From 0fa576d8bb84db8696fb8ca237bf2ec0061ad0e7 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 16 Mar 2024 01:45:23 +0600 Subject: [PATCH 001/624] Compile fixes for Qt6 on Windows --- src/qt/qt_main.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index f87f8b6a9..1523d9a62 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -17,6 +17,10 @@ * Copyright 2021-2022 Cacodemon345 * Copyright 2021-2022 Teemu Korhonen */ + +#ifdef _WIN32 +#define UNICODE 1 +#endif #include #include #include @@ -220,13 +224,13 @@ main(int argc, char *argv[]) #ifdef Q_OS_WINDOWS # if !defined(EMU_BUILD_NUM) || (EMU_BUILD_NUM != 5624) - HWND winbox = FindWindow("TWinBoxMain", NULL); + HWND winbox = FindWindow(L"TWinBoxMain", NULL); if (winbox && - FindWindowEx(winbox, NULL, "TToolBar", NULL) && - FindWindowEx(winbox, NULL, "TListBox", NULL) && - FindWindowEx(winbox, NULL, "TStatusBar", NULL) && - (winbox = FindWindowEx(winbox, NULL, "TPageControl", NULL)) && /* holds a TTabSheet even on VM pages */ - FindWindowEx(winbox, NULL, "TTabSheet", NULL)) + FindWindowEx(winbox, NULL, L"TToolBar", NULL) && + FindWindowEx(winbox, NULL, L"TListBox", NULL) && + FindWindowEx(winbox, NULL, L"TStatusBar", NULL) && + (winbox = FindWindowEx(winbox, NULL, L"TPageControl", NULL)) && /* holds a TTabSheet even on VM pages */ + FindWindowEx(winbox, NULL, L"TTabSheet", NULL)) # endif { QMessageBox warningbox(QMessageBox::Icon::Warning, QObject::tr("WinBox is no longer supported"), From 7afe30205465fdeada5ecdf5961a177e2e804c14 Mon Sep 17 00:00:00 2001 From: Dimitar Angelov Date: Tue, 2 Apr 2024 11:22:31 +0200 Subject: [PATCH 002/624] Adding Pravetz-16S definition --- src/include/86box/machine.h | 1 + src/machine/m_xt.c | 15 ++++++++++++++ src/machine/machine_table.c | 39 +++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index f97d1a37c..7253a5656 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -918,6 +918,7 @@ extern int machine_xt_v20xt_init(const machine_t *); extern int machine_xt_iskra3104_init(const machine_t *); extern int machine_xt_pravetz16_imko4_init(const machine_t *); +extern int machine_xt_pravetz16s_cpu12_init(const machine_t *); extern int machine_xt_micoms_xl7turbo_init(const machine_t *); /* m_xt_compaq.c */ diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index 9a0b39a89..7baaa4ef3 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -368,6 +368,21 @@ machine_xt_pravetz16_imko4_init(const machine_t *model) return ret; } +int +machine_xt_pravetz16s_cpu12_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/pravetz16s/PR16S.BIN", + 0x000fe000, 8192, 0); + + if (bios_only || !ret) + return ret; + + machine_xt_init_ex(model); + return ret; +} + int machine_xt_micoms_xl7turbo_init(const machine_t *model) { diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c2bb3925b..6238bcbb5 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1339,6 +1339,45 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + { + .name = "[8088] Pravetz 16S / CPU12", + .internal_name = "pravetz16s", + .type = MACHINE_TYPE_8088, + .chipset = MACHINE_CHIPSET_DISCRETE, + .init = machine_xt_pravetz16s_cpu12_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_8088, + .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_PC, + .flags = MACHINE_FLAGS_NONE, + .ram = { + .min = 64, + .max = 640, + .step = 64 + }, + .nvrmask = 0, + .kbc_device = &keyboard_xt_device, + .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 + }, { .name = "[8088] Sanyo SX-16", .internal_name = "sansx16", From b9a39d07f865d730d712860ec12e0685c6805348 Mon Sep 17 00:00:00 2001 From: Dimitar Angelov Date: Tue, 2 Apr 2024 15:44:57 +0200 Subject: [PATCH 003/624] Update of min/max bus and min/max RAM --- src/machine/machine_table.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 6238bcbb5..4ac38f607 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1340,7 +1340,7 @@ const machine_t machines[] = { .net_device = NULL }, { - .name = "[8088] Pravetz 16S / CPU12", + .name = "[8088] Pravetz 16S / CPU12+", .internal_name = "pravetz16s", .type = MACHINE_TYPE_8088, .chipset = MACHINE_CHIPSET_DISCRETE, @@ -1352,8 +1352,8 @@ const machine_t machines[] = { .cpu = { .package = CPU_PKG_8088, .block = CPU_BLOCK_NONE, - .min_bus = 0, - .max_bus = 0, + .min_bus = 4772728, + .max_bus = 12000000, .min_voltage = 0, .max_voltage = 0, .min_multi = 0, @@ -1362,9 +1362,9 @@ const machine_t machines[] = { .bus_flags = MACHINE_PC, .flags = MACHINE_FLAGS_NONE, .ram = { - .min = 64, - .max = 640, - .step = 64 + .min = 512, + .max = 1024, + .step = 128 }, .nvrmask = 0, .kbc_device = &keyboard_xt_device, From 7aa3728c3f49c9f196601f2811c439ac376fe4ce Mon Sep 17 00:00:00 2001 From: Dimitar Angelov Date: Tue, 2 Apr 2024 17:02:26 +0200 Subject: [PATCH 004/624] Corrected for CPU12 Plus --- src/include/86box/machine.h | 2 +- src/machine/m_xt.c | 2 +- src/machine/machine_table.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 7253a5656..6690a46c2 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -918,7 +918,7 @@ extern int machine_xt_v20xt_init(const machine_t *); extern int machine_xt_iskra3104_init(const machine_t *); extern int machine_xt_pravetz16_imko4_init(const machine_t *); -extern int machine_xt_pravetz16s_cpu12_init(const machine_t *); +extern int machine_xt_pravetz16s_cpu12p_init(const machine_t *); extern int machine_xt_micoms_xl7turbo_init(const machine_t *); /* m_xt_compaq.c */ diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index 7baaa4ef3..3c1539016 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -369,7 +369,7 @@ machine_xt_pravetz16_imko4_init(const machine_t *model) } int -machine_xt_pravetz16s_cpu12_init(const machine_t *model) +machine_xt_pravetz16s_cpu12p_init(const machine_t *model) { int ret; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 4ac38f607..9f084d723 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1340,11 +1340,11 @@ const machine_t machines[] = { .net_device = NULL }, { - .name = "[8088] Pravetz 16S / CPU12+", + .name = "[8088] Pravetz 16S / CPU12 Plus", .internal_name = "pravetz16s", .type = MACHINE_TYPE_8088, .chipset = MACHINE_CHIPSET_DISCRETE, - .init = machine_xt_pravetz16s_cpu12_init, + .init = machine_xt_pravetz16s_cpu12p_init, .p1_handler = NULL, .gpio_handler = NULL, .available_flag = MACHINE_AVAILABLE, From 072a6c5a05198f51fd1f69ee34f65e467b9b77f4 Mon Sep 17 00:00:00 2001 From: jbs Date: Tue, 16 Apr 2024 11:50:53 -0300 Subject: [PATCH 005/624] For Qt5 add Gui Private Include Header. Fix C++ union initializer syntax in src/sound/snd_opl_ymfm.cpp --- src/qt/CMakeLists.txt | 6 +++++- src/sound/snd_opl_ymfm.cpp | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index 422989a44..b5204e724 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -41,8 +41,12 @@ endif() set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF) find_package(Threads REQUIRED) -find_package(Qt${QT_MAJOR} COMPONENTS Core Widgets Network OpenGL REQUIRED) +find_package(Qt${QT_MAJOR} COMPONENTS Core Widgets Network OpenGL Gui REQUIRED) find_package(Qt${QT_MAJOR}LinguistTools REQUIRED NO_CMAKE_FIND_ROOT_PATH) +if(NOT USE_QT6) + # For in src/qt/qt_mainwindow.cpp + include_directories(${Qt5Gui_PRIVATE_INCLUDE_DIRS}) +endif () # TODO: Is this the correct way to do this, and is it required on any # other platforms or with Qt 5? diff --git a/src/sound/snd_opl_ymfm.cpp b/src/sound/snd_opl_ymfm.cpp index 55e7f1984..a08aac92b 100644 --- a/src/sound/snd_opl_ymfm.cpp +++ b/src/sound/snd_opl_ymfm.cpp @@ -433,7 +433,7 @@ const device_t ym3812_ymfm_device = { .init = ymfm_drv_init, .close = ymfm_drv_close, .reset = NULL, - { .available = NULL }, + .available = NULL, .speed_changed = NULL, .force_redraw = NULL, .config = NULL @@ -447,7 +447,7 @@ const device_t ymf262_ymfm_device = { .init = ymfm_drv_init, .close = ymfm_drv_close, .reset = NULL, - { .available = NULL }, + .available = NULL, .speed_changed = NULL, .force_redraw = NULL, .config = NULL @@ -461,7 +461,7 @@ const device_t ymf289b_ymfm_device = { .init = ymfm_drv_init, .close = ymfm_drv_close, .reset = NULL, - { .available = NULL }, + .available = NULL, .speed_changed = NULL, .force_redraw = NULL, .config = NULL @@ -475,7 +475,7 @@ const device_t ymf278b_ymfm_device = { .init = ymfm_drv_init, .close = ymfm_drv_close, .reset = NULL, - { .available = NULL }, + .available = NULL, .speed_changed = NULL, .force_redraw = NULL, .config = NULL From f374ffde3670d8dbd648c341a3a1fe8423f53900 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 13 Jun 2024 16:44:44 +0200 Subject: [PATCH 006/624] UM8886: Slight fixes. --- src/chipset/umc_8886.c | 50 ++++++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 17 deletions(-) diff --git a/src/chipset/umc_8886.c b/src/chipset/umc_8886.c index 7a049b1cb..fb11af0e7 100644 --- a/src/chipset/umc_8886.c +++ b/src/chipset/umc_8886.c @@ -134,6 +134,36 @@ umc_8886_ide_handler(umc_8886_t *dev) } } +static void +umc_8886_bus_recalc(umc_8886_t *dev) +{ + switch (dev->pci_conf_sb[0x00][0xa4] & 0x03) { + case 0x00: + cpu_set_pci_speed(cpu_busspeed / 2); + break; + case 0x01: + cpu_set_pci_speed(cpu_busspeed); + break; + case 0x02: + cpu_set_pci_speed((cpu_busspeed * 2) / 3); + break; + } + + switch (dev->pci_conf_sb[0x00][0x56] & 0x03) { + default: + break; + case 0x00: + cpu_set_isa_pci_div(3); + break; + case 0x01: + cpu_set_isa_pci_div(4); + break; + case 0x02: + cpu_set_isa_pci_div(2); + break; + } +} + static void umc_8886_write(int func, int addr, uint8_t val, void *priv) { @@ -191,20 +221,7 @@ umc_8886_write(int func, int addr, uint8_t val, void *priv) case 0x56: dev->pci_conf_sb[func][addr] = val; - - switch (val & 3) { - case 0: - cpu_set_isa_pci_div(3); - break; - case 1: - cpu_set_isa_pci_div(4); - break; - case 2: - cpu_set_isa_pci_div(2); - break; - default: - break; - } + umc_8886_bus_recalc(dev); break; case 0xa2: @@ -225,7 +242,7 @@ umc_8886_write(int func, int addr, uint8_t val, void *priv) case 0xa4: dev->pci_conf_sb[func][addr] = val; - cpu_set_pci_speed(cpu_busspeed / ((val & 1) ? 1 : 2)); + umc_8886_bus_recalc(dev); break; default: @@ -362,8 +379,7 @@ umc_8886_reset(void *priv) for (uint8_t i = 1; i < 5; i++) /* Disable all IRQ interrupts */ pci_set_irq_routing(i, PCI_IRQ_DISABLED); - cpu_set_isa_pci_div(3); - cpu_set_pci_speed(cpu_busspeed / 2); + umc_8886_bus_recalc(dev); } static void From fb267d1f8b4a51bdb1f552f5b7bd22e498443c16 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 13 Jun 2024 19:01:57 +0200 Subject: [PATCH 007/624] Fix the DP8473 FDC flags, closes #4538. --- src/floppy/fdc.c | 14 +++++++++++++- src/include/86box/fdc.h | 1 + 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 1a0aa2f10..4c1170eb9 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -931,6 +931,10 @@ fdc_write(uint16_t addr, uint8_t val, void *priv) fdc->format_state = 0; break; case 0x0e: /*Dump registers*/ + if (fdc->flags & FDC_FLAG_NEC) { + fdc_bad_command(fdc); + break; + } fdc->lastdrive = fdc->drive; fdc->interrupt = 0x0e; fdc_callback(fdc); @@ -949,6 +953,10 @@ fdc_write(uint16_t addr, uint8_t val, void *priv) case 0x10: /*Get version*/ case 0x14: /*Unlock*/ case 0x94: /*Lock*/ + if (fdc->flags & FDC_FLAG_NEC) { + fdc_bad_command(fdc); + break; + } fdc->lastdrive = fdc->drive; fdc->interrupt = fdc->command; fdc_callback(fdc); @@ -962,6 +970,10 @@ fdc_write(uint16_t addr, uint8_t val, void *priv) fdc_bad_command(fdc); break; case 0x13: /*Configure*/ + if (fdc->flags & FDC_FLAG_NEC) { + fdc_bad_command(fdc); + break; + } fdc->pnum = 0; fdc->ptot = 3; fdc->stat |= 0x90; @@ -2682,7 +2694,7 @@ const device_t fdc_dp8473_device = { .name = "NS DP8473 Floppy Drive Controller", .internal_name = "fdc_dp8473", .flags = 0, - .local = FDC_FLAG_AT | FDC_FLAG_NSC, + .local = FDC_FLAG_AT | FDC_FLAG_NEC | FDC_FLAG_NO_DSR_RESET, .init = fdc_init, .close = fdc_close, .reset = fdc_reset, diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index 9529fde5c..6bb8f081e 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -57,6 +57,7 @@ extern int fdc_type; #define FDC_FLAG_QUA 0x3000 /* Is Quaternary */ #define FDC_FLAG_CHANNEL 0x3000 /* Channel mask */ #define FDC_FLAG_NO_DSR_RESET 0x4000 /* Has no DSR reset */ +#define FDC_FLAG_NEC 0x8000 /* Is NEC upd765-compatible */ typedef struct fdc_t { uint8_t dor; From e5f676d9b5ef77b8eff01a20b16431aef4af956f Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 13 Jun 2024 19:21:37 +0200 Subject: [PATCH 008/624] CD-ROM: Actually set the format variable of GPCMD_READ_DVD_STRUCTURE to cdb[7], fixes heap corruptions due to the format incorrectly mismatching the given buffer lengths, fixes #4522 . --- src/scsi/scsi_cdrom.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 262d9600c..f6e4b9cf6 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -3000,6 +3000,7 @@ begin: if ((cdb[7] <= 0x7f) || (cdb[7] == 0xff)) { if (cdb[1] == 0) { + format = cdb[7]; ret = scsi_cdrom_read_dvd_structure(dev, format, cdb, dev->buffer); dev->buffer[0] = (ret >> 8); dev->buffer[1] = (ret & 0xff); From 7fd04ad942684a10a584d12aaaf459dda70df311 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 13 Jun 2024 23:53:03 -0300 Subject: [PATCH 009/624] VISO: Fix disc corruption caused by >2GB files on Windows --- src/cdrom/cdrom_image_viso.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/cdrom/cdrom_image_viso.c b/src/cdrom/cdrom_image_viso.c index 7ed68cd86..d75b5f301 100644 --- a/src/cdrom/cdrom_image_viso.c +++ b/src/cdrom/cdrom_image_viso.c @@ -46,6 +46,13 @@ # define S_ISDIR(m) (((m) &S_IFMT) == S_IFDIR) #endif +#ifdef __MINGW32__ +# define stat _stat64 +typedef struct __stat64 stat_t; +#else +typedef struct stat stat_t; +#endif + #define VISO_SKIP(p, n) \ { \ memset(p, 0x00, n); \ @@ -106,7 +113,7 @@ typedef struct _viso_entry_ { }; uint16_t pt_idx; - struct stat stats; + stat_t stats; struct _viso_entry_ *parent, *next, *next_dir, *first_child; @@ -830,7 +837,7 @@ viso_init(const char *dirname, int *error) strcpy(dir->path, dirname); if (stat(dirname, &dir->stats) != 0) { /* Use a blank structure if stat failed. */ - memset(&dir->stats, 0x00, sizeof(struct stat)); + memset(&dir->stats, 0x00, sizeof(stat_t)); } if (!S_ISDIR(dir->stats.st_mode)) /* root is not a directory */ goto end; @@ -879,7 +886,7 @@ viso_init(const char *dirname, int *error) /* Stat the current directory or parent directory. */ if (stat(children_count ? dir->parent->path : dir->path, &entry->stats) != 0) { /* Use a blank structure if stat failed. */ - memset(&entry->stats, 0x00, sizeof(struct stat)); + memset(&entry->stats, 0x00, sizeof(stat_t)); } /* Set basename. */ @@ -909,7 +916,7 @@ viso_init(const char *dirname, int *error) /* Stat this child. */ if (stat(entry->path, &entry->stats) != 0) { /* Use a blank structure if stat failed. */ - memset(&entry->stats, 0x00, sizeof(struct stat)); + memset(&entry->stats, 0x00, sizeof(stat_t)); } /* Handle file size and El Torito boot code. */ @@ -1432,7 +1439,7 @@ next_entry: /* Allocate entry map for sector->file lookups. */ size_t orig_sector_size = viso->sector_size; while (1) { - cdrom_image_viso_log("VISO: Allocating entry map for %d %d-byte sectors\n", viso->entry_map_size, viso->sector_size); + cdrom_image_viso_log("VISO: Allocating entry map for %zu %zu-byte sectors\n", viso->entry_map_size, viso->sector_size); viso->entry_map = (viso_entry_t **) calloc(viso->entry_map_size, sizeof(viso_entry_t *)); if (viso->entry_map) { /* Successfully allocated. */ @@ -1444,7 +1451,7 @@ next_entry: /* If we don't have enough memory, double the sector size. */ viso->sector_size *= 2; - if (viso->sector_size == 0) /* give up if sectors become too large */ + if ((viso->sector_size < VISO_SECTOR_SIZE) || (viso->sector_size > (1 << 30))) /* give up if sectors become too large */ goto end; /* Go through files, recalculating the entry map size. */ @@ -1515,10 +1522,10 @@ next_entry: entry->data_offset = ((uint64_t) viso->all_sectors) * viso->sector_size; /* Determine how many sectors this file will take. */ - uint32_t size = entry->stats.st_size / viso->sector_size; + size_t size = entry->stats.st_size / viso->sector_size; if (entry->stats.st_size % viso->sector_size) size++; /* round up to the next sector */ - cdrom_image_viso_log("[%08X] %s => %" PRIu32 " + %" PRIu32 " sectors\n", entry, entry->path, viso->all_sectors, size); + cdrom_image_viso_log("[%08X] %s => %zu + %zu sectors\n", entry, entry->path, viso->all_sectors, size); /* Allocate sectors to this file. */ viso->all_sectors += size; @@ -1537,7 +1544,7 @@ next_entry: viso_pwrite(data, viso->vol_size_offsets[i], 8, 1, viso->tf.fp); /* Metadata processing is finished, read it back to memory. */ - cdrom_image_viso_log("VISO: Reading back %d %d-byte sectors of metadata\n", viso->metadata_sectors, viso->sector_size); + cdrom_image_viso_log("VISO: Reading back %zu %zu-byte sectors of metadata\n", viso->metadata_sectors, viso->sector_size); viso->metadata = (uint8_t *) calloc(viso->metadata_sectors, viso->sector_size); if (!viso->metadata) goto end; From 05226efe3df80a54b2ef5669eb2a85efc487bf28 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 14 Jun 2024 00:50:08 -0300 Subject: [PATCH 010/624] VISO: Type flexibility and macro cleanups --- src/cdrom/cdrom_image_viso.c | 50 +++++++++++++++++------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/src/cdrom/cdrom_image_viso.c b/src/cdrom/cdrom_image_viso.c index d75b5f301..90bd83cf7 100644 --- a/src/cdrom/cdrom_image_viso.c +++ b/src/cdrom/cdrom_image_viso.c @@ -46,35 +46,35 @@ # define S_ISDIR(m) (((m) &S_IFMT) == S_IFDIR) #endif -#ifdef __MINGW32__ -# define stat _stat64 +#ifdef _WIN32 +# define stat _stat64 typedef struct __stat64 stat_t; #else typedef struct stat stat_t; #endif -#define VISO_SKIP(p, n) \ - { \ - memset(p, 0x00, n); \ - p += n; \ +#define VISO_SKIP(p, n) \ + { \ + memset((p), 0x00, (n)); \ + (p) += (n); \ } #define VISO_TIME_VALID(t) ((t) > 0) /* ISO 9660 defines "both endian" data formats, which are stored as little endian followed by big endian. */ -#define VISO_LBE_16(p, x) \ - { \ - *((uint16_t *) p) = cpu_to_le16(x); \ - p += 2; \ - *((uint16_t *) p) = cpu_to_be16(x); \ - p += 2; \ +#define VISO_LBE_16(p, x) \ + { \ + *((uint16_t *) (p)) = cpu_to_le16((x)); \ + (p) += 2; \ + *((uint16_t *) (p)) = cpu_to_be16((x)); \ + (p) += 2; \ } -#define VISO_LBE_32(p, x) \ - { \ - *((uint32_t *) p) = cpu_to_le32(x); \ - p += 4; \ - *((uint32_t *) p) = cpu_to_be32(x); \ - p += 4; \ +#define VISO_LBE_32(p, x) \ + { \ + *((uint32_t *) (p)) = cpu_to_le32((x)); \ + (p) += 4; \ + *((uint32_t *) (p)) = cpu_to_be32((x)); \ + (p) += 4; \ } #define VISO_SECTOR_SIZE COOKED_SECTOR_SIZE @@ -503,10 +503,6 @@ viso_fill_dir_record(uint8_t *data, viso_entry_t *entry, viso_t *viso, int type) *p++ = 0; /* extended attribute length */ VISO_SKIP(p, 8); /* sector offset */ VISO_LBE_32(p, entry->stats.st_size); /* size (filled in later if this is a directory) */ -#ifdef _WIN32 - if (entry->stats.st_mtime < 0) - pclog("VISO: Warning: Windows returned st_mtime %lld on file [%s]\n", (long long) entry->stats.st_mtime, entry->path); -#endif p += viso_fill_time(p, entry->stats.st_mtime, viso->format, 0); /* time */ *p++ = S_ISDIR(entry->stats.st_mode) ? 0x02 : 0x00; /* flags */ @@ -678,9 +674,9 @@ viso_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) /* Handle reads in a sector by sector basis. */ while (count > 0) { /* Determine the current sector, offset and remainder. */ - uint32_t sector = seek / viso->sector_size; - uint32_t sector_offset = seek % viso->sector_size; - uint32_t sector_remain = MIN(count, viso->sector_size - sector_offset); + size_t sector = seek / viso->sector_size; + size_t sector_offset = seek % viso->sector_size; + size_t sector_remain = MIN(count, viso->sector_size - sector_offset); /* Handle sector. */ if (sector < viso->metadata_sectors) { @@ -1549,8 +1545,8 @@ next_entry: if (!viso->metadata) goto end; fseeko64(viso->tf.fp, 0, SEEK_SET); - uint64_t metadata_size = viso->metadata_sectors * viso->sector_size; - uint64_t metadata_remain = metadata_size; + size_t metadata_size = viso->metadata_sectors * viso->sector_size; + size_t metadata_remain = metadata_size; while (metadata_remain > 0) metadata_remain -= fread(viso->metadata + (metadata_size - metadata_remain), 1, MIN(metadata_remain, viso->sector_size), viso->tf.fp); From b997b9df3e18fa5075e45f35f1586b01db317ae6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 15 Jun 2024 16:59:02 +0200 Subject: [PATCH 011/624] CD-ROM image backend: Fix handling of CD-XA Mode 2 Form 1 images with a sector size of 2336. --- src/cdrom/cdrom_image_backend.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index fdfa4a4ab..5cdb2c988 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -509,11 +509,12 @@ cdi_can_read_pvd(track_file_t *file, uint64_t sector_size, int mode2, int form) uint64_t seek = 16ULL * sector_size; /* First VD is located at sector 16. */ if (sector_size == RAW_SECTOR_SIZE) { - if (!mode2 || (form == 0)) - seek += 16; - else + if (mode2 && (form > 0)) seek += 24; - } + else + seek += 16; + } else if (form > 0) + seek += 8; file->read(file, pvd, seek, COOKED_SECTOR_SIZE); @@ -582,6 +583,10 @@ cdi_load_iso(cd_img_t *cdi, const char *filename) trk.sector_size = 2328; trk.mode2 = 1; trk.form = 2; + } else if (cdi_can_read_pvd(trk.file, 2336, 1, 1)) { + trk.sector_size = 2336; + trk.mode2 = 1; + trk.form = 1; } else if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 1, 0)) { trk.sector_size = RAW_SECTOR_SIZE; trk.mode2 = 1; @@ -908,6 +913,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) trk.attr = DATA_TRACK; trk.mode2 = 1; } else if (!strcmp(type, "MODE2/2336")) { + trk.form = 1; trk.sector_size = 2336; trk.attr = DATA_TRACK; trk.mode2 = 1; From bf105c6f2904c33139e4118e8488efacd3103b3b Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 15 Jun 2024 17:27:19 +0200 Subject: [PATCH 012/624] CD-ROM image backend: Skip 8 bytes on every sector on non-raw CD-XA Mode 2 images. --- src/cdrom/cdrom_image_backend.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index 5cdb2c988..003afb58c 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -764,6 +764,8 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u if (cur->number != 1) return 0; cur->skip = skip * cur->sector_size; + if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0)) + cur->skip += 8; cur->start += cur_pregap; *total_pregap = cur_pregap; cdi_track_push_back(cdi, cur); @@ -786,6 +788,8 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u cur->start += prev->start + prev->length + cur_pregap; cur->skip = skip * cur->sector_size; + if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0)) + cur->skip += 8; *shift += prev->start + prev->length; *total_pregap = cur_pregap; } From 382b941ff99aa3ff78a969cbd494c87647a595b4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 15 Jun 2024 17:40:41 +0200 Subject: [PATCH 013/624] CD-ROM image backend: Add the 8-byte skip also to ISO image loading. --- src/cdrom/cdrom_image_backend.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index 003afb58c..9ce78e5b4 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -587,6 +587,7 @@ cdi_load_iso(cd_img_t *cdi, const char *filename) trk.sector_size = 2336; trk.mode2 = 1; trk.form = 1; + trk.skip = 8; } else if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 1, 0)) { trk.sector_size = RAW_SECTOR_SIZE; trk.mode2 = 1; From c9176b2d91616f03124a6ac66b116894e69cc55c Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sun, 16 Jun 2024 14:16:53 +0600 Subject: [PATCH 014/624] Changes --- src/qt/qt_main.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 1523d9a62..dda682641 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -17,10 +17,6 @@ * Copyright 2021-2022 Cacodemon345 * Copyright 2021-2022 Teemu Korhonen */ - -#ifdef _WIN32 -#define UNICODE 1 -#endif #include #include #include @@ -224,13 +220,13 @@ main(int argc, char *argv[]) #ifdef Q_OS_WINDOWS # if !defined(EMU_BUILD_NUM) || (EMU_BUILD_NUM != 5624) - HWND winbox = FindWindow(L"TWinBoxMain", NULL); + HWND winbox = FindWindowW(L"TWinBoxMain", NULL); if (winbox && - FindWindowEx(winbox, NULL, L"TToolBar", NULL) && - FindWindowEx(winbox, NULL, L"TListBox", NULL) && - FindWindowEx(winbox, NULL, L"TStatusBar", NULL) && - (winbox = FindWindowEx(winbox, NULL, L"TPageControl", NULL)) && /* holds a TTabSheet even on VM pages */ - FindWindowEx(winbox, NULL, L"TTabSheet", NULL)) + FindWindowExW(winbox, NULL, L"TToolBar", NULL) && + FindWindowExW(winbox, NULL, L"TListBox", NULL) && + FindWindowExW(winbox, NULL, L"TStatusBar", NULL) && + (winbox = FindWindowExW(winbox, NULL, L"TPageControl", NULL)) && /* holds a TTabSheet even on VM pages */ + FindWindowExW(winbox, NULL, L"TTabSheet", NULL)) # endif { QMessageBox warningbox(QMessageBox::Icon::Warning, QObject::tr("WinBox is no longer supported"), From 2b3d3ad5bd201900146c316c24b024aae2b87228 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Tue, 18 Jun 2024 20:05:44 +0600 Subject: [PATCH 015/624] Make sure timers don't go completely out of sync upon altering TSC via WRMSR --- src/cpu/cpu.c | 13 +++++++------ src/include/86box/timer.h | 3 +++ src/timer.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 20476eec9..0ff54f61c 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -40,6 +40,7 @@ #include <86box/nmi.h> #include <86box/pic.h> #include <86box/pci.h> +#include <86box/timer.h> #include <86box/gdbstub.h> #include <86box/plat_fallthrough.h> #include <86box/plat_unused.h> @@ -3492,7 +3493,7 @@ cpu_WRMSR(void) break; /* Time Stamp Counter */ case 0x10: - tsc = EAX | ((uint64_t) EDX << 32); + timer_set_new_tsc(EAX | ((uint64_t) EDX << 32)); break; /* Performance Monitor - Control and Event Select */ case 0x11: @@ -3568,7 +3569,7 @@ cpu_WRMSR(void) break; /* Time Stamp Counter */ case 0x10: - tsc = EAX | ((uint64_t) EDX << 32); + timer_set_new_tsc(EAX | ((uint64_t) EDX << 32)); break; /* PERFCTR0 - Performance Counter Register 0 - aliased to TSC */ case 0xc1: @@ -3664,7 +3665,7 @@ cpu_WRMSR(void) break; /* Time Stamp Counter */ case 0x00000010: - tsc = EAX | ((uint64_t) EDX << 32); + timer_set_new_tsc(EAX | ((uint64_t) EDX << 32)); break; /* Array Access Register */ case 0x00000082: @@ -3834,7 +3835,7 @@ amd_k_invalid_wrmsr: /* Time Stamp Counter */ case 0x00000010: case 0x80000010: - tsc = EAX | ((uint64_t) EDX << 32); + timer_set_new_tsc(EAX | ((uint64_t) EDX << 32)); break; /* Performance Monitor - Control and Event Select */ case 0x00000011: @@ -3919,7 +3920,7 @@ pentium_invalid_wrmsr: msr.tr5 = EAX & 0x008f0f3b; /* Time Stamp Counter */ case 0x10: - tsc = EAX | ((uint64_t) EDX << 32); + timer_set_new_tsc(EAX | ((uint64_t) EDX << 32)); break; /* Performance Monitor - Control and Event Select */ case 0x11: @@ -3952,7 +3953,7 @@ pentium_invalid_wrmsr: break; /* Time Stamp Counter */ case 0x10: - tsc = EAX | ((uint64_t) EDX << 32); + timer_set_new_tsc(EAX | ((uint64_t) EDX << 32)); break; /* Unknown */ case 0x18: diff --git a/src/include/86box/timer.h b/src/include/86box/timer.h index 91f903a0f..25aff6b2f 100644 --- a/src/include/86box/timer.h +++ b/src/include/86box/timer.h @@ -185,6 +185,9 @@ timer_set_p(pc_timer_t *timer, void *priv) extern void timer_stop(pc_timer_t *timer); extern void timer_on_auto(pc_timer_t *timer, double period); +/* Change TSC, taking into account the timers. */ +extern void timer_set_new_tsc(uint64_t new_tsc); + #ifdef __cplusplus } #endif diff --git a/src/timer.c b/src/timer.c index d7102ffc3..6ddf8ebb5 100644 --- a/src/timer.c +++ b/src/timer.c @@ -253,3 +253,31 @@ timer_on_auto(pc_timer_t *timer, double period) else timer_stop(timer); } + +void +timer_set_new_tsc(uint64_t new_tsc) +{ + pc_timer_t *timer = NULL; + /* Run timers already expired. */ +#ifdef USE_DYNAREC + if (cpu_use_dynarec) + update_tsc(); +#endif + + if (!timer_head) { + tsc = new_tsc; + return; + } + + timer = timer_head; + timer_target = new_tsc + (int32_t)(timer_get_ts_int(timer_head) - (uint32_t)tsc); + + while (timer) { + int32_t offset_from_current_tsc = (int32_t)(timer_get_ts_int(timer) - (uint32_t)tsc); + timer->ts.ts32.integer = new_tsc + offset_from_current_tsc; + + timer = timer->next; + } + + tsc = new_tsc; +} From a44936f3e1757aec048a3ba01cf7c1b4e2212528 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 21 Jun 2024 15:36:28 +0600 Subject: [PATCH 016/624] Add Generic PCL Printer --- src/include/86box/plat.h | 4 +- src/include/86box/prt_devs.h | 1 + src/lpt.c | 1 + src/printer/prt_ps.c | 129 +++++++++++++++++++++++++++++------ src/qt/qt_platform.cpp | 9 ++- src/unix/unix.c | 4 ++ 6 files changed, 126 insertions(+), 22 deletions(-) diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 975133f6c..26f5d5cc8 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -47,7 +47,9 @@ enum { STRING_HW_NOT_AVAILABLE_MACHINE, /* "Machine \"%hs\" is not available..." */ STRING_HW_NOT_AVAILABLE_VIDEO, /* "Video card \"%hs\" is not available..." */ STRING_HW_NOT_AVAILABLE_VIDEO2, /* "Video card #2 \"%hs\" is not available..." */ - STRING_MONITOR_SLEEP /* "Monitor in sleep mode" */ + STRING_MONITOR_SLEEP, /* "Monitor in sleep mode" */ + STRING_GHOSTPCL_ERROR_TITLE, /* "Unable to initialize GhostPCL" */ + STRING_GHOSTPCL_ERROR_DESC /* "gpcl6dll32.dll/gpcl6dll64.dll/libgpcl6 is required..." */ }; /* The Win32 API uses _wcsicmp. */ diff --git a/src/include/86box/prt_devs.h b/src/include/86box/prt_devs.h index 3d9d6673a..02920e9b0 100644 --- a/src/include/86box/prt_devs.h +++ b/src/include/86box/prt_devs.h @@ -4,5 +4,6 @@ extern const lpt_device_t lpt_prt_text_device; extern const lpt_device_t lpt_prt_escp_device; extern const lpt_device_t lpt_prt_ps_device; +extern const lpt_device_t lpt_prt_pcl_device; #endif /*EMU_PRT_DEVS_H*/ diff --git a/src/lpt.c b/src/lpt.c index 419e5ad3d..d0647c0e6 100644 --- a/src/lpt.c +++ b/src/lpt.c @@ -42,6 +42,7 @@ static const struct { {"text_prt", &lpt_prt_text_device }, {"dot_matrix", &lpt_prt_escp_device }, {"postscript", &lpt_prt_ps_device }, + {"pcl", &lpt_prt_pcl_device }, {"plip", &lpt_plip_device }, {"dongle_savquest", &lpt_hasp_savquest_device }, {"", NULL } diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c index e6362019f..3e6612ce1 100644 --- a/src/printer/prt_ps.c +++ b/src/printer/prt_ps.c @@ -6,13 +6,16 @@ * * This file is part of the 86Box distribution. * - * Implementation of a generic PostScript printer. + * Implementation of a generic PostScript printer and a + * generic PCL 5e printer. * * * * Authors: David Hrdlička, + * Cacodemon345 * * Copyright 2019 David Hrdlička. + * Copyright 2024 Cacodemon345. */ #include @@ -44,15 +47,20 @@ #ifdef _WIN32 # if (!(defined __amd64__ || defined _M_X64 || defined __aarch64__ || defined _M_ARM64)) # define PATH_GHOSTSCRIPT_DLL "gsdll32.dll" +# define PATH_GHOSTPCL_DLL "gpcl6dll32.dll" # else # define PATH_GHOSTSCRIPT_DLL "gsdll64.dll" +# define PATH_GHOSTPCL_DLL "gpcl6dll64.dll" # endif #elif defined __APPLE__ # define PATH_GHOSTSCRIPT_DLL "libgs.dylib" +# define PATH_GHOSTPCL_DLL "libgpcl6.dylib" #else # define PATH_GHOSTSCRIPT_DLL "libgs.so.9" # define PATH_GHOSTSCRIPT_DLL_ALT1 "libgs.so.10" # define PATH_GHOSTSCRIPT_DLL_ALT2 "libgs.so" +# define PATH_GHOSTPCL_DLL "libgpcl6.so.10" +# define PATH_GHOSTPCL_DLL_ALT "libgpcl6.so" #endif #define POSTSCRIPT_BUFFER_LENGTH 65536 @@ -72,6 +80,8 @@ typedef struct ps_t { bool int_pending; bool error; bool autofeed; + bool pcl; + bool pcl_escape; uint8_t ctrl; char printer_path[260]; @@ -141,28 +151,32 @@ pulse_timer(void *priv) static int convert_to_pdf(ps_t *dev) { - volatile int code; + volatile int code, arg = 0; void *instance = NULL; char input_fn[1024]; char output_fn[1024]; - char *gsargv[9]; + char *gsargv[11]; strcpy(input_fn, dev->printer_path); path_slash(input_fn); strcat(input_fn, dev->filename); strcpy(output_fn, input_fn); - strcpy(output_fn + strlen(output_fn) - 3, ".pdf"); + strcpy(output_fn + strlen(output_fn) - (dev->pcl ? 4 : 3), ".pdf"); - gsargv[0] = ""; - gsargv[1] = "-dNOPAUSE"; - gsargv[2] = "-dBATCH"; - gsargv[3] = "-dSAFER"; - gsargv[4] = "-sDEVICE=pdfwrite"; - gsargv[5] = "-q"; - gsargv[6] = "-o"; - gsargv[7] = output_fn; - gsargv[8] = input_fn; + gsargv[arg++] = ""; + gsargv[arg++] = "-dNOPAUSE"; + gsargv[arg++] = "-dBATCH"; + gsargv[arg++] = "-dSAFER"; + gsargv[arg++] = "-sDEVICE=pdfwrite"; + if (dev->pcl) { + gsargv[arg++] = "-LPCL"; + gsargv[arg++] = "-lPCL5E"; + } + gsargv[arg++] = "-q"; + gsargv[arg++] = "-o"; + gsargv[arg++] = output_fn; + gsargv[arg++] = input_fn; code = gsapi_new_instance(&instance, dev); if (code < 0) @@ -171,7 +185,7 @@ convert_to_pdf(ps_t *dev) code = gsapi_set_arg_encoding(instance, GS_ARG_ENCODING_UTF8); if (code == 0) - code = gsapi_init_with_args(instance, 9, gsargv); + code = gsapi_init_with_args(instance, arg, gsargv); if (code == 0 || code == gs_error_Quit) code = gsapi_exit(instance); @@ -198,19 +212,22 @@ write_buffer(ps_t *dev, bool finish) return; if (dev->filename[0] == 0) - plat_tempfile(dev->filename, NULL, ".ps"); + plat_tempfile(dev->filename, NULL, dev->pcl ? ".pcl" : ".ps"); strcpy(path, dev->printer_path); path_slash(path); strcat(path, dev->filename); - fp = plat_fopen(path, "a"); + fp = plat_fopen(path, dev->pcl ? "ab" : "a"); if (fp == NULL) return; fseek(fp, 0, SEEK_END); - fprintf(fp, "%.*s", POSTSCRIPT_BUFFER_LENGTH, dev->buffer); + if (dev->pcl) + fwrite(dev->buffer, 1, dev->buffer_pos, fp); + else + fprintf(fp, "%.*s", POSTSCRIPT_BUFFER_LENGTH, dev->buffer); fclose(fp); @@ -249,8 +266,25 @@ ps_write_data(uint8_t val, void *priv) static void process_data(ps_t *dev) { - /* Check for non-printable characters */ - if ((dev->data < 0x20) || (dev->data == 0x7f)) { + /* On PCL, check for escape sequences. */ + if (dev->pcl) { + if (dev->data == 0x1B) + dev->pcl_escape = true; + else if (dev->pcl_escape) { + dev->pcl_escape = false; + if (dev->data == 0xE) { + dev->buffer[dev->buffer_pos++] = dev->data; + dev->buffer[dev->buffer_pos] = 0; + + if (dev->buffer_pos > 2) + write_buffer(dev, true); + + return; + } + } + } + /* On PostScript, check for non-printable characters. */ + else if ((dev->data < 0x20) || (dev->data == 0x7f)) { switch (dev->data) { /* The following characters are considered white-space by the PostScript specification */ @@ -376,6 +410,51 @@ ps_init(void *lpt) return dev; } +static void * +pcl_init(void *lpt) +{ + ps_t *dev; + gsapi_revision_t rev; + + dev = (ps_t *) malloc(sizeof(ps_t)); + memset(dev, 0x00, sizeof(ps_t)); + dev->ctrl = 0x04; + dev->lpt = lpt; + dev->pcl = true; + + /* Try loading the DLL. */ + ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL, ghostscript_imports); +#ifdef PATH_GHOSTPCL_DLL_ALT + if (ghostscript_handle == NULL) { + ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL_ALT, ghostscript_imports); + } +#endif + if (ghostscript_handle == NULL) { + ui_msgbox_header(MBX_ERROR, plat_get_string(STRING_GHOSTPCL_ERROR_TITLE), plat_get_string(STRING_GHOSTPCL_ERROR_DESC)); + } else { + if (gsapi_revision(&rev, sizeof(rev)) == 0) { + pclog("Loaded %s, rev %ld (%ld)\n", rev.product, rev.revision, rev.revisiondate); + } else { + dynld_close(ghostscript_handle); + ghostscript_handle = NULL; + } + } + + /* Cache print folder path. */ + memset(dev->printer_path, 0x00, sizeof(dev->printer_path)); + path_append_filename(dev->printer_path, usr_path, "printer"); + if (!plat_dir_check(dev->printer_path)) + plat_dir_create(dev->printer_path); + path_slash(dev->printer_path); + + timer_add(&dev->pulse_timer, pulse_timer, dev, 0); + timer_add(&dev->timeout_timer, timeout_timer, dev, 0); + + reset_ps(dev); + + return dev; +} + static void ps_close(void *priv) { @@ -406,3 +485,15 @@ const lpt_device_t lpt_prt_ps_device = { .read_status = ps_read_status, .read_ctrl = NULL }; + +const lpt_device_t lpt_prt_pcl_device = { + .name = "Generic PCL5e Printer", + .internal_name = "pcl", + .init = pcl_init, + .close = ps_close, + .write_data = ps_write_data, + .write_ctrl = ps_write_ctrl, + .read_data = NULL, + .read_status = ps_read_status, + .read_ctrl = NULL +}; diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index edfefa39f..a200e38ec 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -585,14 +585,17 @@ c16stombs(char dst[], const uint16_t src[], int len) #ifdef _WIN32 # if defined(__amd64__) || defined(_M_X64) || defined(__aarch64__) || defined(_M_ARM64) -# define LIB_NAME_GS "gsdll64.dll" +# define LIB_NAME_GS "gsdll64.dll" +# define LIB_NAME_GPCL "gpcl6dll64.dll" # else -# define LIB_NAME_GS "gsdll32.dll" +# define LIB_NAME_GS "gsdll32.dll" +# define LIB_NAME_GPCL "gpcl6dll32.dll" # endif # define LIB_NAME_PCAP "Npcap" # define MOUSE_CAPTURE_KEYSEQ "F8+F12" #else # define LIB_NAME_GS "libgs" +# define LIB_NAME_GPCL "libgpcl6" # define LIB_NAME_PCAP "libpcap" # define MOUSE_CAPTURE_KEYSEQ "Ctrl+End" #endif @@ -613,6 +616,8 @@ ProgSettings::reloadStrings() translatedstrings[STRING_PCAP_ERROR_DESC] = QCoreApplication::translate("", "Make sure %1 is installed and that you are on a %1-compatible network connection.").arg(LIB_NAME_PCAP).toStdWString(); translatedstrings[STRING_GHOSTSCRIPT_ERROR_TITLE] = QCoreApplication::translate("", "Unable to initialize Ghostscript").toStdWString(); translatedstrings[STRING_GHOSTSCRIPT_ERROR_DESC] = QCoreApplication::translate("", "%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.").arg(LIB_NAME_GS).toStdWString(); + translatedstrings[STRING_GHOSTPCL_ERROR_TITLE] = QCoreApplication::translate("", "Unable to initialize GhostPCL").toStdWString(); + translatedstrings[STRING_GHOSTPCL_ERROR_DESC] = QCoreApplication::translate("", "%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.").arg(LIB_NAME_GPCL).toStdWString(); translatedstrings[STRING_HW_NOT_AVAILABLE_MACHINE] = QCoreApplication::translate("", "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine.").toStdWString(); translatedstrings[STRING_HW_NOT_AVAILABLE_VIDEO] = QCoreApplication::translate("", "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card.").toStdWString(); translatedstrings[STRING_HW_NOT_AVAILABLE_VIDEO2] = QCoreApplication::translate("", "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card.").toStdWString(); diff --git a/src/unix/unix.c b/src/unix/unix.c index 58cb1448f..e08b82133 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -266,6 +266,10 @@ plat_get_string(int i) return L"Make sure libpcap is installed and that you are on a libpcap-compatible network connection."; case STRING_GHOSTSCRIPT_ERROR_TITLE: return L"Unable to initialize Ghostscript"; + case STRING_GHOSTPCL_ERROR_TITLE: + return L"Unable to initialize GhostPCL"; + case STRING_GHOSTPCL_ERROR_DESC: + return L"libgpcl6 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."; case STRING_HW_NOT_AVAILABLE_MACHINE: return L"Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine."; case STRING_HW_NOT_AVAILABLE_VIDEO: From 26d9d7131ac6e3067b71abf841a2107f594068d6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 22 Jun 2024 00:09:52 +0200 Subject: [PATCH 017/624] Mask out the upper 3 bits at MCR write, the serial ports now pass Check-It 2.1's MCR test. --- src/device/serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/serial.c b/src/device/serial.c index ab26fc622..2a61347a1 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -597,7 +597,7 @@ serial_write(uint16_t addr, uint8_t val, void *priv) serial_reset_fifo(dev); if (dev->sd && dev->sd->dtr_callback && (val ^ dev->mctrl) & 1) dev->sd->dtr_callback(dev, val & 1, dev->sd->priv); - dev->mctrl = val; + dev->mctrl = val & 0x1f; if (val & 0x10) { new_msr = (val & 0x0c) << 4; new_msr |= (val & 0x02) ? 0x10 : 0; From 77c6296084b189417c48fb4655dd86f471d3402b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 21 Jun 2024 18:08:44 -0400 Subject: [PATCH 018/624] Fix up scancode table formatting (Part 1) --- src/device/keyboard_at.c | 1116 +++++++++++++++++++++++------------ src/device/keyboard_xt.c | 515 ++++++++-------- src/machine/m_amstrad.c | 374 ++++++++---- src/machine/m_tandy.c | 515 ++++++++-------- src/machine/m_xt_olivetti.c | 1030 ++++++++++++++++---------------- 5 files changed, 2029 insertions(+), 1521 deletions(-) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 7accb2fd6..aea35e995 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -81,397 +81,769 @@ static uint16_t bat_counter = 0; static const scancode scancode_set1[512] = { // clang-format off - { { 0},{ 0} }, { { 0x01,0},{ 0x81,0} }, { { 0x02,0},{ 0x82,0} }, { { 0x03,0},{ 0x83,0} }, /*000*/ - { { 0x04,0},{ 0x84,0} }, { { 0x05,0},{ 0x85,0} }, { { 0x06,0},{ 0x86,0} }, { { 0x07,0},{ 0x87,0} }, /*004*/ - { { 0x08,0},{ 0x88,0} }, { { 0x09,0},{ 0x89,0} }, { { 0x0a,0},{ 0x8a,0} }, { { 0x0b,0},{ 0x8b,0} }, /*008*/ - { { 0x0c,0},{ 0x8c,0} }, { { 0x0d,0},{ 0x8d,0} }, { { 0x0e,0},{ 0x8e,0} }, { { 0x0f,0},{ 0x8f,0} }, /*00c*/ - { { 0x10,0},{ 0x90,0} }, { { 0x11,0},{ 0x91,0} }, { { 0x12,0},{ 0x92,0} }, { { 0x13,0},{ 0x93,0} }, /*010*/ - { { 0x14,0},{ 0x94,0} }, { { 0x15,0},{ 0x95,0} }, { { 0x16,0},{ 0x96,0} }, { { 0x17,0},{ 0x97,0} }, /*014*/ - { { 0x18,0},{ 0x98,0} }, { { 0x19,0},{ 0x99,0} }, { { 0x1a,0},{ 0x9a,0} }, { { 0x1b,0},{ 0x9b,0} }, /*018*/ - { { 0x1c,0},{ 0x9c,0} }, { { 0x1d,0},{ 0x9d,0} }, { { 0x1e,0},{ 0x9e,0} }, { { 0x1f,0},{ 0x9f,0} }, /*01c*/ - { { 0x20,0},{ 0xa0,0} }, { { 0x21,0},{ 0xa1,0} }, { { 0x22,0},{ 0xa2,0} }, { { 0x23,0},{ 0xa3,0} }, /*020*/ - { { 0x24,0},{ 0xa4,0} }, { { 0x25,0},{ 0xa5,0} }, { { 0x26,0},{ 0xa6,0} }, { { 0x27,0},{ 0xa7,0} }, /*024*/ - { { 0x28,0},{ 0xa8,0} }, { { 0x29,0},{ 0xa9,0} }, { { 0x2a,0},{ 0xaa,0} }, { { 0x2b,0},{ 0xab,0} }, /*028*/ - { { 0x2c,0},{ 0xac,0} }, { { 0x2d,0},{ 0xad,0} }, { { 0x2e,0},{ 0xae,0} }, { { 0x2f,0},{ 0xaf,0} }, /*02c*/ - { { 0x30,0},{ 0xb0,0} }, { { 0x31,0},{ 0xb1,0} }, { { 0x32,0},{ 0xb2,0} }, { { 0x33,0},{ 0xb3,0} }, /*030*/ - { { 0x34,0},{ 0xb4,0} }, { { 0x35,0},{ 0xb5,0} }, { { 0x36,0},{ 0xb6,0} }, { { 0x37,0},{ 0xb7,0} }, /*034*/ - { { 0x38,0},{ 0xb8,0} }, { { 0x39,0},{ 0xb9,0} }, { { 0x3a,0},{ 0xba,0} }, { { 0x3b,0},{ 0xbb,0} }, /*038*/ - { { 0x3c,0},{ 0xbc,0} }, { { 0x3d,0},{ 0xbd,0} }, { { 0x3e,0},{ 0xbe,0} }, { { 0x3f,0},{ 0xbf,0} }, /*03c*/ - { { 0x40,0},{ 0xc0,0} }, { { 0x41,0},{ 0xc1,0} }, { { 0x42,0},{ 0xc2,0} }, { { 0x43,0},{ 0xc3,0} }, /*040*/ - { { 0x44,0},{ 0xc4,0} }, { { 0x45,0},{ 0xc5,0} }, { { 0x46,0},{ 0xc6,0} }, { { 0x47,0},{ 0xc7,0} }, /*044*/ - { { 0x48,0},{ 0xc8,0} }, { { 0x49,0},{ 0xc9,0} }, { { 0x4a,0},{ 0xca,0} }, { { 0x4b,0},{ 0xcb,0} }, /*048*/ - { { 0x4c,0},{ 0xcc,0} }, { { 0x4d,0},{ 0xcd,0} }, { { 0x4e,0},{ 0xce,0} }, { { 0x4f,0},{ 0xcf,0} }, /*04c*/ - { { 0x50,0},{ 0xd0,0} }, { { 0x51,0},{ 0xd1,0} }, { { 0x52,0},{ 0xd2,0} }, { { 0x53,0},{ 0xd3,0} }, /*050*/ - { { 0x54,0},{ 0xd4,0} }, { { 0x55,0},{ 0xd5,0} }, { { 0x56,0},{ 0xd6,0} }, { { 0x57,0},{ 0xd7,0} }, /*054*/ - { { 0x58,0},{ 0xd8,0} }, { { 0x59,0},{ 0xd9,0} }, { { 0x5a,0},{ 0xda,0} }, { { 0x5b,0},{ 0xdb,0} }, /*058*/ - { { 0x5c,0},{ 0xdc,0} }, { { 0x5d,0},{ 0xdd,0} }, { { 0x5e,0},{ 0xde,0} }, { { 0x5f,0},{ 0xdf,0} }, /*05c*/ - { { 0x60,0},{ 0xe0,0} }, { { 0x61,0},{ 0xe1,0} }, { { 0x62,0},{ 0xe2,0} }, { { 0x63,0},{ 0xe3,0} }, /*060*/ - { { 0x64,0},{ 0xe4,0} }, { { 0x65,0},{ 0xe5,0} }, { { 0x66,0},{ 0xe6,0} }, { { 0x67,0},{ 0xe7,0} }, /*064*/ - { { 0x68,0},{ 0xe8,0} }, { { 0x69,0},{ 0xe9,0} }, { { 0x6a,0},{ 0xea,0} }, { { 0x6b,0},{ 0xeb,0} }, /*068*/ - { { 0x6c,0},{ 0xec,0} }, { { 0x6d,0},{ 0xed,0} }, { { 0x6e,0},{ 0xee,0} }, { { 0x6f,0},{ 0xef,0} }, /*06c*/ - { { 0x70,0},{ 0xf0,0} }, { { 0x71,0},{ 0xf1,0} }, { { 0x72,0},{ 0xf2,0} }, { { 0x73,0},{ 0xf3,0} }, /*070*/ - { { 0x74,0},{ 0xf4,0} }, { { 0x75,0},{ 0xf5,0} }, { { 0x76,0},{ 0xf6,0} }, { { 0x77,0},{ 0xf7,0} }, /*074*/ - { { 0x78,0},{ 0xf8,0} }, { { 0x79,0},{ 0xf9,0} }, { { 0x7a,0},{ 0xfa,0} }, { { 0x7b,0},{ 0xfb,0} }, /*078*/ - { { 0x7c,0},{ 0xfc,0} }, { { 0x7d,0},{ 0xfd,0} }, { { 0x7e,0},{ 0xfe,0} }, { { 0x7f,0},{ 0xff,0} }, /*07c*/ + { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ + { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ + { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ + { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ + { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ + { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ + { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ + { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ + { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ + { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ + { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ + { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ + { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ + { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ + { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ + { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ + { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ + { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ + { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ + { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ + { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ + { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ + { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ + { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ + { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ + { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ + { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ + { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ + { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ + { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ + { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ + { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ + { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ + { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ + { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ + { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ + { { 0x54, 0 }, { 0xd4, 0 } }, { { 0x55, 0 }, { 0xd5, 0 } }, /* 054 */ + { { 0x56, 0 }, { 0xd6, 0 } }, { { 0x57, 0 }, { 0xd7, 0 } }, /* 056 */ + { { 0x58, 0 }, { 0xd8, 0 } }, { { 0x59, 0 }, { 0xd9, 0 } }, /* 058 */ + { { 0x5a, 0 }, { 0xda, 0 } }, { { 0x5b, 0 }, { 0xdb, 0 } }, /* 05a */ + { { 0x5c, 0 }, { 0xdc, 0 } }, { { 0x5d, 0 }, { 0xdd, 0 } }, /* 05c */ + { { 0x5e, 0 }, { 0xde, 0 } }, { { 0x5f, 0 }, { 0xdf, 0 } }, /* 05e */ + { { 0x60, 0 }, { 0xe0, 0 } }, { { 0x61, 0 }, { 0xe1, 0 } }, /* 060 */ + { { 0x62, 0 }, { 0xe2, 0 } }, { { 0x63, 0 }, { 0xe3, 0 } }, /* 062 */ + { { 0x64, 0 }, { 0xe4, 0 } }, { { 0x65, 0 }, { 0xe5, 0 } }, /* 064 */ + { { 0x66, 0 }, { 0xe6, 0 } }, { { 0x67, 0 }, { 0xe7, 0 } }, /* 066 */ + { { 0x68, 0 }, { 0xe8, 0 } }, { { 0x69, 0 }, { 0xe9, 0 } }, /* 068 */ + { { 0x6a, 0 }, { 0xea, 0 } }, { { 0x6b, 0 }, { 0xeb, 0 } }, /* 06a */ + { { 0x6c, 0 }, { 0xec, 0 } }, { { 0x6d, 0 }, { 0xed, 0 } }, /* 06c */ + { { 0x6e, 0 }, { 0xee, 0 } }, { { 0x6f, 0 }, { 0xef, 0 } }, /* 06e */ + { { 0x70, 0 }, { 0xf0, 0 } }, { { 0x71, 0 }, { 0xf1, 0 } }, /* 070 */ + { { 0x72, 0 }, { 0xf2, 0 } }, { { 0x73, 0 }, { 0xf3, 0 } }, /* 072 */ + { { 0x74, 0 }, { 0xf4, 0 } }, { { 0x75, 0 }, { 0xf5, 0 } }, /* 074 */ + { { 0x76, 0 }, { 0xf6, 0 } }, { { 0x77, 0 }, { 0xf7, 0 } }, /* 076 */ + { { 0x78, 0 }, { 0xf8, 0 } }, { { 0x79, 0 }, { 0xf9, 0 } }, /* 078 */ + { { 0x7a, 0 }, { 0xfa, 0 } }, { { 0x7b, 0 }, { 0xfb, 0 } }, /* 07a */ + { { 0x7c, 0 }, { 0xfc, 0 } }, { { 0x7d, 0 }, { 0xfd, 0 } }, /* 07c */ + { { 0x7e, 0 }, { 0xfe, 0 } }, { { 0x7f, 0 }, { 0xff, 0 } }, /* 07e */ - { { 0x80,0},{ 0} }, { { 0x81,0},{ 0} }, { { 0x82,0},{ 0} }, { { 0},{ 0} }, /*080*/ - { { 0},{ 0} }, { { 0x85,0},{ 0} }, { { 0x86,0},{ 0} }, { { 0x87,0},{ 0} }, /*084*/ - { { 0x88,0},{ 0} }, { { 0x89,0},{ 0} }, { { 0x8a,0},{ 0} }, { { 0x8b,0},{ 0} }, /*088*/ - { { 0x8c,0},{ 0} }, { { 0x8d,0},{ 0} }, { { 0x8e,0},{ 0} }, { { 0x8f,0},{ 0} }, /*08c*/ - { { 0x90,0},{ 0} }, { { 0x91,0},{ 0} }, { { 0x92,0},{ 0} }, { { 0x93,0},{ 0} }, /*090*/ - { { 0x94,0},{ 0} }, { { 0x95,0},{ 0} }, { { 0x96,0},{ 0} }, { { 0x97,0},{ 0} }, /*094*/ - { { 0x98,0},{ 0} }, { { 0x99,0},{ 0} }, { { 0x9a,0},{ 0} }, { { 0x9b,0},{ 0} }, /*098*/ - { { 0x9c,0},{ 0} }, { { 0x9d,0},{ 0} }, { { 0x9e,0},{ 0} }, { { 0x9f,0},{ 0} }, /*09c*/ - { { 0xa0,0},{ 0} }, { { 0xa1,0},{ 0} }, { { 0xa2,0},{ 0} }, { { 0xa3,0},{ 0} }, /*0a0*/ - { { 0xa4,0},{ 0} }, { { 0xa5,0},{ 0} }, { { 0xa6,0},{ 0} }, { { 0xa7,0},{ 0} }, /*0a4*/ - { { 0xa8,0},{ 0} }, { { 0xa9,0},{ 0} }, { { 0xaa,0},{ 0} }, { { 0xab,0},{ 0} }, /*0a8*/ - { { 0xac,0},{ 0} }, { { 0xad,0},{ 0} }, { { 0xae,0},{ 0} }, { { 0xaf,0},{ 0} }, /*0ac*/ - { { 0xb0,0},{ 0} }, { { 0xb1,0},{ 0} }, { { 0xb2,0},{ 0} }, { { 0xb3,0},{ 0} }, /*0b0*/ - { { 0xb4,0},{ 0} }, { { 0xb5,0},{ 0} }, { { 0xb6,0},{ 0} }, { { 0xb7,0},{ 0} }, /*0b4*/ - { { 0xb8,0},{ 0} }, { { 0xb9,0},{ 0} }, { { 0xba,0},{ 0} }, { { 0xbb,0},{ 0} }, /*0b8*/ - { { 0xbc,0},{ 0} }, { { 0xbd,0},{ 0} }, { { 0xbe,0},{ 0} }, { { 0xbf,0},{ 0} }, /*0bc*/ - { { 0xc0,0},{ 0} }, { { 0xc1,0},{ 0} }, { { 0xc2,0},{ 0} }, { { 0xc3,0},{ 0} }, /*0c0*/ - { { 0xc4,0},{ 0} }, { { 0xc5,0},{ 0} }, { { 0xc6,0},{ 0} }, { { 0xc7,0},{ 0} }, /*0c4*/ - { { 0xc8,0},{ 0} }, { { 0xc9,0},{ 0} }, { { 0xca,0},{ 0} }, { { 0xcb,0},{ 0} }, /*0c8*/ - { { 0xcc,0},{ 0} }, { { 0xcd,0},{ 0} }, { { 0xce,0},{ 0} }, { { 0xcf,0},{ 0} }, /*0cc*/ - { { 0xd0,0},{ 0} }, { { 0xd1,0},{ 0} }, { { 0xd2,0},{ 0} }, { { 0xd3,0},{ 0} }, /*0d0*/ - { { 0xd4,0},{ 0} }, { { 0xd5,0},{ 0} }, { { 0xd6,0},{ 0} }, { { 0xd7,0},{ 0} }, /*0d4*/ - { { 0xd8,0},{ 0} }, { { 0xd9,0},{ 0} }, { { 0xda,0},{ 0} }, { { 0xdb,0},{ 0} }, /*0d8*/ - { { 0xdc,0},{ 0} }, { { 0xdd,0},{ 0} }, { { 0xde,0},{ 0} }, { { 0xdf,0},{ 0} }, /*0dc*/ - { { 0xe0,0},{ 0} }, { { 0xe1,0},{ 0} }, { { 0xe2,0},{ 0} }, { { 0xe3,0},{ 0} }, /*0e0*/ - { { 0xe4,0},{ 0} }, { { 0xe5,0},{ 0} }, { { 0xe6,0},{ 0} }, { { 0xe7,0},{ 0} }, /*0e4*/ - { { 0xe8,0},{ 0} }, { { 0xe9,0},{ 0} }, { { 0xea,0},{ 0} }, { { 0xeb,0},{ 0} }, /*0e8*/ - { { 0xec,0},{ 0} }, { { 0xed,0},{ 0} }, { { 0xee,0},{ 0} }, { { 0xef,0},{ 0} }, /*0ec*/ - { { 0},{ 0} }, { { 0xf1,0},{ 0} }, { { 0xf2,0},{ 0} }, { { 0xf3,0},{ 0} }, /*0f0*/ - { { 0xf4,0},{ 0} }, { { 0xf5,0},{ 0} }, { { 0xf6,0},{ 0} }, { { 0xf7,0},{ 0} }, /*0f4*/ - { { 0xf8,0},{ 0} }, { { 0xf9,0},{ 0} }, { { 0xfa,0},{ 0} }, { { 0xfb,0},{ 0} }, /*0f8*/ - { { 0xfc,0},{ 0} }, { { 0xfd,0},{ 0} }, { { 0xfe,0},{ 0} }, { { 0xff,0},{ 0} }, /*0fc*/ + { { 0x80, 0 }, { 0 } }, { { 0x81, 0 }, { 0 } }, /* 080 */ + { { 0x82, 0 }, { 0 } }, { { 0 } ,{ 0 } }, /* 082 */ + { { 0 }, { 0 } }, { { 0x85, 0 }, { 0 } }, /* 084 */ + { { 0x86, 0 }, { 0 } }, { { 0x87, 0 }, { 0 } }, /* 086 */ + { { 0x88, 0 }, { 0 } }, { { 0x89, 0 }, { 0 } }, /* 088 */ + { { 0x8a, 0 }, { 0 } }, { { 0x8b, 0 }, { 0 } }, /* 08a */ + { { 0x8c, 0 }, { 0 } }, { { 0x8d, 0 }, { 0 } }, /* 08c */ + { { 0x8e, 0 }, { 0 } }, { { 0x8f, 0 }, { 0 } }, /* 08e */ + { { 0x90, 0 }, { 0 } }, { { 0x91, 0 }, { 0 } }, /* 090 */ + { { 0x92, 0 }, { 0 } }, { { 0x93, 0 }, { 0 } }, /* 092 */ + { { 0x94, 0 }, { 0 } }, { { 0x95, 0 }, { 0 } }, /* 094 */ + { { 0x96, 0 }, { 0 } }, { { 0x97, 0 }, { 0 } }, /* 096 */ + { { 0x98, 0 }, { 0 } }, { { 0x99, 0 }, { 0 } }, /* 098 */ + { { 0x9a, 0 }, { 0 } }, { { 0x9b, 0 }, { 0 } }, /* 09a */ + { { 0x9c, 0 }, { 0 } }, { { 0x9d, 0 }, { 0 } }, /* 09c */ + { { 0x9e, 0 }, { 0 } }, { { 0x9f, 0 }, { 0 } }, /* 09e */ + { { 0xa0, 0 }, { 0 } }, { { 0xa1, 0 }, { 0 } }, /* 0a0 */ + { { 0xa2, 0 }, { 0 } }, { { 0xa3, 0 }, { 0 } }, /* 0a2 */ + { { 0xa4, 0 }, { 0 } }, { { 0xa5, 0 }, { 0 } }, /* 0a4 */ + { { 0xa6, 0 }, { 0 } }, { { 0xa7, 0 }, { 0 } }, /* 0a6 */ + { { 0xa8, 0 }, { 0 } }, { { 0xa9, 0 }, { 0 } }, /* 0a8 */ + { { 0xaa, 0 }, { 0 } }, { { 0xab, 0 }, { 0 } }, /* 0aa */ + { { 0xac, 0 }, { 0 } }, { { 0xad, 0 }, { 0 } }, /* 0ac */ + { { 0xae, 0 }, { 0 } }, { { 0xaf, 0 }, { 0 } }, /* 0ae */ + { { 0xb0, 0 }, { 0 } }, { { 0xb1, 0 }, { 0 } }, /* 0b0 */ + { { 0xb2, 0 }, { 0 } }, { { 0xb3, 0 }, { 0 } }, /* 0b2 */ + { { 0xb4, 0 }, { 0 } }, { { 0xb5, 0 }, { 0 } }, /* 0b4 */ + { { 0xb6, 0 }, { 0 } }, { { 0xb7, 0 }, { 0 } }, /* 0b6 */ + { { 0xb8, 0 }, { 0 } }, { { 0xb9, 0 }, { 0 } }, /* 0b8 */ + { { 0xba, 0 }, { 0 } }, { { 0xbb, 0 }, { 0 } }, /* 0ba */ + { { 0xbc, 0 }, { 0 } }, { { 0xbd, 0 }, { 0 } }, /* 0bc */ + { { 0xbe, 0 }, { 0 } }, { { 0xbf, 0 }, { 0 } }, /* 0be */ + { { 0xc0, 0 }, { 0 } }, { { 0xc1, 0 }, { 0 } }, /* 0c0 */ + { { 0xc2, 0 }, { 0 } }, { { 0xc3, 0 }, { 0 } }, /* 0c2 */ + { { 0xc4, 0 }, { 0 } }, { { 0xc5, 0 }, { 0 } }, /* 0c4 */ + { { 0xc6, 0 }, { 0 } }, { { 0xc7, 0 }, { 0 } }, /* 0c6 */ + { { 0xc8, 0 }, { 0 } }, { { 0xc9, 0 }, { 0 } }, /* 0c8 */ + { { 0xca, 0 }, { 0 } }, { { 0xcb, 0 }, { 0 } }, /* 0ca */ + { { 0xcc, 0 }, { 0 } }, { { 0xcd, 0 }, { 0 } }, /* 0cc */ + { { 0xce, 0 }, { 0 } }, { { 0xcf, 0 }, { 0 } }, /* 0ce */ + { { 0xd0, 0 }, { 0 } }, { { 0xd1, 0 }, { 0 } }, /* 0d0 */ + { { 0xd2, 0 }, { 0 } }, { { 0xd3, 0 }, { 0 } }, /* 0d2 */ + { { 0xd4, 0 }, { 0 } }, { { 0xd5, 0 }, { 0 } }, /* 0d4 */ + { { 0xd6, 0 }, { 0 } }, { { 0xd7, 0 }, { 0 } }, /* 0d6 */ + { { 0xd8, 0 }, { 0 } }, { { 0xd9, 0 }, { 0 } }, /* 0d8 */ + { { 0xda, 0 }, { 0 } }, { { 0xdb, 0 }, { 0 } }, /* 0da */ + { { 0xdc, 0 }, { 0 } }, { { 0xdd, 0 }, { 0 } }, /* 0dc */ + { { 0xde, 0 }, { 0 } }, { { 0xdf, 0 }, { 0 } }, /* 0de */ + { { 0xe0, 0 }, { 0 } }, { { 0xe1, 0 }, { 0 } }, /* 0e0 */ + { { 0xe2, 0 }, { 0 } }, { { 0xe3, 0 }, { 0 } }, /* 0e2 */ + { { 0xe4, 0 }, { 0 } }, { { 0xe5, 0 }, { 0 } }, /* 0e4 */ + { { 0xe6, 0 }, { 0 } }, { { 0xe7, 0 }, { 0 } }, /* 0e6 */ + { { 0xe8, 0 }, { 0 } }, { { 0xe9, 0 }, { 0 } }, /* 0e8 */ + { { 0xea, 0 }, { 0 } }, { { 0xeb, 0 }, { 0 } }, /* 0ea */ + { { 0xec, 0 }, { 0 } }, { { 0xed, 0 }, { 0 } }, /* 0ec */ + { { 0xee, 0 }, { 0 } }, { { 0xef, 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, { { 0xf1, 0 }, { 0 } }, /* 0f0 */ + { { 0xf2, 0 }, { 0 } }, { { 0xf3, 0 }, { 0 } }, /* 0f2 */ + { { 0xf4, 0 }, { 0 } }, { { 0xf5, 0 }, { 0 } }, /* 0f4 */ + { { 0xf6, 0 }, { 0 } }, { { 0xf7, 0 }, { 0 } }, /* 0f6 */ + { { 0xf8, 0 }, { 0 } }, { { 0xf9, 0 }, { 0 } }, /* 0f8 */ + { { 0xfa, 0 }, { 0 } }, { { 0xfb, 0 }, { 0 } }, /* 0fa */ + { { 0xfc, 0 }, { 0 } }, { { 0xfd, 0 }, { 0 } }, /* 0fc */ + { { 0xfe, 0 }, { 0 } }, { { 0xff, 0 }, { 0 } }, /* 0fe */ - { {0xe1,0x1d,0},{0xe1, 0x9d,0} }, { {0xe0,0x01,0},{0xe0, 0x81,0} }, { {0xe0,0x02,0},{0xe0, 0x82,0} }, { {0xe0,0x03,0},{0xe0, 0x83,0} }, /*100*/ - { {0xe0,0x04,0},{0xe0, 0x84,0} }, { {0xe0,0x05,0},{0xe0, 0x85,0} }, { {0xe0,0x06,0},{0xe0, 0x86,0} }, { {0xe0,0x07,0},{0xe0, 0x87,0} }, /*104*/ - { {0xe0,0x08,0},{0xe0, 0x88,0} }, { {0xe0,0x09,0},{0xe0, 0x89,0} }, { {0xe0,0x0a,0},{0xe0, 0x8a,0} }, { {0xe0,0x0b,0},{0xe0, 0x8b,0} }, /*108*/ - { {0xe0,0x0c,0},{0xe0, 0x8c,0} }, { { 0},{ 0} }, { {0xe0,0x0e,0},{0xe0, 0x8e,0} }, { {0xe0,0x0f,0},{0xe0, 0x8f,0} }, /*10c*/ - { {0xe0,0x10,0},{0xe0, 0x90,0} }, { {0xe0,0x11,0},{0xe0, 0x91,0} }, { {0xe0,0x12,0},{0xe0, 0x92,0} }, { {0xe0,0x13,0},{0xe0, 0x93,0} }, /*110*/ - { {0xe0,0x14,0},{0xe0, 0x94,0} }, { {0xe0,0x15,0},{0xe0, 0x95,0} }, { {0xe0,0x16,0},{0xe0, 0x96,0} }, { {0xe0,0x17,0},{0xe0, 0x97,0} }, /*114*/ - { {0xe0,0x18,0},{0xe0, 0x98,0} }, { {0xe0,0x19,0},{0xe0, 0x99,0} }, { {0xe0,0x1a,0},{0xe0, 0x9a,0} }, { {0xe0,0x1b,0},{0xe0, 0x9b,0} }, /*118*/ - { {0xe0,0x1c,0},{0xe0, 0x9c,0} }, { {0xe0,0x1d,0},{0xe0, 0x9d,0} }, { {0xe0,0x1e,0},{0xe0, 0x9e,0} }, { {0xe0,0x1f,0},{0xe0, 0x9f,0} }, /*11c*/ - { {0xe0,0x20,0},{0xe0, 0xa0,0} }, { {0xe0,0x21,0},{0xe0, 0xa1,0} }, { {0xe0,0x22,0},{0xe0, 0xa2,0} }, { {0xe0,0x23,0},{0xe0, 0xa3,0} }, /*120*/ - { {0xe0,0x24,0},{0xe0, 0xa4,0} }, { {0xe0,0x25,0},{0xe0, 0xa5,0} }, { {0xe0,0x26,0},{0xe0, 0xa6,0} }, { { 0},{ 0} }, /*124*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*128*/ - { {0xe0,0x2c,0},{0xe0, 0xac,0} }, { {0xe0,0x2d,0},{0xe0, 0xad,0} }, { {0xe0,0x2e,0},{0xe0, 0xae,0} }, { {0xe0,0x2f,0},{0xe0, 0xaf,0} }, /*12c*/ - { {0xe0,0x30,0},{0xe0, 0xb0,0} }, { {0xe0,0x31,0},{0xe0, 0xb1,0} }, { {0xe0,0x32,0},{0xe0, 0xb2,0} }, { { 0},{ 0} }, /*130*/ - { {0xe0,0x34,0},{0xe0, 0xb4,0} }, { {0xe0,0x35,0},{0xe0, 0xb5,0} }, { { 0},{ 0} }, { {0xe0,0x37,0},{0xe0, 0xb7,0} }, /*134*/ - { {0xe0,0x38,0},{0xe0, 0xb8,0} }, { { 0},{ 0} }, { {0xe0,0x3a,0},{0xe0, 0xba,0} }, { {0xe0,0x3b,0},{0xe0, 0xbb,0} }, /*138*/ - { {0xe0,0x3c,0},{0xe0, 0xbc,0} }, { {0xe0,0x3d,0},{0xe0, 0xbd,0} }, { {0xe0,0x3e,0},{0xe0, 0xbe,0} }, { {0xe0,0x3f,0},{0xe0, 0xbf,0} }, /*13c*/ - { {0xe0,0x40,0},{0xe0, 0xc0,0} }, { {0xe0,0x41,0},{0xe0, 0xc1,0} }, { {0xe0,0x42,0},{0xe0, 0xc2,0} }, { {0xe0,0x43,0},{0xe0, 0xc3,0} }, /*140*/ - { {0xe0,0x44,0},{0xe0, 0xc4,0} }, { { 0},{ 0} }, { {0xe0,0x46,0},{0xe0, 0xc6,0} }, { {0xe0,0x47,0},{0xe0, 0xc7,0} }, /*144*/ - { {0xe0,0x48,0},{0xe0, 0xc8,0} }, { {0xe0,0x49,0},{0xe0, 0xc9,0} }, { { 0},{ 0} }, { {0xe0,0x4b,0},{0xe0, 0xcb,0} }, /*148*/ - { {0xe0,0x4c,0},{0xe0, 0xcc,0} }, { {0xe0,0x4d,0},{0xe0, 0xcd,0} }, { {0xe0,0x4e,0},{0xe0, 0xce,0} }, { {0xe0,0x4f,0},{0xe0, 0xcf,0} }, /*14c*/ - { {0xe0,0x50,0},{0xe0, 0xd0,0} }, { {0xe0,0x51,0},{0xe0, 0xd1,0} }, { {0xe0,0x52,0},{0xe0, 0xd2,0} }, { {0xe0,0x53,0},{0xe0, 0xd3,0} }, /*150*/ - { { 0},{ 0} }, { {0xe0,0x55,0},{0xe0, 0xd5,0} }, { { 0},{ 0} }, { {0xe0,0x57,0},{0xe0, 0xd7,0} }, /*154*/ - { {0xe0,0x58,0},{0xe0, 0xd8,0} }, { {0xe0,0x59,0},{0xe0, 0xd9,0} }, { {0xe0,0x5a,0},{0xe0, 0xaa,0} }, { {0xe0,0x5b,0},{0xe0, 0xdb,0} }, /*158*/ - { {0xe0,0x5c,0},{0xe0, 0xdc,0} }, { {0xe0,0x5d,0},{0xe0, 0xdd,0} }, { {0xe0,0x5e,0},{0xe0, 0xee,0} }, { {0xe0,0x5f,0},{0xe0, 0xdf,0} }, /*15c*/ - { { 0},{ 0} }, { {0xe0,0x61,0},{0xe0, 0xe1,0} }, { {0xe0,0x62,0},{0xe0, 0xe2,0} }, { {0xe0,0x63,0},{0xe0, 0xe3,0} }, /*160*/ - { {0xe0,0x64,0},{0xe0, 0xe4,0} }, { {0xe0,0x65,0},{0xe0, 0xe5,0} }, { {0xe0,0x66,0},{0xe0, 0xe6,0} }, { {0xe0,0x67,0},{0xe0, 0xe7,0} }, /*164*/ - { {0xe0,0x68,0},{0xe0, 0xe8,0} }, { {0xe0,0x69,0},{0xe0, 0xe9,0} }, { {0xe0,0x6a,0},{0xe0, 0xea,0} }, { {0xe0,0x6b,0},{0xe0, 0xeb,0} }, /*168*/ - { {0xe0,0x6c,0},{0xe0, 0xec,0} }, { {0xe0,0x6d,0},{0xe0, 0xed,0} }, { {0xe0,0x6e,0},{0xe0, 0xee,0} }, { { 0},{ 0} }, /*16c*/ - { {0xe0,0x70,0},{0xe0, 0xf0,0} }, { {0xe0,0x71,0},{0xe0, 0xf1,0} }, { {0xe0,0x72,0},{0xe0, 0xf2,0} }, { {0xe0,0x73,0},{0xe0, 0xf3,0} }, /*170*/ - { {0xe0,0x74,0},{0xe0, 0xf4,0} }, { {0xe0,0x75,0},{0xe0, 0xf5,0} }, { { 0},{ 0} }, { {0xe0,0x77,0},{0xe0, 0xf7,0} }, /*174*/ - { {0xe0,0x78,0},{0xe0, 0xf8,0} }, { {0xe0,0x79,0},{0xe0, 0xf9,0} }, { {0xe0,0x7a,0},{0xe0, 0xfa,0} }, { {0xe0,0x7b,0},{0xe0, 0xfb,0} }, /*178*/ - { {0xe0,0x7c,0},{0xe0, 0xfc,0} }, { {0xe0,0x7d,0},{0xe0, 0xfd,0} }, { {0xe0,0x7e,0},{0xe0, 0xfe,0} }, { {0xe0,0x7f,0},{0xe0, 0xff,0} }, /*17c*/ + { { 0xe1, 0x1d, 0 }, { 0xe1, 0x9d, 0 } }, { { 0xe0, 0x01, 0 }, { 0xe0, 0x81, 0 } }, /* 100 */ + { { 0xe0, 0x02, 0 }, { 0xe0, 0x82, 0 } }, { { 0xe0, 0x03, 0 }, { 0xe0, 0x83, 0 } }, /* 102 */ + { { 0xe0, 0x04, 0 }, { 0xe0, 0x84, 0 } }, { { 0xe0, 0x05, 0 }, { 0xe0, 0x85, 0 } }, /* 104 */ + { { 0xe0, 0x06, 0 }, { 0xe0, 0x86, 0 } }, { { 0xe0, 0x07, 0 }, { 0xe0, 0x87, 0 } }, /* 106 */ + { { 0xe0, 0x08, 0 }, { 0xe0, 0x88, 0 } }, { { 0xe0, 0x09, 0 }, { 0xe0, 0x89, 0 } }, /* 108 */ + { { 0xe0, 0x0a, 0 }, { 0xe0, 0x8a, 0 } }, { { 0xe0, 0x0b, 0 }, { 0xe0, 0x8b, 0 } }, /* 10a */ + { { 0xe0, 0x0c, 0 }, { 0xe0, 0x8c, 0 } }, { { 0 }, { 0 } }, /* 10c */ + { { 0xe0, 0x0e, 0 }, { 0xe0, 0x8e, 0 } }, { { 0xe0, 0x0f, 0 }, { 0xe0, 0x8f, 0 } }, /* 10e */ + { { 0xe0, 0x10, 0 }, { 0xe0, 0x90, 0 } }, { { 0xe0, 0x11, 0 }, { 0xe0, 0x91, 0 } }, /* 110 */ + { { 0xe0, 0x12, 0 }, { 0xe0, 0x92, 0 } }, { { 0xe0, 0x13, 0 }, { 0xe0, 0x93, 0 } }, /* 112 */ + { { 0xe0, 0x14, 0 }, { 0xe0, 0x94, 0 } }, { { 0xe0, 0x15, 0 }, { 0xe0, 0x95, 0 } }, /* 114 */ + { { 0xe0, 0x16, 0 }, { 0xe0, 0x96, 0 } }, { { 0xe0, 0x17, 0 }, { 0xe0, 0x97, 0 } }, /* 116 */ + { { 0xe0, 0x18, 0 }, { 0xe0, 0x98, 0 } }, { { 0xe0, 0x19, 0 }, { 0xe0, 0x99, 0 } }, /* 118 */ + { { 0xe0, 0x1a, 0 }, { 0xe0, 0x9a, 0 } }, { { 0xe0, 0x1b, 0 }, { 0xe0, 0x9b, 0 } }, /* 11a */ + { { 0xe0, 0x1c, 0 }, { 0xe0, 0x9c, 0 } }, { { 0xe0, 0x1d, 0 }, { 0xe0, 0x9d, 0 } }, /* 11c */ + { { 0xe0, 0x1e, 0 }, { 0xe0, 0x9e, 0 } }, { { 0xe0, 0x1f, 0 }, { 0xe0, 0x9f, 0 } }, /* 11e */ + { { 0xe0, 0x20, 0 }, { 0xe0, 0xa0, 0 } }, { { 0xe0, 0x21, 0 }, { 0xe0, 0xa1, 0 } }, /* 120 */ + { { 0xe0, 0x22, 0 }, { 0xe0, 0xa2, 0 } }, { { 0xe0, 0x23, 0 }, { 0xe0, 0xa3, 0 } }, /* 122 */ + { { 0xe0, 0x24, 0 }, { 0xe0, 0xa4, 0 } }, { { 0xe0, 0x25, 0 }, { 0xe0, 0xa5, 0 } }, /* 124 */ + { { 0xe0, 0x26, 0 }, { 0xe0, 0xa6, 0 } }, { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ + { { 0xe0, 0x2c, 0 }, { 0xe0, 0xac, 0 } }, { { 0xe0, 0x2d, 0 }, { 0xe0, 0xad, 0 } }, /* 12c */ + { { 0xe0, 0x2e, 0 }, { 0xe0, 0xae, 0 } }, { { 0xe0, 0x2f, 0 }, { 0xe0, 0xaf, 0 } }, /* 12e */ + { { 0xe0, 0x30, 0 }, { 0xe0, 0xb0, 0 } }, { { 0xe0, 0x31, 0 }, { 0xe0, 0xb1, 0 } }, /* 130 */ + { { 0xe0, 0x32, 0 }, { 0xe0, 0xb2, 0 } }, { { 0 }, { 0 } }, /* 132 */ + { { 0xe0, 0x34, 0 }, { 0xe0, 0xb4, 0 } }, { { 0xe0, 0x35, 0 }, { 0xe0, 0xb5, 0 } }, /* 134 */ + { { 0 }, { 0 } }, { { 0xe0, 0x37, 0 }, { 0xe0, 0xb7, 0 } }, /* 136 */ + { { 0xe0, 0x38, 0 }, { 0xe0, 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ + { { 0xe0, 0x3a, 0 }, { 0xe0, 0xba, 0 } }, { { 0xe0, 0x3b, 0 }, { 0xe0, 0xbb, 0 } }, /* 13a */ + { { 0xe0, 0x3c, 0 }, { 0xe0, 0xbc, 0 } }, { { 0xe0, 0x3d, 0 }, { 0xe0, 0xbd, 0 } }, /* 13c */ + { { 0xe0, 0x3e, 0 }, { 0xe0, 0xbe, 0 } }, { { 0xe0, 0x3f, 0 }, { 0xe0, 0xbf, 0 } }, /* 13e */ + { { 0xe0, 0x40, 0 }, { 0xe0, 0xc0, 0 } }, { { 0xe0, 0x41, 0 }, { 0xe0, 0xc1, 0 } }, /* 140 */ + { { 0xe0, 0x42, 0 }, { 0xe0, 0xc2, 0 } }, { { 0xe0, 0x43, 0 }, { 0xe0, 0xc3, 0 } }, /* 142 */ + { { 0xe0, 0x44, 0 }, { 0xe0, 0xc4, 0 } }, { { 0 }, { 0 } }, /* 144 */ + { { 0xe0, 0x46, 0 }, { 0xe0, 0xc6, 0 } }, { { 0xe0, 0x47, 0 }, { 0xe0, 0xc7, 0 } }, /* 146 */ + { { 0xe0, 0x48, 0 }, { 0xe0, 0xc8, 0 } }, { { 0xe0, 0x49, 0 }, { 0xe0, 0xc9, 0 } }, /* 148 */ + { { 0 }, { 0 } }, { { 0xe0, 0x4b, 0 }, { 0xe0, 0xcb, 0 } }, /* 14a */ + { { 0xe0, 0x4c, 0 }, { 0xe0, 0xcc, 0 } }, { { 0xe0, 0x4d, 0 }, { 0xe0, 0xcd, 0 } }, /* 14c */ + { { 0xe0, 0x4e, 0 }, { 0xe0, 0xce, 0 } }, { { 0xe0, 0x4f, 0 }, { 0xe0, 0xcf, 0 } }, /* 14e */ + { { 0xe0, 0x50, 0 }, { 0xe0, 0xd0, 0 } }, { { 0xe0, 0x51, 0 }, { 0xe0, 0xd1, 0 } }, /* 150 */ + { { 0xe0, 0x52, 0 }, { 0xe0, 0xd2, 0 } }, { { 0xe0, 0x53, 0 }, { 0xe0, 0xd3, 0 } }, /* 152 */ + { { 0 }, { 0 } }, { { 0xe0, 0x55, 0 }, { 0xe0, 0xd5, 0 } }, /* 154 */ + { { 0 }, { 0 } }, { { 0xe0, 0x57, 0 }, { 0xe0, 0xd7, 0 } }, /* 156 */ + { { 0xe0, 0x58, 0 }, { 0xe0, 0xd8, 0 } }, { { 0xe0, 0x59, 0 }, { 0xe0, 0xd9, 0 } }, /* 158 */ + { { 0xe0, 0x5a, 0 }, { 0xe0, 0xaa, 0 } }, { { 0xe0, 0x5b, 0 }, { 0xe0, 0xdb, 0 } }, /* 15a */ + { { 0xe0, 0x5c, 0 }, { 0xe0, 0xdc, 0 } }, { { 0xe0, 0x5d, 0 }, { 0xe0, 0xdd, 0 } }, /* 15c */ + { { 0xe0, 0x5e, 0 }, { 0xe0, 0xee, 0 } }, { { 0xe0, 0x5f, 0 }, { 0xe0, 0xdf, 0 } }, /* 15e */ + { { 0 }, { 0 } }, { { 0xe0, 0x61, 0 }, { 0xe0, 0xe1, 0 } }, /* 160 */ + { { 0xe0, 0x62, 0 }, { 0xe0, 0xe2, 0 } }, { { 0xe0, 0x63, 0 }, { 0xe0, 0xe3, 0 } }, /* 162 */ + { { 0xe0, 0x64, 0 }, { 0xe0, 0xe4, 0 } }, { { 0xe0, 0x65, 0 }, { 0xe0, 0xe5, 0 } }, /* 164 */ + { { 0xe0, 0x66, 0 }, { 0xe0, 0xe6, 0 } }, { { 0xe0, 0x67, 0 }, { 0xe0, 0xe7, 0 } }, /* 166 */ + { { 0xe0, 0x68, 0 }, { 0xe0, 0xe8, 0 } }, { { 0xe0, 0x69, 0 }, { 0xe0, 0xe9, 0 } }, /* 168 */ + { { 0xe0, 0x6a, 0 }, { 0xe0, 0xea, 0 } }, { { 0xe0, 0x6b, 0 }, { 0xe0, 0xeb, 0 } }, /* 16a */ + { { 0xe0, 0x6c, 0 }, { 0xe0, 0xec, 0 } }, { { 0xe0, 0x6d, 0 }, { 0xe0, 0xed, 0 } }, /* 16c */ + { { 0xe0, 0x6e, 0 }, { 0xe0, 0xee, 0 } }, { { 0 }, { 0 } }, /* 16e */ + { { 0xe0, 0x70, 0 }, { 0xe0, 0xf0, 0 } }, { { 0xe0, 0x71, 0 }, { 0xe0, 0xf1, 0 } }, /* 170 */ + { { 0xe0, 0x72, 0 }, { 0xe0, 0xf2, 0 } }, { { 0xe0, 0x73, 0 }, { 0xe0, 0xf3, 0 } }, /* 172 */ + { { 0xe0, 0x74, 0 }, { 0xe0, 0xf4, 0 } }, { { 0xe0, 0x75, 0 }, { 0xe0, 0xf5, 0 } }, /* 174 */ + { { 0 }, { 0 } }, { { 0xe0, 0x77, 0 }, { 0xe0, 0xf7, 0 } }, /* 176 */ + { { 0xe0, 0x78, 0 }, { 0xe0, 0xf8, 0 } }, { { 0xe0, 0x79, 0 }, { 0xe0, 0xf9, 0 } }, /* 178 */ + { { 0xe0, 0x7a, 0 }, { 0xe0, 0xfa, 0 } }, { { 0xe0, 0x7b, 0 }, { 0xe0, 0xfb, 0 } }, /* 17a */ + { { 0xe0, 0x7c, 0 }, { 0xe0, 0xfc, 0 } }, { { 0xe0, 0x7d, 0 }, { 0xe0, 0xfd, 0 } }, /* 17c */ + { { 0xe0, 0x7e, 0 }, { 0xe0, 0xfe, 0 } }, { { 0xe0, 0x7f, 0 }, { 0xe0, 0xff, 0 } }, /* 17e */ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*180*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*184*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*188*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*18c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*190*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*194*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*198*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*19c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1ac*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1cc*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1dc*/ - { { 0},{ 0} }, { {0xe0,0xe1,0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xee,0},{ 0} }, { { 0},{ 0} }, /*1ec*/ - { { 0},{ 0} }, { {0xe0,0xf1,0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{ 0} }, { {0xe0,0xff,0},{ 0} } /*1fc*/ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, { { 0xe0, 0xe1, 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ + { { 0xe0, 0xee, 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, { { 0xe0, 0xf1, 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ + { { 0xe0, 0xfe, 0 }, { 0 } }, { { 0xe0, 0xff, 0 }, { 0 } } /* 1fe */ // clang-format on }; static const scancode scancode_set2[512] = { // clang-format off - { { 0},{ 0} }, { { 0x76,0},{ 0xF0,0x76,0} }, { { 0x16,0},{ 0xF0,0x16,0} }, { { 0x1E,0},{ 0xF0,0x1E,0} }, /*000*/ - { { 0x26,0},{ 0xF0,0x26,0} }, { { 0x25,0},{ 0xF0,0x25,0} }, { { 0x2E,0},{ 0xF0,0x2E,0} }, { { 0x36,0},{ 0xF0,0x36,0} }, /*004*/ - { { 0x3D,0},{ 0xF0,0x3D,0} }, { { 0x3E,0},{ 0xF0,0x3E,0} }, { { 0x46,0},{ 0xF0,0x46,0} }, { { 0x45,0},{ 0xF0,0x45,0} }, /*008*/ - { { 0x4E,0},{ 0xF0,0x4E,0} }, { { 0x55,0},{ 0xF0,0x55,0} }, { { 0x66,0},{ 0xF0,0x66,0} }, { { 0x0D,0},{ 0xF0,0x0D,0} }, /*00c*/ - { { 0x15,0},{ 0xF0,0x15,0} }, { { 0x1D,0},{ 0xF0,0x1D,0} }, { { 0x24,0},{ 0xF0,0x24,0} }, { { 0x2D,0},{ 0xF0,0x2D,0} }, /*010*/ - { { 0x2C,0},{ 0xF0,0x2C,0} }, { { 0x35,0},{ 0xF0,0x35,0} }, { { 0x3C,0},{ 0xF0,0x3C,0} }, { { 0x43,0},{ 0xF0,0x43,0} }, /*014*/ - { { 0x44,0},{ 0xF0,0x44,0} }, { { 0x4D,0},{ 0xF0,0x4D,0} }, { { 0x54,0},{ 0xF0,0x54,0} }, { { 0x5B,0},{ 0xF0,0x5B,0} }, /*018*/ - { { 0x5A,0},{ 0xF0,0x5A,0} }, { { 0x14,0},{ 0xF0,0x14,0} }, { { 0x1C,0},{ 0xF0,0x1C,0} }, { { 0x1B,0},{ 0xF0,0x1B,0} }, /*01c*/ - { { 0x23,0},{ 0xF0,0x23,0} }, { { 0x2B,0},{ 0xF0,0x2B,0} }, { { 0x34,0},{ 0xF0,0x34,0} }, { { 0x33,0},{ 0xF0,0x33,0} }, /*020*/ - { { 0x3B,0},{ 0xF0,0x3B,0} }, { { 0x42,0},{ 0xF0,0x42,0} }, { { 0x4B,0},{ 0xF0,0x4B,0} }, { { 0x4C,0},{ 0xF0,0x4C,0} }, /*024*/ - { { 0x52,0},{ 0xF0,0x52,0} }, { { 0x0E,0},{ 0xF0,0x0E,0} }, { { 0x12,0},{ 0xF0,0x12,0} }, { { 0x5D,0},{ 0xF0,0x5D,0} }, /*028*/ - { { 0x1A,0},{ 0xF0,0x1A,0} }, { { 0x22,0},{ 0xF0,0x22,0} }, { { 0x21,0},{ 0xF0,0x21,0} }, { { 0x2A,0},{ 0xF0,0x2A,0} }, /*02c*/ - { { 0x32,0},{ 0xF0,0x32,0} }, { { 0x31,0},{ 0xF0,0x31,0} }, { { 0x3A,0},{ 0xF0,0x3A,0} }, { { 0x41,0},{ 0xF0,0x41,0} }, /*030*/ - { { 0x49,0},{ 0xF0,0x49,0} }, { { 0x4A,0},{ 0xF0,0x4A,0} }, { { 0x59,0},{ 0xF0,0x59,0} }, { { 0x7C,0},{ 0xF0,0x7C,0} }, /*034*/ - { { 0x11,0},{ 0xF0,0x11,0} }, { { 0x29,0},{ 0xF0,0x29,0} }, { { 0x58,0},{ 0xF0,0x58,0} }, { { 0x05,0},{ 0xF0,0x05,0} }, /*038*/ - { { 0x06,0},{ 0xF0,0x06,0} }, { { 0x04,0},{ 0xF0,0x04,0} }, { { 0x0C,0},{ 0xF0,0x0C,0} }, { { 0x03,0},{ 0xF0,0x03,0} }, /*03c*/ - { { 0x0B,0},{ 0xF0,0x0B,0} }, { { 0x83,0},{ 0xF0,0x83,0} }, { { 0x0A,0},{ 0xF0,0x0A,0} }, { { 0x01,0},{ 0xF0,0x01,0} }, /*040*/ - { { 0x09,0},{ 0xF0,0x09,0} }, { { 0x77,0},{ 0xF0,0x77,0} }, { { 0x7E,0},{ 0xF0,0x7E,0} }, { { 0x6C,0},{ 0xF0,0x6C,0} }, /*044*/ - { { 0x75,0},{ 0xF0,0x75,0} }, { { 0x7D,0},{ 0xF0,0x7D,0} }, { { 0x7B,0},{ 0xF0,0x7B,0} }, { { 0x6B,0},{ 0xF0,0x6B,0} }, /*048*/ - { { 0x73,0},{ 0xF0,0x73,0} }, { { 0x74,0},{ 0xF0,0x74,0} }, { { 0x79,0},{ 0xF0,0x79,0} }, { { 0x69,0},{ 0xF0,0x69,0} }, /*04c*/ - { { 0x72,0},{ 0xF0,0x72,0} }, { { 0x7A,0},{ 0xF0,0x7A,0} }, { { 0x70,0},{ 0xF0,0x70,0} }, { { 0x71,0},{ 0xF0,0x71,0} }, /*050*/ - { { 0x84,0},{ 0xF0,0x84,0} }, { { 0x60,0},{ 0xF0,0x60,0} }, { { 0x61,0},{ 0xF0,0x61,0} }, { { 0x78,0},{ 0xF0,0x78,0} }, /*054*/ - { { 0x07,0},{ 0xF0,0x07,0} }, { { 0x0F,0},{ 0xF0,0x0F,0} }, { { 0x17,0},{ 0xF0,0x17,0} }, { { 0x1F,0},{ 0xF0,0x1F,0} }, /*058*/ - { { 0x27,0},{ 0xF0,0x27,0} }, { { 0x2F,0},{ 0xF0,0x2F,0} }, { { 0x37,0},{ 0xF0,0x37,0} }, { { 0x3F,0},{ 0xF0,0x3F,0} }, /*05c*/ - { { 0x47,0},{ 0xF0,0x47,0} }, { { 0x4F,0},{ 0xF0,0x4F,0} }, { { 0x56,0},{ 0xF0,0x56,0} }, { { 0x5E,0},{ 0xF0,0x5E,0} }, /*060*/ - { { 0x08,0},{ 0xF0,0x08,0} }, { { 0x10,0},{ 0xF0,0x10,0} }, { { 0x18,0},{ 0xF0,0x18,0} }, { { 0x20,0},{ 0xF0,0x20,0} }, /*064*/ - { { 0x28,0},{ 0xF0,0x28,0} }, { { 0x30,0},{ 0xF0,0x30,0} }, { { 0x38,0},{ 0xF0,0x38,0} }, { { 0x40,0},{ 0xF0,0x40,0} }, /*068*/ - { { 0x48,0},{ 0xF0,0x48,0} }, { { 0x50,0},{ 0xF0,0x50,0} }, { { 0x57,0},{ 0xF0,0x57,0} }, { { 0x6F,0},{ 0xF0,0x6F,0} }, /*06c*/ - { { 0x13,0},{ 0xF0,0x13,0} }, { { 0x19,0},{ 0xF0,0x19,0} }, { { 0x39,0},{ 0xF0,0x39,0} }, { { 0x51,0},{ 0xF0,0x51,0} }, /*070*/ - { { 0x53,0},{ 0xF0,0x53,0} }, { { 0x5C,0},{ 0xF0,0x5C,0} }, { { 0x5F,0},{ 0xF0,0x5F,0} }, { { 0x62,0},{ 0xF0,0x62,0} }, /*074*/ - { { 0x63,0},{ 0xF0,0x63,0} }, { { 0x64,0},{ 0xF0,0x64,0} }, { { 0x65,0},{ 0xF0,0x65,0} }, { { 0x67,0},{ 0xF0,0x67,0} }, /*078*/ - { { 0x68,0},{ 0xF0,0x68,0} }, { { 0x6A,0},{ 0xF0,0x6A,0} }, { { 0x6D,0},{ 0xF0,0x6D,0} }, { { 0x6E,0},{ 0xF0,0x6E,0} }, /*07c*/ + { { 0 }, { 0 } }, { { 0x76, 0 }, { 0xF0, 0x76, 0 } }, /* 000 */ + { { 0x16, 0 }, { 0xF0, 0x16, 0 } }, { { 0x1E, 0 }, { 0xF0, 0x1E, 0 } }, /* 002 */ + { { 0x26, 0 }, { 0xF0, 0x26, 0 } }, { { 0x25, 0 }, { 0xF0, 0x25, 0 } }, + { { 0x2E, 0 }, { 0xF0, 0x2E, 0 } }, { { 0x36, 0 }, { 0xF0, 0x36, 0 } }, /* 004 */ + { { 0x3D, 0 }, { 0xF0, 0x3D, 0 } }, { { 0x3E, 0 }, { 0xF0, 0x3E, 0 } }, + { { 0x46, 0 }, { 0xF0, 0x46, 0 } }, { { 0x45, 0 }, { 0xF0, 0x45, 0 } }, /* 008 */ + { { 0x4E, 0 }, { 0xF0, 0x4E, 0 } }, { { 0x55, 0 }, { 0xF0, 0x55, 0 } }, + { { 0x66, 0 }, { 0xF0, 0x66, 0 } }, { { 0x0D, 0 }, { 0xF0, 0x0D, 0 } }, /* 00c */ + { { 0x15, 0 }, { 0xF0, 0x15, 0 } }, { { 0x1D, 0 }, { 0xF0, 0x1D, 0 } }, + { { 0x24, 0 }, { 0xF0, 0x24, 0 } }, { { 0x2D, 0 }, { 0xF0, 0x2D, 0 } }, /* 010 */ + { { 0x2C, 0 }, { 0xF0, 0x2C, 0 } }, { { 0x35, 0 }, { 0xF0, 0x35, 0 } }, + { { 0x3C, 0 }, { 0xF0, 0x3C, 0 } }, { { 0x43, 0 }, { 0xF0, 0x43, 0 } }, /* 014 */ + { { 0x44, 0 }, { 0xF0, 0x44, 0 } }, { { 0x4D, 0 }, { 0xF0, 0x4D, 0 } }, + { { 0x54, 0 }, { 0xF0, 0x54, 0 } }, { { 0x5B, 0 }, { 0xF0, 0x5B, 0 } }, /* 018 */ + { { 0x5A, 0 }, { 0xF0, 0x5A, 0 } }, { { 0x14, 0 }, { 0xF0, 0x14, 0 } }, + { { 0x1C, 0 }, { 0xF0, 0x1C, 0 } }, { { 0x1B, 0 }, { 0xF0, 0x1B, 0 } }, /* 01c */ + { { 0x23, 0 }, { 0xF0, 0x23, 0 } }, { { 0x2B, 0 }, { 0xF0, 0x2B, 0 } }, + { { 0x34, 0 }, { 0xF0, 0x34, 0 } }, { { 0x33, 0 }, { 0xF0, 0x33, 0 } }, /* 020 */ + { { 0x3B, 0 }, { 0xF0, 0x3B, 0 } }, { { 0x42, 0 }, { 0xF0, 0x42, 0 } }, + { { 0x4B, 0 }, { 0xF0, 0x4B, 0 } }, { { 0x4C, 0 }, { 0xF0, 0x4C, 0 } }, /* 024 */ + { { 0x52, 0 }, { 0xF0, 0x52, 0 } }, { { 0x0E, 0 }, { 0xF0, 0x0E, 0 } }, + { { 0x12, 0 }, { 0xF0, 0x12, 0 } }, { { 0x5D, 0 }, { 0xF0, 0x5D, 0 } }, /* 028 */ + { { 0x1A, 0 }, { 0xF0, 0x1A, 0 } }, { { 0x22, 0 }, { 0xF0, 0x22, 0 } }, + { { 0x21, 0 }, { 0xF0, 0x21, 0 } }, { { 0x2A, 0 }, { 0xF0, 0x2A, 0 } }, /* 02c */ + { { 0x32, 0 }, { 0xF0, 0x32, 0 } }, { { 0x31, 0 }, { 0xF0, 0x31, 0 } }, + { { 0x3A, 0 }, { 0xF0, 0x3A, 0 } }, { { 0x41, 0 }, { 0xF0, 0x41, 0 } }, /* 030 */ + { { 0x49, 0 }, { 0xF0, 0x49, 0 } }, { { 0x4A, 0 }, { 0xF0, 0x4A, 0 } }, + { { 0x59, 0 }, { 0xF0, 0x59, 0 } }, { { 0x7C, 0 }, { 0xF0, 0x7C, 0 } }, /* 034 */ + { { 0x11, 0 }, { 0xF0, 0x11, 0 } }, { { 0x29, 0 }, { 0xF0, 0x29, 0 } }, + { { 0x58, 0 }, { 0xF0, 0x58, 0 } }, { { 0x05, 0 }, { 0xF0, 0x05, 0 } }, /* 038 */ + { { 0x06, 0 }, { 0xF0, 0x06, 0 } }, { { 0x04, 0 }, { 0xF0, 0x04, 0 } }, + { { 0x0C, 0 }, { 0xF0, 0x0C, 0 } }, { { 0x03, 0 }, { 0xF0, 0x03, 0 } }, /* 03c */ + { { 0x0B, 0 }, { 0xF0, 0x0B, 0 } }, { { 0x83, 0 }, { 0xF0, 0x83, 0 } }, + { { 0x0A, 0 }, { 0xF0, 0x0A, 0 } }, { { 0x01, 0 }, { 0xF0, 0x01, 0 } }, /* 040 */ + { { 0x09, 0 }, { 0xF0, 0x09, 0 } }, { { 0x77, 0 }, { 0xF0, 0x77, 0 } }, + { { 0x7E, 0 }, { 0xF0, 0x7E, 0 } }, { { 0x6C, 0 }, { 0xF0, 0x6C, 0 } }, /* 044 */ + { { 0x75, 0 }, { 0xF0, 0x75, 0 } }, { { 0x7D, 0 }, { 0xF0, 0x7D, 0 } }, + { { 0x7B, 0 }, { 0xF0, 0x7B, 0 } }, { { 0x6B, 0 }, { 0xF0, 0x6B, 0 } }, /* 048 */ + { { 0x73, 0 }, { 0xF0, 0x73, 0 } }, { { 0x74, 0 }, { 0xF0, 0x74, 0 } }, + { { 0x79, 0 }, { 0xF0, 0x79, 0 } }, { { 0x69, 0 }, { 0xF0, 0x69, 0 } }, /* 04c */ + { { 0x72, 0 }, { 0xF0, 0x72, 0 } }, { { 0x7A, 0 }, { 0xF0, 0x7A, 0 } }, + { { 0x70, 0 }, { 0xF0, 0x70, 0 } }, { { 0x71, 0 }, { 0xF0, 0x71, 0 } }, /* 050 */ + { { 0x84, 0 }, { 0xF0, 0x84, 0 } }, { { 0x60, 0 }, { 0xF0, 0x60, 0 } }, + { { 0x61, 0 }, { 0xF0, 0x61, 0 } }, { { 0x78, 0 }, { 0xF0, 0x78, 0 } }, /* 054 */ + { { 0x07, 0 }, { 0xF0, 0x07, 0 } }, { { 0x0F, 0 }, { 0xF0, 0x0F, 0 } }, + { { 0x17, 0 }, { 0xF0, 0x17, 0 } }, { { 0x1F, 0 }, { 0xF0, 0x1F, 0 } }, /* 058 */ + { { 0x27, 0 }, { 0xF0, 0x27, 0 } }, { { 0x2F, 0 }, { 0xF0, 0x2F, 0 } }, + { { 0x37, 0 }, { 0xF0, 0x37, 0 } }, { { 0x3F, 0 }, { 0xF0, 0x3F, 0 } }, /* 05c */ + { { 0x47, 0 }, { 0xF0, 0x47, 0 } }, { { 0x4F, 0 }, { 0xF0, 0x4F, 0 } }, + { { 0x56, 0 }, { 0xF0, 0x56, 0 } }, { { 0x5E, 0 }, { 0xF0, 0x5E, 0 } }, /* 060 */ + { { 0x08, 0 }, { 0xF0, 0x08, 0 } }, { { 0x10, 0 }, { 0xF0, 0x10, 0 } }, + { { 0x18, 0 }, { 0xF0, 0x18, 0 } }, { { 0x20, 0 }, { 0xF0, 0x20, 0 } }, /* 064 */ + { { 0x28, 0 }, { 0xF0, 0x28, 0 } }, { { 0x30, 0 }, { 0xF0, 0x30, 0 } }, + { { 0x38, 0 }, { 0xF0, 0x38, 0 } }, { { 0x40, 0 }, { 0xF0, 0x40, 0 } }, /* 068 */ + { { 0x48, 0 }, { 0xF0, 0x48, 0 } }, { { 0x50, 0 }, { 0xF0, 0x50, 0 } }, + { { 0x57, 0 }, { 0xF0, 0x57, 0 } }, { { 0x6F, 0 }, { 0xF0, 0x6F, 0 } }, /* 06c */ + { { 0x13, 0 }, { 0xF0, 0x13, 0 } }, { { 0x19, 0 }, { 0xF0, 0x19, 0 } }, + { { 0x39, 0 }, { 0xF0, 0x39, 0 } }, { { 0x51, 0 }, { 0xF0, 0x51, 0 } }, /* 070 */ + { { 0x53, 0 }, { 0xF0, 0x53, 0 } }, { { 0x5C, 0 }, { 0xF0, 0x5C, 0 } }, + { { 0x5F, 0 }, { 0xF0, 0x5F, 0 } }, { { 0x62, 0 }, { 0xF0, 0x62, 0 } }, /* 074 */ + { { 0x63, 0 }, { 0xF0, 0x63, 0 } }, { { 0x64, 0 }, { 0xF0, 0x64, 0 } }, + { { 0x65, 0 }, { 0xF0, 0x65, 0 } }, { { 0x67, 0 }, { 0xF0, 0x67, 0 } }, /* 078 */ + { { 0x68, 0 }, { 0xF0, 0x68, 0 } }, { { 0x6A, 0 }, { 0xF0, 0x6A, 0 } }, + { { 0x6D, 0 }, { 0xF0, 0x6D, 0 } }, { { 0x6E, 0 }, { 0xF0, 0x6E, 0 } }, /* 07c */ - { { 0x80,0},{ 0xf0,0x80,0} }, { { 0x81,0},{ 0xf0,0x81,0} }, { { 0x82,0},{ 0xf0,0x82,0} }, { { 0},{ 0} }, /*080*/ - { { 0},{ 0} }, { { 0x85,0},{ 0xf0,0x54,0} }, { { 0x86,0},{ 0xf0,0x86,0} }, { { 0x87,0},{ 0xf0,0x87,0} }, /*084*/ - { { 0x88,0},{ 0xf0,0x88,0} }, { { 0x89,0},{ 0xf0,0x89,0} }, { { 0x8a,0},{ 0xf0,0x8a,0} }, { { 0x8b,0},{ 0xf0,0x8b,0} }, /*088*/ - { { 0x8c,0},{ 0xf0,0x8c,0} }, { { 0x8d,0},{ 0xf0,0x8d,0} }, { { 0x8e,0},{ 0xf0,0x8e,0} }, { { 0x8f,0},{ 0xf0,0x8f,0} }, /*08c*/ - { { 0x90,0},{ 0xf0,0x90,0} }, { { 0x91,0},{ 0xf0,0x91,0} }, { { 0x92,0},{ 0xf0,0x92,0} }, { { 0x93,0},{ 0xf0,0x93,0} }, /*090*/ - { { 0x94,0},{ 0xf0,0x94,0} }, { { 0x95,0},{ 0xf0,0x95,0} }, { { 0x96,0},{ 0xf0,0x96,0} }, { { 0x97,0},{ 0xf0,0x97,0} }, /*094*/ - { { 0x98,0},{ 0xf0,0x98,0} }, { { 0x99,0},{ 0xf0,0x99,0} }, { { 0x9a,0},{ 0xf0,0x9a,0} }, { { 0x9b,0},{ 0xf0,0x9b,0} }, /*098*/ - { { 0x9c,0},{ 0xf0,0x9c,0} }, { { 0x9d,0},{ 0xf0,0x9d,0} }, { { 0x9e,0},{ 0xf0,0x9e,0} }, { { 0x9f,0},{ 0xf0,0x9f,0} }, /*09c*/ - { { 0xa0,0},{ 0xf0,0xa0,0} }, { { 0xa1,0},{ 0xf0,0xa1,0} }, { { 0xa2,0},{ 0xf0,0xa2,0} }, { { 0xa3,0},{ 0xf0,0xa3,0} }, /*0a0*/ - { { 0xa4,0},{ 0xf0,0xa4,0} }, { { 0xa5,0},{ 0xf0,0xa5,0} }, { { 0xa6,0},{ 0xf0,0xa6,0} }, { { 0xa7,0},{ 0xf0,0xa7,0} }, /*0a4*/ - { { 0xa8,0},{ 0xf0,0xa8,0} }, { { 0xa9,0},{ 0xf0,0xa9,0} }, { { 0xaa,0},{ 0xf0,0xaa,0} }, { { 0xab,0},{ 0xf0,0xab,0} }, /*0a8*/ - { { 0xac,0},{ 0xf0,0xac,0} }, { { 0xad,0},{ 0xf0,0xad,0} }, { { 0xae,0},{ 0xf0,0xae,0} }, { { 0xaf,0},{ 0xf0,0xaf,0} }, /*0ac*/ - { { 0xb0,0},{ 0xf0,0xb0,0} }, { { 0xb1,0},{ 0xf0,0xb1,0} }, { { 0xb2,0},{ 0xf0,0xb2,0} }, { { 0xb3,0},{ 0xf0,0xb3,0} }, /*0b0*/ - { { 0xb4,0},{ 0xf0,0xb4,0} }, { { 0xb5,0},{ 0xf0,0xb5,0} }, { { 0xb6,0},{ 0xf0,0xb6,0} }, { { 0xb7,0},{ 0xf0,0xb7,0} }, /*0b4*/ - { { 0xb8,0},{ 0xf0,0xb8,0} }, { { 0xb9,0},{ 0xf0,0xb9,0} }, { { 0xba,0},{ 0xf0,0xba,0} }, { { 0xbb,0},{ 0xf0,0xbb,0} }, /*0b8*/ - { { 0xbc,0},{ 0xf0,0xbc,0} }, { { 0xbd,0},{ 0xf0,0xbd,0} }, { { 0xbe,0},{ 0xf0,0xbe,0} }, { { 0xbf,0},{ 0xf0,0xbf,0} }, /*0bc*/ - { { 0xc0,0},{ 0xf0,0xc0,0} }, { { 0xc1,0},{ 0xf0,0xc1,0} }, { { 0xc2,0},{ 0xf0,0xc2,0} }, { { 0xc3,0},{ 0xf0,0xc3,0} }, /*0c0*/ - { { 0xc4,0},{ 0xf0,0xc4,0} }, { { 0xc5,0},{ 0xf0,0xc5,0} }, { { 0xc6,0},{ 0xf0,0xc6,0} }, { { 0xc7,0},{ 0xf0,0xc7,0} }, /*0c4*/ - { { 0xc8,0},{ 0xf0,0xc8,0} }, { { 0xc9,0},{ 0xf0,0xc9,0} }, { { 0xca,0},{ 0xf0,0xca,0} }, { { 0xcb,0},{ 0xf0,0xcb,0} }, /*0c8*/ - { { 0xcc,0},{ 0xf0,0xcc,0} }, { { 0xcd,0},{ 0xf0,0xcd,0} }, { { 0xce,0},{ 0xf0,0xce,0} }, { { 0xcf,0},{ 0xf0,0xcf,0} }, /*0cc*/ - { { 0xd0,0},{ 0xf0,0xd0,0} }, { { 0xd1,0},{ 0xf0,0xd0,0} }, { { 0xd2,0},{ 0xf0,0xd2,0} }, { { 0xd3,0},{ 0xf0,0xd3,0} }, /*0d0*/ - { { 0xd4,0},{ 0xf0,0xd4,0} }, { { 0xd5,0},{ 0xf0,0xd5,0} }, { { 0xd6,0},{ 0xf0,0xd6,0} }, { { 0xd7,0},{ 0xf0,0xd7,0} }, /*0d4*/ - { { 0xd8,0},{ 0xf0,0xd8,0} }, { { 0xd9,0},{ 0xf0,0xd9,0} }, { { 0xda,0},{ 0xf0,0xda,0} }, { { 0xdb,0},{ 0xf0,0xdb,0} }, /*0d8*/ - { { 0xdc,0},{ 0xf0,0xdc,0} }, { { 0xdd,0},{ 0xf0,0xdd,0} }, { { 0xde,0},{ 0xf0,0xde,0} }, { { 0xdf,0},{ 0xf0,0xdf,0} }, /*0dc*/ - { { 0xe0,0},{ 0xf0,0xe0,0} }, { { 0xe1,0},{ 0xf0,0xe1,0} }, { { 0xe2,0},{ 0xf0,0xe2,0} }, { { 0xe3,0},{ 0xf0,0xe3,0} }, /*0e0*/ - { { 0xe4,0},{ 0xf0,0xe4,0} }, { { 0xe5,0},{ 0xf0,0xe5,0} }, { { 0xe6,0},{ 0xf0,0xe6,0} }, { { 0xe7,0},{ 0xf0,0xe7,0} }, /*0e4*/ - { { 0xe8,0},{ 0xf0,0xe8,0} }, { { 0xe9,0},{ 0xf0,0xe9,0} }, { { 0xea,0},{ 0xf0,0xea,0} }, { { 0xeb,0},{ 0xf0,0xeb,0} }, /*0e8*/ - { { 0xec,0},{ 0xf0,0xec,0} }, { { 0xed,0},{ 0xf0,0xed,0} }, { { 0xee,0},{ 0xf0,0xee,0} }, { { 0xef,0},{ 0xf0,0xef,0} }, /*0ec*/ - { { 0},{ 0} }, { { 0xf1,0},{ 0xf0,0xf1,0} }, { { 0xf2,0},{ 0xf0,0xf2,0} }, { { 0xf3,0},{ 0xf0,0xf3,0} }, /*0f0*/ - { { 0xf4,0},{ 0xf0,0xf4,0} }, { { 0xf5,0},{ 0xf0,0xf5,0} }, { { 0xf6,0},{ 0xf0,0xf6,0} }, { { 0xf7,0},{ 0xf0,0xf7,0} }, /*0f4*/ - { { 0xf8,0},{ 0xf0,0xf8,0} }, { { 0xf9,0},{ 0xf0,0xf9,0} }, { { 0xfa,0},{ 0xf0,0xfa,0} }, { { 0xfb,0},{ 0xf0,0xfb,0} }, /*0f8*/ - { { 0xfc,0},{ 0xf0,0xfc,0} }, { { 0xfd,0},{ 0xf0,0xfd,0} }, { { 0xfe,0},{ 0xf0,0xfe,0} }, { { 0xff,0},{ 0xf0,0xff,0} }, /*0fc*/ + { { 0x80, 0 }, { 0xf0, 0x80, 0 } }, { { 0x81, 0 }, { 0xf0, 0x81, 0 } }, /* 080 */ + { { 0x82, 0 }, { 0xf0, 0x82, 0 } }, { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, { { 0x85, 0 }, { 0xf0, 0x54, 0 } }, + { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 084 */ + { { 0x88, 0 }, { 0xf0, 0x88, 0 } }, { { 0x89, 0 }, { 0xf0, 0x89, 0 } }, + { { 0x8a, 0 }, { 0xf0, 0x8a, 0 } }, { { 0x8b, 0 }, { 0xf0, 0x8b, 0 } }, /* 088 */ + { { 0x8c, 0 }, { 0xf0, 0x8c, 0 } }, { { 0x8d, 0 }, { 0xf0, 0x8d, 0 } }, + { { 0x8e, 0 }, { 0xf0, 0x8e, 0 } }, { { 0x8f, 0 }, { 0xf0, 0x8f, 0 } }, /* 08c */ + { { 0x90, 0 }, { 0xf0, 0x90, 0 } }, { { 0x91, 0 }, { 0xf0, 0x91, 0 } }, + { { 0x92, 0 }, { 0xf0, 0x92, 0 } }, { { 0x93, 0 }, { 0xf0, 0x93, 0 } }, /* 090 */ + { { 0x94, 0 }, { 0xf0, 0x94, 0 } }, { { 0x95, 0 }, { 0xf0, 0x95, 0 } }, + { { 0x96, 0 }, { 0xf0, 0x96, 0 } }, { { 0x97, 0 }, { 0xf0, 0x97, 0 } }, /* 094 */ + { { 0x98, 0 }, { 0xf0, 0x98, 0 } }, { { 0x99, 0 }, { 0xf0, 0x99, 0 } }, + { { 0x9a, 0 }, { 0xf0, 0x9a, 0 } }, { { 0x9b, 0 }, { 0xf0, 0x9b, 0 } }, /* 098 */ + { { 0x9c, 0 }, { 0xf0, 0x9c, 0 } }, { { 0x9d, 0 }, { 0xf0, 0x9d, 0 } }, + { { 0x9e, 0 }, { 0xf0, 0x9e, 0 } }, { { 0x9f, 0 }, { 0xf0, 0x9f, 0 } }, /* 09c */ + { { 0xa0, 0 }, { 0xf0, 0xa0, 0 } }, { { 0xa1, 0 }, { 0xf0, 0xa1, 0 } }, + { { 0xa2, 0 }, { 0xf0, 0xa2, 0 } }, { { 0xa3, 0 }, { 0xf0, 0xa3, 0 } }, /* 0a0 */ + { { 0xa4, 0 }, { 0xf0, 0xa4, 0 } }, { { 0xa5, 0 }, { 0xf0, 0xa5, 0 } }, + { { 0xa6, 0 }, { 0xf0, 0xa6, 0 } }, { { 0xa7, 0 }, { 0xf0, 0xa7, 0 } }, /* 0a4 */ + { { 0xa8, 0 }, { 0xf0, 0xa8, 0 } }, { { 0xa9, 0 }, { 0xf0, 0xa9, 0 } }, + { { 0xaa, 0 }, { 0xf0, 0xaa, 0 } }, { { 0xab, 0 }, { 0xf0, 0xab, 0 } }, /* 0a8 */ + { { 0xac, 0 }, { 0xf0, 0xac, 0 } }, { { 0xad, 0 }, { 0xf0, 0xad, 0 } }, + { { 0xae, 0 }, { 0xf0, 0xae, 0 } }, { { 0xaf, 0 }, { 0xf0, 0xaf, 0 } }, /* 0ac */ + { { 0xb0, 0 }, { 0xf0, 0xb0, 0 } }, { { 0xb1, 0 }, { 0xf0, 0xb1, 0 } }, + { { 0xb2, 0 }, { 0xf0, 0xb2, 0 } }, { { 0xb3, 0 }, { 0xf0, 0xb3, 0 } }, /* 0b0 */ + { { 0xb4, 0 }, { 0xf0, 0xb4, 0 } }, { { 0xb5, 0 }, { 0xf0, 0xb5, 0 } }, + { { 0xb6, 0 }, { 0xf0, 0xb6, 0 } }, { { 0xb7, 0 }, { 0xf0, 0xb7, 0 } }, /* 0b4 */ + { { 0xb8, 0 }, { 0xf0, 0xb8, 0 } }, { { 0xb9, 0 }, { 0xf0, 0xb9, 0 } }, + { { 0xba, 0 }, { 0xf0, 0xba, 0 } }, { { 0xbb, 0 }, { 0xf0, 0xbb, 0 } }, /* 0b8 */ + { { 0xbc, 0 }, { 0xf0, 0xbc, 0 } }, { { 0xbd, 0 }, { 0xf0, 0xbd, 0 } }, + { { 0xbe, 0 }, { 0xf0, 0xbe, 0 } }, { { 0xbf, 0 }, { 0xf0, 0xbf, 0 } }, /* 0bc */ + { { 0xc0, 0 }, { 0xf0, 0xc0, 0 } }, { { 0xc1, 0 }, { 0xf0, 0xc1, 0 } }, + { { 0xc2, 0 }, { 0xf0, 0xc2, 0 } }, { { 0xc3, 0 }, { 0xf0, 0xc3, 0 } }, /* 0c0 */ + { { 0xc4, 0 }, { 0xf0, 0xc4, 0 } }, { { 0xc5, 0 }, { 0xf0, 0xc5, 0 } }, + { { 0xc6, 0 }, { 0xf0, 0xc6, 0 } }, { { 0xc7, 0 }, { 0xf0, 0xc7, 0 } }, /* 0c4 */ + { { 0xc8, 0 }, { 0xf0, 0xc8, 0 } }, { { 0xc9, 0 }, { 0xf0, 0xc9, 0 } }, + { { 0xca, 0 }, { 0xf0, 0xca, 0 } }, { { 0xcb, 0 }, { 0xf0, 0xcb, 0 } }, /* 0c8 */ + { { 0xcc, 0 }, { 0xf0, 0xcc, 0 } }, { { 0xcd, 0 }, { 0xf0, 0xcd, 0 } }, + { { 0xce, 0 }, { 0xf0, 0xce, 0 } }, { { 0xcf, 0 }, { 0xf0, 0xcf, 0 } }, /* 0cc */ + { { 0xd0, 0 }, { 0xf0, 0xd0, 0 } }, { { 0xd1, 0 }, { 0xf0, 0xd0, 0 } }, + { { 0xd2, 0 }, { 0xf0, 0xd2, 0 } }, { { 0xd3, 0 }, { 0xf0, 0xd3, 0 } }, /* 0d0 */ + { { 0xd4, 0 }, { 0xf0, 0xd4, 0 } }, { { 0xd5, 0 }, { 0xf0, 0xd5, 0 } }, + { { 0xd6, 0 }, { 0xf0, 0xd6, 0 } }, { { 0xd7, 0 }, { 0xf0, 0xd7, 0 } }, /* 0d4 */ + { { 0xd8, 0 }, { 0xf0, 0xd8, 0 } }, { { 0xd9, 0 }, { 0xf0, 0xd9, 0 } }, + { { 0xda, 0 }, { 0xf0, 0xda, 0 } }, { { 0xdb, 0 }, { 0xf0, 0xdb, 0 } }, /* 0d8 */ + { { 0xdc, 0 }, { 0xf0, 0xdc, 0 } }, { { 0xdd, 0 }, { 0xf0, 0xdd, 0 } }, + { { 0xde, 0 }, { 0xf0, 0xde, 0 } }, { { 0xdf, 0 }, { 0xf0, 0xdf, 0 } }, /* 0dc */ + { { 0xe0, 0 }, { 0xf0, 0xe0, 0 } }, { { 0xe1, 0 }, { 0xf0, 0xe1, 0 } }, + { { 0xe2, 0 }, { 0xf0, 0xe2, 0 } }, { { 0xe3, 0 }, { 0xf0, 0xe3, 0 } }, /* 0e0 */ + { { 0xe4, 0 }, { 0xf0, 0xe4, 0 } }, { { 0xe5, 0 }, { 0xf0, 0xe5, 0 } }, + { { 0xe6, 0 }, { 0xf0, 0xe6, 0 } }, { { 0xe7, 0 }, { 0xf0, 0xe7, 0 } }, /* 0e4 */ + { { 0xe8, 0 }, { 0xf0, 0xe8, 0 } }, { { 0xe9, 0 }, { 0xf0, 0xe9, 0 } }, + { { 0xea, 0 }, { 0xf0, 0xea, 0 } }, { { 0xeb, 0 }, { 0xf0, 0xeb, 0 } }, /* 0e8 */ + { { 0xec, 0 }, { 0xf0, 0xec, 0 } }, { { 0xed, 0 }, { 0xf0, 0xed, 0 } }, + { { 0xee, 0 }, { 0xf0, 0xee, 0 } }, { { 0xef, 0 }, { 0xf0, 0xef, 0 } }, /* 0ec */ + { { 0 }, { 0 } }, { { 0xf1, 0 }, { 0xf0, 0xf1, 0 } }, + { { 0xf2, 0 }, { 0xf0, 0xf2, 0 } }, { { 0xf3, 0 }, { 0xf0, 0xf3, 0 } }, /* 0f0 */ + { { 0xf4, 0 }, { 0xf0, 0xf4, 0 } }, { { 0xf5, 0 }, { 0xf0, 0xf5, 0 } }, + { { 0xf6, 0 }, { 0xf0, 0xf6, 0 } }, { { 0xf7, 0 }, { 0xf0, 0xf7, 0 } }, /* 0f4 */ + { { 0xf8, 0 }, { 0xf0, 0xf8, 0 } }, { { 0xf9, 0 }, { 0xf0, 0xf9, 0 } }, + { { 0xfa, 0 }, { 0xf0, 0xfa, 0 } }, { { 0xfb, 0 }, { 0xf0, 0xfb, 0 } }, /* 0f8 */ + { { 0xfc, 0 }, { 0xf0, 0xfc, 0 } }, { { 0xfd, 0 }, { 0xf0, 0xfd, 0 } }, + { { 0xfe, 0 }, { 0xf0, 0xfe, 0 } }, { { 0xff, 0 }, { 0xf0, 0xff, 0 } }, /* 0fc */ - { {0xe1,0x14,0},{0xe1,0xf0,0x14,0} }, { {0xe0,0x76,0},{0xe0,0xF0,0x76,0} }, { {0xe0,0x16,0},{0xe0,0xF0,0x16,0} }, { {0xe0,0x1E,0},{0xe0,0xF0,0x1E,0} }, /*100*/ - { {0xe0,0x26,0},{0xe0,0xF0,0x26,0} }, { {0xe0,0x25,0},{0xe0,0xF0,0x25,0} }, { {0xe0,0x2E,0},{0xe0,0xF0,0x2E,0} }, { {0xe0,0x36,0},{0xe0,0xF0,0x36,0} }, /*104*/ - { {0xe0,0x3D,0},{0xe0,0xF0,0x3D,0} }, { {0xe0,0x3E,0},{0xe0,0xF0,0x3E,0} }, { {0xe0,0x46,0},{0xe0,0xF0,0x46,0} }, { {0xe0,0x45,0},{0xe0,0xF0,0x45,0} }, /*108*/ - { {0xe0,0x4E,0},{0xe0,0xF0,0x4E,0} }, { { 0},{ 0} }, { {0xe0,0x66,0},{0xe0,0xF0,0x66,0} }, { {0xe0,0x0D,0},{0xe0,0xF0,0x0D,0} }, /*10c*/ - { {0xe0,0x15,0},{0xe0,0xF0,0x15,0} }, { {0xe0,0x1D,0},{0xe0,0xF0,0x1D,0} }, { {0xe0,0x24,0},{0xe0,0xF0,0x24,0} }, { {0xe0,0x2D,0},{0xe0,0xF0,0x2D,0} }, /*110*/ - { {0xe0,0x2C,0},{0xe0,0xF0,0x2C,0} }, { {0xe0,0x35,0},{0xe0,0xF0,0x35,0} }, { {0xe0,0x3C,0},{0xe0,0xF0,0x3C,0} }, { {0xe0,0x43,0},{0xe0,0xF0,0x43,0} }, /*114*/ - { {0xe0,0x44,0},{0xe0,0xF0,0x44,0} }, { {0xe0,0x4D,0},{0xe0,0xF0,0x4D,0} }, { {0xe0,0x54,0},{0xe0,0xF0,0x54,0} }, { {0xe0,0x5B,0},{0xe0,0xF0,0x5B,0} }, /*118*/ - { {0xe0,0x5A,0},{0xe0,0xF0,0x5A,0} }, { {0xe0,0x14,0},{0xe0,0xF0,0x14,0} }, { {0xe0,0x1C,0},{0xe0,0xF0,0x1C,0} }, { {0xe0,0x1B,0},{0xe0,0xF0,0x1B,0} }, /*11c*/ - { {0xe0,0x23,0},{0xe0,0xF0,0x23,0} }, { {0xe0,0x2B,0},{0xe0,0xF0,0x2B,0} }, { {0xe0,0x34,0},{0xe0,0xF0,0x34,0} }, { {0xe0,0x33,0},{0xe0,0xF0,0x33,0} }, /*120*/ - { {0xe0,0x3B,0},{0xe0,0xF0,0x3B,0} }, { {0xe0,0x42,0},{0xe0,0xF0,0x42,0} }, { {0xe0,0x4B,0},{0xe0,0xF0,0x4B,0} }, { { 0},{ 0} }, /*124*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*128*/ - { {0xe0,0x1A,0},{0xe0,0xF0,0x1A,0} }, { {0xe0,0x22,0},{0xe0,0xF0,0x22,0} }, { {0xe0,0x21,0},{0xe0,0xF0,0x21,0} }, { {0xe0,0x2A,0},{0xe0,0xF0,0x2A,0} }, /*12c*/ - { {0xe0,0x32,0},{0xe0,0xF0,0x32,0} }, { {0xe0,0x31,0},{0xe0,0xF0,0x31,0} }, { {0xe0,0x3A,0},{0xe0,0xF0,0x3A,0} }, { { 0},{ 0} }, /*130*/ - { {0xe0,0x49,0},{0xe0,0xF0,0x49,0} }, { {0xe0,0x4A,0},{0xe0,0xF0,0x4A,0} }, { { 0},{ 0} }, { {0xe0,0x7C,0},{0xe0,0xF0,0x7C,0} }, /*134*/ - { {0xe0,0x11,0},{0xe0,0xF0,0x11,0} }, { { 0},{ 0} }, { {0xe0,0x58,0},{0xe0,0xF0,0x58,0} }, { {0xe0,0x05,0},{0xe0,0xF0,0x05,0} }, /*138*/ - { {0xe0,0x06,0},{0xe0,0xF0,0x06,0} }, { {0xe0,0x04,0},{0xe0,0xF0,0x04,0} }, { {0xe0,0x0C,0},{0xe0,0xF0,0x0C,0} }, { {0xe0,0x03,0},{0xe0,0xF0,0x03,0} }, /*13c*/ - { {0xe0,0x0B,0},{0xe0,0xF0,0x0B,0} }, { {0xe0,0x02,0},{0xe0,0xF0,0x02,0} }, { {0xe0,0x0A,0},{0xe0,0xF0,0x0A,0} }, { {0xe0,0x01,0},{0xe0,0xF0,0x01,0} }, /*140*/ - { {0xe0,0x09,0},{0xe0,0xF0,0x09,0} }, { { 0},{ 0} }, { {0xe0,0x7E,0},{0xe0,0xF0,0x7E,0} }, { {0xe0,0x6C,0},{0xe0,0xF0,0x6C,0} }, /*144*/ - { {0xe0,0x75,0},{0xe0,0xF0,0x75,0} }, { {0xe0,0x7D,0},{0xe0,0xF0,0x7D,0} }, { { 0},{ 0} }, { {0xe0,0x6B,0},{0xe0,0xF0,0x6B,0} }, /*148*/ - { {0xe0,0x73,0},{0xe0,0xF0,0x73,0} }, { {0xe0,0x74,0},{0xe0,0xF0,0x74,0} }, { {0xe0,0x79,0},{0xe0,0xF0,0x79,0} }, { {0xe0,0x69,0},{0xe0,0xF0,0x69,0} }, /*14c*/ - { {0xe0,0x72,0},{0xe0,0xF0,0x72,0} }, { {0xe0,0x7A,0},{0xe0,0xF0,0x7A,0} }, { {0xe0,0x70,0},{0xe0,0xF0,0x70,0} }, { {0xe0,0x71,0},{0xe0,0xF0,0x71,0} }, /*150*/ - { { 0},{ 0} }, { {0xe0,0x60,0},{0xe0,0xF0,0x60,0} }, { { 0},{ 0} }, { {0xe0,0x78,0},{0xe0,0xF0,0x78,0} }, /*154*/ - { {0xe0,0x07,0},{0xe0,0xF0,0x07,0} }, { {0xe0,0x0F,0},{0xe0,0xF0,0x0F,0} }, { {0xe0,0x17,0},{0xe0,0xF0,0x17,0} }, { {0xe0,0x1F,0},{0xe0,0xF0,0x1F,0} }, /*158*/ - { {0xe0,0x27,0},{0xe0,0xF0,0x27,0} }, { {0xe0,0x2F,0},{0xe0,0xF0,0x2F,0} }, { {0xe0,0x37,0},{0xe0,0xF0,0x37,0} }, { {0xe0,0x3F,0},{0xe0,0xF0,0x3F,0} }, /*15c*/ - { { 0},{ 0} }, { {0xe0,0x4F,0},{0xe0,0xF0,0x4F,0} }, { {0xe0,0x56,0},{0xe0,0xF0,0x56,0} }, { {0xe0,0x5E,0},{0xe0,0xF0,0x5E,0} }, /*160*/ - { {0xe0,0x08,0},{0xe0,0xF0,0x08,0} }, { {0xe0,0x10,0},{0xe0,0xF0,0x10,0} }, { {0xe0,0x18,0},{0xe0,0xF0,0x18,0} }, { {0xe0,0x20,0},{0xe0,0xF0,0x20,0} }, /*164*/ - { {0xe0,0x28,0},{0xe0,0xF0,0x28,0} }, { {0xe0,0x30,0},{0xe0,0xF0,0x30,0} }, { {0xe0,0x38,0},{0xe0,0xF0,0x38,0} }, { {0xe0,0x40,0},{0xe0,0xF0,0x40,0} }, /*168*/ - { {0xe0,0x48,0},{0xe0,0xF0,0x48,0} }, { {0xe0,0x50,0},{0xe0,0xF0,0x50,0} }, { {0xe0,0x57,0},{0xe0,0xF0,0x57,0} }, { { 0},{ 0} }, /*16c*/ - { {0xe0,0x13,0},{0xe0,0xF0,0x13,0} }, { {0xe0,0x19,0},{0xe0,0xF0,0x19,0} }, { {0xe0,0x39,0},{0xe0,0xF0,0x39,0} }, { {0xe0,0x51,0},{0xe0,0xF0,0x51,0} }, /*170*/ - { {0xe0,0x53,0},{0xe0,0xF0,0x53,0} }, { {0xe0,0x5C,0},{0xe0,0xF0,0x5C,0} }, { { 0},{ 0} }, { {0xe0,0x62,0},{0xe0,0xF0,0x62,0} }, /*174*/ - { {0xe0,0x63,0},{0xe0,0xF0,0x63,0} }, { {0xe0,0x64,0},{0xe0,0xF0,0x64,0} }, { {0xe0,0x65,0},{0xe0,0xF0,0x65,0} }, { {0xe0,0x67,0},{0xe0,0xF0,0x67,0} }, /*178*/ - { {0xe0,0x68,0},{0xe0,0xF0,0x68,0} }, { {0xe0,0x6A,0},{0xe0,0xF0,0x6A,0} }, { {0xe0,0x6D,0},{0xe0,0xF0,0x6D,0} }, { {0xe0,0x6E,0},{0xe0,0xF0,0x6E,0} }, /*17c*/ + { { 0xe1, 0x14, 0 }, { 0xe1, 0xf0, 0x14, 0 } }, { { 0xe0, 0x76, 0 }, { 0xe0, 0xF0, 0x76, 0 } }, /* 100 */ + { { 0xe0, 0x16, 0 }, { 0xe0, 0xF0, 0x16, 0 } }, { { 0xe0, 0x1E, 0 }, { 0xe0, 0xF0, 0x1E, 0 } }, /* 102 */ + { { 0xe0, 0x26, 0 }, { 0xe0, 0xF0, 0x26, 0 } }, { { 0xe0, 0x25, 0 }, { 0xe0, 0xF0, 0x25, 0 } }, + { { 0xe0, 0x2E, 0 }, { 0xe0, 0xF0, 0x2E, 0 } }, { { 0xe0, 0x36, 0 }, { 0xe0, 0xF0, 0x36, 0 } }, /* 104 */ + { { 0xe0, 0x3D, 0 }, { 0xe0, 0xF0, 0x3D, 0 } }, { { 0xe0, 0x3E, 0 }, { 0xe0, 0xF0, 0x3E, 0 } }, + { { 0xe0, 0x46, 0 }, { 0xe0, 0xF0, 0x46, 0 } }, { { 0xe0, 0x45, 0 }, { 0xe0, 0xF0, 0x45, 0 } }, /* 108 */ + { { 0xe0, 0x4E, 0 }, { 0xe0, 0xF0, 0x4E, 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0x66, 0 }, { 0xe0, 0xF0, 0x66, 0 } }, { { 0xe0, 0x0D, 0 }, { 0xe0, 0xF0, 0x0D, 0 } }, /* 10c */ + { { 0xe0, 0x15, 0 }, { 0xe0, 0xF0, 0x15, 0 } }, { { 0xe0, 0x1D, 0 }, { 0xe0, 0xF0, 0x1D, 0 } }, + { { 0xe0, 0x24, 0 }, { 0xe0, 0xF0, 0x24, 0 } }, { { 0xe0, 0x2D, 0 }, { 0xe0, 0xF0, 0x2D, 0 } }, /* 110 */ + { { 0xe0, 0x2C, 0 }, { 0xe0, 0xF0, 0x2C, 0 } }, { { 0xe0, 0x35, 0 }, { 0xe0, 0xF0, 0x35, 0 } }, + { { 0xe0, 0x3C, 0 }, { 0xe0, 0xF0, 0x3C, 0 } }, { { 0xe0, 0x43, 0 }, { 0xe0, 0xF0, 0x43, 0 } }, /* 114 */ + { { 0xe0, 0x44, 0 }, { 0xe0, 0xF0, 0x44, 0 } }, { { 0xe0, 0x4D, 0 }, { 0xe0, 0xF0, 0x4D, 0 } }, + { { 0xe0, 0x54, 0 }, { 0xe0, 0xF0, 0x54, 0 } }, { { 0xe0, 0x5B, 0 }, { 0xe0, 0xF0, 0x5B, 0 } }, /* 118 */ + { { 0xe0, 0x5A, 0 }, { 0xe0, 0xF0, 0x5A, 0 } }, { { 0xe0, 0x14, 0 }, { 0xe0, 0xF0, 0x14, 0 } }, + { { 0xe0, 0x1C, 0 }, { 0xe0, 0xF0, 0x1C, 0 } }, { { 0xe0, 0x1B, 0 }, { 0xe0, 0xF0, 0x1B, 0 } }, /* 11c */ + { { 0xe0, 0x23, 0 }, { 0xe0, 0xF0, 0x23, 0 } }, { { 0xe0, 0x2B, 0 }, { 0xe0, 0xF0, 0x2B, 0 } }, + { { 0xe0, 0x34, 0 }, { 0xe0, 0xF0, 0x34, 0 } }, { { 0xe0, 0x33, 0 }, { 0xe0, 0xF0, 0x33, 0 } }, /* 120 */ + { { 0xe0, 0x3B, 0 }, { 0xe0, 0xF0, 0x3B, 0 } }, { { 0xe0, 0x42, 0 }, { 0xe0, 0xF0, 0x42, 0 } }, + { { 0xe0, 0x4B, 0 }, { 0xe0, 0xF0, 0x4B, 0 } }, { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ + { { 0xe0, 0x1A, 0 }, { 0xe0, 0xF0, 0x1A, 0 } }, { { 0xe0, 0x22, 0 }, { 0xe0, 0xF0, 0x22, 0 } }, + { { 0xe0, 0x21, 0 }, { 0xe0, 0xF0, 0x21, 0 } }, { { 0xe0, 0x2A, 0 }, { 0xe0, 0xF0, 0x2A, 0 } }, /* 12c */ + { { 0xe0, 0x32, 0 }, { 0xe0, 0xF0, 0x32, 0 } }, { { 0xe0, 0x31, 0 }, { 0xe0, 0xF0, 0x31, 0 } }, + { { 0xe0, 0x3A, 0 }, { 0xe0, 0xF0, 0x3A, 0 } }, { { 0 }, { 0 } }, /* 130 */ + { { 0xe0, 0x49, 0 }, { 0xe0, 0xF0, 0x49, 0 } }, { { 0xe0, 0x4A, 0 }, { 0xe0, 0xF0, 0x4A, 0 } }, + { { 0 }, { 0 } }, { { 0xe0, 0x7C, 0 }, { 0xe0, 0xF0, 0x7C, 0 } }, /* 134 */ + { { 0xe0, 0x11, 0 }, { 0xe0, 0xF0, 0x11, 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0x58, 0 }, { 0xe0, 0xF0, 0x58, 0 } }, { { 0xe0, 0x05, 0 }, { 0xe0, 0xF0, 0x05, 0 } }, /* 138 */ + { { 0xe0, 0x06, 0 }, { 0xe0, 0xF0, 0x06, 0 } }, { { 0xe0, 0x04, 0 }, { 0xe0, 0xF0, 0x04, 0 } }, + { { 0xe0, 0x0C, 0 }, { 0xe0, 0xF0, 0x0C, 0 } }, { { 0xe0, 0x03, 0 }, { 0xe0, 0xF0, 0x03, 0 } }, /* 13c */ + { { 0xe0, 0x0B, 0 }, { 0xe0, 0xF0, 0x0B, 0 } }, { { 0xe0, 0x02, 0 }, { 0xe0, 0xF0, 0x02, 0 } }, + { { 0xe0, 0x0A, 0 }, { 0xe0, 0xF0, 0x0A, 0 } }, { { 0xe0, 0x01, 0 }, { 0xe0, 0xF0, 0x01, 0 } }, /* 140 */ + { { 0xe0, 0x09, 0 }, { 0xe0, 0xF0, 0x09, 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0x7E, 0 }, { 0xe0, 0xF0, 0x7E, 0 } }, { { 0xe0, 0x6C, 0 }, { 0xe0, 0xF0, 0x6C, 0 } }, /* 144 */ + { { 0xe0, 0x75, 0 }, { 0xe0, 0xF0, 0x75, 0 } }, { { 0xe0, 0x7D, 0 }, { 0xe0, 0xF0, 0x7D, 0 } }, + { { 0 }, { 0 } }, { { 0xe0, 0x6B, 0 }, { 0xe0, 0xF0, 0x6B, 0 } }, /* 148 */ + { { 0xe0, 0x73, 0 }, { 0xe0, 0xF0, 0x73, 0 } }, { { 0xe0, 0x74, 0 }, { 0xe0, 0xF0, 0x74, 0 } }, + { { 0xe0, 0x79, 0 }, { 0xe0, 0xF0, 0x79, 0 } }, { { 0xe0, 0x69, 0 }, { 0xe0, 0xF0, 0x69, 0 } }, /* 14c */ + { { 0xe0, 0x72, 0 }, { 0xe0, 0xF0, 0x72, 0 } }, { { 0xe0, 0x7A, 0 }, { 0xe0, 0xF0, 0x7A, 0 } }, + { { 0xe0, 0x70, 0 }, { 0xe0, 0xF0, 0x70, 0 } }, { { 0xe0, 0x71, 0 }, { 0xe0, 0xF0, 0x71, 0 } }, /* 150 */ + { { 0 }, { 0 } }, { { 0xe0, 0x60, 0 }, { 0xe0, 0xF0, 0x60, 0 } }, + { { 0 }, { 0 } }, { { 0xe0, 0x78, 0 }, { 0xe0, 0xF0, 0x78, 0 } }, /* 154 */ + { { 0xe0, 0x07, 0 }, { 0xe0, 0xF0, 0x07, 0 } }, { { 0xe0, 0x0F, 0 }, { 0xe0, 0xF0, 0x0F, 0 } }, + { { 0xe0, 0x17, 0 }, { 0xe0, 0xF0, 0x17, 0 } }, { { 0xe0, 0x1F, 0 }, { 0xe0, 0xF0, 0x1F, 0 } }, /* 158 */ + { { 0xe0, 0x27, 0 }, { 0xe0, 0xF0, 0x27, 0 } }, { { 0xe0, 0x2F, 0 }, { 0xe0, 0xF0, 0x2F, 0 } }, + { { 0xe0, 0x37, 0 }, { 0xe0, 0xF0, 0x37, 0 } }, { { 0xe0, 0x3F, 0 }, { 0xe0, 0xF0, 0x3F, 0 } }, /* 15c */ + { { 0 }, { 0 } }, { { 0xe0, 0x4F, 0 }, { 0xe0, 0xF0, 0x4F, 0 } }, + { { 0xe0, 0x56, 0 }, { 0xe0, 0xF0, 0x56, 0 } }, { { 0xe0, 0x5E, 0 }, { 0xe0, 0xF0, 0x5E, 0 } }, /* 160 */ + { { 0xe0, 0x08, 0 }, { 0xe0, 0xF0, 0x08, 0 } }, { { 0xe0, 0x10, 0 }, { 0xe0, 0xF0, 0x10, 0 } }, + { { 0xe0, 0x18, 0 }, { 0xe0, 0xF0, 0x18, 0 } }, { { 0xe0, 0x20, 0 }, { 0xe0, 0xF0, 0x20, 0 } }, /* 164 */ + { { 0xe0, 0x28, 0 }, { 0xe0, 0xF0, 0x28, 0 } }, { { 0xe0, 0x30, 0 }, { 0xe0, 0xF0, 0x30, 0 } }, + { { 0xe0, 0x38, 0 }, { 0xe0, 0xF0, 0x38, 0 } }, { { 0xe0, 0x40, 0 }, { 0xe0, 0xF0, 0x40, 0 } }, /* 168 */ + { { 0xe0, 0x48, 0 }, { 0xe0, 0xF0, 0x48, 0 } }, { { 0xe0, 0x50, 0 }, { 0xe0, 0xF0, 0x50, 0 } }, + { { 0xe0, 0x57, 0 }, { 0xe0, 0xF0, 0x57, 0 } }, { { 0 }, { 0 } }, /* 16c */ + { { 0xe0, 0x13, 0 }, { 0xe0, 0xF0, 0x13, 0 } }, { { 0xe0, 0x19, 0 }, { 0xe0, 0xF0, 0x19, 0 } }, + { { 0xe0, 0x39, 0 }, { 0xe0, 0xF0, 0x39, 0 } }, { { 0xe0, 0x51, 0 }, { 0xe0, 0xF0, 0x51, 0 } }, /* 170 */ + { { 0xe0, 0x53, 0 }, { 0xe0, 0xF0, 0x53, 0 } }, { { 0xe0, 0x5C, 0 }, { 0xe0, 0xF0, 0x5C, 0 } }, + { { 0 }, { 0 } }, { { 0xe0, 0x62, 0 }, { 0xe0, 0xF0, 0x62, 0 } }, /* 174 */ + { { 0xe0, 0x63, 0 }, { 0xe0, 0xF0, 0x63, 0 } }, { { 0xe0, 0x64, 0 }, { 0xe0, 0xF0, 0x64, 0 } }, + { { 0xe0, 0x65, 0 }, { 0xe0, 0xF0, 0x65, 0 } }, { { 0xe0, 0x67, 0 }, { 0xe0, 0xF0, 0x67, 0 } }, /* 178 */ + { { 0xe0, 0x68, 0 }, { 0xe0, 0xF0, 0x68, 0 } }, { { 0xe0, 0x6A, 0 }, { 0xe0, 0xF0, 0x6A, 0 } }, + { { 0xe0, 0x6D, 0 }, { 0xe0, 0xF0, 0x6D, 0 } }, { { 0xe0, 0x6E, 0 }, { 0xe0, 0xF0, 0x6E, 0 } }, /* 17c */ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*180*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*184*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*188*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*18c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*190*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*194*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*198*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*19c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1ac*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1cc*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1dc*/ - { { 0},{ 0} }, { {0xe0,0xe1,0},{0xe0,0xF0,0xE1,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xee,0},{0xe0,0xF0,0xEE,0} }, { { 0},{ 0} }, /*1ec*/ - { { 0},{ 0} }, { {0xe0,0xf1,0},{0xe0,0xF0,0xF1,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{0xe0,0xF0,0xFE,0} }, { {0xe0,0xff,0},{0xe0,0xF0,0xFF,0} } /*1fc*/ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, { { 0xe0, 0xe1, 0 }, { 0xe0, 0xF0, 0xE1, 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0xee, 0 }, { 0xe0, 0xF0, 0xEE, 0 } }, { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, { { 0xe0, 0xf1, 0 }, { 0xe0, 0xF0, 0xF1, 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0xfe, 0 }, { 0xe0, 0xF0, 0xFE, 0 } }, { { 0xe0, 0xff, 0 }, { 0xe0, 0xF0, 0xFF, 0 } } /* 1fc */ // clang-format on }; static const scancode scancode_set3[512] = { // clang-format off - { { 0},{ 0} }, { { 0x08,0},{ 0xf0,0x08,0} }, { { 0x16,0},{ 0xf0,0x16,0} }, { { 0x1E,0},{ 0xf0,0x1E,0} }, /*000*/ - { { 0x26,0},{ 0xf0,0x26,0} }, { { 0x25,0},{ 0xf0,0x25,0} }, { { 0x2E,0},{ 0xf0,0x2E,0} }, { { 0x36,0},{ 0xf0,0x36,0} }, /*004*/ - { { 0x3D,0},{ 0xf0,0x3D,0} }, { { 0x3E,0},{ 0xf0,0x3E,0} }, { { 0x46,0},{ 0xf0,0x46,0} }, { { 0x45,0},{ 0xf0,0x45,0} }, /*008*/ - { { 0x4E,0},{ 0xf0,0x4E,0} }, { { 0x55,0},{ 0xf0,0x55,0} }, { { 0x66,0},{ 0xf0,0x66,0} }, { { 0x0D,0},{ 0xf0,0x0D,0} }, /*00c*/ - { { 0x15,0},{ 0xf0,0x15,0} }, { { 0x1D,0},{ 0xf0,0x1D,0} }, { { 0x24,0},{ 0xf0,0x24,0} }, { { 0x2D,0},{ 0xf0,0x2D,0} }, /*010*/ - { { 0x2C,0},{ 0xf0,0x2C,0} }, { { 0x35,0},{ 0xf0,0x35,0} }, { { 0x3C,0},{ 0xf0,0x3C,0} }, { { 0x43,0},{ 0xf0,0x43,0} }, /*014*/ - { { 0x44,0},{ 0xf0,0x44,0} }, { { 0x4D,0},{ 0xf0,0x4D,0} }, { { 0x54,0},{ 0xf0,0x54,0} }, { { 0x5B,0},{ 0xf0,0x5B,0} }, /*018*/ - { { 0x5A,0},{ 0xf0,0x5A,0} }, { { 0x11,0},{ 0xf0,0x11,0} }, { { 0x1C,0},{ 0xf0,0x1C,0} }, { { 0x1B,0},{ 0xf0,0x1B,0} }, /*01c*/ - { { 0x23,0},{ 0xf0,0x23,0} }, { { 0x2B,0},{ 0xf0,0x2B,0} }, { { 0x34,0},{ 0xf0,0x34,0} }, { { 0x33,0},{ 0xf0,0x33,0} }, /*020*/ - { { 0x3B,0},{ 0xf0,0x3B,0} }, { { 0x42,0},{ 0xf0,0x42,0} }, { { 0x4B,0},{ 0xf0,0x4B,0} }, { { 0x4C,0},{ 0xf0,0x4C,0} }, /*024*/ - { { 0x52,0},{ 0xf0,0x52,0} }, { { 0x0E,0},{ 0xf0,0x0E,0} }, { { 0x12,0},{ 0xf0,0x12,0} }, { { 0x5C,0},{ 0xf0,0x5C,0} }, /*028*/ - { { 0x1A,0},{ 0xf0,0x1A,0} }, { { 0x22,0},{ 0xf0,0x22,0} }, { { 0x21,0},{ 0xf0,0x21,0} }, { { 0x2A,0},{ 0xf0,0x2A,0} }, /*02c*/ - { { 0x32,0},{ 0xf0,0x32,0} }, { { 0x31,0},{ 0xf0,0x31,0} }, { { 0x3A,0},{ 0xf0,0x3A,0} }, { { 0x41,0},{ 0xf0,0x41,0} }, /*030*/ - { { 0x49,0},{ 0xf0,0x49,0} }, { { 0x4A,0},{ 0xf0,0x4A,0} }, { { 0x59,0},{ 0xf0,0x59,0} }, { { 0x7E,0},{ 0xf0,0x7E,0} }, /*034*/ - { { 0x19,0},{ 0xf0,0x19,0} }, { { 0x29,0},{ 0xf0,0x29,0} }, { { 0x14,0},{ 0xf0,0x14,0} }, { { 0x07,0},{ 0xf0,0x07,0} }, /*038*/ - { { 0x0F,0},{ 0xf0,0x0F,0} }, { { 0x17,0},{ 0xf0,0x17,0} }, { { 0x1F,0},{ 0xf0,0x1F,0} }, { { 0x27,0},{ 0xf0,0x27,0} }, /*03c*/ - { { 0x2F,0},{ 0xf0,0x2F,0} }, { { 0x37,0},{ 0xf0,0x37,0} }, { { 0x3F,0},{ 0xf0,0x3F,0} }, { { 0x47,0},{ 0xf0,0x47,0} }, /*040*/ - { { 0x4F,0},{ 0xf0,0x4F,0} }, { { 0x76,0},{ 0xf0,0x76,0} }, { { 0x5F,0},{ 0xf0,0x5F,0} }, { { 0x6C,0},{ 0xf0,0x6C,0} }, /*044*/ - { { 0x75,0},{ 0xf0,0x75,0} }, { { 0x7D,0},{ 0xf0,0x7D,0} }, { { 0x84,0},{ 0xf0,0x84,0} }, { { 0x6B,0},{ 0xf0,0x6B,0} }, /*048*/ - { { 0x73,0},{ 0xf0,0x73,0} }, { { 0x74,0},{ 0xf0,0x74,0} }, { { 0x7C,0},{ 0xf0,0x7C,0} }, { { 0x69,0},{ 0xf0,0x69,0} }, /*04c*/ - { { 0x72,0},{ 0xf0,0x72,0} }, { { 0x7A,0},{ 0xf0,0x7A,0} }, { { 0x70,0},{ 0xf0,0x70,0} }, { { 0x71,0},{ 0xf0,0x71,0} }, /*050*/ - { { 0x57,0},{ 0xf0,0x57,0} }, { { 0x60,0},{ 0xf0,0x60,0} }, { { 0},{ 0} }, { { 0x56,0},{ 0xf0,0x56,0} }, /*054*/ - { { 0x5E,0},{ 0xf0,0x5E,0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*058*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*05c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*060*/ - { { 0},{ 0} }, { { 0x10,0},{ 0xf0,0x10,0} }, { { 0x18,0},{ 0xf0,0x18,0} }, { { 0x20,0},{ 0xf0,0x20,0} }, /*064*/ - { { 0x28,0},{ 0xf0,0x28,0} }, { { 0x30,0},{ 0xf0,0x30,0} }, { { 0x38,0},{ 0xf0,0x38,0} }, { { 0x40,0},{ 0xf0,0x40,0} }, /*068*/ - { { 0x48,0},{ 0xf0,0x48,0} }, { { 0x50,0},{ 0xf0,0x50,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*06c*/ - { { 0x87,0},{ 0xf0,0x87,0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0x51,0},{ 0xf0,0x51,0} }, /*070*/ - { { 0x53,0},{ 0xf0,0x53,0} }, { { 0x5C,0},{ 0xf0,0x5C,0} }, { { 0},{ 0} }, { { 0x62,0},{ 0xf0,0x62,0} }, /*074*/ - { { 0x63,0},{ 0xf0,0x63,0} }, { { 0x86,0},{ 0xf0,0x86,0} }, { { 0},{ 0} }, { { 0x85,0},{ 0xf0,0x85,0} }, /*078*/ - { { 0x68,0},{ 0xf0,0x68,0} }, { { 0x13,0},{ 0xf0,0x13,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*07c*/ + { { 0 }, { 0 } }, { { 0x08, 0 }, { 0xf0, 0x08, 0 } }, /* 000 */ + { { 0x16, 0 }, { 0xf0, 0x16, 0 } }, { { 0x1E, 0 }, { 0xf0, 0x1E, 0 } }, /* 002 */ + { { 0x26, 0 }, { 0xf0, 0x26, 0 } }, { { 0x25, 0 }, { 0xf0, 0x25, 0 } }, + { { 0x2E, 0 }, { 0xf0, 0x2E, 0 } }, { { 0x36, 0 }, { 0xf0, 0x36, 0 } }, /* 004 */ + { { 0x3D, 0 }, { 0xf0, 0x3D, 0 } }, { { 0x3E, 0 }, { 0xf0, 0x3E, 0 } }, + { { 0x46, 0 }, { 0xf0, 0x46, 0 } }, { { 0x45, 0 }, { 0xf0, 0x45, 0 } }, /* 008 */ + { { 0x4E, 0 }, { 0xf0, 0x4E, 0 } }, { { 0x55, 0 }, { 0xf0, 0x55, 0 } }, + { { 0x66, 0 }, { 0xf0, 0x66, 0 } }, { { 0x0D, 0 }, { 0xf0, 0x0D, 0 } }, /* 00c */ + { { 0x15, 0 }, { 0xf0, 0x15, 0 } }, { { 0x1D, 0 }, { 0xf0, 0x1D, 0 } }, + { { 0x24, 0 }, { 0xf0, 0x24, 0 } }, { { 0x2D, 0 }, { 0xf0, 0x2D, 0 } }, /* 010 */ + { { 0x2C, 0 }, { 0xf0, 0x2C, 0 } }, { { 0x35, 0 }, { 0xf0, 0x35, 0 } }, + { { 0x3C, 0 }, { 0xf0, 0x3C, 0 } }, { { 0x43, 0 }, { 0xf0, 0x43, 0 } }, /* 014 */ + { { 0x44, 0 }, { 0xf0, 0x44, 0 } }, { { 0x4D, 0 }, { 0xf0, 0x4D, 0 } }, + { { 0x54, 0 }, { 0xf0, 0x54, 0 } }, { { 0x5B, 0 }, { 0xf0, 0x5B, 0 } }, /* 018 */ + { { 0x5A, 0 }, { 0xf0, 0x5A, 0 } }, { { 0x11, 0 }, { 0xf0, 0x11, 0 } }, + { { 0x1C, 0 }, { 0xf0, 0x1C, 0 } }, { { 0x1B, 0 }, { 0xf0, 0x1B, 0 } }, /* 01c */ + { { 0x23, 0 }, { 0xf0, 0x23, 0 } }, { { 0x2B, 0 }, { 0xf0, 0x2B, 0 } }, + { { 0x34, 0 }, { 0xf0, 0x34, 0 } }, { { 0x33, 0 }, { 0xf0, 0x33, 0 } }, /* 020 */ + { { 0x3B, 0 }, { 0xf0, 0x3B, 0 } }, { { 0x42, 0 }, { 0xf0, 0x42, 0 } }, + { { 0x4B, 0 }, { 0xf0, 0x4B, 0 } }, { { 0x4C, 0 }, { 0xf0, 0x4C, 0 } }, /* 024 */ + { { 0x52, 0 }, { 0xf0, 0x52, 0 } }, { { 0x0E, 0 }, { 0xf0, 0x0E, 0 } }, + { { 0x12, 0 }, { 0xf0, 0x12, 0 } }, { { 0x5C, 0 }, { 0xf0, 0x5C, 0 } }, /* 028 */ + { { 0x1A, 0 }, { 0xf0, 0x1A, 0 } }, { { 0x22, 0 }, { 0xf0, 0x22, 0 } }, + { { 0x21, 0 }, { 0xf0, 0x21, 0 } }, { { 0x2A, 0 }, { 0xf0, 0x2A, 0 } }, /* 02c */ + { { 0x32, 0 }, { 0xf0, 0x32, 0 } }, { { 0x31, 0 }, { 0xf0, 0x31, 0 } }, + { { 0x3A, 0 }, { 0xf0, 0x3A, 0 } }, { { 0x41, 0 }, { 0xf0, 0x41, 0 } }, /* 030 */ + { { 0x49, 0 }, { 0xf0, 0x49, 0 } }, { { 0x4A, 0 }, { 0xf0, 0x4A, 0 } }, + { { 0x59, 0 }, { 0xf0, 0x59, 0 } }, { { 0x7E, 0 }, { 0xf0, 0x7E, 0 } }, /* 034 */ + { { 0x19, 0 }, { 0xf0, 0x19, 0 } }, { { 0x29, 0 }, { 0xf0, 0x29, 0 } }, + { { 0x14, 0 }, { 0xf0, 0x14, 0 } }, { { 0x07, 0 }, { 0xf0, 0x07, 0 } }, /* 038 */ + { { 0x0F, 0 }, { 0xf0, 0x0F, 0 } }, { { 0x17, 0 }, { 0xf0, 0x17, 0 } }, + { { 0x1F, 0 }, { 0xf0, 0x1F, 0 } }, { { 0x27, 0 }, { 0xf0, 0x27, 0 } }, /* 03c */ + { { 0x2F, 0 }, { 0xf0, 0x2F, 0 } }, { { 0x37, 0 }, { 0xf0, 0x37, 0 } }, + { { 0x3F, 0 }, { 0xf0, 0x3F, 0 } }, { { 0x47, 0 }, { 0xf0, 0x47, 0 } }, /* 040 */ + { { 0x4F, 0 }, { 0xf0, 0x4F, 0 } }, { { 0x76, 0 }, { 0xf0, 0x76, 0 } }, + { { 0x5F, 0 }, { 0xf0, 0x5F, 0 } }, { { 0x6C, 0 }, { 0xf0, 0x6C, 0 } }, /* 044 */ + { { 0x75, 0 }, { 0xf0, 0x75, 0 } }, { { 0x7D, 0 }, { 0xf0, 0x7D, 0 } }, + { { 0x84, 0 }, { 0xf0, 0x84, 0 } }, { { 0x6B, 0 }, { 0xf0, 0x6B, 0 } }, /* 048 */ + { { 0x73, 0 }, { 0xf0, 0x73, 0 } }, { { 0x74, 0 }, { 0xf0, 0x74, 0 } }, + { { 0x7C, 0 }, { 0xf0, 0x7C, 0 } }, { { 0x69, 0 }, { 0xf0, 0x69, 0 } }, /* 04c */ + { { 0x72, 0 }, { 0xf0, 0x72, 0 } }, { { 0x7A, 0 }, { 0xf0, 0x7A, 0 } }, + { { 0x70, 0 }, { 0xf0, 0x70, 0 } }, { { 0x71, 0 }, { 0xf0, 0x71, 0 } }, /* 050 */ + { { 0x57, 0 }, { 0xf0, 0x57, 0 } }, { { 0x60, 0 }, { 0xf0, 0x60, 0 } }, + { { 0 }, { 0 } }, { { 0x56, 0 }, { 0xf0, 0x56, 0 } }, /* 054 */ + { { 0x5E, 0 }, { 0xf0, 0x5E, 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 058 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, { { 0x10, 0 }, { 0xf0, 0x10, 0 } }, + { { 0x18, 0 }, { 0xf0, 0x18, 0 } }, { { 0x20, 0 }, { 0xf0, 0x20, 0 } }, /* 064 */ + { { 0x28, 0 }, { 0xf0, 0x28, 0 } }, { { 0x30, 0 }, { 0xf0, 0x30, 0 } }, + { { 0x38, 0 }, { 0xf0, 0x38, 0 } }, { { 0x40, 0 }, { 0xf0, 0x40, 0 } }, /* 068 */ + { { 0x48, 0 }, { 0xf0, 0x48, 0 } }, { { 0x50, 0 }, { 0xf0, 0x50, 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ + { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0x51, 0 }, { 0xf0, 0x51, 0 } }, /* 070 */ + { { 0x53, 0 }, { 0xf0, 0x53, 0 } }, { { 0x5C, 0 }, { 0xf0, 0x5C, 0 } }, + { { 0 }, { 0 } }, { { 0x62, 0 }, { 0xf0, 0x62, 0 } }, /* 074 */ + { { 0x63, 0 }, { 0xf0, 0x63, 0 } }, { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, + { { 0 }, { 0 } }, { { 0x85, 0 }, { 0xf0, 0x85, 0 } }, /* 078 */ + { { 0x68, 0 }, { 0xf0, 0x68, 0 } }, { { 0x13, 0 }, { 0xf0, 0x13, 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ - { { 0x80,0},{ 0xf0,0x80,0} }, { { 0x81,0},{ 0xf0,0x81,0} }, { { 0x82,0},{ 0xf0,0x82,0} }, { { 0},{ 0} }, /*080*/ - { { 0},{ 0} }, { { 0x85,0},{ 0xf0,0x54,0} }, { { 0x86,0},{ 0xf0,0x86,0} }, { { 0x87,0},{ 0xf0,0x87,0} }, /*084*/ - { { 0x88,0},{ 0xf0,0x88,0} }, { { 0x89,0},{ 0xf0,0x89,0} }, { { 0x8a,0},{ 0xf0,0x8a,0} }, { { 0x8b,0},{ 0xf0,0x8b,0} }, /*088*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0x8e,0},{ 0xf0,0x8e,0} }, { { 0x8f,0},{ 0xf0,0x8f,0} }, /*08c*/ - { { 0x90,0},{ 0xf0,0x90,0} }, { { 0x91,0},{ 0xf0,0x91,0} }, { { 0x92,0},{ 0xf0,0x92,0} }, { { 0x93,0},{ 0xf0,0x93,0} }, /*090*/ - { { 0x94,0},{ 0xf0,0x94,0} }, { { 0x95,0},{ 0xf0,0x95,0} }, { { 0x96,0},{ 0xf0,0x96,0} }, { { 0x97,0},{ 0xf0,0x97,0} }, /*094*/ - { { 0x98,0},{ 0xf0,0x98,0} }, { { 0x99,0},{ 0xf0,0x99,0} }, { { 0x9a,0},{ 0xf0,0x9a,0} }, { { 0x9b,0},{ 0xf0,0x9b,0} }, /*098*/ - { { 0x9c,0},{ 0xf0,0x9c,0} }, { { 0x9d,0},{ 0xf0,0x9d,0} }, { { 0x9e,0},{ 0xf0,0x9e,0} }, { { 0x9f,0},{ 0xf0,0x9f,0} }, /*09c*/ - { { 0xa0,0},{ 0xf0,0xa0,0} }, { { 0xa1,0},{ 0xf0,0xa1,0} }, { { 0xa2,0},{ 0xf0,0xa2,0} }, { { 0xa3,0},{ 0xf0,0xa3,0} }, /*0a0*/ - { { 0xa4,0},{ 0xf0,0xa4,0} }, { { 0xa5,0},{ 0xf0,0xa5,0} }, { { 0xa6,0},{ 0xf0,0xa6,0} }, { { 0xa7,0},{ 0xf0,0xa7,0} }, /*0a4*/ - { { 0xa8,0},{ 0xf0,0xa8,0} }, { { 0xa9,0},{ 0xf0,0xa9,0} }, { { 0xaa,0},{ 0xf0,0xaa,0} }, { { 0xab,0},{ 0xf0,0xab,0} }, /*0a8*/ - { { 0xac,0},{ 0xf0,0xac,0} }, { { 0xad,0},{ 0xf0,0xad,0} }, { { 0xae,0},{ 0xf0,0xae,0} }, { { 0xaf,0},{ 0xf0,0xaf,0} }, /*0ac*/ - { { 0xb0,0},{ 0xf0,0xb0,0} }, { { 0xb1,0},{ 0xf0,0xb1,0} }, { { 0xb2,0},{ 0xf0,0xb2,0} }, { { 0xb3,0},{ 0xf0,0xb3,0} }, /*0b0*/ - { { 0xb4,0},{ 0xf0,0xb4,0} }, { { 0xb5,0},{ 0xf0,0xb5,0} }, { { 0xb6,0},{ 0xf0,0xb6,0} }, { { 0xb7,0},{ 0xf0,0xb7,0} }, /*0b4*/ - { { 0xb8,0},{ 0xf0,0xb8,0} }, { { 0xb9,0},{ 0xf0,0xb9,0} }, { { 0xba,0},{ 0xf0,0xba,0} }, { { 0xbb,0},{ 0xf0,0xbb,0} }, /*0b8*/ - { { 0xbc,0},{ 0xf0,0xbc,0} }, { { 0xbd,0},{ 0xf0,0xbd,0} }, { { 0xbe,0},{ 0xf0,0xbe,0} }, { { 0xbf,0},{ 0xf0,0xbf,0} }, /*0bc*/ - { { 0xc0,0},{ 0xf0,0xc0,0} }, { { 0xc1,0},{ 0xf0,0xc1,0} }, { { 0xc2,0},{ 0xf0,0xc2,0} }, { { 0xc3,0},{ 0xf0,0xc3,0} }, /*0c0*/ - { { 0xc4,0},{ 0xf0,0xc4,0} }, { { 0xc5,0},{ 0xf0,0xc5,0} }, { { 0xc6,0},{ 0xf0,0xc6,0} }, { { 0xc7,0},{ 0xf0,0xc7,0} }, /*0c4*/ - { { 0xc8,0},{ 0xf0,0xc8,0} }, { { 0xc9,0},{ 0xf0,0xc9,0} }, { { 0xca,0},{ 0xf0,0xca,0} }, { { 0xcb,0},{ 0xf0,0xcb,0} }, /*0c8*/ - { { 0xcc,0},{ 0xf0,0xcc,0} }, { { 0xcd,0},{ 0xf0,0xcd,0} }, { { 0xce,0},{ 0xf0,0xce,0} }, { { 0xcf,0},{ 0xf0,0xcf,0} }, /*0cc*/ - { { 0xd0,0},{ 0xf0,0xd0,0} }, { { 0xd1,0},{ 0xf0,0xd0,0} }, { { 0xd2,0},{ 0xf0,0xd2,0} }, { { 0xd3,0},{ 0xf0,0xd3,0} }, /*0d0*/ - { { 0xd4,0},{ 0xf0,0xd4,0} }, { { 0xd5,0},{ 0xf0,0xd5,0} }, { { 0xd6,0},{ 0xf0,0xd6,0} }, { { 0xd7,0},{ 0xf0,0xd7,0} }, /*0d4*/ - { { 0xd8,0},{ 0xf0,0xd8,0} }, { { 0xd9,0},{ 0xf0,0xd9,0} }, { { 0xda,0},{ 0xf0,0xda,0} }, { { 0xdb,0},{ 0xf0,0xdb,0} }, /*0d8*/ - { { 0xdc,0},{ 0xf0,0xdc,0} }, { { 0xdd,0},{ 0xf0,0xdd,0} }, { { 0xde,0},{ 0xf0,0xde,0} }, { { 0xdf,0},{ 0xf0,0xdf,0} }, /*0dc*/ - { { 0xe0,0},{ 0xf0,0xe0,0} }, { { 0xe1,0},{ 0xf0,0xe1,0} }, { { 0xe2,0},{ 0xf0,0xe2,0} }, { { 0xe3,0},{ 0xf0,0xe3,0} }, /*0e0*/ - { { 0xe4,0},{ 0xf0,0xe4,0} }, { { 0xe5,0},{ 0xf0,0xe5,0} }, { { 0xe6,0},{ 0xf0,0xe6,0} }, { { 0xe7,0},{ 0xf0,0xe7,0} }, /*0e4*/ - { { 0xe8,0},{ 0xf0,0xe8,0} }, { { 0xe9,0},{ 0xf0,0xe9,0} }, { { 0xea,0},{ 0xf0,0xea,0} }, { { 0xeb,0},{ 0xf0,0xeb,0} }, /*0e8*/ - { { 0xec,0},{ 0xf0,0xec,0} }, { { 0xed,0},{ 0xf0,0xed,0} }, { { 0xee,0},{ 0xf0,0xee,0} }, { { 0xef,0},{ 0xf0,0xef,0} }, /*0ec*/ - { { 0},{ 0} }, { { 0xf1,0},{ 0xf0,0xf1,0} }, { { 0xf2,0},{ 0xf0,0xf2,0} }, { { 0xf3,0},{ 0xf0,0xf3,0} }, /*0f0*/ - { { 0xf4,0},{ 0xf0,0xf4,0} }, { { 0xf5,0},{ 0xf0,0xf5,0} }, { { 0xf6,0},{ 0xf0,0xf6,0} }, { { 0xf7,0},{ 0xf0,0xf7,0} }, /*0f4*/ - { { 0xf8,0},{ 0xf0,0xf8,0} }, { { 0xf9,0},{ 0xf0,0xf9,0} }, { { 0xfa,0},{ 0xf0,0xfa,0} }, { { 0xfb,0},{ 0xf0,0xfb,0} }, /*0f8*/ - { { 0xfc,0},{ 0xf0,0xfc,0} }, { { 0xfd,0},{ 0xf0,0xfd,0} }, { { 0xfe,0},{ 0xf0,0xfe,0} }, { { 0xff,0},{ 0xf0,0xff,0} }, /*0fc*/ + { { 0x80, 0 }, { 0xf0, 0x80, 0 } }, { { 0x81, 0 }, { 0xf0, 0x81, 0 } }, /* 080 */ + { { 0x82, 0 }, { 0xf0, 0x82, 0 } }, { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, { { 0x85, 0 }, { 0xf0, 0x54, 0 } }, + { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 084 */ + { { 0x88, 0 }, { 0xf0, 0x88, 0 } }, { { 0x89, 0 }, { 0xf0, 0x89, 0 } }, + { { 0x8a, 0 }, { 0xf0, 0x8a, 0 } }, { { 0x8b, 0 }, { 0xf0, 0x8b, 0 } }, /* 088 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0x8e, 0 }, { 0xf0, 0x8e, 0 } }, { { 0x8f, 0 }, { 0xf0, 0x8f, 0 } }, /* 08c */ + { { 0x90, 0 }, { 0xf0, 0x90, 0 } }, { { 0x91, 0 }, { 0xf0, 0x91, 0 } }, + { { 0x92, 0 }, { 0xf0, 0x92, 0 } }, { { 0x93, 0 }, { 0xf0, 0x93, 0 } }, /* 090 */ + { { 0x94, 0 }, { 0xf0, 0x94, 0 } }, { { 0x95, 0 }, { 0xf0, 0x95, 0 } }, + { { 0x96, 0 }, { 0xf0, 0x96, 0 } }, { { 0x97, 0 }, { 0xf0, 0x97, 0 } }, /* 094 */ + { { 0x98, 0 }, { 0xf0, 0x98, 0 } }, { { 0x99, 0 }, { 0xf0, 0x99, 0 } }, + { { 0x9a, 0 }, { 0xf0, 0x9a, 0 } }, { { 0x9b, 0 }, { 0xf0, 0x9b, 0 } }, /* 098 */ + { { 0x9c, 0 }, { 0xf0, 0x9c, 0 } }, { { 0x9d, 0 }, { 0xf0, 0x9d, 0 } }, + { { 0x9e, 0 }, { 0xf0, 0x9e, 0 } }, { { 0x9f, 0 }, { 0xf0, 0x9f, 0 } }, /* 09c */ + { { 0xa0, 0 }, { 0xf0, 0xa0, 0 } }, { { 0xa1, 0 }, { 0xf0, 0xa1, 0 } }, + { { 0xa2, 0 }, { 0xf0, 0xa2, 0 } }, { { 0xa3, 0 }, { 0xf0, 0xa3, 0 } }, /* 0a0 */ + { { 0xa4, 0 }, { 0xf0, 0xa4, 0 } }, { { 0xa5, 0 }, { 0xf0, 0xa5, 0 } }, + { { 0xa6, 0 }, { 0xf0, 0xa6, 0 } }, { { 0xa7, 0 }, { 0xf0, 0xa7, 0 } }, /* 0a4 */ + { { 0xa8, 0 }, { 0xf0, 0xa8, 0 } }, { { 0xa9, 0 }, { 0xf0, 0xa9, 0 } }, + { { 0xaa, 0 }, { 0xf0, 0xaa, 0 } }, { { 0xab, 0 }, { 0xf0, 0xab, 0 } }, /* 0a8 */ + { { 0xac, 0 }, { 0xf0, 0xac, 0 } }, { { 0xad, 0 }, { 0xf0, 0xad, 0 } }, + { { 0xae, 0 }, { 0xf0, 0xae, 0 } }, { { 0xaf, 0 }, { 0xf0, 0xaf, 0 } }, /* 0ac */ + { { 0xb0, 0 }, { 0xf0, 0xb0, 0 } }, { { 0xb1, 0 }, { 0xf0, 0xb1, 0 } }, + { { 0xb2, 0 }, { 0xf0, 0xb2, 0 } }, { { 0xb3, 0 }, { 0xf0, 0xb3, 0 } }, /* 0b0 */ + { { 0xb4, 0 }, { 0xf0, 0xb4, 0 } }, { { 0xb5, 0 }, { 0xf0, 0xb5, 0 } }, + { { 0xb6, 0 }, { 0xf0, 0xb6, 0 } }, { { 0xb7, 0 }, { 0xf0, 0xb7, 0 } }, /* 0b4 */ + { { 0xb8, 0 }, { 0xf0, 0xb8, 0 } }, { { 0xb9, 0 }, { 0xf0, 0xb9, 0 } }, + { { 0xba, 0 }, { 0xf0, 0xba, 0 } }, { { 0xbb, 0 }, { 0xf0, 0xbb, 0 } }, /* 0b8 */ + { { 0xbc, 0 }, { 0xf0, 0xbc, 0 } }, { { 0xbd, 0 }, { 0xf0, 0xbd, 0 } }, + { { 0xbe, 0 }, { 0xf0, 0xbe, 0 } }, { { 0xbf, 0 }, { 0xf0, 0xbf, 0 } }, /* 0bc */ + { { 0xc0, 0 }, { 0xf0, 0xc0, 0 } }, { { 0xc1, 0 }, { 0xf0, 0xc1, 0 } }, + { { 0xc2, 0 }, { 0xf0, 0xc2, 0 } }, { { 0xc3, 0 }, { 0xf0, 0xc3, 0 } }, /* 0c0 */ + { { 0xc4, 0 }, { 0xf0, 0xc4, 0 } }, { { 0xc5, 0 }, { 0xf0, 0xc5, 0 } }, + { { 0xc6, 0 }, { 0xf0, 0xc6, 0 } }, { { 0xc7, 0 }, { 0xf0, 0xc7, 0 } }, /* 0c4 */ + { { 0xc8, 0 }, { 0xf0, 0xc8, 0 } }, { { 0xc9, 0 }, { 0xf0, 0xc9, 0 } }, + { { 0xca, 0 }, { 0xf0, 0xca, 0 } }, { { 0xcb, 0 }, { 0xf0, 0xcb, 0 } }, /* 0c8 */ + { { 0xcc, 0 }, { 0xf0, 0xcc, 0 } }, { { 0xcd, 0 }, { 0xf0, 0xcd, 0 } }, + { { 0xce, 0 }, { 0xf0, 0xce, 0 } }, { { 0xcf, 0 }, { 0xf0, 0xcf, 0 } }, /* 0cc */ + { { 0xd0, 0 }, { 0xf0, 0xd0, 0 } }, { { 0xd1, 0 }, { 0xf0, 0xd0, 0 } }, + { { 0xd2, 0 }, { 0xf0, 0xd2, 0 } }, { { 0xd3, 0 }, { 0xf0, 0xd3, 0 } }, /* 0d0 */ + { { 0xd4, 0 }, { 0xf0, 0xd4, 0 } }, { { 0xd5, 0 }, { 0xf0, 0xd5, 0 } }, + { { 0xd6, 0 }, { 0xf0, 0xd6, 0 } }, { { 0xd7, 0 }, { 0xf0, 0xd7, 0 } }, /* 0d4 */ + { { 0xd8, 0 }, { 0xf0, 0xd8, 0 } }, { { 0xd9, 0 }, { 0xf0, 0xd9, 0 } }, + { { 0xda, 0 }, { 0xf0, 0xda, 0 } }, { { 0xdb, 0 }, { 0xf0, 0xdb, 0 } }, /* 0d8 */ + { { 0xdc, 0 }, { 0xf0, 0xdc, 0 } }, { { 0xdd, 0 }, { 0xf0, 0xdd, 0 } }, + { { 0xde, 0 }, { 0xf0, 0xde, 0 } }, { { 0xdf, 0 }, { 0xf0, 0xdf, 0 } }, /* 0dc */ + { { 0xe0, 0 }, { 0xf0, 0xe0, 0 } }, { { 0xe1, 0 }, { 0xf0, 0xe1, 0 } }, + { { 0xe2, 0 }, { 0xf0, 0xe2, 0 } }, { { 0xe3, 0 }, { 0xf0, 0xe3, 0 } }, /* 0e0 */ + { { 0xe4, 0 }, { 0xf0, 0xe4, 0 } }, { { 0xe5, 0 }, { 0xf0, 0xe5, 0 } }, + { { 0xe6, 0 }, { 0xf0, 0xe6, 0 } }, { { 0xe7, 0 }, { 0xf0, 0xe7, 0 } }, /* 0e4 */ + { { 0xe8, 0 }, { 0xf0, 0xe8, 0 } }, { { 0xe9, 0 }, { 0xf0, 0xe9, 0 } }, + { { 0xea, 0 }, { 0xf0, 0xea, 0 } }, { { 0xeb, 0 }, { 0xf0, 0xeb, 0 } }, /* 0e8 */ + { { 0xec, 0 }, { 0xf0, 0xec, 0 } }, { { 0xed, 0 }, { 0xf0, 0xed, 0 } }, + { { 0xee, 0 }, { 0xf0, 0xee, 0 } }, { { 0xef, 0 }, { 0xf0, 0xef, 0 } }, /* 0ec */ + { { 0 }, { 0 } }, { { 0xf1, 0 }, { 0xf0, 0xf1, 0 } }, + { { 0xf2, 0 }, { 0xf0, 0xf2, 0 } }, { { 0xf3, 0 }, { 0xf0, 0xf3, 0 } }, /* 0f0 */ + { { 0xf4, 0 }, { 0xf0, 0xf4, 0 } }, { { 0xf5, 0 }, { 0xf0, 0xf5, 0 } }, + { { 0xf6, 0 }, { 0xf0, 0xf6, 0 } }, { { 0xf7, 0 }, { 0xf0, 0xf7, 0 } }, /* 0f4 */ + { { 0xf8, 0 }, { 0xf0, 0xf8, 0 } }, { { 0xf9, 0 }, { 0xf0, 0xf9, 0 } }, + { { 0xfa, 0 }, { 0xf0, 0xfa, 0 } }, { { 0xfb, 0 }, { 0xf0, 0xfb, 0 } }, /* 0f8 */ + { { 0xfc, 0 }, { 0xf0, 0xfc, 0 } }, { { 0xfd, 0 }, { 0xf0, 0xfd, 0 } }, + { { 0xfe, 0 }, { 0xf0, 0xfe, 0 } }, { { 0xff, 0 }, { 0xf0, 0xff, 0 } }, /* 0fc */ - { { 0x62,0},{ 0xF0,0x62,0} }, { {0xe0,0x76,0},{0xe0,0xF0,0x76,0} }, { {0xe0,0x16,0},{0xe0,0xF0,0x16,0} }, { {0xe0,0x1E,0},{0xe0,0xF0,0x1E,0} }, /*100*/ - { {0xe0,0x26,0},{0xe0,0xF0,0x26,0} }, { {0xe0,0x25,0},{0xe0,0xF0,0x25,0} }, { {0xe0,0x2E,0},{0xe0,0xF0,0x2E,0} }, { {0xe0,0x36,0},{0xe0,0xF0,0x36,0} }, /*104*/ - { {0xe0,0x3D,0},{0xe0,0xF0,0x3D,0} }, { {0xe0,0x3E,0},{0xe0,0xF0,0x3E,0} }, { {0xe0,0x46,0},{0xe0,0xF0,0x46,0} }, { {0xe0,0x45,0},{0xe0,0xF0,0x45,0} }, /*108*/ - { {0xe0,0x4E,0},{0xe0,0xF0,0x4E,0} }, { { 0},{ 0} }, { {0xe0,0x66,0},{0xe0,0xF0,0x66,0} }, { {0xe0,0x0D,0},{0xe0,0xF0,0x0D,0} }, /*10c*/ - { {0xe0,0x15,0},{0xe0,0xF0,0x15,0} }, { {0xe0,0x1D,0},{0xe0,0xF0,0x1D,0} }, { {0xe0,0x24,0},{0xe0,0xF0,0x24,0} }, { {0xe0,0x2D,0},{0xe0,0xF0,0x2D,0} }, /*110*/ - { {0xe0,0x2C,0},{0xe0,0xF0,0x2C,0} }, { {0xe0,0x35,0},{0xe0,0xF0,0x35,0} }, { {0xe0,0x3C,0},{0xe0,0xF0,0x3C,0} }, { {0xe0,0x43,0},{0xe0,0xF0,0x43,0} }, /*114*/ - { {0xe0,0x44,0},{0xe0,0xF0,0x44,0} }, { {0xe0,0x4D,0},{0xe0,0xF0,0x4D,0} }, { {0xe0,0x54,0},{0xe0,0xF0,0x54,0} }, { {0xe0,0x5B,0},{0xe0,0xF0,0x5B,0} }, /*118*/ - { { 0x79,0},{ 0xf0,0x79,0} }, { { 0x58,0},{ 0xf0,0x58,0} }, { {0xe0,0x1C,0},{0xe0,0xF0,0x1C,0} }, { {0xe0,0x1B,0},{0xe0,0xF0,0x1B,0} }, /*11c*/ - { {0xe0,0x23,0},{0xe0,0xF0,0x23,0} }, { {0xe0,0x2B,0},{0xe0,0xF0,0x2B,0} }, { {0xe0,0x34,0},{0xe0,0xF0,0x34,0} }, { {0xe0,0x33,0},{0xe0,0xF0,0x33,0} }, /*120*/ - { {0xe0,0x3B,0},{0xe0,0xF0,0x3B,0} }, { {0xe0,0x42,0},{0xe0,0xF0,0x42,0} }, { {0xe0,0x4B,0},{0xe0,0xF0,0x4B,0} }, { { 0},{ 0} }, /*124*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*128*/ - { {0xe0,0x1A,0},{0xe0,0xF0,0x1A,0} }, { {0xe0,0x22,0},{0xe0,0xF0,0x22,0} }, { {0xe0,0x21,0},{0xe0,0xF0,0x21,0} }, { {0xe0,0x2A,0},{0xe0,0xF0,0x2A,0} }, /*12c*/ - { {0xe0,0x32,0},{0xe0,0xF0,0x32,0} }, { {0xe0,0x31,0},{0xe0,0xF0,0x31,0} }, { {0xe0,0x3A,0},{0xe0,0xF0,0x3A,0} }, { { 0},{ 0} }, /*130*/ - { {0xe0,0x49,0},{0xe0,0xF0,0x49,0} }, { { 0x77,0},{ 0xf0,0x77,0} }, { { 0},{ 0} }, { { 0x57,0},{ 0xf0,0x57,0} }, /*134*/ - { { 0x39,0},{ 0xf0,0x39,0} }, { { 0},{ 0} }, { {0xe0,0x58,0},{0xe0,0xF0,0x58,0} }, { {0xe0,0x05,0},{0xe0,0xF0,0x05,0} }, /*138*/ - { {0xe0,0x06,0},{0xe0,0xF0,0x06,0} }, { {0xe0,0x04,0},{0xe0,0xF0,0x04,0} }, { {0xe0,0x0C,0},{0xe0,0xF0,0x0C,0} }, { {0xe0,0x03,0},{0xe0,0xF0,0x03,0} }, /*13c*/ - { {0xe0,0x0B,0},{0xe0,0xF0,0x0B,0} }, { {0xe0,0x02,0},{0xe0,0xF0,0x02,0} }, { {0xe0,0x0A,0},{0xe0,0xF0,0x0A,0} }, { {0xe0,0x01,0},{0xe0,0xF0,0x01,0} }, /*140*/ - { {0xe0,0x09,0},{0xe0,0xF0,0x09,0} }, { { 0},{ 0} }, { {0xe0,0x7E,0},{0xe0,0xF0,0x7E,0} }, { { 0x6E,0},{ 0xf0,0x6E,0} }, /*144*/ - { { 0x63,0},{ 0xf0,0x63,0} }, { { 0x6F,0},{ 0xf0,0x6F,0} }, { { 0},{ 0} }, { { 0x61,0},{ 0xf0,0x61,0} }, /*148*/ - { {0xe0,0x73,0},{0xe0,0xF0,0x73,0} }, { { 0x6A,0},{ 0xf0,0x6A,0} }, { {0xe0,0x79,0},{0xe0,0xF0,0x79,0} }, { { 0x65,0},{ 0xf0,0x65,0} }, /*14c*/ - { { 0x60,0},{ 0xf0,0x60,0} }, { { 0x6D,0},{ 0xf0,0x6D,0} }, { { 0x67,0},{ 0xf0,0x67,0} }, { { 0x64,0},{ 0xf0,0x64,0} }, /*150*/ - { { 0xd4,0},{ 0xf0,0xD4,0} }, { {0xe0,0x60,0},{0xe0,0xF0,0x60,0} }, { { 0},{ 0} }, { {0xe0,0x78,0},{0xe0,0xF0,0x78,0} }, /*154*/ - { {0xe0,0x07,0},{0xe0,0xF0,0x07,0} }, { {0xe0,0x0F,0},{0xe0,0xF0,0x0F,0} }, { {0xe0,0x17,0},{0xe0,0xF0,0x17,0} }, { { 0x8B,0},{ 0xf0,0x8B,0} }, /*158*/ - { { 0x8C,0},{ 0xf0,0x8C,0} }, { { 0x8D,0},{ 0xf0,0x8D,0} }, { { 0},{ 0} }, { { 0x7F,0},{ 0xf0,0x7F,0} }, /*15c*/ - { { 0},{ 0} }, { {0xe0,0x4F,0},{0xe0,0xF0,0x4F,0} }, { {0xe0,0x56,0},{0xe0,0xF0,0x56,0} }, { { 0},{ 0} }, /*160*/ - { {0xe0,0x08,0},{0xe0,0xF0,0x08,0} }, { {0xe0,0x10,0},{0xe0,0xF0,0x10,0} }, { {0xe0,0x18,0},{0xe0,0xF0,0x18,0} }, { {0xe0,0x20,0},{0xe0,0xF0,0x20,0} }, /*164*/ - { {0xe0,0x28,0},{0xe0,0xF0,0x28,0} }, { {0xe0,0x30,0},{0xe0,0xF0,0x30,0} }, { {0xe0,0x38,0},{0xe0,0xF0,0x38,0} }, { {0xe0,0x40,0},{0xe0,0xF0,0x40,0} }, /*168*/ - { {0xe0,0x48,0},{0xe0,0xF0,0x48,0} }, { {0xe0,0x50,0},{0xe0,0xF0,0x50,0} }, { {0xe0,0x57,0},{0xe0,0xF0,0x57,0} }, { { 0},{ 0} }, /*16c*/ - { {0xe0,0x13,0},{0xe0,0xF0,0x13,0} }, { {0xe0,0x19,0},{0xe0,0xF0,0x19,0} }, { {0xe0,0x39,0},{0xe0,0xF0,0x39,0} }, { {0xe0,0x51,0},{0xe0,0xF0,0x51,0} }, /*170*/ - { {0xe0,0x53,0},{0xe0,0xF0,0x53,0} }, { {0xe0,0x5C,0},{0xe0,0xF0,0x5C,0} }, { { 0},{ 0} }, { {0xe0,0x62,0},{0xe0,0xF0,0x62,0} }, /*174*/ - { {0xe0,0x63,0},{0xe0,0xF0,0x63,0} }, { {0xe0,0x64,0},{0xe0,0xF0,0x64,0} }, { {0xe0,0x65,0},{0xe0,0xF0,0x65,0} }, { {0xe0,0x67,0},{0xe0,0xF0,0x67,0} }, /*178*/ - { {0xe0,0x68,0},{0xe0,0xF0,0x68,0} }, { {0xe0,0x6A,0},{0xe0,0xF0,0x6A,0} }, { {0xe0,0x6D,0},{0xe0,0xF0,0x6D,0} }, { {0xe0,0x6E,0},{0xe0,0xF0,0x6E,0} }, /*17c*/ + { { 0x62, 0 }, { 0xF0, 0x62, 0 } }, { { 0xe0, 0x76, 0 }, { 0xe0, 0xF0, 0x76, 0 } }, /* 100 */ + { { 0xe0, 0x16, 0 }, { 0xe0, 0xF0, 0x16, 0 } }, { { 0xe0, 0x1E, 0 }, { 0xe0, 0xF0, 0x1E, 0 } }, /* 102 */ + { { 0xe0, 0x26, 0 }, { 0xe0, 0xF0, 0x26, 0 } }, { { 0xe0, 0x25, 0 }, { 0xe0, 0xF0, 0x25, 0 } }, + { { 0xe0, 0x2E, 0 }, { 0xe0, 0xF0, 0x2E, 0 } }, { { 0xe0, 0x36, 0 }, { 0xe0, 0xF0, 0x36, 0 } }, /* 104 */ + { { 0xe0, 0x3D, 0 }, { 0xe0, 0xF0, 0x3D, 0 } }, { { 0xe0, 0x3E, 0 }, { 0xe0, 0xF0, 0x3E, 0 } }, + { { 0xe0, 0x46, 0 }, { 0xe0, 0xF0, 0x46, 0 } }, { { 0xe0, 0x45, 0 }, { 0xe0, 0xF0, 0x45, 0 } }, /* 108 */ + { { 0xe0, 0x4E, 0 }, { 0xe0, 0xF0, 0x4E, 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0x66, 0 }, { 0xe0, 0xF0, 0x66, 0 } }, { { 0xe0, 0x0D, 0 }, { 0xe0, 0xF0, 0x0D, 0 } }, /* 10c */ + { { 0xe0, 0x15, 0 }, { 0xe0, 0xF0, 0x15, 0 } }, { { 0xe0, 0x1D, 0 }, { 0xe0, 0xF0, 0x1D, 0 } }, + { { 0xe0, 0x24, 0 }, { 0xe0, 0xF0, 0x24, 0 } }, { { 0xe0, 0x2D, 0 }, { 0xe0, 0xF0, 0x2D, 0 } }, /* 110 */ + { { 0xe0, 0x2C, 0 }, { 0xe0, 0xF0, 0x2C, 0 } }, { { 0xe0, 0x35, 0 }, { 0xe0, 0xF0, 0x35, 0 } }, + { { 0xe0, 0x3C, 0 }, { 0xe0, 0xF0, 0x3C, 0 } }, { { 0xe0, 0x43, 0 }, { 0xe0, 0xF0, 0x43, 0 } }, /* 114 */ + { { 0xe0, 0x44, 0 }, { 0xe0, 0xF0, 0x44, 0 } }, { { 0xe0, 0x4D, 0 }, { 0xe0, 0xF0, 0x4D, 0 } }, + { { 0xe0, 0x54, 0 }, { 0xe0, 0xF0, 0x54, 0 } }, { { 0xe0, 0x5B, 0 }, { 0xe0, 0xF0, 0x5B, 0 } }, /* 118 */ + { { 0x79, 0 }, { 0xf0, 0x79, 0 } }, { { 0x58, 0 }, { 0xf0, 0x58, 0 } }, + { { 0xe0, 0x1C, 0 }, { 0xe0, 0xF0, 0x1C, 0 } }, { { 0xe0, 0x1B, 0 }, { 0xe0, 0xF0, 0x1B, 0 } }, /* 11c */ + { { 0xe0, 0x23, 0 }, { 0xe0, 0xF0, 0x23, 0 } }, { { 0xe0, 0x2B, 0 }, { 0xe0, 0xF0, 0x2B, 0 } }, + { { 0xe0, 0x34, 0 }, { 0xe0, 0xF0, 0x34, 0 } }, { { 0xe0, 0x33, 0 }, { 0xe0, 0xF0, 0x33, 0 } }, /* 120 */ + { { 0xe0, 0x3B, 0 }, { 0xe0, 0xF0, 0x3B, 0 } }, { { 0xe0, 0x42, 0 }, { 0xe0, 0xF0, 0x42, 0 } }, + { { 0xe0, 0x4B, 0 }, { 0xe0, 0xF0, 0x4B, 0 } }, { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ + { { 0xe0, 0x1A, 0 }, { 0xe0, 0xF0, 0x1A, 0 } }, { { 0xe0, 0x22, 0 }, { 0xe0, 0xF0, 0x22, 0 } }, + { { 0xe0, 0x21, 0 }, { 0xe0, 0xF0, 0x21, 0 } }, { { 0xe0, 0x2A, 0 }, { 0xe0, 0xF0, 0x2A, 0 } }, /* 12c */ + { { 0xe0, 0x32, 0 }, { 0xe0, 0xF0, 0x32, 0 } }, { { 0xe0, 0x31, 0 }, { 0xe0, 0xF0, 0x31, 0 } }, + { { 0xe0, 0x3A, 0 }, { 0xe0, 0xF0, 0x3A, 0 } }, { { 0 }, { 0 } }, /* 130 */ + { { 0xe0, 0x49, 0 }, { 0xe0, 0xF0, 0x49, 0 } }, { { 0x77, 0 }, { 0xf0, 0x77, 0 } }, + { { 0 }, { 0 } }, { { 0x57, 0 }, { 0xf0, 0x57, 0 } }, /* 134 */ + { { 0x39, 0 }, { 0xf0, 0x39, 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0x58, 0 }, { 0xe0, 0xF0, 0x58, 0 } }, { { 0xe0, 0x05, 0 }, { 0xe0, 0xF0, 0x05, 0 } }, /* 138 */ + { { 0xe0, 0x06, 0 }, { 0xe0, 0xF0, 0x06, 0 } }, { { 0xe0, 0x04, 0 }, { 0xe0, 0xF0, 0x04, 0 } }, + { { 0xe0, 0x0C, 0 }, { 0xe0, 0xF0, 0x0C, 0 } }, { { 0xe0, 0x03, 0 }, { 0xe0, 0xF0, 0x03, 0 } }, /* 13c */ + { { 0xe0, 0x0B, 0 }, { 0xe0, 0xF0, 0x0B, 0 } }, { { 0xe0, 0x02, 0 }, { 0xe0, 0xF0, 0x02, 0 } }, + { { 0xe0, 0x0A, 0 }, { 0xe0, 0xF0, 0x0A, 0 } }, { { 0xe0, 0x01, 0 }, { 0xe0, 0xF0, 0x01, 0 } }, /* 140 */ + { { 0xe0, 0x09, 0 }, { 0xe0, 0xF0, 0x09, 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0x7E, 0 }, { 0xe0, 0xF0, 0x7E, 0 } }, { { 0x6E, 0 }, { 0xf0, 0x6E, 0 } }, /* 144 */ + { { 0x63, 0 }, { 0xf0, 0x63, 0 } }, { { 0x6F, 0 }, { 0xf0, 0x6F, 0 } }, + { { 0 }, { 0 } }, { { 0x61, 0 }, { 0xf0, 0x61, 0 } }, /* 148 */ + { { 0xe0, 0x73, 0 }, { 0xe0, 0xF0, 0x73, 0 } }, { { 0x6A, 0 }, { 0xf0, 0x6A, 0 } }, + { { 0xe0, 0x79, 0 }, { 0xe0, 0xF0, 0x79, 0 } }, { { 0x65, 0 }, { 0xf0, 0x65, 0 } }, /* 14c */ + { { 0x60, 0 }, { 0xf0, 0x60, 0 } }, { { 0x6D, 0 }, { 0xf0, 0x6D, 0 } }, + { { 0x67, 0 }, { 0xf0, 0x67, 0 } }, { { 0x64, 0 }, { 0xf0, 0x64, 0 } }, /* 150 */ + { { 0xd4, 0 }, { 0xf0, 0xD4, 0 } }, { { 0xe0, 0x60, 0 }, { 0xe0, 0xF0, 0x60, 0 } }, + { { 0 }, { 0 } }, { { 0xe0, 0x78, 0 }, { 0xe0, 0xF0, 0x78, 0 } }, /* 154 */ + { { 0xe0, 0x07, 0 }, { 0xe0, 0xF0, 0x07, 0 } }, { { 0xe0, 0x0F, 0 }, { 0xe0, 0xF0, 0x0F, 0 } }, + { { 0xe0, 0x17, 0 }, { 0xe0, 0xF0, 0x17, 0 } }, { { 0x8B, 0 }, { 0xf0, 0x8B, 0 } }, /* 158 */ + { { 0x8C, 0 }, { 0xf0, 0x8C, 0 } }, { { 0x8D, 0 }, { 0xf0, 0x8D, 0 } }, + { { 0 }, { 0 } }, { { 0x7F, 0 }, { 0xf0, 0x7F, 0 } }, /* 15c */ + { { 0 }, { 0 } }, { { 0xe0, 0x4F, 0 }, { 0xe0, 0xF0, 0x4F, 0 } }, + { { 0xe0, 0x56, 0 }, { 0xe0, 0xF0, 0x56, 0 } }, { { 0 }, { 0 } }, /* 160 */ + { { 0xe0, 0x08, 0 }, { 0xe0, 0xF0, 0x08, 0 } }, { { 0xe0, 0x10, 0 }, { 0xe0, 0xF0, 0x10, 0 } }, + { { 0xe0, 0x18, 0 }, { 0xe0, 0xF0, 0x18, 0 } }, { { 0xe0, 0x20, 0 }, { 0xe0, 0xF0, 0x20, 0 } }, /* 164 */ + { { 0xe0, 0x28, 0 }, { 0xe0, 0xF0, 0x28, 0 } }, { { 0xe0, 0x30, 0 }, { 0xe0, 0xF0, 0x30, 0 } }, + { { 0xe0, 0x38, 0 }, { 0xe0, 0xF0, 0x38, 0 } }, { { 0xe0, 0x40, 0 }, { 0xe0, 0xF0, 0x40, 0 } }, /* 168 */ + { { 0xe0, 0x48, 0 }, { 0xe0, 0xF0, 0x48, 0 } }, { { 0xe0, 0x50, 0 }, { 0xe0, 0xF0, 0x50, 0 } }, + { { 0xe0, 0x57, 0 }, { 0xe0, 0xF0, 0x57, 0 } }, { { 0 }, { 0 } }, /* 16c */ + { { 0xe0, 0x13, 0 }, { 0xe0, 0xF0, 0x13, 0 } }, { { 0xe0, 0x19, 0 }, { 0xe0, 0xF0, 0x19, 0 } }, + { { 0xe0, 0x39, 0 }, { 0xe0, 0xF0, 0x39, 0 } }, { { 0xe0, 0x51, 0 }, { 0xe0, 0xF0, 0x51, 0 } }, /* 170 */ + { { 0xe0, 0x53, 0 }, { 0xe0, 0xF0, 0x53, 0 } }, { { 0xe0, 0x5C, 0 }, { 0xe0, 0xF0, 0x5C, 0 } }, + { { 0 }, { 0 } }, { { 0xe0, 0x62, 0 }, { 0xe0, 0xF0, 0x62, 0 } }, /* 174 */ + { { 0xe0, 0x63, 0 }, { 0xe0, 0xF0, 0x63, 0 } }, { { 0xe0, 0x64, 0 }, { 0xe0, 0xF0, 0x64, 0 } }, + { { 0xe0, 0x65, 0 }, { 0xe0, 0xF0, 0x65, 0 } }, { { 0xe0, 0x67, 0 }, { 0xe0, 0xF0, 0x67, 0 } }, /* 178 */ + { { 0xe0, 0x68, 0 }, { 0xe0, 0xF0, 0x68, 0 } }, { { 0xe0, 0x6A, 0 }, { 0xe0, 0xF0, 0x6A, 0 } }, + { { 0xe0, 0x6D, 0 }, { 0xe0, 0xF0, 0x6D, 0 } }, { { 0xe0, 0x6E, 0 }, { 0xe0, 0xF0, 0x6E, 0 } }, /* 17c */ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*180*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*184*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*188*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*18c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*190*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*194*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*198*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*19c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1ac*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1cc*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1dc*/ - { { 0},{ 0} }, { {0xe0,0xe1,0},{0xe0,0xF0,0xE1,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xee,0},{0xe0,0xF0,0xEE,0} }, { { 0},{ 0} }, /*1ec*/ - { { 0},{ 0} }, { {0xe0,0xf1,0},{0xe0,0xF0,0xF1,0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{0xe0,0xF0,0xFE,0} }, { {0xe0,0xff,0},{0xe0,0xF0,0xFF,0} } /*1fc*/ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, { { 0xe0, 0xe1, 0 }, { 0xe0, 0xF0, 0xE1, 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0xee, 0 }, { 0xe0, 0xF0, 0xEE, 0 } }, { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, { { 0xe0, 0xf1, 0 }, { 0xe0, 0xF0, 0xF1, 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, + { { 0xe0, 0xfe, 0 }, { 0xe0, 0xF0, 0xFE, 0 } }, { { 0xe0, 0xff, 0 }, { 0xe0, 0xF0, 0xFF, 0 } } /* 1fc */ // clang-format on }; diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index f65a6dffc..c2404231f 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -90,262 +90,265 @@ typedef struct xtkbd_t { /*XT keyboard has no escape scancodes, and no scancodes beyond 53*/ const scancode scancode_xt[512] = { // clang-format off - { {0}, {0} }, { {0x01, 0}, {0x81, 0} }, - { {0x02, 0}, {0x82, 0} }, { {0x03, 0}, {0x83, 0} }, - { {0x04, 0}, {0x84, 0} }, { {0x05, 0}, {0x85, 0} }, - { {0x06, 0}, {0x86, 0} }, { {0x07, 0}, {0x87, 0} }, - { {0x08, 0}, {0x88, 0} }, { {0x09, 0}, {0x89, 0} }, - { {0x0a, 0}, {0x8a, 0} }, { {0x0b, 0}, {0x8b, 0} }, - { {0x0c, 0}, {0x8c, 0} }, { {0x0d, 0}, {0x8d, 0} }, - { {0x0e, 0}, {0x8e, 0} }, { {0x0f, 0}, {0x8f, 0} }, - { {0x10, 0}, {0x90, 0} }, { {0x11, 0}, {0x91, 0} }, - { {0x12, 0}, {0x92, 0} }, { {0x13, 0}, {0x93, 0} }, - { {0x14, 0}, {0x94, 0} }, { {0x15, 0}, {0x95, 0} }, - { {0x16, 0}, {0x96, 0} }, { {0x17, 0}, {0x97, 0} }, - { {0x18, 0}, {0x98, 0} }, { {0x19, 0}, {0x99, 0} }, - { {0x1a, 0}, {0x9a, 0} }, { {0x1b, 0}, {0x9b, 0} }, - { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0x1e, 0}, {0x9e, 0} }, { {0x1f, 0}, {0x9f, 0} }, - { {0x20, 0}, {0xa0, 0} }, { {0x21, 0}, {0xa1, 0} }, - { {0x22, 0}, {0xa2, 0} }, { {0x23, 0}, {0xa3, 0} }, - { {0x24, 0}, {0xa4, 0} }, { {0x25, 0}, {0xa5, 0} }, - { {0x26, 0}, {0xa6, 0} }, { {0x27, 0}, {0xa7, 0} }, - { {0x28, 0}, {0xa8, 0} }, { {0x29, 0}, {0xa9, 0} }, - { {0x2a, 0}, {0xaa, 0} }, { {0x2b, 0}, {0xab, 0} }, - { {0x2c, 0}, {0xac, 0} }, { {0x2d, 0}, {0xad, 0} }, - { {0x2e, 0}, {0xae, 0} }, { {0x2f, 0}, {0xaf, 0} }, - { {0x30, 0}, {0xb0, 0} }, { {0x31, 0}, {0xb1, 0} }, - { {0x32, 0}, {0xb2, 0} }, { {0x33, 0}, {0xb3, 0} }, - { {0x34, 0}, {0xb4, 0} }, { {0x35, 0}, {0xb5, 0} }, - { {0x36, 0}, {0xb6, 0} }, { {0x37, 0}, {0xb7, 0} }, - { {0x38, 0}, {0xb8, 0} }, { {0x39, 0}, {0xb9, 0} }, - { {0x3a, 0}, {0xba, 0} }, { {0x3b, 0}, {0xbb, 0} }, - { {0x3c, 0}, {0xbc, 0} }, { {0x3d, 0}, {0xbd, 0} }, - { {0x3e, 0}, {0xbe, 0} }, { {0x3f, 0}, {0xbf, 0} }, - { {0x40, 0}, {0xc0, 0} }, { {0x41, 0}, {0xc1, 0} }, - { {0x42, 0}, {0xc2, 0} }, { {0x43, 0}, {0xc3, 0} }, - { {0x44, 0}, {0xc4, 0} }, { {0x45, 0}, {0xc5, 0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, - { {0x48, 0}, {0xc8, 0} }, { {0x49, 0}, {0xc9, 0} }, - { {0x4a, 0}, {0xca, 0} }, { {0x4b, 0}, {0xcb, 0} }, - { {0x4c, 0}, {0xcc, 0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0x4e, 0}, {0xce, 0} }, { {0x4f, 0}, {0xcf, 0} }, - { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*054*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ - { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ - { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ - { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ - { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ - { {0x48, 0}, {0xc8, 0} }, { {0x49, 0}, {0xc9, 0} }, - { {0}, {0} }, { {0x4b, 0}, {0xcb, 0} }, /*148*/ - { {0}, {0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ - { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*88*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ + { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ + { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ + { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ + { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ + { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ + { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ + { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ + { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ + { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ + { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ + { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ + { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ + { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ + { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ + { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ + { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ + { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ + { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ + { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ + { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ + { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ + { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ + { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ + { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ + { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ + { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ + { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ + { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ + { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ + { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ + { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ + { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ + { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ + { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ + { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 054 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 056 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 058 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 064 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 066 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 068 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 070 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 072 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 074 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 076 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 078 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 080 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 084 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 086 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 088 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 090 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 092 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 094 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 096 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 098 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ba */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0bc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0be */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0de */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ec */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fe */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 100 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 102 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 104 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 106 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 108 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 110 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 112 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 114 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 116 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 118 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11a */ + { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 11c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 120 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 122 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 130 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 132 */ + { { 0 }, { 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 134 */ + { { 0 }, { 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 136 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 140 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 142 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 144 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 146 */ + { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 148 */ + { { 0 }, { 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 14a */ + { { 0 }, { 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 14c */ + { { 0 }, { 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14e */ + { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 150 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 152 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 154 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 156 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 158 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 160 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 162 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 164 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 166 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 168 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 170 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 172 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 174 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 176 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 178 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } } /* 1fe */ // clang-format on }; diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index dfeb1fa0f..772a3a261 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -2350,133 +2350,257 @@ ams_read(uint16_t port, void *priv) static const scancode scancode_pc200[512] = { // clang-format off - { { 0},{ 0} }, { { 0x01,0},{ 0x81,0} }, { { 0x02,0},{ 0x82,0} }, { { 0x03,0},{ 0x83,0} }, /*000*/ - { { 0x04,0},{ 0x84,0} }, { { 0x05,0},{ 0x85,0} }, { { 0x06,0},{ 0x86,0} }, { { 0x07,0},{ 0x87,0} }, /*004*/ - { { 0x08,0},{ 0x88,0} }, { { 0x09,0},{ 0x89,0} }, { { 0x0a,0},{ 0x8a,0} }, { { 0x0b,0},{ 0x8b,0} }, /*008*/ - { { 0x0c,0},{ 0x8c,0} }, { { 0x0d,0},{ 0x8d,0} }, { { 0x0e,0},{ 0x8e,0} }, { { 0x0f,0},{ 0x8f,0} }, /*00c*/ - { { 0x10,0},{ 0x90,0} }, { { 0x11,0},{ 0x91,0} }, { { 0x12,0},{ 0x92,0} }, { { 0x13,0},{ 0x93,0} }, /*010*/ - { { 0x14,0},{ 0x94,0} }, { { 0x15,0},{ 0x95,0} }, { { 0x16,0},{ 0x96,0} }, { { 0x17,0},{ 0x97,0} }, /*014*/ - { { 0x18,0},{ 0x98,0} }, { { 0x19,0},{ 0x99,0} }, { { 0x1a,0},{ 0x9a,0} }, { { 0x1b,0},{ 0x9b,0} }, /*018*/ - { { 0x1c,0},{ 0x9c,0} }, { { 0x1d,0},{ 0x9d,0} }, { { 0x1e,0},{ 0x9e,0} }, { { 0x1f,0},{ 0x9f,0} }, /*01c*/ - { { 0x20,0},{ 0xa0,0} }, { { 0x21,0},{ 0xa1,0} }, { { 0x22,0},{ 0xa2,0} }, { { 0x23,0},{ 0xa3,0} }, /*020*/ - { { 0x24,0},{ 0xa4,0} }, { { 0x25,0},{ 0xa5,0} }, { { 0x26,0},{ 0xa6,0} }, { { 0x27,0},{ 0xa7,0} }, /*024*/ - { { 0x28,0},{ 0xa8,0} }, { { 0x29,0},{ 0xa9,0} }, { { 0x2a,0},{ 0xaa,0} }, { { 0x2b,0},{ 0xab,0} }, /*028*/ - { { 0x2c,0},{ 0xac,0} }, { { 0x2d,0},{ 0xad,0} }, { { 0x2e,0},{ 0xae,0} }, { { 0x2f,0},{ 0xaf,0} }, /*02c*/ - { { 0x30,0},{ 0xb0,0} }, { { 0x31,0},{ 0xb1,0} }, { { 0x32,0},{ 0xb2,0} }, { { 0x33,0},{ 0xb3,0} }, /*030*/ - { { 0x34,0},{ 0xb4,0} }, { { 0x35,0},{ 0xb5,0} }, { { 0x36,0},{ 0xb6,0} }, { { 0x37,0},{ 0xb7,0} }, /*034*/ - { { 0x38,0},{ 0xb8,0} }, { { 0x39,0},{ 0xb9,0} }, { { 0x3a,0},{ 0xba,0} }, { { 0x3b,0},{ 0xbb,0} }, /*038*/ - { { 0x3c,0},{ 0xbc,0} }, { { 0x3d,0},{ 0xbd,0} }, { { 0x3e,0},{ 0xbe,0} }, { { 0x3f,0},{ 0xbf,0} }, /*03c*/ - { { 0x40,0},{ 0xc0,0} }, { { 0x41,0},{ 0xc1,0} }, { { 0x42,0},{ 0xc2,0} }, { { 0x43,0},{ 0xc3,0} }, /*040*/ - { { 0x44,0},{ 0xc4,0} }, { { 0x45,0},{ 0xc5,0} }, { { 0x46,0},{ 0xc6,0} }, { { 0x47,0},{ 0xc7,0} }, /*044*/ - { { 0x48,0},{ 0xc8,0} }, { { 0x49,0},{ 0xc9,0} }, { { 0x4a,0},{ 0xca,0} }, { { 0x4b,0},{ 0xcb,0} }, /*048*/ - { { 0x4c,0},{ 0xcc,0} }, { { 0x4d,0},{ 0xcd,0} }, { { 0x4e,0},{ 0xce,0} }, { { 0x4f,0},{ 0xcf,0} }, /*04c*/ - { { 0x50,0},{ 0xd0,0} }, { { 0x51,0},{ 0xd1,0} }, { { 0x52,0},{ 0xd2,0} }, { { 0x53,0},{ 0xd3,0} }, /*050*/ - { { 0x54,0},{ 0xd4,0} }, { { 0x55,0},{ 0xd5,0} }, { { 0x56,0},{ 0xd6,0} }, { { 0x57,0},{ 0xd7,0} }, /*054*/ - { { 0x58,0},{ 0xd8,0} }, { { 0x59,0},{ 0xd9,0} }, { { 0x5a,0},{ 0xda,0} }, { { 0x5b,0},{ 0xdb,0} }, /*058*/ - { { 0x5c,0},{ 0xdc,0} }, { { 0x5d,0},{ 0xdd,0} }, { { 0x5e,0},{ 0xde,0} }, { { 0x5f,0},{ 0xdf,0} }, /*05c*/ - { { 0x60,0},{ 0xe0,0} }, { { 0x61,0},{ 0xe1,0} }, { { 0x62,0},{ 0xe2,0} }, { { 0x63,0},{ 0xe3,0} }, /*060*/ - { { 0x64,0},{ 0xe4,0} }, { { 0x65,0},{ 0xe5,0} }, { { 0x66,0},{ 0xe6,0} }, { { 0x67,0},{ 0xe7,0} }, /*064*/ - { { 0x68,0},{ 0xe8,0} }, { { 0x69,0},{ 0xe9,0} }, { { 0x6a,0},{ 0xea,0} }, { { 0x6b,0},{ 0xeb,0} }, /*068*/ - { { 0x6c,0},{ 0xec,0} }, { { 0x6d,0},{ 0xed,0} }, { { 0x6e,0},{ 0xee,0} }, { { 0x6f,0},{ 0xef,0} }, /*06c*/ - { { 0x70,0},{ 0xf0,0} }, { { 0x71,0},{ 0xf1,0} }, { { 0x72,0},{ 0xf2,0} }, { { 0x73,0},{ 0xf3,0} }, /*070*/ - { { 0x74,0},{ 0xf4,0} }, { { 0x75,0},{ 0xf5,0} }, { { 0x76,0},{ 0xf6,0} }, { { 0x77,0},{ 0xf7,0} }, /*074*/ - { { 0x78,0},{ 0xf8,0} }, { { 0x79,0},{ 0xf9,0} }, { { 0x7a,0},{ 0xfa,0} }, { { 0x7b,0},{ 0xfb,0} }, /*078*/ - { { 0x7c,0},{ 0xfc,0} }, { { 0x7d,0},{ 0xfd,0} }, { { 0x7e,0},{ 0xfe,0} }, { { 0x7f,0},{ 0xff,0} }, /*07c*/ + { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ + { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ + { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ + { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ + { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ + { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ + { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ + { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ + { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ + { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ + { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ + { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ + { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ + { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ + { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ + { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ + { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ + { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ + { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ + { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ + { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ + { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ + { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ + { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ + { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ + { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ + { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ + { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ + { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ + { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ + { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ + { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ + { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ + { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ + { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ + { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ + { { 0x54, 0 }, { 0xd4, 0 } }, { { 0x55, 0 }, { 0xd5, 0 } }, /* 054 */ + { { 0x56, 0 }, { 0xd6, 0 } }, { { 0x57, 0 }, { 0xd7, 0 } }, /* 056 */ + { { 0x58, 0 }, { 0xd8, 0 } }, { { 0x59, 0 }, { 0xd9, 0 } }, /* 058 */ + { { 0x5a, 0 }, { 0xda, 0 } }, { { 0x5b, 0 }, { 0xdb, 0 } }, /* 05a */ + { { 0x5c, 0 }, { 0xdc, 0 } }, { { 0x5d, 0 }, { 0xdd, 0 } }, /* 05c */ + { { 0x5e, 0 }, { 0xde, 0 } }, { { 0x5f, 0 }, { 0xdf, 0 } }, /* 05e */ + { { 0x60, 0 }, { 0xe0, 0 } }, { { 0x61, 0 }, { 0xe1, 0 } }, /* 060 */ + { { 0x62, 0 }, { 0xe2, 0 } }, { { 0x63, 0 }, { 0xe3, 0 } }, /* 062 */ + { { 0x64, 0 }, { 0xe4, 0 } }, { { 0x65, 0 }, { 0xe5, 0 } }, /* 064 */ + { { 0x66, 0 }, { 0xe6, 0 } }, { { 0x67, 0 }, { 0xe7, 0 } }, /* 066 */ + { { 0x68, 0 }, { 0xe8, 0 } }, { { 0x69, 0 }, { 0xe9, 0 } }, /* 068 */ + { { 0x6a, 0 }, { 0xea, 0 } }, { { 0x6b, 0 }, { 0xeb, 0 } }, /* 06a */ + { { 0x6c, 0 }, { 0xec, 0 } }, { { 0x6d, 0 }, { 0xed, 0 } }, /* 06c */ + { { 0x6e, 0 }, { 0xee, 0 } }, { { 0x6f, 0 }, { 0xef, 0 } }, /* 06e */ + { { 0x70, 0 }, { 0xf0, 0 } }, { { 0x71, 0 }, { 0xf1, 0 } }, /* 070 */ + { { 0x72, 0 }, { 0xf2, 0 } }, { { 0x73, 0 }, { 0xf3, 0 } }, /* 072 */ + { { 0x74, 0 }, { 0xf4, 0 } }, { { 0x75, 0 }, { 0xf5, 0 } }, /* 074 */ + { { 0x76, 0 }, { 0xf6, 0 } }, { { 0x77, 0 }, { 0xf7, 0 } }, /* 076 */ + { { 0x78, 0 }, { 0xf8, 0 } }, { { 0x79, 0 }, { 0xf9, 0 } }, /* 078 */ + { { 0x7a, 0 }, { 0xfa, 0 } }, { { 0x7b, 0 }, { 0xfb, 0 } }, /* 07a */ + { { 0x7c, 0 }, { 0xfc, 0 } }, { { 0x7d, 0 }, { 0xfd, 0 } }, /* 07c */ + { { 0x7e, 0 }, { 0xfe, 0 } }, { { 0x7f, 0 }, { 0xff, 0 } }, /* 07e */ - { { 0x80,0},{ 0} }, { { 0x81,0},{ 0} }, { { 0x82,0},{ 0} }, { { 0},{ 0} }, /*080*/ - { { 0},{ 0} }, { { 0x85,0},{ 0} }, { { 0x86,0},{ 0} }, { { 0x87,0},{ 0} }, /*084*/ - { { 0x88,0},{ 0} }, { { 0x89,0},{ 0} }, { { 0x8a,0},{ 0} }, { { 0x8b,0},{ 0} }, /*088*/ - { { 0x8c,0},{ 0} }, { { 0x8d,0},{ 0} }, { { 0x8e,0},{ 0} }, { { 0x8f,0},{ 0} }, /*08c*/ - { { 0x90,0},{ 0} }, { { 0x91,0},{ 0} }, { { 0x92,0},{ 0} }, { { 0x93,0},{ 0} }, /*090*/ - { { 0x94,0},{ 0} }, { { 0x95,0},{ 0} }, { { 0x96,0},{ 0} }, { { 0x97,0},{ 0} }, /*094*/ - { { 0x98,0},{ 0} }, { { 0x99,0},{ 0} }, { { 0x9a,0},{ 0} }, { { 0x9b,0},{ 0} }, /*098*/ - { { 0x9c,0},{ 0} }, { { 0x9d,0},{ 0} }, { { 0x9e,0},{ 0} }, { { 0x9f,0},{ 0} }, /*09c*/ - { { 0xa0,0},{ 0} }, { { 0xa1,0},{ 0} }, { { 0xa2,0},{ 0} }, { { 0xa3,0},{ 0} }, /*0a0*/ - { { 0xa4,0},{ 0} }, { { 0xa5,0},{ 0} }, { { 0xa6,0},{ 0} }, { { 0xa7,0},{ 0} }, /*0a4*/ - { { 0xa8,0},{ 0} }, { { 0xa9,0},{ 0} }, { { 0xaa,0},{ 0} }, { { 0xab,0},{ 0} }, /*0a8*/ - { { 0xac,0},{ 0} }, { { 0xad,0},{ 0} }, { { 0xae,0},{ 0} }, { { 0xaf,0},{ 0} }, /*0ac*/ - { { 0xb0,0},{ 0} }, { { 0xb1,0},{ 0} }, { { 0xb2,0},{ 0} }, { { 0xb3,0},{ 0} }, /*0b0*/ - { { 0xb4,0},{ 0} }, { { 0xb5,0},{ 0} }, { { 0xb6,0},{ 0} }, { { 0xb7,0},{ 0} }, /*0b4*/ - { { 0xb8,0},{ 0} }, { { 0xb9,0},{ 0} }, { { 0xba,0},{ 0} }, { { 0xbb,0},{ 0} }, /*0b8*/ - { { 0xbc,0},{ 0} }, { { 0xbd,0},{ 0} }, { { 0xbe,0},{ 0} }, { { 0xbf,0},{ 0} }, /*0bc*/ - { { 0xc0,0},{ 0} }, { { 0xc1,0},{ 0} }, { { 0xc2,0},{ 0} }, { { 0xc3,0},{ 0} }, /*0c0*/ - { { 0xc4,0},{ 0} }, { { 0xc5,0},{ 0} }, { { 0xc6,0},{ 0} }, { { 0xc7,0},{ 0} }, /*0c4*/ - { { 0xc8,0},{ 0} }, { { 0xc9,0},{ 0} }, { { 0xca,0},{ 0} }, { { 0xcb,0},{ 0} }, /*0c8*/ - { { 0xcc,0},{ 0} }, { { 0xcd,0},{ 0} }, { { 0xce,0},{ 0} }, { { 0xcf,0},{ 0} }, /*0cc*/ - { { 0xd0,0},{ 0} }, { { 0xd1,0},{ 0} }, { { 0xd2,0},{ 0} }, { { 0xd3,0},{ 0} }, /*0d0*/ - { { 0xd4,0},{ 0} }, { { 0xd5,0},{ 0} }, { { 0xd6,0},{ 0} }, { { 0xd7,0},{ 0} }, /*0d4*/ - { { 0xd8,0},{ 0} }, { { 0xd9,0},{ 0} }, { { 0xda,0},{ 0} }, { { 0xdb,0},{ 0} }, /*0d8*/ - { { 0xdc,0},{ 0} }, { { 0xdd,0},{ 0} }, { { 0xde,0},{ 0} }, { { 0xdf,0},{ 0} }, /*0dc*/ - { { 0xe0,0},{ 0} }, { { 0xe1,0},{ 0} }, { { 0xe2,0},{ 0} }, { { 0xe3,0},{ 0} }, /*0e0*/ - { { 0xe4,0},{ 0} }, { { 0xe5,0},{ 0} }, { { 0xe6,0},{ 0} }, { { 0xe7,0},{ 0} }, /*0e4*/ - { { 0xe8,0},{ 0} }, { { 0xe9,0},{ 0} }, { { 0xea,0},{ 0} }, { { 0xeb,0},{ 0} }, /*0e8*/ - { { 0xec,0},{ 0} }, { { 0xed,0},{ 0} }, { { 0xee,0},{ 0} }, { { 0xef,0},{ 0} }, /*0ec*/ - { { 0},{ 0} }, { { 0xf1,0},{ 0} }, { { 0xf2,0},{ 0} }, { { 0xf3,0},{ 0} }, /*0f0*/ - { { 0xf4,0},{ 0} }, { { 0xf5,0},{ 0} }, { { 0xf6,0},{ 0} }, { { 0xf7,0},{ 0} }, /*0f4*/ - { { 0xf8,0},{ 0} }, { { 0xf9,0},{ 0} }, { { 0xfa,0},{ 0} }, { { 0xfb,0},{ 0} }, /*0f8*/ - { { 0xfc,0},{ 0} }, { { 0xfd,0},{ 0} }, { { 0xfe,0},{ 0} }, { { 0xff,0},{ 0} }, /*0fc*/ + { { 0x80, 0 }, { 0 } }, { { 0x81, 0 }, { 0 } }, /* 080 */ + { { 0x82, 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, { { 0x85, 0 }, { 0 } }, /* 084 */ + { { 0x86, 0 }, { 0 } }, { { 0x87, 0 }, { 0 } }, /* 086 */ + { { 0x88, 0 }, { 0 } }, { { 0x89, 0 }, { 0 } }, /* 088 */ + { { 0x8a, 0 }, { 0 } }, { { 0x8b, 0 }, { 0 } }, /* 08a */ + { { 0x8c, 0 }, { 0 } }, { { 0x8d, 0 }, { 0 } }, /* 08c */ + { { 0x8e, 0 }, { 0 } }, { { 0x8f, 0 }, { 0 } }, /* 08e */ + { { 0x90, 0 }, { 0 } }, { { 0x91, 0 }, { 0 } }, /* 090 */ + { { 0x92, 0 }, { 0 } }, { { 0x93, 0 }, { 0 } }, /* 092 */ + { { 0x94, 0 }, { 0 } }, { { 0x95, 0 }, { 0 } }, /* 094 */ + { { 0x96, 0 }, { 0 } }, { { 0x97, 0 }, { 0 } }, /* 096 */ + { { 0x98, 0 }, { 0 } }, { { 0x99, 0 }, { 0 } }, /* 098 */ + { { 0x9a, 0 }, { 0 } }, { { 0x9b, 0 }, { 0 } }, /* 09a */ + { { 0x9c, 0 }, { 0 } }, { { 0x9d, 0 }, { 0 } }, /* 09c */ + { { 0x9e, 0 }, { 0 } }, { { 0x9f, 0 }, { 0 } }, /* 09e */ + { { 0xa0, 0 }, { 0 } }, { { 0xa1, 0 }, { 0 } }, /* 0a0 */ + { { 0xa2, 0 }, { 0 } }, { { 0xa3, 0 }, { 0 } }, /* 0a2 */ + { { 0xa4, 0 }, { 0 } }, { { 0xa5, 0 }, { 0 } }, /* 0a4 */ + { { 0xa6, 0 }, { 0 } }, { { 0xa7, 0 }, { 0 } }, /* 0a6 */ + { { 0xa8, 0 }, { 0 } }, { { 0xa9, 0 }, { 0 } }, /* 0a8 */ + { { 0xaa, 0 }, { 0 } }, { { 0xab, 0 }, { 0 } }, /* 0aa */ + { { 0xac, 0 }, { 0 } }, { { 0xad, 0 }, { 0 } }, /* 0ac */ + { { 0xae, 0 }, { 0 } }, { { 0xaf, 0 }, { 0 } }, /* 0ae */ + { { 0xb0, 0 }, { 0 } }, { { 0xb1, 0 }, { 0 } }, /* 0b0 */ + { { 0xb2, 0 }, { 0 } }, { { 0xb3, 0 }, { 0 } }, /* 0b2 */ + { { 0xb4, 0 }, { 0 } }, { { 0xb5, 0 }, { 0 } }, /* 0b4 */ + { { 0xb6, 0 }, { 0 } }, { { 0xb7, 0 }, { 0 } }, /* 0b6 */ + { { 0xb8, 0 }, { 0 } }, { { 0xb9, 0 }, { 0 } }, /* 0b8 */ + { { 0xba, 0 }, { 0 } }, { { 0xbb, 0 }, { 0 } }, /* 0ba */ + { { 0xbc, 0 }, { 0 } }, { { 0xbd, 0 }, { 0 } }, /* 0bc */ + { { 0xbe, 0 }, { 0 } }, { { 0xbf, 0 }, { 0 } }, /* 0be */ + { { 0xc0, 0 }, { 0 } }, { { 0xc1, 0 }, { 0 } }, /* 0c0 */ + { { 0xc2, 0 }, { 0 } }, { { 0xc3, 0 }, { 0 } }, /* 0c2 */ + { { 0xc4, 0 }, { 0 } }, { { 0xc5, 0 }, { 0 } }, /* 0c4 */ + { { 0xc6, 0 }, { 0 } }, { { 0xc7, 0 }, { 0 } }, /* 0c6 */ + { { 0xc8, 0 }, { 0 } }, { { 0xc9, 0 }, { 0 } }, /* 0c8 */ + { { 0xca, 0 }, { 0 } }, { { 0xcb, 0 }, { 0 } }, /* 0ca */ + { { 0xcc, 0 }, { 0 } }, { { 0xcd, 0 }, { 0 } }, /* 0cc */ + { { 0xce, 0 }, { 0 } }, { { 0xcf, 0 }, { 0 } }, /* 0ce */ + { { 0xd0, 0 }, { 0 } }, { { 0xd1, 0 }, { 0 } }, /* 0d0 */ + { { 0xd2, 0 }, { 0 } }, { { 0xd3, 0 }, { 0 } }, /* 0d2 */ + { { 0xd4, 0 }, { 0 } }, { { 0xd5, 0 }, { 0 } }, /* 0d4 */ + { { 0xd6, 0 }, { 0 } }, { { 0xd7, 0 }, { 0 } }, /* 0d6 */ + { { 0xd8, 0 }, { 0 } }, { { 0xd9, 0 }, { 0 } }, /* 0d8 */ + { { 0xda, 0 }, { 0 } }, { { 0xdb, 0 }, { 0 } }, /* 0da */ + { { 0xdc, 0 }, { 0 } }, { { 0xdd, 0 }, { 0 } }, /* 0dc */ + { { 0xde, 0 }, { 0 } }, { { 0xdf, 0 }, { 0 } }, /* 0de */ + { { 0xe0, 0 }, { 0 } }, { { 0xe1, 0 }, { 0 } }, /* 0e0 */ + { { 0xe2, 0 }, { 0 } }, { { 0xe3, 0 }, { 0 } }, /* 0e2 */ + { { 0xe4, 0 }, { 0 } }, { { 0xe5, 0 }, { 0 } }, /* 0e4 */ + { { 0xe6, 0 }, { 0 } }, { { 0xe7, 0 }, { 0 } }, /* 0e6 */ + { { 0xe8, 0 }, { 0 } }, { { 0xe9, 0 }, { 0 } }, /* 0e8 */ + { { 0xea, 0 }, { 0 } }, { { 0xeb, 0 }, { 0 } }, /* 0ea */ + { { 0xec, 0 }, { 0 } }, { { 0xed, 0 }, { 0 } }, /* 0ec */ + { { 0xee, 0 }, { 0 } }, { { 0xef, 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, { { 0xf1, 0 }, { 0 } }, /* 0f0 */ + { { 0xf2, 0 }, { 0 } }, { { 0xf3, 0 }, { 0 } }, /* 0f2 */ + { { 0xf4, 0 }, { 0 } }, { { 0xf5, 0 }, { 0 } }, /* 0f4 */ + { { 0xf6, 0 }, { 0 } }, { { 0xf7, 0 }, { 0 } }, /* 0f6 */ + { { 0xf8, 0 }, { 0 } }, { { 0xf9, 0 }, { 0 } }, /* 0f8 */ + { { 0xfa, 0 }, { 0 } }, { { 0xfb, 0 }, { 0 } }, /* 0fa */ + { { 0xfc, 0 }, { 0 } }, { { 0xfd, 0 }, { 0 } }, /* 0fc */ + { { 0xfe, 0 }, { 0 } }, { { 0xff, 0 }, { 0 } }, /* 0fe */ - { {0xe1,0x1d,0},{0xe1, 0x9d,0} }, { {0xe0,0x01,0},{0xe0, 0x81,0} }, { {0xe0,0x02,0},{0xe0, 0x82,0} }, { {0xe0,0x03,0},{0xe0, 0x83,0} }, /*100*/ - { {0xe0,0x04,0},{0xe0, 0x84,0} }, { {0xe0,0x05,0},{0xe0, 0x85,0} }, { {0xe0,0x06,0},{0xe0, 0x86,0} }, { {0xe0,0x07,0},{0xe0, 0x87,0} }, /*104*/ - { {0xe0,0x08,0},{0xe0, 0x88,0} }, { {0xe0,0x09,0},{0xe0, 0x89,0} }, { {0xe0,0x0a,0},{0xe0, 0x8a,0} }, { {0xe0,0x0b,0},{0xe0, 0x8b,0} }, /*108*/ - { {0xe0,0x0c,0},{0xe0, 0x8c,0} }, { { 0},{ 0} }, { {0xe0,0x0e,0},{0xe0, 0x8e,0} }, { {0xe0,0x0f,0},{0xe0, 0x8f,0} }, /*10c*/ - { {0xe0,0x10,0},{0xe0, 0x90,0} }, { {0xe0,0x11,0},{0xe0, 0x91,0} }, { {0xe0,0x12,0},{0xe0, 0x92,0} }, { {0xe0,0x13,0},{0xe0, 0x93,0} }, /*110*/ - { {0xe0,0x14,0},{0xe0, 0x94,0} }, { {0xe0,0x15,0},{0xe0, 0x95,0} }, { {0xe0,0x16,0},{0xe0, 0x96,0} }, { {0xe0,0x17,0},{0xe0, 0x97,0} }, /*114*/ - { {0xe0,0x18,0},{0xe0, 0x98,0} }, { {0xe0,0x19,0},{0xe0, 0x99,0} }, { {0xe0,0x1a,0},{0xe0, 0x9a,0} }, { {0xe0,0x1b,0},{0xe0, 0x9b,0} }, /*118*/ - { {0xe0,0x1c,0},{0xe0, 0x9c,0} }, { {0xe0,0x1d,0},{0xe0, 0x9d,0} }, { {0xe0,0x1e,0},{0xe0, 0x9e,0} }, { {0xe0,0x1f,0},{0xe0, 0x9f,0} }, /*11c*/ - { {0xe0,0x20,0},{0xe0, 0xa0,0} }, { {0xe0,0x21,0},{0xe0, 0xa1,0} }, { {0xe0,0x22,0},{0xe0, 0xa2,0} }, { {0xe0,0x23,0},{0xe0, 0xa3,0} }, /*120*/ - { {0xe0,0x24,0},{0xe0, 0xa4,0} }, { {0xe0,0x25,0},{0xe0, 0xa5,0} }, { {0xe0,0x26,0},{0xe0, 0xa6,0} }, { { 0},{ 0} }, /*124*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*128*/ - { {0xe0,0x2c,0},{0xe0, 0xac,0} }, { {0xe0,0x2d,0},{0xe0, 0xad,0} }, { {0xe0,0x2e,0},{0xe0, 0xae,0} }, { {0xe0,0x2f,0},{0xe0, 0xaf,0} }, /*12c*/ - { {0xe0,0x30,0},{0xe0, 0xb0,0} }, { {0xe0,0x31,0},{0xe0, 0xb1,0} }, { {0xe0,0x32,0},{0xe0, 0xb2,0} }, { { 0},{ 0} }, /*130*/ - { {0xe0,0x34,0},{0xe0, 0xb4,0} }, { {0xe0,0x35,0},{0xe0, 0xb5,0} }, { { 0},{ 0} }, { {0xe0,0x37,0},{0xe0, 0xb7,0} }, /*134*/ - { {0xe0,0x38,0},{0xe0, 0xb8,0} }, { { 0},{ 0} }, { {0xe0,0x3a,0},{0xe0, 0xba,0} }, { {0xe0,0x3b,0},{0xe0, 0xbb,0} }, /*138*/ - { {0xe0,0x3c,0},{0xe0, 0xbc,0} }, { {0xe0,0x3d,0},{0xe0, 0xbd,0} }, { {0xe0,0x3e,0},{0xe0, 0xbe,0} }, { {0xe0,0x3f,0},{0xe0, 0xbf,0} }, /*13c*/ - { {0xe0,0x40,0},{0xe0, 0xc0,0} }, { {0xe0,0x41,0},{0xe0, 0xc1,0} }, { {0xe0,0x42,0},{0xe0, 0xc2,0} }, { {0xe0,0x43,0},{0xe0, 0xc3,0} }, /*140*/ - { {0xe0,0x44,0},{0xe0, 0xc4,0} }, { { 0},{ 0} }, { {0xe0,0x46,0},{0xe0, 0xc6,0} }, { {0xe0,0x47,0},{0xe0, 0xc7,0} }, /*144*/ - { {0xe0,0x48,0},{0xe0, 0xc8,0} }, { {0xe0,0x49,0},{0xe0, 0xc9,0} }, { { 0},{ 0} }, { {0xe0,0x4b,0},{0xe0, 0xcb,0} }, /*148*/ - { {0xe0,0x4c,0},{0xe0, 0xcc,0} }, { {0xe0,0x4d,0},{0xe0, 0xcd,0} }, { {0xe0,0x4e,0},{0xe0, 0xce,0} }, { {0xe0,0x4f,0},{0xe0, 0xcf,0} }, /*14c*/ - { {0xe0,0x50,0},{0xe0, 0xd0,0} }, { {0xe0,0x51,0},{0xe0, 0xd1,0} }, { {0xe0,0x52,0},{0xe0, 0xd2,0} }, { {0xe0,0x53,0},{0xe0, 0xd3,0} }, /*150*/ - { { 0},{ 0} }, { {0xe0,0x55,0},{0xe0, 0xd5,0} }, { { 0},{ 0} }, { {0xe0,0x57,0},{0xe0, 0xd7,0} }, /*154*/ - { {0xe0,0x58,0},{0xe0, 0xd8,0} }, { {0xe0,0x59,0},{0xe0, 0xd9,0} }, { {0xe0,0x5a,0},{0xe0, 0xaa,0} }, { {0xe0,0x5b,0},{0xe0, 0xdb,0} }, /*158*/ - { {0xe0,0x5c,0},{0xe0, 0xdc,0} }, { {0xe0,0x5d,0},{0xe0, 0xdd,0} }, { {0xe0,0x5e,0},{0xe0, 0xee,0} }, { {0xe0,0x5f,0},{0xe0, 0xdf,0} }, /*15c*/ - { { 0},{ 0} }, { {0xe0,0x61,0},{0xe0, 0xe1,0} }, { {0xe0,0x62,0},{0xe0, 0xe2,0} }, { {0xe0,0x63,0},{0xe0, 0xe3,0} }, /*160*/ - { {0xe0,0x64,0},{0xe0, 0xe4,0} }, { {0xe0,0x65,0},{0xe0, 0xe5,0} }, { {0xe0,0x66,0},{0xe0, 0xe6,0} }, { {0xe0,0x67,0},{0xe0, 0xe7,0} }, /*164*/ - { {0xe0,0x68,0},{0xe0, 0xe8,0} }, { {0xe0,0x69,0},{0xe0, 0xe9,0} }, { {0xe0,0x6a,0},{0xe0, 0xea,0} }, { {0xe0,0x6b,0},{0xe0, 0xeb,0} }, /*168*/ - { {0xe0,0x6c,0},{0xe0, 0xec,0} }, { {0xe0,0x6d,0},{0xe0, 0xed,0} }, { {0xe0,0x6e,0},{0xe0, 0xee,0} }, { { 0},{ 0} }, /*16c*/ - { {0xe0,0x70,0},{0xe0, 0xf0,0} }, { {0xe0,0x71,0},{0xe0, 0xf1,0} }, { {0xe0,0x72,0},{0xe0, 0xf2,0} }, { {0xe0,0x73,0},{0xe0, 0xf3,0} }, /*170*/ - { {0xe0,0x74,0},{0xe0, 0xf4,0} }, { {0xe0,0x75,0},{0xe0, 0xf5,0} }, { { 0},{ 0} }, { {0xe0,0x77,0},{0xe0, 0xf7,0} }, /*174*/ - { {0xe0,0x78,0},{0xe0, 0xf8,0} }, { {0xe0,0x79,0},{0xe0, 0xf9,0} }, { {0xe0,0x7a,0},{0xe0, 0xfa,0} }, { {0xe0,0x7b,0},{0xe0, 0xfb,0} }, /*178*/ - { {0xe0,0x7c,0},{0xe0, 0xfc,0} }, { {0xe0,0x7d,0},{0xe0, 0xfd,0} }, { {0xe0,0x7e,0},{0xe0, 0xfe,0} }, { {0xe0,0x7f,0},{0xe0, 0xff,0} }, /*17c*/ - - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*180*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*184*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*188*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*18c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*190*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*194*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*198*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*19c*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1a8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1ac*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1c8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1cc*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1d8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1dc*/ - { { 0},{ 0} }, { {0xe0,0xe1,0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1e8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xee,0},{ 0} }, { { 0},{ 0} }, /*1ec*/ - { { 0},{ 0} }, { {0xe0,0xf1,0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f0*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f4*/ - { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, { { 0},{ 0} }, /*1f8*/ - { { 0},{ 0} }, { { 0},{ 0} }, { {0xe0,0xfe,0},{ 0} }, { {0xe0,0xff,0},{ 0} } /*1fc*/ + { { 0xe1, 0x1d, 0 }, { 0xe1, 0x9d, 0 } }, { { 0xe0, 0x01, 0 }, { 0xe0, 0x81, 0 } }, /* 100 */ + { { 0xe0, 0x02, 0 }, { 0xe0, 0x82, 0 } }, { { 0xe0, 0x03, 0 }, { 0xe0, 0x83, 0 } }, /* 102 */ + { { 0xe0, 0x04, 0 }, { 0xe0, 0x84, 0 } }, { { 0xe0, 0x05, 0 }, { 0xe0, 0x85, 0 } }, /* 104 */ + { { 0xe0, 0x06, 0 }, { 0xe0, 0x86, 0 } }, { { 0xe0, 0x07, 0 }, { 0xe0, 0x87, 0 } }, /* 106 */ + { { 0xe0, 0x08, 0 }, { 0xe0, 0x88, 0 } }, { { 0xe0, 0x09, 0 }, { 0xe0, 0x89, 0 } }, /* 108 */ + { { 0xe0, 0x0a, 0 }, { 0xe0, 0x8a, 0 } }, { { 0xe0, 0x0b, 0 }, { 0xe0, 0x8b, 0 } }, /* 10a */ + { { 0xe0, 0x0c, 0 }, { 0xe0, 0x8c, 0 } }, { { 0 }, { 0 } }, /* 10c */ + { { 0xe0, 0x0e, 0 }, { 0xe0, 0x8e, 0 } }, { { 0xe0, 0x0f, 0 }, { 0xe0, 0x8f, 0 } }, /* 10e */ + { { 0xe0, 0x10, 0 }, { 0xe0, 0x90, 0 } }, { { 0xe0, 0x11, 0 }, { 0xe0, 0x91, 0 } }, /* 110 */ + { { 0xe0, 0x12, 0 }, { 0xe0, 0x92, 0 } }, { { 0xe0, 0x13, 0 }, { 0xe0, 0x93, 0 } }, /* 112 */ + { { 0xe0, 0x14, 0 }, { 0xe0, 0x94, 0 } }, { { 0xe0, 0x15, 0 }, { 0xe0, 0x95, 0 } }, /* 114 */ + { { 0xe0, 0x16, 0 }, { 0xe0, 0x96, 0 } }, { { 0xe0, 0x17, 0 }, { 0xe0, 0x97, 0 } }, /* 116 */ + { { 0xe0, 0x18, 0 }, { 0xe0, 0x98, 0 } }, { { 0xe0, 0x19, 0 }, { 0xe0, 0x99, 0 } }, /* 118 */ + { { 0xe0, 0x1a, 0 }, { 0xe0, 0x9a, 0 } }, { { 0xe0, 0x1b, 0 }, { 0xe0, 0x9b, 0 } }, /* 11a */ + { { 0xe0, 0x1c, 0 }, { 0xe0, 0x9c, 0 } }, { { 0xe0, 0x1d, 0 }, { 0xe0, 0x9d, 0 } }, /* 11c */ + { { 0xe0, 0x1e, 0 }, { 0xe0, 0x9e, 0 } }, { { 0xe0, 0x1f, 0 }, { 0xe0, 0x9f, 0 } }, /* 11e */ + { { 0xe0, 0x20, 0 }, { 0xe0, 0xa0, 0 } }, { { 0xe0, 0x21, 0 }, { 0xe0, 0xa1, 0 } }, /* 120 */ + { { 0xe0, 0x22, 0 }, { 0xe0, 0xa2, 0 } }, { { 0xe0, 0x23, 0 }, { 0xe0, 0xa3, 0 } }, /* 122 */ + { { 0xe0, 0x24, 0 }, { 0xe0, 0xa4, 0 } }, { { 0xe0, 0x25, 0 }, { 0xe0, 0xa5, 0 } }, /* 124 */ + { { 0xe0, 0x26, 0 }, { 0xe0, 0xa6, 0 } }, { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ + { { 0xe0, 0x2c, 0 }, { 0xe0, 0xac, 0 } }, { { 0xe0, 0x2d, 0 }, { 0xe0, 0xad, 0 } }, /* 12c */ + { { 0xe0, 0x2e, 0 }, { 0xe0, 0xae, 0 } }, { { 0xe0, 0x2f, 0 }, { 0xe0, 0xaf, 0 } }, /* 12e */ + { { 0xe0, 0x30, 0 }, { 0xe0, 0xb0, 0 } }, { { 0xe0, 0x31, 0 }, { 0xe0, 0xb1, 0 } }, /* 130 */ + { { 0xe0, 0x32, 0 }, { 0xe0, 0xb2, 0 } }, { { 0 }, { 0 } }, /* 132 */ + { { 0xe0, 0x34, 0 }, { 0xe0, 0xb4, 0 } }, { { 0xe0, 0x35, 0 }, { 0xe0, 0xb5, 0 } }, /* 134 */ + { { 0 }, { 0 } }, { { 0xe0, 0x37, 0 }, { 0xe0, 0xb7, 0 } }, /* 136 */ + { { 0xe0, 0x38, 0 }, { 0xe0, 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ + { { 0xe0, 0x3a, 0 }, { 0xe0, 0xba, 0 } }, { { 0xe0, 0x3b, 0 }, { 0xe0, 0xbb, 0 } }, /* 13a */ + { { 0xe0, 0x3c, 0 }, { 0xe0, 0xbc, 0 } }, { { 0xe0, 0x3d, 0 }, { 0xe0, 0xbd, 0 } }, /* 13c */ + { { 0xe0, 0x3e, 0 }, { 0xe0, 0xbe, 0 } }, { { 0xe0, 0x3f, 0 }, { 0xe0, 0xbf, 0 } }, /* 13e */ + { { 0xe0, 0x40, 0 }, { 0xe0, 0xc0, 0 } }, { { 0xe0, 0x41, 0 }, { 0xe0, 0xc1, 0 } }, /* 140 */ + { { 0xe0, 0x42, 0 }, { 0xe0, 0xc2, 0 } }, { { 0xe0, 0x43, 0 }, { 0xe0, 0xc3, 0 } }, /* 142 */ + { { 0xe0, 0x44, 0 }, { 0xe0, 0xc4, 0 } }, { { 0 }, { 0 } }, /* 144 */ + { { 0xe0, 0x46, 0 }, { 0xe0, 0xc6, 0 } }, { { 0xe0, 0x47, 0 }, { 0xe0, 0xc7, 0 } }, /* 146 */ + { { 0xe0, 0x48, 0 }, { 0xe0, 0xc8, 0 } }, { { 0xe0, 0x49, 0 }, { 0xe0, 0xc9, 0 } }, /* 148 */ + { { 0 }, { 0 } }, { { 0xe0, 0x4b, 0 }, { 0xe0, 0xcb, 0 } }, /* 14a */ + { { 0xe0, 0x4c, 0 }, { 0xe0, 0xcc, 0 } }, { { 0xe0, 0x4d, 0 }, { 0xe0, 0xcd, 0 } }, /* 14c */ + { { 0xe0, 0x4e, 0 }, { 0xe0, 0xce, 0 } }, { { 0xe0, 0x4f, 0 }, { 0xe0, 0xcf, 0 } }, /* 14e */ + { { 0xe0, 0x50, 0 }, { 0xe0, 0xd0, 0 } }, { { 0xe0, 0x51, 0 }, { 0xe0, 0xd1, 0 } }, /* 150 */ + { { 0xe0, 0x52, 0 }, { 0xe0, 0xd2, 0 } }, { { 0xe0, 0x53, 0 }, { 0xe0, 0xd3, 0 } }, /* 152 */ + { { 0 }, { 0 } }, { { 0xe0, 0x55, 0 }, { 0xe0, 0xd5, 0 } }, /* 154 */ + { { 0 }, { 0 } }, { { 0xe0, 0x57, 0 }, { 0xe0, 0xd7, 0 } }, /* 156 */ + { { 0xe0, 0x58, 0 }, { 0xe0, 0xd8, 0 } }, { { 0xe0, 0x59, 0 }, { 0xe0, 0xd9, 0 } }, /* 158 */ + { { 0xe0, 0x5a, 0 }, { 0xe0, 0xaa, 0 } }, { { 0xe0, 0x5b, 0 }, { 0xe0, 0xdb, 0 } }, /* 15a */ + { { 0xe0, 0x5c, 0 }, { 0xe0, 0xdc, 0 } }, { { 0xe0, 0x5d, 0 }, { 0xe0, 0xdd, 0 } }, /* 15c */ + { { 0xe0, 0x5e, 0 }, { 0xe0, 0xee, 0 } }, { { 0xe0, 0x5f, 0 }, { 0xe0, 0xdf, 0 } }, /* 15e */ + { { 0 }, { 0 } }, { { 0xe0, 0x61, 0 }, { 0xe0, 0xe1, 0 } }, /* 160 */ + { { 0xe0, 0x62, 0 }, { 0xe0, 0xe2, 0 } }, { { 0xe0, 0x63, 0 }, { 0xe0, 0xe3, 0 } }, /* 162 */ + { { 0xe0, 0x64, 0 }, { 0xe0, 0xe4, 0 } }, { { 0xe0, 0x65, 0 }, { 0xe0, 0xe5, 0 } }, /* 164 */ + { { 0xe0, 0x66, 0 }, { 0xe0, 0xe6, 0 } }, { { 0xe0, 0x67, 0 }, { 0xe0, 0xe7, 0 } }, /* 166 */ + { { 0xe0, 0x68, 0 }, { 0xe0, 0xe8, 0 } }, { { 0xe0, 0x69, 0 }, { 0xe0, 0xe9, 0 } }, /* 168 */ + { { 0xe0, 0x6a, 0 }, { 0xe0, 0xea, 0 } }, { { 0xe0, 0x6b, 0 }, { 0xe0, 0xeb, 0 } }, /* 16a */ + { { 0xe0, 0x6c, 0 }, { 0xe0, 0xec, 0 } }, { { 0xe0, 0x6d, 0 }, { 0xe0, 0xed, 0 } }, /* 16c */ + { { 0xe0, 0x6e, 0 }, { 0xe0, 0xee, 0 } }, { { 0 }, { 0 } }, /* 16e */ + { { 0xe0, 0x70, 0 }, { 0xe0, 0xf0, 0 } }, { { 0xe0, 0x71, 0 }, { 0xe0, 0xf1, 0 } }, /* 170 */ + { { 0xe0, 0x72, 0 }, { 0xe0, 0xf2, 0 } }, { { 0xe0, 0x73, 0 }, { 0xe0, 0xf3, 0 } }, /* 172 */ + { { 0xe0, 0x74, 0 }, { 0xe0, 0xf4, 0 } }, { { 0xe0, 0x75, 0 }, { 0xe0, 0xf5, 0 } }, /* 174 */ + { { 0 }, { 0 } }, { { 0xe0, 0x77, 0 }, { 0xe0, 0xf7, 0 } }, /* 176 */ + { { 0xe0, 0x78, 0 }, { 0xe0, 0xf8, 0 } }, { { 0xe0, 0x79, 0 }, { 0xe0, 0xf9, 0 } }, /* 178 */ + { { 0xe0, 0x7a, 0 }, { 0xe0, 0xfa, 0 } }, { { 0xe0, 0x7b, 0 }, { 0xe0, 0xfb, 0 } }, /* 17a */ + { { 0xe0, 0x7c, 0 }, { 0xe0, 0xfc, 0 } }, { { 0xe0, 0x7d, 0 }, { 0xe0, 0xfd, 0 } }, /* 17c */ + { { 0xe0, 0x7e, 0 }, { 0xe0, 0xfe, 0 } }, { { 0xe0, 0x7f, 0 }, { 0xe0, 0xff, 0 } }, /* 17e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, { { 0xe0, 0xe1, 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ + { { 0xe0, 0xee, 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, { { 0xe0, 0xf1, 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ + { { 0xe0, 0xfe, 0 }, { 0 } }, { { 0xe0, 0xff, 0 }, { 0 } } /* 1fe */ // clang-format on }; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 1d4c3303f..39cb43d70 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -138,262 +138,265 @@ static video_timings_t timing_dram = { VIDEO_BUS, 0, 0, 0, 0, 0, 0 }; /*No addit static const scancode scancode_tandy[512] = { // clang-format off - { {0}, {0} }, { {0x01, 0}, {0x81, 0} }, - { {0x02, 0}, {0x82, 0} }, { {0x03, 0}, {0x83, 0} }, - { {0x04, 0}, {0x84, 0} }, { {0x05, 0}, {0x85, 0} }, - { {0x06, 0}, {0x86, 0} }, { {0x07, 0}, {0x87, 0} }, - { {0x08, 0}, {0x88, 0} }, { {0x09, 0}, {0x89, 0} }, - { {0x0a, 0}, {0x8a, 0} }, { {0x0b, 0}, {0x8b, 0} }, - { {0x0c, 0}, {0x8c, 0} }, { {0x0d, 0}, {0x8d, 0} }, - { {0x0e, 0}, {0x8e, 0} }, { {0x0f, 0}, {0x8f, 0} }, - { {0x10, 0}, {0x90, 0} }, { {0x11, 0}, {0x91, 0} }, - { {0x12, 0}, {0x92, 0} }, { {0x13, 0}, {0x93, 0} }, - { {0x14, 0}, {0x94, 0} }, { {0x15, 0}, {0x95, 0} }, - { {0x16, 0}, {0x96, 0} }, { {0x17, 0}, {0x97, 0} }, - { {0x18, 0}, {0x98, 0} }, { {0x19, 0}, {0x99, 0} }, - { {0x1a, 0}, {0x9a, 0} }, { {0x1b, 0}, {0x9b, 0} }, - { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0x1e, 0}, {0x9e, 0} }, { {0x1f, 0}, {0x9f, 0} }, - { {0x20, 0}, {0xa0, 0} }, { {0x21, 0}, {0xa1, 0} }, - { {0x22, 0}, {0xa2, 0} }, { {0x23, 0}, {0xa3, 0} }, - { {0x24, 0}, {0xa4, 0} }, { {0x25, 0}, {0xa5, 0} }, - { {0x26, 0}, {0xa6, 0} }, { {0x27, 0}, {0xa7, 0} }, - { {0x28, 0}, {0xa8, 0} }, { {0x29, 0}, {0xa9, 0} }, - { {0x2a, 0}, {0xaa, 0} }, { {0x2b, 0}, {0xab, 0} }, - { {0x2c, 0}, {0xac, 0} }, { {0x2d, 0}, {0xad, 0} }, - { {0x2e, 0}, {0xae, 0} }, { {0x2f, 0}, {0xaf, 0} }, - { {0x30, 0}, {0xb0, 0} }, { {0x31, 0}, {0xb1, 0} }, - { {0x32, 0}, {0xb2, 0} }, { {0x33, 0}, {0xb3, 0} }, - { {0x34, 0}, {0xb4, 0} }, { {0x35, 0}, {0xb5, 0} }, - { {0x36, 0}, {0xb6, 0} }, { {0x37, 0}, {0xb7, 0} }, - { {0x38, 0}, {0xb8, 0} }, { {0x39, 0}, {0xb9, 0} }, - { {0x3a, 0}, {0xba, 0} }, { {0x3b, 0}, {0xbb, 0} }, - { {0x3c, 0}, {0xbc, 0} }, { {0x3d, 0}, {0xbd, 0} }, - { {0x3e, 0}, {0xbe, 0} }, { {0x3f, 0}, {0xbf, 0} }, - { {0x40, 0}, {0xc0, 0} }, { {0x41, 0}, {0xc1, 0} }, - { {0x42, 0}, {0xc2, 0} }, { {0x43, 0}, {0xc3, 0} }, - { {0x44, 0}, {0xc4, 0} }, { {0x45, 0}, {0xc5, 0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, - { {0x48, 0}, {0xc8, 0} }, { {0x49, 0}, {0xc9, 0} }, - { {0x4a, 0}, {0xca, 0} }, { {0x4b, 0}, {0xcb, 0} }, - { {0x4c, 0}, {0xcc, 0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0x4e, 0}, {0xce, 0} }, { {0x4f, 0}, {0xcf, 0} }, - { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x56, 0}, {0xd6, 0} }, - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*054*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ - { {0x57, 0}, {0xd7, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ - { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ - { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ - { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ - { {0x29, 0}, {0xa9, 0} }, { {0x49, 0}, {0xc9, 0} }, - { {0}, {0} }, { {0x2b, 0}, {0xab, 0} }, /*148*/ - { {0}, {0} }, { {0x4e, 0}, {0xce, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ - { {0x4a, 0}, {0xca, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*188*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ + { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ + { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ + { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ + { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ + { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ + { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ + { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ + { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ + { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ + { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ + { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ + { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ + { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ + { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ + { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ + { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ + { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ + { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ + { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ + { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ + { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ + { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ + { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ + { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ + { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ + { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ + { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ + { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ + { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ + { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ + { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ + { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ + { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ + { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ + { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x56, 0 }, { 0xd6, 0 } }, /* 052 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 054 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 056 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 058 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 064 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 066 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 068 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 070 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 072 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 074 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 076 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 078 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 080 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 084 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 086 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 088 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 090 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 092 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 094 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 096 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 098 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ba */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0bc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0be */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0de */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ec */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fe */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 100 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 102 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 104 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 106 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 108 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 110 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 112 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 114 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 116 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 118 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11a */ + { { 0x57, 0 }, { 0xd7, 0 } }, { { 0 }, { 0 } }, /* 11c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 120 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 122 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 130 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 132 */ + { { 0 }, { 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 134 */ + { { 0 }, { 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 136 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 140 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 142 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 144 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 146 */ + { { 0x29, 0 }, { 0xa9, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 148 */ + { { 0 }, { 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 14a */ + { { 0 }, { 0 } }, { { 0x4e, 0 }, { 0xce, 0 } }, /* 14c */ + { { 0 }, { 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14e */ + { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 150 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 152 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 154 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 156 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 158 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 160 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 162 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 164 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 166 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 168 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 170 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 172 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 174 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 176 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 178 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } } /* 1fe */ // clang-format on }; static uint8_t crtcmask[32] = { diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index 7806d378b..6cc359892 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -846,262 +846,265 @@ ms_poll(void *priv) */ const scancode scancode_olivetti_m24_deluxe[512] = { // clang-format off - { {0}, {0} }, { {0x01, 0}, {0x81, 0} }, - { {0x02, 0}, {0x82, 0} }, { {0x03, 0}, {0x83, 0} }, - { {0x04, 0}, {0x84, 0} }, { {0x05, 0}, {0x85, 0} }, - { {0x06, 0}, {0x86, 0} }, { {0x07, 0}, {0x87, 0} }, - { {0x08, 0}, {0x88, 0} }, { {0x09, 0}, {0x89, 0} }, - { {0x0a, 0}, {0x8a, 0} }, { {0x0b, 0}, {0x8b, 0} }, - { {0x0c, 0}, {0x8c, 0} }, { {0x0d, 0}, {0x8d, 0} }, - { {0x0e, 0}, {0x8e, 0} }, { {0x0f, 0}, {0x8f, 0} }, - { {0x10, 0}, {0x90, 0} }, { {0x11, 0}, {0x91, 0} }, - { {0x12, 0}, {0x92, 0} }, { {0x13, 0}, {0x93, 0} }, - { {0x14, 0}, {0x94, 0} }, { {0x15, 0}, {0x95, 0} }, - { {0x16, 0}, {0x96, 0} }, { {0x17, 0}, {0x97, 0} }, - { {0x18, 0}, {0x98, 0} }, { {0x19, 0}, {0x99, 0} }, - { {0x1a, 0}, {0x9a, 0} }, { {0x1b, 0}, {0x9b, 0} }, - { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0x1e, 0}, {0x9e, 0} }, { {0x1f, 0}, {0x9f, 0} }, - { {0x20, 0}, {0xa0, 0} }, { {0x21, 0}, {0xa1, 0} }, - { {0x22, 0}, {0xa2, 0} }, { {0x23, 0}, {0xa3, 0} }, - { {0x24, 0}, {0xa4, 0} }, { {0x25, 0}, {0xa5, 0} }, - { {0x26, 0}, {0xa6, 0} }, { {0x27, 0}, {0xa7, 0} }, - { {0x28, 0}, {0xa8, 0} }, { {0x29, 0}, {0xa9, 0} }, - { {0x2a, 0}, {0xaa, 0} }, { {0x2b, 0}, {0xab, 0} }, - { {0x2c, 0}, {0xac, 0} }, { {0x2d, 0}, {0xad, 0} }, - { {0x2e, 0}, {0xae, 0} }, { {0x2f, 0}, {0xaf, 0} }, - { {0x30, 0}, {0xb0, 0} }, { {0x31, 0}, {0xb1, 0} }, - { {0x32, 0}, {0xb2, 0} }, { {0x33, 0}, {0xb3, 0} }, - { {0x34, 0}, {0xb4, 0} }, { {0x35, 0}, {0xb5, 0} }, - { {0x36, 0}, {0xb6, 0} }, { {0x37, 0}, {0xb7, 0} }, - { {0x38, 0}, {0xb8, 0} }, { {0x39, 0}, {0xb9, 0} }, - { {0x3a, 0}, {0xba, 0} }, { {0x3b, 0}, {0xbb, 0} }, - { {0x3c, 0}, {0xbc, 0} }, { {0x3d, 0}, {0xbd, 0} }, - { {0x3e, 0}, {0xbe, 0} }, { {0x3f, 0}, {0xbf, 0} }, - { {0x40, 0}, {0xc0, 0} }, { {0x41, 0}, {0xc1, 0} }, - { {0x42, 0}, {0xc2, 0} }, { {0x43, 0}, {0xc3, 0} }, - { {0x44, 0}, {0xc4, 0} }, { {0x45, 0}, {0xc5, 0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, - { {0x48, 0}, {0xc8, 0} }, { {0x49, 0}, {0xc9, 0} }, - { {0x4a, 0}, {0xca, 0} }, { {0x4b, 0}, {0xcb, 0} }, - { {0x4c, 0}, {0xcc, 0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0x4e, 0}, {0xce, 0} }, { {0x4f, 0}, {0xcf, 0} }, - { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, - { {0}, {0} }, { {0}, {0} }, - { {0x5e, 0}, {0xde, 0} }, { {0x60, 0}, {0xe0, 0} }, /*054*/ - { {0x61, 0}, {0xe1, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ - { {0x57, 0}, {0xd7, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ - { {0}, {0} }, { {0x5f, 0}, {0xdf, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ - { {0x66, 0}, {0xe6, 0} }, { {0x55, 0}, {0xd5, 0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ - { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x63, 0}, {0xe3, 0} }, /*144*/ - { {0x5b, 0}, {0xdb, 0} }, { {0x5c, 0}, {0xdc, 0} }, - { {0}, {0} }, { {0x58, 0}, {0xd8, 0} }, /*148*/ - { {0}, {0} }, { {0x5a, 0}, {0xda, 0} }, - { {0}, {0} }, { {0x65, 0}, {0xe5, 0} }, /*14c*/ - { {0x59, 0}, {0xd9, 0} }, { {0x5d, 0}, {0xdd, 0} }, - { {0x62, 0}, {0xe2, 0} }, { {0x64, 0}, {0xe4, 0} }, /*150*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0x54, 0}, {0xd4, 0} }, /*158*/ - { {0x67, 0}, {0xe7, 0} }, { {0x56, 0}, {0xd6, 0} }, - { {0}, {0} }, { {0}, {0} }, /*15c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*188*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ + { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ + { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ + { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ + { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ + { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ + { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ + { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ + { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ + { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ + { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ + { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ + { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ + { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ + { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ + { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ + { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ + { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ + { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ + { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ + { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ + { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ + { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ + { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ + { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ + { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ + { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ + { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ + { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ + { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ + { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ + { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ + { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ + { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ + { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ + { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 054 */ + { { 0x5e, 0 }, { 0xde, 0 } }, { { 0x60, 0 }, { 0xe0, 0 } }, /* 056 */ + { { 0x61, 0 }, { 0xe1, 0 } }, { { 0 }, { 0 } }, /* 058 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 064 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 066 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 068 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 070 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 072 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 074 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 076 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 078 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 080 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 084 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 086 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 088 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 090 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 092 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 094 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 096 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 098 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ba */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0bc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0be */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0de */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ec */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fe */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 100 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 102 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 104 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 106 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 108 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 110 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 112 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 114 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 116 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 118 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11a */ + { { 0x57, 0 }, { 0xd7, 0 } }, { { 0 }, { 0 } }, /* 11c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 120 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 122 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 130 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 132 */ + { { 0 }, { 0 } }, { { 0x5f, 0 }, { 0xdf, 0 } }, /* 134 */ + { { 0 }, { 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 136 */ + { { 0x66, 0 }, { 0xe6, 0 } }, { { 0x55, 0 }, { 0xd5, 0 } }, /* 138 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 140 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 142 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 144 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x63, 0 }, { 0xe3, 0 } }, /* 146 */ + { { 0x5b, 0 }, { 0xdb, 0 } }, { { 0x5c, 0 }, { 0xdc, 0 } }, /* 148 */ + { { 0 }, { 0 } }, { { 0x58, 0 }, { 0xd8, 0 } }, /* 14a */ + { { 0 }, { 0 } }, { { 0x5a, 0 }, { 0xda, 0 } }, /* 14c */ + { { 0 }, { 0 } }, { { 0x65, 0 }, { 0xe5, 0 } }, /* 14e */ + { { 0x59, 0 }, { 0xd9, 0 } }, { { 0x5d, 0 }, { 0xdd, 0 } }, /* 150 */ + { { 0x62, 0 }, { 0xe2, 0 } }, { { 0x64, 0 }, { 0xe4, 0 } }, /* 152 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 154 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 156 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 158 */ + { { 0 }, { 0 } }, { { 0x54, 0 }, { 0xd4, 0 } }, /* 15a */ + { { 0x67, 0 }, { 0xe7, 0 } }, { { 0x56, 0 }, { 0xd6, 0 } }, /* 15c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 160 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 162 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 164 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 166 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 168 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 170 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 172 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 174 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 176 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 178 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } } /* 1fe */ // clang-format on }; @@ -1113,262 +1116,265 @@ const scancode scancode_olivetti_m24_deluxe[512] = { */ const scancode scancode_olivetti_m240[512] = { // clang-format off - { {0}, {0} }, { {0x01, 0}, {0x81, 0} }, - { {0x02, 0}, {0x82, 0} }, { {0x03, 0}, {0x83, 0} }, - { {0x04, 0}, {0x84, 0} }, { {0x05, 0}, {0x85, 0} }, - { {0x06, 0}, {0x86, 0} }, { {0x07, 0}, {0x87, 0} }, - { {0x08, 0}, {0x88, 0} }, { {0x09, 0}, {0x89, 0} }, - { {0x0a, 0}, {0x8a, 0} }, { {0x0b, 0}, {0x8b, 0} }, - { {0x0c, 0}, {0x8c, 0} }, { {0x0d, 0}, {0x8d, 0} }, - { {0x0e, 0}, {0x8e, 0} }, { {0x0f, 0}, {0x8f, 0} }, - { {0x10, 0}, {0x90, 0} }, { {0x11, 0}, {0x91, 0} }, - { {0x12, 0}, {0x92, 0} }, { {0x13, 0}, {0x93, 0} }, - { {0x14, 0}, {0x94, 0} }, { {0x15, 0}, {0x95, 0} }, - { {0x16, 0}, {0x96, 0} }, { {0x17, 0}, {0x97, 0} }, - { {0x18, 0}, {0x98, 0} }, { {0x19, 0}, {0x99, 0} }, - { {0x1a, 0}, {0x9a, 0} }, { {0x1b, 0}, {0x9b, 0} }, - { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0x1e, 0}, {0x9e, 0} }, { {0x1f, 0}, {0x9f, 0} }, - { {0x20, 0}, {0xa0, 0} }, { {0x21, 0}, {0xa1, 0} }, - { {0x22, 0}, {0xa2, 0} }, { {0x23, 0}, {0xa3, 0} }, - { {0x24, 0}, {0xa4, 0} }, { {0x25, 0}, {0xa5, 0} }, - { {0x26, 0}, {0xa6, 0} }, { {0x27, 0}, {0xa7, 0} }, - { {0x28, 0}, {0xa8, 0} }, { {0x29, 0}, {0xa9, 0} }, - { {0x2a, 0}, {0xaa, 0} }, { {0x2b, 0}, {0xab, 0} }, - { {0x2c, 0}, {0xac, 0} }, { {0x2d, 0}, {0xad, 0} }, - { {0x2e, 0}, {0xae, 0} }, { {0x2f, 0}, {0xaf, 0} }, - { {0x30, 0}, {0xb0, 0} }, { {0x31, 0}, {0xb1, 0} }, - { {0x32, 0}, {0xb2, 0} }, { {0x33, 0}, {0xb3, 0} }, - { {0x34, 0}, {0xb4, 0} }, { {0x35, 0}, {0xb5, 0} }, - { {0x36, 0}, {0xb6, 0} }, { {0x37, 0}, {0xb7, 0} }, - { {0x38, 0}, {0xb8, 0} }, { {0x39, 0}, {0xb9, 0} }, - { {0x3a, 0}, {0xba, 0} }, { {0x3b, 0}, {0xbb, 0} }, - { {0x3c, 0}, {0xbc, 0} }, { {0x3d, 0}, {0xbd, 0} }, - { {0x3e, 0}, {0xbe, 0} }, { {0x3f, 0}, {0xbf, 0} }, - { {0x40, 0}, {0xc0, 0} }, { {0x41, 0}, {0xc1, 0} }, - { {0x42, 0}, {0xc2, 0} }, { {0x43, 0}, {0xc3, 0} }, - { {0x44, 0}, {0xc4, 0} }, { {0x45, 0}, {0xc5, 0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, - { {0x48, 0}, {0xc8, 0} }, { {0x49, 0}, {0xc9, 0} }, - { {0x4a, 0}, {0xca, 0} }, { {0x4b, 0}, {0xcb, 0} }, - { {0x4c, 0}, {0xcc, 0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0x4e, 0}, {0xce, 0} }, { {0x4f, 0}, {0xcf, 0} }, - { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*054*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*058*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*05c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*060*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*064*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*068*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*06c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*070*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*074*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*078*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*07c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*080*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*084*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*088*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*08c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*090*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*094*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*098*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*09c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0a8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ac*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0b8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0bc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0c8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0cc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0d8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0dc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0e8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0ec*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0f8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*0fc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*100*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*104*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*108*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*10c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*110*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*114*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*118*/ - { {0x1c, 0}, {0x9c, 0} }, { {0x1d, 0}, {0x9d, 0} }, - { {0}, {0} }, { {0}, {0} }, /*11c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*120*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*124*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*128*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*12c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*130*/ - { {0}, {0} }, { {0x35, 0}, {0xb5, 0} }, - { {0}, {0} }, { {0x37, 0}, {0xb7, 0} }, /*134*/ - { {0x38, 0}, {0xb8, 0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*138*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*13c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*140*/ - { {0}, {0} }, { {0}, {0} }, - { {0x46, 0}, {0xc6, 0} }, { {0x47, 0}, {0xc7, 0} }, /*144*/ - { {0x48, 0}, {0xc8, 0} }, { {0x49, 0}, {0xc9, 0} }, - { {0}, {0} }, { {0x4b, 0}, {0xcb, 0} }, /*148*/ - { {0}, {0} }, { {0x4d, 0}, {0xcd, 0} }, - { {0}, {0} }, { {0x4f, 0}, {0xcf, 0} }, /*14c*/ - { {0x50, 0}, {0xd0, 0} }, { {0x51, 0}, {0xd1, 0} }, - { {0x52, 0}, {0xd2, 0} }, { {0x53, 0}, {0xd3, 0} }, /*150*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*154*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*158*/ - { {0}, {0} }, { {0x54, 0}, {0xd4, 0} }, - { {0x56, 0}, {0xd6, 0} }, { {0x5c, 0}, {0xdc, 0} }, /*15c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*160*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*164*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*168*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*16c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*170*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*174*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*148*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*17c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*180*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*184*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*188*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*18c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*190*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*194*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*198*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*19c*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1a8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ac*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1b8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1bc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1c8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1cc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1d8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1dc*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1e8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1ec*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f0*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f4*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} }, /*1f8*/ - { {0}, {0} }, { {0}, {0} }, - { {0}, {0} }, { {0}, {0} } /*1fc*/ + { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ + { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ + { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ + { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ + { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ + { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ + { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ + { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ + { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ + { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ + { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ + { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ + { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ + { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ + { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ + { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ + { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ + { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ + { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ + { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ + { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ + { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ + { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ + { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ + { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ + { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ + { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ + { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ + { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ + { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ + { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ + { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ + { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ + { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ + { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ + { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 054 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 056 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 058 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 064 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 066 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 068 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 070 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 072 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 074 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 076 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 078 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 080 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 084 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 086 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 088 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 090 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 092 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 094 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 096 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 098 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ba */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0bc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0be */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0de */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ec */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fe */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 100 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 102 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 104 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 106 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 108 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 110 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 112 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 114 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 116 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 118 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11a */ + { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 11c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 120 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 122 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 130 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 132 */ + { { 0 }, { 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 134 */ + { { 0 }, { 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 136 */ + { { 0x38, 0 }, { 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 140 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 142 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 144 */ + { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 146 */ + { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 148 */ + { { 0 }, { 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 14a */ + { { 0 }, { 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 14c */ + { { 0 }, { 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14e */ + { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 150 */ + { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 152 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 154 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 156 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 158 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15a */ + { { 0 }, { 0 } }, { { 0x54, 0 }, { 0xd4, 0 } }, /* 15c */ + { { 0x56, 0 }, { 0xd6, 0 } }, { { 0x5c, 0 }, { 0xdc, 0 } }, /* 15e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 160 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 162 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 164 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 166 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 168 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 170 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 172 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 174 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 176 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 178 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17e */ + + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, { { 0 }, { 0 } } /* 1fe */ // clang-format on }; From 931fc0d24a9767cc0202e29c3feacd41699fd7ef Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 21 Jun 2024 21:24:03 -0400 Subject: [PATCH 019/624] One line per keyboard scancode (Part 2) --- src/device/keyboard_at.c | 2241 +++++++++++++++++++++++------------ src/device/keyboard_xt.c | 771 ++++++++---- src/machine/m_amstrad.c | 747 ++++++++---- src/machine/m_tandy.c | 771 ++++++++---- src/machine/m_xt_olivetti.c | 1542 ++++++++++++++++-------- 5 files changed, 4032 insertions(+), 2040 deletions(-) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index aea35e995..915dbe2b8 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -81,769 +81,1504 @@ static uint16_t bat_counter = 0; static const scancode scancode_set1[512] = { // clang-format off - { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ - { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ - { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ - { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ - { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ - { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ - { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ - { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ - { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ - { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ - { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ - { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ - { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ - { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ - { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ - { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ - { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ - { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ - { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ - { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ - { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ - { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ - { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ - { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ - { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ - { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ - { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ - { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ - { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ - { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ - { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ - { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ - { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ - { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ - { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ - { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ - { { 0x54, 0 }, { 0xd4, 0 } }, { { 0x55, 0 }, { 0xd5, 0 } }, /* 054 */ - { { 0x56, 0 }, { 0xd6, 0 } }, { { 0x57, 0 }, { 0xd7, 0 } }, /* 056 */ - { { 0x58, 0 }, { 0xd8, 0 } }, { { 0x59, 0 }, { 0xd9, 0 } }, /* 058 */ - { { 0x5a, 0 }, { 0xda, 0 } }, { { 0x5b, 0 }, { 0xdb, 0 } }, /* 05a */ - { { 0x5c, 0 }, { 0xdc, 0 } }, { { 0x5d, 0 }, { 0xdd, 0 } }, /* 05c */ - { { 0x5e, 0 }, { 0xde, 0 } }, { { 0x5f, 0 }, { 0xdf, 0 } }, /* 05e */ - { { 0x60, 0 }, { 0xe0, 0 } }, { { 0x61, 0 }, { 0xe1, 0 } }, /* 060 */ - { { 0x62, 0 }, { 0xe2, 0 } }, { { 0x63, 0 }, { 0xe3, 0 } }, /* 062 */ - { { 0x64, 0 }, { 0xe4, 0 } }, { { 0x65, 0 }, { 0xe5, 0 } }, /* 064 */ - { { 0x66, 0 }, { 0xe6, 0 } }, { { 0x67, 0 }, { 0xe7, 0 } }, /* 066 */ - { { 0x68, 0 }, { 0xe8, 0 } }, { { 0x69, 0 }, { 0xe9, 0 } }, /* 068 */ - { { 0x6a, 0 }, { 0xea, 0 } }, { { 0x6b, 0 }, { 0xeb, 0 } }, /* 06a */ - { { 0x6c, 0 }, { 0xec, 0 } }, { { 0x6d, 0 }, { 0xed, 0 } }, /* 06c */ - { { 0x6e, 0 }, { 0xee, 0 } }, { { 0x6f, 0 }, { 0xef, 0 } }, /* 06e */ - { { 0x70, 0 }, { 0xf0, 0 } }, { { 0x71, 0 }, { 0xf1, 0 } }, /* 070 */ - { { 0x72, 0 }, { 0xf2, 0 } }, { { 0x73, 0 }, { 0xf3, 0 } }, /* 072 */ - { { 0x74, 0 }, { 0xf4, 0 } }, { { 0x75, 0 }, { 0xf5, 0 } }, /* 074 */ - { { 0x76, 0 }, { 0xf6, 0 } }, { { 0x77, 0 }, { 0xf7, 0 } }, /* 076 */ - { { 0x78, 0 }, { 0xf8, 0 } }, { { 0x79, 0 }, { 0xf9, 0 } }, /* 078 */ - { { 0x7a, 0 }, { 0xfa, 0 } }, { { 0x7b, 0 }, { 0xfb, 0 } }, /* 07a */ - { { 0x7c, 0 }, { 0xfc, 0 } }, { { 0x7d, 0 }, { 0xfd, 0 } }, /* 07c */ - { { 0x7e, 0 }, { 0xfe, 0 } }, { { 0x7f, 0 }, { 0xff, 0 } }, /* 07e */ - - { { 0x80, 0 }, { 0 } }, { { 0x81, 0 }, { 0 } }, /* 080 */ - { { 0x82, 0 }, { 0 } }, { { 0 } ,{ 0 } }, /* 082 */ - { { 0 }, { 0 } }, { { 0x85, 0 }, { 0 } }, /* 084 */ - { { 0x86, 0 }, { 0 } }, { { 0x87, 0 }, { 0 } }, /* 086 */ - { { 0x88, 0 }, { 0 } }, { { 0x89, 0 }, { 0 } }, /* 088 */ - { { 0x8a, 0 }, { 0 } }, { { 0x8b, 0 }, { 0 } }, /* 08a */ - { { 0x8c, 0 }, { 0 } }, { { 0x8d, 0 }, { 0 } }, /* 08c */ - { { 0x8e, 0 }, { 0 } }, { { 0x8f, 0 }, { 0 } }, /* 08e */ - { { 0x90, 0 }, { 0 } }, { { 0x91, 0 }, { 0 } }, /* 090 */ - { { 0x92, 0 }, { 0 } }, { { 0x93, 0 }, { 0 } }, /* 092 */ - { { 0x94, 0 }, { 0 } }, { { 0x95, 0 }, { 0 } }, /* 094 */ - { { 0x96, 0 }, { 0 } }, { { 0x97, 0 }, { 0 } }, /* 096 */ - { { 0x98, 0 }, { 0 } }, { { 0x99, 0 }, { 0 } }, /* 098 */ - { { 0x9a, 0 }, { 0 } }, { { 0x9b, 0 }, { 0 } }, /* 09a */ - { { 0x9c, 0 }, { 0 } }, { { 0x9d, 0 }, { 0 } }, /* 09c */ - { { 0x9e, 0 }, { 0 } }, { { 0x9f, 0 }, { 0 } }, /* 09e */ - { { 0xa0, 0 }, { 0 } }, { { 0xa1, 0 }, { 0 } }, /* 0a0 */ - { { 0xa2, 0 }, { 0 } }, { { 0xa3, 0 }, { 0 } }, /* 0a2 */ - { { 0xa4, 0 }, { 0 } }, { { 0xa5, 0 }, { 0 } }, /* 0a4 */ - { { 0xa6, 0 }, { 0 } }, { { 0xa7, 0 }, { 0 } }, /* 0a6 */ - { { 0xa8, 0 }, { 0 } }, { { 0xa9, 0 }, { 0 } }, /* 0a8 */ - { { 0xaa, 0 }, { 0 } }, { { 0xab, 0 }, { 0 } }, /* 0aa */ - { { 0xac, 0 }, { 0 } }, { { 0xad, 0 }, { 0 } }, /* 0ac */ - { { 0xae, 0 }, { 0 } }, { { 0xaf, 0 }, { 0 } }, /* 0ae */ - { { 0xb0, 0 }, { 0 } }, { { 0xb1, 0 }, { 0 } }, /* 0b0 */ - { { 0xb2, 0 }, { 0 } }, { { 0xb3, 0 }, { 0 } }, /* 0b2 */ - { { 0xb4, 0 }, { 0 } }, { { 0xb5, 0 }, { 0 } }, /* 0b4 */ - { { 0xb6, 0 }, { 0 } }, { { 0xb7, 0 }, { 0 } }, /* 0b6 */ - { { 0xb8, 0 }, { 0 } }, { { 0xb9, 0 }, { 0 } }, /* 0b8 */ - { { 0xba, 0 }, { 0 } }, { { 0xbb, 0 }, { 0 } }, /* 0ba */ - { { 0xbc, 0 }, { 0 } }, { { 0xbd, 0 }, { 0 } }, /* 0bc */ - { { 0xbe, 0 }, { 0 } }, { { 0xbf, 0 }, { 0 } }, /* 0be */ - { { 0xc0, 0 }, { 0 } }, { { 0xc1, 0 }, { 0 } }, /* 0c0 */ - { { 0xc2, 0 }, { 0 } }, { { 0xc3, 0 }, { 0 } }, /* 0c2 */ - { { 0xc4, 0 }, { 0 } }, { { 0xc5, 0 }, { 0 } }, /* 0c4 */ - { { 0xc6, 0 }, { 0 } }, { { 0xc7, 0 }, { 0 } }, /* 0c6 */ - { { 0xc8, 0 }, { 0 } }, { { 0xc9, 0 }, { 0 } }, /* 0c8 */ - { { 0xca, 0 }, { 0 } }, { { 0xcb, 0 }, { 0 } }, /* 0ca */ - { { 0xcc, 0 }, { 0 } }, { { 0xcd, 0 }, { 0 } }, /* 0cc */ - { { 0xce, 0 }, { 0 } }, { { 0xcf, 0 }, { 0 } }, /* 0ce */ - { { 0xd0, 0 }, { 0 } }, { { 0xd1, 0 }, { 0 } }, /* 0d0 */ - { { 0xd2, 0 }, { 0 } }, { { 0xd3, 0 }, { 0 } }, /* 0d2 */ - { { 0xd4, 0 }, { 0 } }, { { 0xd5, 0 }, { 0 } }, /* 0d4 */ - { { 0xd6, 0 }, { 0 } }, { { 0xd7, 0 }, { 0 } }, /* 0d6 */ - { { 0xd8, 0 }, { 0 } }, { { 0xd9, 0 }, { 0 } }, /* 0d8 */ - { { 0xda, 0 }, { 0 } }, { { 0xdb, 0 }, { 0 } }, /* 0da */ - { { 0xdc, 0 }, { 0 } }, { { 0xdd, 0 }, { 0 } }, /* 0dc */ - { { 0xde, 0 }, { 0 } }, { { 0xdf, 0 }, { 0 } }, /* 0de */ - { { 0xe0, 0 }, { 0 } }, { { 0xe1, 0 }, { 0 } }, /* 0e0 */ - { { 0xe2, 0 }, { 0 } }, { { 0xe3, 0 }, { 0 } }, /* 0e2 */ - { { 0xe4, 0 }, { 0 } }, { { 0xe5, 0 }, { 0 } }, /* 0e4 */ - { { 0xe6, 0 }, { 0 } }, { { 0xe7, 0 }, { 0 } }, /* 0e6 */ - { { 0xe8, 0 }, { 0 } }, { { 0xe9, 0 }, { 0 } }, /* 0e8 */ - { { 0xea, 0 }, { 0 } }, { { 0xeb, 0 }, { 0 } }, /* 0ea */ - { { 0xec, 0 }, { 0 } }, { { 0xed, 0 }, { 0 } }, /* 0ec */ - { { 0xee, 0 }, { 0 } }, { { 0xef, 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, { { 0xf1, 0 }, { 0 } }, /* 0f0 */ - { { 0xf2, 0 }, { 0 } }, { { 0xf3, 0 }, { 0 } }, /* 0f2 */ - { { 0xf4, 0 }, { 0 } }, { { 0xf5, 0 }, { 0 } }, /* 0f4 */ - { { 0xf6, 0 }, { 0 } }, { { 0xf7, 0 }, { 0 } }, /* 0f6 */ - { { 0xf8, 0 }, { 0 } }, { { 0xf9, 0 }, { 0 } }, /* 0f8 */ - { { 0xfa, 0 }, { 0 } }, { { 0xfb, 0 }, { 0 } }, /* 0fa */ - { { 0xfc, 0 }, { 0 } }, { { 0xfd, 0 }, { 0 } }, /* 0fc */ - { { 0xfe, 0 }, { 0 } }, { { 0xff, 0 }, { 0 } }, /* 0fe */ - - { { 0xe1, 0x1d, 0 }, { 0xe1, 0x9d, 0 } }, { { 0xe0, 0x01, 0 }, { 0xe0, 0x81, 0 } }, /* 100 */ - { { 0xe0, 0x02, 0 }, { 0xe0, 0x82, 0 } }, { { 0xe0, 0x03, 0 }, { 0xe0, 0x83, 0 } }, /* 102 */ - { { 0xe0, 0x04, 0 }, { 0xe0, 0x84, 0 } }, { { 0xe0, 0x05, 0 }, { 0xe0, 0x85, 0 } }, /* 104 */ - { { 0xe0, 0x06, 0 }, { 0xe0, 0x86, 0 } }, { { 0xe0, 0x07, 0 }, { 0xe0, 0x87, 0 } }, /* 106 */ - { { 0xe0, 0x08, 0 }, { 0xe0, 0x88, 0 } }, { { 0xe0, 0x09, 0 }, { 0xe0, 0x89, 0 } }, /* 108 */ - { { 0xe0, 0x0a, 0 }, { 0xe0, 0x8a, 0 } }, { { 0xe0, 0x0b, 0 }, { 0xe0, 0x8b, 0 } }, /* 10a */ - { { 0xe0, 0x0c, 0 }, { 0xe0, 0x8c, 0 } }, { { 0 }, { 0 } }, /* 10c */ - { { 0xe0, 0x0e, 0 }, { 0xe0, 0x8e, 0 } }, { { 0xe0, 0x0f, 0 }, { 0xe0, 0x8f, 0 } }, /* 10e */ - { { 0xe0, 0x10, 0 }, { 0xe0, 0x90, 0 } }, { { 0xe0, 0x11, 0 }, { 0xe0, 0x91, 0 } }, /* 110 */ - { { 0xe0, 0x12, 0 }, { 0xe0, 0x92, 0 } }, { { 0xe0, 0x13, 0 }, { 0xe0, 0x93, 0 } }, /* 112 */ - { { 0xe0, 0x14, 0 }, { 0xe0, 0x94, 0 } }, { { 0xe0, 0x15, 0 }, { 0xe0, 0x95, 0 } }, /* 114 */ - { { 0xe0, 0x16, 0 }, { 0xe0, 0x96, 0 } }, { { 0xe0, 0x17, 0 }, { 0xe0, 0x97, 0 } }, /* 116 */ - { { 0xe0, 0x18, 0 }, { 0xe0, 0x98, 0 } }, { { 0xe0, 0x19, 0 }, { 0xe0, 0x99, 0 } }, /* 118 */ - { { 0xe0, 0x1a, 0 }, { 0xe0, 0x9a, 0 } }, { { 0xe0, 0x1b, 0 }, { 0xe0, 0x9b, 0 } }, /* 11a */ - { { 0xe0, 0x1c, 0 }, { 0xe0, 0x9c, 0 } }, { { 0xe0, 0x1d, 0 }, { 0xe0, 0x9d, 0 } }, /* 11c */ - { { 0xe0, 0x1e, 0 }, { 0xe0, 0x9e, 0 } }, { { 0xe0, 0x1f, 0 }, { 0xe0, 0x9f, 0 } }, /* 11e */ - { { 0xe0, 0x20, 0 }, { 0xe0, 0xa0, 0 } }, { { 0xe0, 0x21, 0 }, { 0xe0, 0xa1, 0 } }, /* 120 */ - { { 0xe0, 0x22, 0 }, { 0xe0, 0xa2, 0 } }, { { 0xe0, 0x23, 0 }, { 0xe0, 0xa3, 0 } }, /* 122 */ - { { 0xe0, 0x24, 0 }, { 0xe0, 0xa4, 0 } }, { { 0xe0, 0x25, 0 }, { 0xe0, 0xa5, 0 } }, /* 124 */ - { { 0xe0, 0x26, 0 }, { 0xe0, 0xa6, 0 } }, { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ - { { 0xe0, 0x2c, 0 }, { 0xe0, 0xac, 0 } }, { { 0xe0, 0x2d, 0 }, { 0xe0, 0xad, 0 } }, /* 12c */ - { { 0xe0, 0x2e, 0 }, { 0xe0, 0xae, 0 } }, { { 0xe0, 0x2f, 0 }, { 0xe0, 0xaf, 0 } }, /* 12e */ - { { 0xe0, 0x30, 0 }, { 0xe0, 0xb0, 0 } }, { { 0xe0, 0x31, 0 }, { 0xe0, 0xb1, 0 } }, /* 130 */ - { { 0xe0, 0x32, 0 }, { 0xe0, 0xb2, 0 } }, { { 0 }, { 0 } }, /* 132 */ - { { 0xe0, 0x34, 0 }, { 0xe0, 0xb4, 0 } }, { { 0xe0, 0x35, 0 }, { 0xe0, 0xb5, 0 } }, /* 134 */ - { { 0 }, { 0 } }, { { 0xe0, 0x37, 0 }, { 0xe0, 0xb7, 0 } }, /* 136 */ - { { 0xe0, 0x38, 0 }, { 0xe0, 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ - { { 0xe0, 0x3a, 0 }, { 0xe0, 0xba, 0 } }, { { 0xe0, 0x3b, 0 }, { 0xe0, 0xbb, 0 } }, /* 13a */ - { { 0xe0, 0x3c, 0 }, { 0xe0, 0xbc, 0 } }, { { 0xe0, 0x3d, 0 }, { 0xe0, 0xbd, 0 } }, /* 13c */ - { { 0xe0, 0x3e, 0 }, { 0xe0, 0xbe, 0 } }, { { 0xe0, 0x3f, 0 }, { 0xe0, 0xbf, 0 } }, /* 13e */ - { { 0xe0, 0x40, 0 }, { 0xe0, 0xc0, 0 } }, { { 0xe0, 0x41, 0 }, { 0xe0, 0xc1, 0 } }, /* 140 */ - { { 0xe0, 0x42, 0 }, { 0xe0, 0xc2, 0 } }, { { 0xe0, 0x43, 0 }, { 0xe0, 0xc3, 0 } }, /* 142 */ - { { 0xe0, 0x44, 0 }, { 0xe0, 0xc4, 0 } }, { { 0 }, { 0 } }, /* 144 */ - { { 0xe0, 0x46, 0 }, { 0xe0, 0xc6, 0 } }, { { 0xe0, 0x47, 0 }, { 0xe0, 0xc7, 0 } }, /* 146 */ - { { 0xe0, 0x48, 0 }, { 0xe0, 0xc8, 0 } }, { { 0xe0, 0x49, 0 }, { 0xe0, 0xc9, 0 } }, /* 148 */ - { { 0 }, { 0 } }, { { 0xe0, 0x4b, 0 }, { 0xe0, 0xcb, 0 } }, /* 14a */ - { { 0xe0, 0x4c, 0 }, { 0xe0, 0xcc, 0 } }, { { 0xe0, 0x4d, 0 }, { 0xe0, 0xcd, 0 } }, /* 14c */ - { { 0xe0, 0x4e, 0 }, { 0xe0, 0xce, 0 } }, { { 0xe0, 0x4f, 0 }, { 0xe0, 0xcf, 0 } }, /* 14e */ - { { 0xe0, 0x50, 0 }, { 0xe0, 0xd0, 0 } }, { { 0xe0, 0x51, 0 }, { 0xe0, 0xd1, 0 } }, /* 150 */ - { { 0xe0, 0x52, 0 }, { 0xe0, 0xd2, 0 } }, { { 0xe0, 0x53, 0 }, { 0xe0, 0xd3, 0 } }, /* 152 */ - { { 0 }, { 0 } }, { { 0xe0, 0x55, 0 }, { 0xe0, 0xd5, 0 } }, /* 154 */ - { { 0 }, { 0 } }, { { 0xe0, 0x57, 0 }, { 0xe0, 0xd7, 0 } }, /* 156 */ - { { 0xe0, 0x58, 0 }, { 0xe0, 0xd8, 0 } }, { { 0xe0, 0x59, 0 }, { 0xe0, 0xd9, 0 } }, /* 158 */ - { { 0xe0, 0x5a, 0 }, { 0xe0, 0xaa, 0 } }, { { 0xe0, 0x5b, 0 }, { 0xe0, 0xdb, 0 } }, /* 15a */ - { { 0xe0, 0x5c, 0 }, { 0xe0, 0xdc, 0 } }, { { 0xe0, 0x5d, 0 }, { 0xe0, 0xdd, 0 } }, /* 15c */ - { { 0xe0, 0x5e, 0 }, { 0xe0, 0xee, 0 } }, { { 0xe0, 0x5f, 0 }, { 0xe0, 0xdf, 0 } }, /* 15e */ - { { 0 }, { 0 } }, { { 0xe0, 0x61, 0 }, { 0xe0, 0xe1, 0 } }, /* 160 */ - { { 0xe0, 0x62, 0 }, { 0xe0, 0xe2, 0 } }, { { 0xe0, 0x63, 0 }, { 0xe0, 0xe3, 0 } }, /* 162 */ - { { 0xe0, 0x64, 0 }, { 0xe0, 0xe4, 0 } }, { { 0xe0, 0x65, 0 }, { 0xe0, 0xe5, 0 } }, /* 164 */ - { { 0xe0, 0x66, 0 }, { 0xe0, 0xe6, 0 } }, { { 0xe0, 0x67, 0 }, { 0xe0, 0xe7, 0 } }, /* 166 */ - { { 0xe0, 0x68, 0 }, { 0xe0, 0xe8, 0 } }, { { 0xe0, 0x69, 0 }, { 0xe0, 0xe9, 0 } }, /* 168 */ - { { 0xe0, 0x6a, 0 }, { 0xe0, 0xea, 0 } }, { { 0xe0, 0x6b, 0 }, { 0xe0, 0xeb, 0 } }, /* 16a */ - { { 0xe0, 0x6c, 0 }, { 0xe0, 0xec, 0 } }, { { 0xe0, 0x6d, 0 }, { 0xe0, 0xed, 0 } }, /* 16c */ - { { 0xe0, 0x6e, 0 }, { 0xe0, 0xee, 0 } }, { { 0 }, { 0 } }, /* 16e */ - { { 0xe0, 0x70, 0 }, { 0xe0, 0xf0, 0 } }, { { 0xe0, 0x71, 0 }, { 0xe0, 0xf1, 0 } }, /* 170 */ - { { 0xe0, 0x72, 0 }, { 0xe0, 0xf2, 0 } }, { { 0xe0, 0x73, 0 }, { 0xe0, 0xf3, 0 } }, /* 172 */ - { { 0xe0, 0x74, 0 }, { 0xe0, 0xf4, 0 } }, { { 0xe0, 0x75, 0 }, { 0xe0, 0xf5, 0 } }, /* 174 */ - { { 0 }, { 0 } }, { { 0xe0, 0x77, 0 }, { 0xe0, 0xf7, 0 } }, /* 176 */ - { { 0xe0, 0x78, 0 }, { 0xe0, 0xf8, 0 } }, { { 0xe0, 0x79, 0 }, { 0xe0, 0xf9, 0 } }, /* 178 */ - { { 0xe0, 0x7a, 0 }, { 0xe0, 0xfa, 0 } }, { { 0xe0, 0x7b, 0 }, { 0xe0, 0xfb, 0 } }, /* 17a */ - { { 0xe0, 0x7c, 0 }, { 0xe0, 0xfc, 0 } }, { { 0xe0, 0x7d, 0 }, { 0xe0, 0xfd, 0 } }, /* 17c */ - { { 0xe0, 0x7e, 0 }, { 0xe0, 0xfe, 0 } }, { { 0xe0, 0x7f, 0 }, { 0xe0, 0xff, 0 } }, /* 17e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, { { 0xe0, 0xe1, 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ - { { 0xe0, 0xee, 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, { { 0xe0, 0xf1, 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ - { { 0xe0, 0xfe, 0 }, { 0 } }, { { 0xe0, 0xff, 0 }, { 0 } } /* 1fe */ + { { 0 }, { 0 } }, /* 000 */ + { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ + { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ + { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ + { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ + { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ + { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ + { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ + { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ + { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ + { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ + { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ + { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ + { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ + { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ + { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ + { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ + { { 0x12, 0 }, { 0x92, 0 } }, /* 012 */ + { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ + { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ + { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ + { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ + { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ + { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ + { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ + { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ + { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ + { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ + { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ + { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ + { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ + { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ + { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ + { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ + { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ + { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ + { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ + { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ + { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ + { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ + { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ + { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ + { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ + { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ + { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ + { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ + { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ + { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ + { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ + { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ + { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ + { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ + { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ + { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ + { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ + { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ + { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ + { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ + { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ + { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ + { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ + { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ + { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ + { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ + { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ + { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ + { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ + { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ + { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ + { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ + { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ + { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ + { { 0x54, 0 }, { 0xd4, 0 } }, /* 054 */ + { { 0x55, 0 }, { 0xd5, 0 } }, /* 055 */ + { { 0x56, 0 }, { 0xd6, 0 } }, /* 056 */ + { { 0x57, 0 }, { 0xd7, 0 } }, /* 057 */ + { { 0x58, 0 }, { 0xd8, 0 } }, /* 058 */ + { { 0x59, 0 }, { 0xd9, 0 } }, /* 059 */ + { { 0x5a, 0 }, { 0xda, 0 } }, /* 05a */ + { { 0x5b, 0 }, { 0xdb, 0 } }, /* 05b */ + { { 0x5c, 0 }, { 0xdc, 0 } }, /* 05c */ + { { 0x5d, 0 }, { 0xdd, 0 } }, /* 05d */ + { { 0x5e, 0 }, { 0xde, 0 } }, /* 05e */ + { { 0x5f, 0 }, { 0xdf, 0 } }, /* 05f */ + { { 0x60, 0 }, { 0xe0, 0 } }, /* 060 */ + { { 0x61, 0 }, { 0xe1, 0 } }, /* 061 */ + { { 0x62, 0 }, { 0xe2, 0 } }, /* 062 */ + { { 0x63, 0 }, { 0xe3, 0 } }, /* 063 */ + { { 0x64, 0 }, { 0xe4, 0 } }, /* 064 */ + { { 0x65, 0 }, { 0xe5, 0 } }, /* 065 */ + { { 0x66, 0 }, { 0xe6, 0 } }, /* 066 */ + { { 0x67, 0 }, { 0xe7, 0 } }, /* 067 */ + { { 0x68, 0 }, { 0xe8, 0 } }, /* 068 */ + { { 0x69, 0 }, { 0xe9, 0 } }, /* 069 */ + { { 0x6a, 0 }, { 0xea, 0 } }, /* 06a */ + { { 0x6b, 0 }, { 0xeb, 0 } }, /* 06b */ + { { 0x6c, 0 }, { 0xec, 0 } }, /* 06c */ + { { 0x6d, 0 }, { 0xed, 0 } }, /* 06d */ + { { 0x6e, 0 }, { 0xee, 0 } }, /* 06e */ + { { 0x6f, 0 }, { 0xef, 0 } }, /* 06f */ + { { 0x70, 0 }, { 0xf0, 0 } }, /* 070 */ + { { 0x71, 0 }, { 0xf1, 0 } }, /* 071 */ + { { 0x72, 0 }, { 0xf2, 0 } }, /* 072 */ + { { 0x73, 0 }, { 0xf3, 0 } }, /* 073 */ + { { 0x74, 0 }, { 0xf4, 0 } }, /* 074 */ + { { 0x75, 0 }, { 0xf5, 0 } }, /* 075 */ + { { 0x76, 0 }, { 0xf6, 0 } }, /* 076 */ + { { 0x77, 0 }, { 0xf7, 0 } }, /* 077 */ + { { 0x78, 0 }, { 0xf8, 0 } }, /* 078 */ + { { 0x79, 0 }, { 0xf9, 0 } }, /* 079 */ + { { 0x7a, 0 }, { 0xfa, 0 } }, /* 07a */ + { { 0x7b, 0 }, { 0xfb, 0 } }, /* 07b */ + { { 0x7c, 0 }, { 0xfc, 0 } }, /* 07c */ + { { 0x7d, 0 }, { 0xfd, 0 } }, /* 07d */ + { { 0x7e, 0 }, { 0xfe, 0 } }, /* 07e */ + { { 0x7f, 0 }, { 0xff, 0 } }, /* 07f */ + { { 0x80, 0 }, { 0 } }, /* 080 */ + { { 0x81, 0 }, { 0 } }, /* 081 */ + { { 0x82, 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, /* 083 */ + { { 0 }, { 0 } }, /* 084 */ + { { 0x85, 0 }, { 0 } }, /* 085 */ + { { 0x86, 0 }, { 0 } }, /* 086 */ + { { 0x87, 0 }, { 0 } }, /* 087 */ + { { 0x88, 0 }, { 0 } }, /* 088 */ + { { 0x89, 0 }, { 0 } }, /* 089 */ + { { 0x8a, 0 }, { 0 } }, /* 08a */ + { { 0x8b, 0 }, { 0 } }, /* 08b */ + { { 0x8c, 0 }, { 0 } }, /* 08c */ + { { 0x8d, 0 }, { 0 } }, /* 08d */ + { { 0x8e, 0 }, { 0 } }, /* 08e */ + { { 0x8f, 0 }, { 0 } }, /* 08f */ + { { 0x90, 0 }, { 0 } }, /* 090 */ + { { 0x91, 0 }, { 0 } }, /* 091 */ + { { 0x92, 0 }, { 0 } }, /* 092 */ + { { 0x93, 0 }, { 0 } }, /* 093 */ + { { 0x94, 0 }, { 0 } }, /* 094 */ + { { 0x95, 0 }, { 0 } }, /* 095 */ + { { 0x96, 0 }, { 0 } }, /* 096 */ + { { 0x97, 0 }, { 0 } }, /* 097 */ + { { 0x98, 0 }, { 0 } }, /* 098 */ + { { 0x99, 0 }, { 0 } }, /* 099 */ + { { 0x9a, 0 }, { 0 } }, /* 09a */ + { { 0x9b, 0 }, { 0 } }, /* 09b */ + { { 0x9c, 0 }, { 0 } }, /* 09c */ + { { 0x9d, 0 }, { 0 } }, /* 09d */ + { { 0x9e, 0 }, { 0 } }, /* 09e */ + { { 0x9f, 0 }, { 0 } }, /* 09f */ + { { 0xa0, 0 }, { 0 } }, /* 0a0 */ + { { 0xa1, 0 }, { 0 } }, /* 0a1 */ + { { 0xa2, 0 }, { 0 } }, /* 0a2 */ + { { 0xa3, 0 }, { 0 } }, /* 0a3 */ + { { 0xa4, 0 }, { 0 } }, /* 0a4 */ + { { 0xa5, 0 }, { 0 } }, /* 0a5 */ + { { 0xa6, 0 }, { 0 } }, /* 0a6 */ + { { 0xa7, 0 }, { 0 } }, /* 0a7 */ + { { 0xa8, 0 }, { 0 } }, /* 0a8 */ + { { 0xa9, 0 }, { 0 } }, /* 0a9 */ + { { 0xaa, 0 }, { 0 } }, /* 0aa */ + { { 0xab, 0 }, { 0 } }, /* 0ab */ + { { 0xac, 0 }, { 0 } }, /* 0ac */ + { { 0xad, 0 }, { 0 } }, /* 0ad */ + { { 0xae, 0 }, { 0 } }, /* 0ae */ + { { 0xaf, 0 }, { 0 } }, /* 0af */ + { { 0xb0, 0 }, { 0 } }, /* 0b0 */ + { { 0xb1, 0 }, { 0 } }, /* 0b1 */ + { { 0xb2, 0 }, { 0 } }, /* 0b2 */ + { { 0xb3, 0 }, { 0 } }, /* 0b3 */ + { { 0xb4, 0 }, { 0 } }, /* 0b4 */ + { { 0xb5, 0 }, { 0 } }, /* 0b5 */ + { { 0xb6, 0 }, { 0 } }, /* 0b6 */ + { { 0xb7, 0 }, { 0 } }, /* 0b7 */ + { { 0xb8, 0 }, { 0 } }, /* 0b8 */ + { { 0xb9, 0 }, { 0 } }, /* 0b9 */ + { { 0xba, 0 }, { 0 } }, /* 0ba */ + { { 0xbb, 0 }, { 0 } }, /* 0bb */ + { { 0xbc, 0 }, { 0 } }, /* 0bc */ + { { 0xbd, 0 }, { 0 } }, /* 0bd */ + { { 0xbe, 0 }, { 0 } }, /* 0be */ + { { 0xbf, 0 }, { 0 } }, /* 0bf */ + { { 0xc0, 0 }, { 0 } }, /* 0c0 */ + { { 0xc1, 0 }, { 0 } }, /* 0c1 */ + { { 0xc2, 0 }, { 0 } }, /* 0c2 */ + { { 0xc3, 0 }, { 0 } }, /* 0c3 */ + { { 0xc4, 0 }, { 0 } }, /* 0c4 */ + { { 0xc5, 0 }, { 0 } }, /* 0c5 */ + { { 0xc6, 0 }, { 0 } }, /* 0c6 */ + { { 0xc7, 0 }, { 0 } }, /* 0c7 */ + { { 0xc8, 0 }, { 0 } }, /* 0c8 */ + { { 0xc9, 0 }, { 0 } }, /* 0c9 */ + { { 0xca, 0 }, { 0 } }, /* 0ca */ + { { 0xcb, 0 }, { 0 } }, /* 0cb */ + { { 0xcc, 0 }, { 0 } }, /* 0cc */ + { { 0xcd, 0 }, { 0 } }, /* 0cd */ + { { 0xce, 0 }, { 0 } }, /* 0ce */ + { { 0xcf, 0 }, { 0 } }, /* 0cf */ + { { 0xd0, 0 }, { 0 } }, /* 0d0 */ + { { 0xd1, 0 }, { 0 } }, /* 0d1 */ + { { 0xd2, 0 }, { 0 } }, /* 0d2 */ + { { 0xd3, 0 }, { 0 } }, /* 0d3 */ + { { 0xd4, 0 }, { 0 } }, /* 0d4 */ + { { 0xd5, 0 }, { 0 } }, /* 0d5 */ + { { 0xd6, 0 }, { 0 } }, /* 0d6 */ + { { 0xd7, 0 }, { 0 } }, /* 0d7 */ + { { 0xd8, 0 }, { 0 } }, /* 0d8 */ + { { 0xd9, 0 }, { 0 } }, /* 0d9 */ + { { 0xda, 0 }, { 0 } }, /* 0da */ + { { 0xdb, 0 }, { 0 } }, /* 0db */ + { { 0xdc, 0 }, { 0 } }, /* 0dc */ + { { 0xdd, 0 }, { 0 } }, /* 0dd */ + { { 0xde, 0 }, { 0 } }, /* 0de */ + { { 0xdf, 0 }, { 0 } }, /* 0df */ + { { 0xe0, 0 }, { 0 } }, /* 0e0 */ + { { 0xe1, 0 }, { 0 } }, /* 0e1 */ + { { 0xe2, 0 }, { 0 } }, /* 0e2 */ + { { 0xe3, 0 }, { 0 } }, /* 0e3 */ + { { 0xe4, 0 }, { 0 } }, /* 0e4 */ + { { 0xe5, 0 }, { 0 } }, /* 0e5 */ + { { 0xe6, 0 }, { 0 } }, /* 0e6 */ + { { 0xe7, 0 }, { 0 } }, /* 0e7 */ + { { 0xe8, 0 }, { 0 } }, /* 0e8 */ + { { 0xe9, 0 }, { 0 } }, /* 0e9 */ + { { 0xea, 0 }, { 0 } }, /* 0ea */ + { { 0xeb, 0 }, { 0 } }, /* 0eb */ + { { 0xec, 0 }, { 0 } }, /* 0ec */ + { { 0xed, 0 }, { 0 } }, /* 0ed */ + { { 0xee, 0 }, { 0 } }, /* 0ee */ + { { 0xef, 0 }, { 0 } }, /* 0ef */ + { { 0 }, { 0 } }, /* 0f0 */ + { { 0xf1, 0 }, { 0 } }, /* 0f1 */ + { { 0xf2, 0 }, { 0 } }, /* 0f2 */ + { { 0xf3, 0 }, { 0 } }, /* 0f3 */ + { { 0xf4, 0 }, { 0 } }, /* 0f4 */ + { { 0xf5, 0 }, { 0 } }, /* 0f5 */ + { { 0xf6, 0 }, { 0 } }, /* 0f6 */ + { { 0xf7, 0 }, { 0 } }, /* 0f7 */ + { { 0xf8, 0 }, { 0 } }, /* 0f8 */ + { { 0xf9, 0 }, { 0 } }, /* 0f9 */ + { { 0xfa, 0 }, { 0 } }, /* 0fa */ + { { 0xfb, 0 }, { 0 } }, /* 0fb */ + { { 0xfc, 0 }, { 0 } }, /* 0fc */ + { { 0xfd, 0 }, { 0 } }, /* 0fd */ + { { 0xfe, 0 }, { 0 } }, /* 0fe */ + { { 0xff, 0 }, { 0 } }, /* 0ff */ + { { 0xe1, 0x1d, 0 }, { 0xe1, 0x9d, 0 } }, /* 100 */ + { { 0xe0, 0x01, 0 }, { 0xe0, 0x81, 0 } }, /* 101 */ + { { 0xe0, 0x02, 0 }, { 0xe0, 0x82, 0 } }, /* 102 */ + { { 0xe0, 0x03, 0 }, { 0xe0, 0x83, 0 } }, /* 103 */ + { { 0xe0, 0x04, 0 }, { 0xe0, 0x84, 0 } }, /* 104 */ + { { 0xe0, 0x05, 0 }, { 0xe0, 0x85, 0 } }, /* 105 */ + { { 0xe0, 0x06, 0 }, { 0xe0, 0x86, 0 } }, /* 106 */ + { { 0xe0, 0x07, 0 }, { 0xe0, 0x87, 0 } }, /* 107 */ + { { 0xe0, 0x08, 0 }, { 0xe0, 0x88, 0 } }, /* 108 */ + { { 0xe0, 0x09, 0 }, { 0xe0, 0x89, 0 } }, /* 109 */ + { { 0xe0, 0x0a, 0 }, { 0xe0, 0x8a, 0 } }, /* 10a */ + { { 0xe0, 0x0b, 0 }, { 0xe0, 0x8b, 0 } }, /* 10b */ + { { 0xe0, 0x0c, 0 }, { 0xe0, 0x8c, 0 } }, /* 10c */ + { { 0 }, { 0 } }, /* 10d */ + { { 0xe0, 0x0e, 0 }, { 0xe0, 0x8e, 0 } }, /* 10e */ + { { 0xe0, 0x0f, 0 }, { 0xe0, 0x8f, 0 } }, /* 10f */ + { { 0xe0, 0x10, 0 }, { 0xe0, 0x90, 0 } }, /* 110 */ + { { 0xe0, 0x11, 0 }, { 0xe0, 0x91, 0 } }, /* 111 */ + { { 0xe0, 0x12, 0 }, { 0xe0, 0x92, 0 } }, /* 112 */ + { { 0xe0, 0x13, 0 }, { 0xe0, 0x93, 0 } }, /* 113 */ + { { 0xe0, 0x14, 0 }, { 0xe0, 0x94, 0 } }, /* 114 */ + { { 0xe0, 0x15, 0 }, { 0xe0, 0x95, 0 } }, /* 115 */ + { { 0xe0, 0x16, 0 }, { 0xe0, 0x96, 0 } }, /* 116 */ + { { 0xe0, 0x17, 0 }, { 0xe0, 0x97, 0 } }, /* 117 */ + { { 0xe0, 0x18, 0 }, { 0xe0, 0x98, 0 } }, /* 118 */ + { { 0xe0, 0x19, 0 }, { 0xe0, 0x99, 0 } }, /* 119 */ + { { 0xe0, 0x1a, 0 }, { 0xe0, 0x9a, 0 } }, /* 11a */ + { { 0xe0, 0x1b, 0 }, { 0xe0, 0x9b, 0 } }, /* 11b */ + { { 0xe0, 0x1c, 0 }, { 0xe0, 0x9c, 0 } }, /* 11c */ + { { 0xe0, 0x1d, 0 }, { 0xe0, 0x9d, 0 } }, /* 11d */ + { { 0xe0, 0x1e, 0 }, { 0xe0, 0x9e, 0 } }, /* 11e */ + { { 0xe0, 0x1f, 0 }, { 0xe0, 0x9f, 0 } }, /* 11f */ + { { 0xe0, 0x20, 0 }, { 0xe0, 0xa0, 0 } }, /* 120 */ + { { 0xe0, 0x21, 0 }, { 0xe0, 0xa1, 0 } }, /* 121 */ + { { 0xe0, 0x22, 0 }, { 0xe0, 0xa2, 0 } }, /* 122 */ + { { 0xe0, 0x23, 0 }, { 0xe0, 0xa3, 0 } }, /* 123 */ + { { 0xe0, 0x24, 0 }, { 0xe0, 0xa4, 0 } }, /* 124 */ + { { 0xe0, 0x25, 0 }, { 0xe0, 0xa5, 0 } }, /* 125 */ + { { 0xe0, 0x26, 0 }, { 0xe0, 0xa6, 0 } }, /* 126 */ + { { 0 }, { 0 } }, /* 127 */ + { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, /* 129 */ + { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, /* 12b */ + { { 0xe0, 0x2c, 0 }, { 0xe0, 0xac, 0 } }, /* 12c */ + { { 0xe0, 0x2d, 0 }, { 0xe0, 0xad, 0 } }, /* 12d */ + { { 0xe0, 0x2e, 0 }, { 0xe0, 0xae, 0 } }, /* 12e */ + { { 0xe0, 0x2f, 0 }, { 0xe0, 0xaf, 0 } }, /* 12f */ + { { 0xe0, 0x30, 0 }, { 0xe0, 0xb0, 0 } }, /* 130 */ + { { 0xe0, 0x31, 0 }, { 0xe0, 0xb1, 0 } }, /* 131 */ + { { 0xe0, 0x32, 0 }, { 0xe0, 0xb2, 0 } }, /* 132 */ + { { 0 }, { 0 } }, /* 133 */ + { { 0xe0, 0x34, 0 }, { 0xe0, 0xb4, 0 } }, /* 134 */ + { { 0xe0, 0x35, 0 }, { 0xe0, 0xb5, 0 } }, /* 135 */ + { { 0 }, { 0 } }, /* 136 */ + { { 0xe0, 0x37, 0 }, { 0xe0, 0xb7, 0 } }, /* 137 */ + { { 0xe0, 0x38, 0 }, { 0xe0, 0xb8, 0 } }, /* 138 */ + { { 0 }, { 0 } }, /* 139 */ + { { 0xe0, 0x3a, 0 }, { 0xe0, 0xba, 0 } }, /* 13a */ + { { 0xe0, 0x3b, 0 }, { 0xe0, 0xbb, 0 } }, /* 13b */ + { { 0xe0, 0x3c, 0 }, { 0xe0, 0xbc, 0 } }, /* 13c */ + { { 0xe0, 0x3d, 0 }, { 0xe0, 0xbd, 0 } }, /* 13d */ + { { 0xe0, 0x3e, 0 }, { 0xe0, 0xbe, 0 } }, /* 13e */ + { { 0xe0, 0x3f, 0 }, { 0xe0, 0xbf, 0 } }, /* 13f */ + { { 0xe0, 0x40, 0 }, { 0xe0, 0xc0, 0 } }, /* 140 */ + { { 0xe0, 0x41, 0 }, { 0xe0, 0xc1, 0 } }, /* 141 */ + { { 0xe0, 0x42, 0 }, { 0xe0, 0xc2, 0 } }, /* 142 */ + { { 0xe0, 0x43, 0 }, { 0xe0, 0xc3, 0 } }, /* 143 */ + { { 0xe0, 0x44, 0 }, { 0xe0, 0xc4, 0 } }, /* 144 */ + { { 0 }, { 0 } }, /* 145 */ + { { 0xe0, 0x46, 0 }, { 0xe0, 0xc6, 0 } }, /* 146 */ + { { 0xe0, 0x47, 0 }, { 0xe0, 0xc7, 0 } }, /* 147 */ + { { 0xe0, 0x48, 0 }, { 0xe0, 0xc8, 0 } }, /* 148 */ + { { 0xe0, 0x49, 0 }, { 0xe0, 0xc9, 0 } }, /* 149 */ + { { 0 }, { 0 } }, /* 14a */ + { { 0xe0, 0x4b, 0 }, { 0xe0, 0xcb, 0 } }, /* 14b */ + { { 0xe0, 0x4c, 0 }, { 0xe0, 0xcc, 0 } }, /* 14c */ + { { 0xe0, 0x4d, 0 }, { 0xe0, 0xcd, 0 } }, /* 14d */ + { { 0xe0, 0x4e, 0 }, { 0xe0, 0xce, 0 } }, /* 14e */ + { { 0xe0, 0x4f, 0 }, { 0xe0, 0xcf, 0 } }, /* 14f */ + { { 0xe0, 0x50, 0 }, { 0xe0, 0xd0, 0 } }, /* 150 */ + { { 0xe0, 0x51, 0 }, { 0xe0, 0xd1, 0 } }, /* 151 */ + { { 0xe0, 0x52, 0 }, { 0xe0, 0xd2, 0 } }, /* 152 */ + { { 0xe0, 0x53, 0 }, { 0xe0, 0xd3, 0 } }, /* 153 */ + { { 0 }, { 0 } }, /* 154 */ + { { 0xe0, 0x55, 0 }, { 0xe0, 0xd5, 0 } }, /* 155 */ + { { 0 }, { 0 } }, /* 156 */ + { { 0xe0, 0x57, 0 }, { 0xe0, 0xd7, 0 } }, /* 157 */ + { { 0xe0, 0x58, 0 }, { 0xe0, 0xd8, 0 } }, /* 158 */ + { { 0xe0, 0x59, 0 }, { 0xe0, 0xd9, 0 } }, /* 159 */ + { { 0xe0, 0x5a, 0 }, { 0xe0, 0xaa, 0 } }, /* 15a */ + { { 0xe0, 0x5b, 0 }, { 0xe0, 0xdb, 0 } }, /* 15b */ + { { 0xe0, 0x5c, 0 }, { 0xe0, 0xdc, 0 } }, /* 15c */ + { { 0xe0, 0x5d, 0 }, { 0xe0, 0xdd, 0 } }, /* 15d */ + { { 0xe0, 0x5e, 0 }, { 0xe0, 0xee, 0 } }, /* 15e */ + { { 0xe0, 0x5f, 0 }, { 0xe0, 0xdf, 0 } }, /* 15f */ + { { 0 }, { 0 } }, /* 160 */ + { { 0xe0, 0x61, 0 }, { 0xe0, 0xe1, 0 } }, /* 161 */ + { { 0xe0, 0x62, 0 }, { 0xe0, 0xe2, 0 } }, /* 162 */ + { { 0xe0, 0x63, 0 }, { 0xe0, 0xe3, 0 } }, /* 163 */ + { { 0xe0, 0x64, 0 }, { 0xe0, 0xe4, 0 } }, /* 164 */ + { { 0xe0, 0x65, 0 }, { 0xe0, 0xe5, 0 } }, /* 165 */ + { { 0xe0, 0x66, 0 }, { 0xe0, 0xe6, 0 } }, /* 166 */ + { { 0xe0, 0x67, 0 }, { 0xe0, 0xe7, 0 } }, /* 167 */ + { { 0xe0, 0x68, 0 }, { 0xe0, 0xe8, 0 } }, /* 168 */ + { { 0xe0, 0x69, 0 }, { 0xe0, 0xe9, 0 } }, /* 169 */ + { { 0xe0, 0x6a, 0 }, { 0xe0, 0xea, 0 } }, /* 16a */ + { { 0xe0, 0x6b, 0 }, { 0xe0, 0xeb, 0 } }, /* 16b */ + { { 0xe0, 0x6c, 0 }, { 0xe0, 0xec, 0 } }, /* 16c */ + { { 0xe0, 0x6d, 0 }, { 0xe0, 0xed, 0 } }, /* 16d */ + { { 0xe0, 0x6e, 0 }, { 0xe0, 0xee, 0 } }, /* 16e */ + { { 0 }, { 0 } }, /* 16f */ + { { 0xe0, 0x70, 0 }, { 0xe0, 0xf0, 0 } }, /* 170 */ + { { 0xe0, 0x71, 0 }, { 0xe0, 0xf1, 0 } }, /* 171 */ + { { 0xe0, 0x72, 0 }, { 0xe0, 0xf2, 0 } }, /* 172 */ + { { 0xe0, 0x73, 0 }, { 0xe0, 0xf3, 0 } }, /* 173 */ + { { 0xe0, 0x74, 0 }, { 0xe0, 0xf4, 0 } }, /* 174 */ + { { 0xe0, 0x75, 0 }, { 0xe0, 0xf5, 0 } }, /* 175 */ + { { 0 }, { 0 } }, /* 176 */ + { { 0xe0, 0x77, 0 }, { 0xe0, 0xf7, 0 } }, /* 177 */ + { { 0xe0, 0x78, 0 }, { 0xe0, 0xf8, 0 } }, /* 178 */ + { { 0xe0, 0x79, 0 }, { 0xe0, 0xf9, 0 } }, /* 179 */ + { { 0xe0, 0x7a, 0 }, { 0xe0, 0xfa, 0 } }, /* 17a */ + { { 0xe0, 0x7b, 0 }, { 0xe0, 0xfb, 0 } }, /* 17b */ + { { 0xe0, 0x7c, 0 }, { 0xe0, 0xfc, 0 } }, /* 17c */ + { { 0xe0, 0x7d, 0 }, { 0xe0, 0xfd, 0 } }, /* 17d */ + { { 0xe0, 0x7e, 0 }, { 0xe0, 0xfe, 0 } }, /* 17e */ + { { 0xe0, 0x7f, 0 }, { 0xe0, 0xff, 0 } }, /* 17f */ + { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, /* 181 */ + { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, /* 183 */ + { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, /* 185 */ + { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, /* 187 */ + { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, /* 189 */ + { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, /* 18b */ + { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, /* 18d */ + { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, /* 18f */ + { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, /* 191 */ + { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, /* 193 */ + { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, /* 195 */ + { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, /* 197 */ + { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, /* 199 */ + { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, /* 19b */ + { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, /* 19d */ + { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, /* 19f */ + { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, /* 1a1 */ + { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, /* 1a3 */ + { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, /* 1a5 */ + { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, /* 1a7 */ + { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, /* 1a9 */ + { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, /* 1ab */ + { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, /* 1ad */ + { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, /* 1c1 */ + { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, /* 1c3 */ + { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, /* 1c5 */ + { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, /* 1c7 */ + { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, /* 1c9 */ + { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, /* 1cb */ + { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, /* 1cd */ + { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, /* 1cf */ + { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, /* 1d1 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, /* 1d5 */ + { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, /* 1d7 */ + { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, /* 1d9 */ + { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, /* 1db */ + { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, /* 1dd */ + { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, /* 1df */ + { { 0 }, { 0 } }, /* 1e0 */ + { { 0xe0, 0xe1, 0 }, { 0 } }, /* 1e1 */ + { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, /* 1e3 */ + { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, /* 1e5 */ + { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, /* 1e7 */ + { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, /* 1e9 */ + { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, /* 1eb */ + { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, /* 1ed */ + { { 0xe0, 0xee, 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, /* 1ef */ + { { 0 }, { 0 } }, /* 1f0 */ + { { 0xe0, 0xf1, 0 }, { 0 } }, /* 1f1 */ + { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, /* 1f3 */ + { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, /* 1f5 */ + { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, /* 1f7 */ + { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, /* 1f9 */ + { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, /* 1fb */ + { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, /* 1fd */ + { { 0xe0, 0xfe, 0 }, { 0 } }, /* 1fe */ + { { 0xe0, 0xff, 0 }, { 0 } } /* 1ff */ // clang-format on }; static const scancode scancode_set2[512] = { // clang-format off - { { 0 }, { 0 } }, { { 0x76, 0 }, { 0xF0, 0x76, 0 } }, /* 000 */ - { { 0x16, 0 }, { 0xF0, 0x16, 0 } }, { { 0x1E, 0 }, { 0xF0, 0x1E, 0 } }, /* 002 */ - { { 0x26, 0 }, { 0xF0, 0x26, 0 } }, { { 0x25, 0 }, { 0xF0, 0x25, 0 } }, - { { 0x2E, 0 }, { 0xF0, 0x2E, 0 } }, { { 0x36, 0 }, { 0xF0, 0x36, 0 } }, /* 004 */ - { { 0x3D, 0 }, { 0xF0, 0x3D, 0 } }, { { 0x3E, 0 }, { 0xF0, 0x3E, 0 } }, - { { 0x46, 0 }, { 0xF0, 0x46, 0 } }, { { 0x45, 0 }, { 0xF0, 0x45, 0 } }, /* 008 */ - { { 0x4E, 0 }, { 0xF0, 0x4E, 0 } }, { { 0x55, 0 }, { 0xF0, 0x55, 0 } }, - { { 0x66, 0 }, { 0xF0, 0x66, 0 } }, { { 0x0D, 0 }, { 0xF0, 0x0D, 0 } }, /* 00c */ - { { 0x15, 0 }, { 0xF0, 0x15, 0 } }, { { 0x1D, 0 }, { 0xF0, 0x1D, 0 } }, - { { 0x24, 0 }, { 0xF0, 0x24, 0 } }, { { 0x2D, 0 }, { 0xF0, 0x2D, 0 } }, /* 010 */ - { { 0x2C, 0 }, { 0xF0, 0x2C, 0 } }, { { 0x35, 0 }, { 0xF0, 0x35, 0 } }, - { { 0x3C, 0 }, { 0xF0, 0x3C, 0 } }, { { 0x43, 0 }, { 0xF0, 0x43, 0 } }, /* 014 */ - { { 0x44, 0 }, { 0xF0, 0x44, 0 } }, { { 0x4D, 0 }, { 0xF0, 0x4D, 0 } }, - { { 0x54, 0 }, { 0xF0, 0x54, 0 } }, { { 0x5B, 0 }, { 0xF0, 0x5B, 0 } }, /* 018 */ - { { 0x5A, 0 }, { 0xF0, 0x5A, 0 } }, { { 0x14, 0 }, { 0xF0, 0x14, 0 } }, - { { 0x1C, 0 }, { 0xF0, 0x1C, 0 } }, { { 0x1B, 0 }, { 0xF0, 0x1B, 0 } }, /* 01c */ - { { 0x23, 0 }, { 0xF0, 0x23, 0 } }, { { 0x2B, 0 }, { 0xF0, 0x2B, 0 } }, - { { 0x34, 0 }, { 0xF0, 0x34, 0 } }, { { 0x33, 0 }, { 0xF0, 0x33, 0 } }, /* 020 */ - { { 0x3B, 0 }, { 0xF0, 0x3B, 0 } }, { { 0x42, 0 }, { 0xF0, 0x42, 0 } }, - { { 0x4B, 0 }, { 0xF0, 0x4B, 0 } }, { { 0x4C, 0 }, { 0xF0, 0x4C, 0 } }, /* 024 */ - { { 0x52, 0 }, { 0xF0, 0x52, 0 } }, { { 0x0E, 0 }, { 0xF0, 0x0E, 0 } }, - { { 0x12, 0 }, { 0xF0, 0x12, 0 } }, { { 0x5D, 0 }, { 0xF0, 0x5D, 0 } }, /* 028 */ - { { 0x1A, 0 }, { 0xF0, 0x1A, 0 } }, { { 0x22, 0 }, { 0xF0, 0x22, 0 } }, - { { 0x21, 0 }, { 0xF0, 0x21, 0 } }, { { 0x2A, 0 }, { 0xF0, 0x2A, 0 } }, /* 02c */ - { { 0x32, 0 }, { 0xF0, 0x32, 0 } }, { { 0x31, 0 }, { 0xF0, 0x31, 0 } }, - { { 0x3A, 0 }, { 0xF0, 0x3A, 0 } }, { { 0x41, 0 }, { 0xF0, 0x41, 0 } }, /* 030 */ - { { 0x49, 0 }, { 0xF0, 0x49, 0 } }, { { 0x4A, 0 }, { 0xF0, 0x4A, 0 } }, - { { 0x59, 0 }, { 0xF0, 0x59, 0 } }, { { 0x7C, 0 }, { 0xF0, 0x7C, 0 } }, /* 034 */ - { { 0x11, 0 }, { 0xF0, 0x11, 0 } }, { { 0x29, 0 }, { 0xF0, 0x29, 0 } }, - { { 0x58, 0 }, { 0xF0, 0x58, 0 } }, { { 0x05, 0 }, { 0xF0, 0x05, 0 } }, /* 038 */ - { { 0x06, 0 }, { 0xF0, 0x06, 0 } }, { { 0x04, 0 }, { 0xF0, 0x04, 0 } }, - { { 0x0C, 0 }, { 0xF0, 0x0C, 0 } }, { { 0x03, 0 }, { 0xF0, 0x03, 0 } }, /* 03c */ - { { 0x0B, 0 }, { 0xF0, 0x0B, 0 } }, { { 0x83, 0 }, { 0xF0, 0x83, 0 } }, - { { 0x0A, 0 }, { 0xF0, 0x0A, 0 } }, { { 0x01, 0 }, { 0xF0, 0x01, 0 } }, /* 040 */ - { { 0x09, 0 }, { 0xF0, 0x09, 0 } }, { { 0x77, 0 }, { 0xF0, 0x77, 0 } }, - { { 0x7E, 0 }, { 0xF0, 0x7E, 0 } }, { { 0x6C, 0 }, { 0xF0, 0x6C, 0 } }, /* 044 */ - { { 0x75, 0 }, { 0xF0, 0x75, 0 } }, { { 0x7D, 0 }, { 0xF0, 0x7D, 0 } }, - { { 0x7B, 0 }, { 0xF0, 0x7B, 0 } }, { { 0x6B, 0 }, { 0xF0, 0x6B, 0 } }, /* 048 */ - { { 0x73, 0 }, { 0xF0, 0x73, 0 } }, { { 0x74, 0 }, { 0xF0, 0x74, 0 } }, - { { 0x79, 0 }, { 0xF0, 0x79, 0 } }, { { 0x69, 0 }, { 0xF0, 0x69, 0 } }, /* 04c */ - { { 0x72, 0 }, { 0xF0, 0x72, 0 } }, { { 0x7A, 0 }, { 0xF0, 0x7A, 0 } }, - { { 0x70, 0 }, { 0xF0, 0x70, 0 } }, { { 0x71, 0 }, { 0xF0, 0x71, 0 } }, /* 050 */ - { { 0x84, 0 }, { 0xF0, 0x84, 0 } }, { { 0x60, 0 }, { 0xF0, 0x60, 0 } }, - { { 0x61, 0 }, { 0xF0, 0x61, 0 } }, { { 0x78, 0 }, { 0xF0, 0x78, 0 } }, /* 054 */ - { { 0x07, 0 }, { 0xF0, 0x07, 0 } }, { { 0x0F, 0 }, { 0xF0, 0x0F, 0 } }, - { { 0x17, 0 }, { 0xF0, 0x17, 0 } }, { { 0x1F, 0 }, { 0xF0, 0x1F, 0 } }, /* 058 */ - { { 0x27, 0 }, { 0xF0, 0x27, 0 } }, { { 0x2F, 0 }, { 0xF0, 0x2F, 0 } }, - { { 0x37, 0 }, { 0xF0, 0x37, 0 } }, { { 0x3F, 0 }, { 0xF0, 0x3F, 0 } }, /* 05c */ - { { 0x47, 0 }, { 0xF0, 0x47, 0 } }, { { 0x4F, 0 }, { 0xF0, 0x4F, 0 } }, - { { 0x56, 0 }, { 0xF0, 0x56, 0 } }, { { 0x5E, 0 }, { 0xF0, 0x5E, 0 } }, /* 060 */ - { { 0x08, 0 }, { 0xF0, 0x08, 0 } }, { { 0x10, 0 }, { 0xF0, 0x10, 0 } }, - { { 0x18, 0 }, { 0xF0, 0x18, 0 } }, { { 0x20, 0 }, { 0xF0, 0x20, 0 } }, /* 064 */ - { { 0x28, 0 }, { 0xF0, 0x28, 0 } }, { { 0x30, 0 }, { 0xF0, 0x30, 0 } }, - { { 0x38, 0 }, { 0xF0, 0x38, 0 } }, { { 0x40, 0 }, { 0xF0, 0x40, 0 } }, /* 068 */ - { { 0x48, 0 }, { 0xF0, 0x48, 0 } }, { { 0x50, 0 }, { 0xF0, 0x50, 0 } }, - { { 0x57, 0 }, { 0xF0, 0x57, 0 } }, { { 0x6F, 0 }, { 0xF0, 0x6F, 0 } }, /* 06c */ - { { 0x13, 0 }, { 0xF0, 0x13, 0 } }, { { 0x19, 0 }, { 0xF0, 0x19, 0 } }, - { { 0x39, 0 }, { 0xF0, 0x39, 0 } }, { { 0x51, 0 }, { 0xF0, 0x51, 0 } }, /* 070 */ - { { 0x53, 0 }, { 0xF0, 0x53, 0 } }, { { 0x5C, 0 }, { 0xF0, 0x5C, 0 } }, - { { 0x5F, 0 }, { 0xF0, 0x5F, 0 } }, { { 0x62, 0 }, { 0xF0, 0x62, 0 } }, /* 074 */ - { { 0x63, 0 }, { 0xF0, 0x63, 0 } }, { { 0x64, 0 }, { 0xF0, 0x64, 0 } }, - { { 0x65, 0 }, { 0xF0, 0x65, 0 } }, { { 0x67, 0 }, { 0xF0, 0x67, 0 } }, /* 078 */ - { { 0x68, 0 }, { 0xF0, 0x68, 0 } }, { { 0x6A, 0 }, { 0xF0, 0x6A, 0 } }, - { { 0x6D, 0 }, { 0xF0, 0x6D, 0 } }, { { 0x6E, 0 }, { 0xF0, 0x6E, 0 } }, /* 07c */ - - { { 0x80, 0 }, { 0xf0, 0x80, 0 } }, { { 0x81, 0 }, { 0xf0, 0x81, 0 } }, /* 080 */ - { { 0x82, 0 }, { 0xf0, 0x82, 0 } }, { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, { { 0x85, 0 }, { 0xf0, 0x54, 0 } }, - { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 084 */ - { { 0x88, 0 }, { 0xf0, 0x88, 0 } }, { { 0x89, 0 }, { 0xf0, 0x89, 0 } }, - { { 0x8a, 0 }, { 0xf0, 0x8a, 0 } }, { { 0x8b, 0 }, { 0xf0, 0x8b, 0 } }, /* 088 */ - { { 0x8c, 0 }, { 0xf0, 0x8c, 0 } }, { { 0x8d, 0 }, { 0xf0, 0x8d, 0 } }, - { { 0x8e, 0 }, { 0xf0, 0x8e, 0 } }, { { 0x8f, 0 }, { 0xf0, 0x8f, 0 } }, /* 08c */ - { { 0x90, 0 }, { 0xf0, 0x90, 0 } }, { { 0x91, 0 }, { 0xf0, 0x91, 0 } }, - { { 0x92, 0 }, { 0xf0, 0x92, 0 } }, { { 0x93, 0 }, { 0xf0, 0x93, 0 } }, /* 090 */ - { { 0x94, 0 }, { 0xf0, 0x94, 0 } }, { { 0x95, 0 }, { 0xf0, 0x95, 0 } }, - { { 0x96, 0 }, { 0xf0, 0x96, 0 } }, { { 0x97, 0 }, { 0xf0, 0x97, 0 } }, /* 094 */ - { { 0x98, 0 }, { 0xf0, 0x98, 0 } }, { { 0x99, 0 }, { 0xf0, 0x99, 0 } }, - { { 0x9a, 0 }, { 0xf0, 0x9a, 0 } }, { { 0x9b, 0 }, { 0xf0, 0x9b, 0 } }, /* 098 */ - { { 0x9c, 0 }, { 0xf0, 0x9c, 0 } }, { { 0x9d, 0 }, { 0xf0, 0x9d, 0 } }, - { { 0x9e, 0 }, { 0xf0, 0x9e, 0 } }, { { 0x9f, 0 }, { 0xf0, 0x9f, 0 } }, /* 09c */ - { { 0xa0, 0 }, { 0xf0, 0xa0, 0 } }, { { 0xa1, 0 }, { 0xf0, 0xa1, 0 } }, - { { 0xa2, 0 }, { 0xf0, 0xa2, 0 } }, { { 0xa3, 0 }, { 0xf0, 0xa3, 0 } }, /* 0a0 */ - { { 0xa4, 0 }, { 0xf0, 0xa4, 0 } }, { { 0xa5, 0 }, { 0xf0, 0xa5, 0 } }, - { { 0xa6, 0 }, { 0xf0, 0xa6, 0 } }, { { 0xa7, 0 }, { 0xf0, 0xa7, 0 } }, /* 0a4 */ - { { 0xa8, 0 }, { 0xf0, 0xa8, 0 } }, { { 0xa9, 0 }, { 0xf0, 0xa9, 0 } }, - { { 0xaa, 0 }, { 0xf0, 0xaa, 0 } }, { { 0xab, 0 }, { 0xf0, 0xab, 0 } }, /* 0a8 */ - { { 0xac, 0 }, { 0xf0, 0xac, 0 } }, { { 0xad, 0 }, { 0xf0, 0xad, 0 } }, - { { 0xae, 0 }, { 0xf0, 0xae, 0 } }, { { 0xaf, 0 }, { 0xf0, 0xaf, 0 } }, /* 0ac */ - { { 0xb0, 0 }, { 0xf0, 0xb0, 0 } }, { { 0xb1, 0 }, { 0xf0, 0xb1, 0 } }, - { { 0xb2, 0 }, { 0xf0, 0xb2, 0 } }, { { 0xb3, 0 }, { 0xf0, 0xb3, 0 } }, /* 0b0 */ - { { 0xb4, 0 }, { 0xf0, 0xb4, 0 } }, { { 0xb5, 0 }, { 0xf0, 0xb5, 0 } }, - { { 0xb6, 0 }, { 0xf0, 0xb6, 0 } }, { { 0xb7, 0 }, { 0xf0, 0xb7, 0 } }, /* 0b4 */ - { { 0xb8, 0 }, { 0xf0, 0xb8, 0 } }, { { 0xb9, 0 }, { 0xf0, 0xb9, 0 } }, - { { 0xba, 0 }, { 0xf0, 0xba, 0 } }, { { 0xbb, 0 }, { 0xf0, 0xbb, 0 } }, /* 0b8 */ - { { 0xbc, 0 }, { 0xf0, 0xbc, 0 } }, { { 0xbd, 0 }, { 0xf0, 0xbd, 0 } }, - { { 0xbe, 0 }, { 0xf0, 0xbe, 0 } }, { { 0xbf, 0 }, { 0xf0, 0xbf, 0 } }, /* 0bc */ - { { 0xc0, 0 }, { 0xf0, 0xc0, 0 } }, { { 0xc1, 0 }, { 0xf0, 0xc1, 0 } }, - { { 0xc2, 0 }, { 0xf0, 0xc2, 0 } }, { { 0xc3, 0 }, { 0xf0, 0xc3, 0 } }, /* 0c0 */ - { { 0xc4, 0 }, { 0xf0, 0xc4, 0 } }, { { 0xc5, 0 }, { 0xf0, 0xc5, 0 } }, - { { 0xc6, 0 }, { 0xf0, 0xc6, 0 } }, { { 0xc7, 0 }, { 0xf0, 0xc7, 0 } }, /* 0c4 */ - { { 0xc8, 0 }, { 0xf0, 0xc8, 0 } }, { { 0xc9, 0 }, { 0xf0, 0xc9, 0 } }, - { { 0xca, 0 }, { 0xf0, 0xca, 0 } }, { { 0xcb, 0 }, { 0xf0, 0xcb, 0 } }, /* 0c8 */ - { { 0xcc, 0 }, { 0xf0, 0xcc, 0 } }, { { 0xcd, 0 }, { 0xf0, 0xcd, 0 } }, - { { 0xce, 0 }, { 0xf0, 0xce, 0 } }, { { 0xcf, 0 }, { 0xf0, 0xcf, 0 } }, /* 0cc */ - { { 0xd0, 0 }, { 0xf0, 0xd0, 0 } }, { { 0xd1, 0 }, { 0xf0, 0xd0, 0 } }, - { { 0xd2, 0 }, { 0xf0, 0xd2, 0 } }, { { 0xd3, 0 }, { 0xf0, 0xd3, 0 } }, /* 0d0 */ - { { 0xd4, 0 }, { 0xf0, 0xd4, 0 } }, { { 0xd5, 0 }, { 0xf0, 0xd5, 0 } }, - { { 0xd6, 0 }, { 0xf0, 0xd6, 0 } }, { { 0xd7, 0 }, { 0xf0, 0xd7, 0 } }, /* 0d4 */ - { { 0xd8, 0 }, { 0xf0, 0xd8, 0 } }, { { 0xd9, 0 }, { 0xf0, 0xd9, 0 } }, - { { 0xda, 0 }, { 0xf0, 0xda, 0 } }, { { 0xdb, 0 }, { 0xf0, 0xdb, 0 } }, /* 0d8 */ - { { 0xdc, 0 }, { 0xf0, 0xdc, 0 } }, { { 0xdd, 0 }, { 0xf0, 0xdd, 0 } }, - { { 0xde, 0 }, { 0xf0, 0xde, 0 } }, { { 0xdf, 0 }, { 0xf0, 0xdf, 0 } }, /* 0dc */ - { { 0xe0, 0 }, { 0xf0, 0xe0, 0 } }, { { 0xe1, 0 }, { 0xf0, 0xe1, 0 } }, - { { 0xe2, 0 }, { 0xf0, 0xe2, 0 } }, { { 0xe3, 0 }, { 0xf0, 0xe3, 0 } }, /* 0e0 */ - { { 0xe4, 0 }, { 0xf0, 0xe4, 0 } }, { { 0xe5, 0 }, { 0xf0, 0xe5, 0 } }, - { { 0xe6, 0 }, { 0xf0, 0xe6, 0 } }, { { 0xe7, 0 }, { 0xf0, 0xe7, 0 } }, /* 0e4 */ - { { 0xe8, 0 }, { 0xf0, 0xe8, 0 } }, { { 0xe9, 0 }, { 0xf0, 0xe9, 0 } }, - { { 0xea, 0 }, { 0xf0, 0xea, 0 } }, { { 0xeb, 0 }, { 0xf0, 0xeb, 0 } }, /* 0e8 */ - { { 0xec, 0 }, { 0xf0, 0xec, 0 } }, { { 0xed, 0 }, { 0xf0, 0xed, 0 } }, - { { 0xee, 0 }, { 0xf0, 0xee, 0 } }, { { 0xef, 0 }, { 0xf0, 0xef, 0 } }, /* 0ec */ - { { 0 }, { 0 } }, { { 0xf1, 0 }, { 0xf0, 0xf1, 0 } }, - { { 0xf2, 0 }, { 0xf0, 0xf2, 0 } }, { { 0xf3, 0 }, { 0xf0, 0xf3, 0 } }, /* 0f0 */ - { { 0xf4, 0 }, { 0xf0, 0xf4, 0 } }, { { 0xf5, 0 }, { 0xf0, 0xf5, 0 } }, - { { 0xf6, 0 }, { 0xf0, 0xf6, 0 } }, { { 0xf7, 0 }, { 0xf0, 0xf7, 0 } }, /* 0f4 */ - { { 0xf8, 0 }, { 0xf0, 0xf8, 0 } }, { { 0xf9, 0 }, { 0xf0, 0xf9, 0 } }, - { { 0xfa, 0 }, { 0xf0, 0xfa, 0 } }, { { 0xfb, 0 }, { 0xf0, 0xfb, 0 } }, /* 0f8 */ - { { 0xfc, 0 }, { 0xf0, 0xfc, 0 } }, { { 0xfd, 0 }, { 0xf0, 0xfd, 0 } }, - { { 0xfe, 0 }, { 0xf0, 0xfe, 0 } }, { { 0xff, 0 }, { 0xf0, 0xff, 0 } }, /* 0fc */ - - { { 0xe1, 0x14, 0 }, { 0xe1, 0xf0, 0x14, 0 } }, { { 0xe0, 0x76, 0 }, { 0xe0, 0xF0, 0x76, 0 } }, /* 100 */ - { { 0xe0, 0x16, 0 }, { 0xe0, 0xF0, 0x16, 0 } }, { { 0xe0, 0x1E, 0 }, { 0xe0, 0xF0, 0x1E, 0 } }, /* 102 */ - { { 0xe0, 0x26, 0 }, { 0xe0, 0xF0, 0x26, 0 } }, { { 0xe0, 0x25, 0 }, { 0xe0, 0xF0, 0x25, 0 } }, - { { 0xe0, 0x2E, 0 }, { 0xe0, 0xF0, 0x2E, 0 } }, { { 0xe0, 0x36, 0 }, { 0xe0, 0xF0, 0x36, 0 } }, /* 104 */ - { { 0xe0, 0x3D, 0 }, { 0xe0, 0xF0, 0x3D, 0 } }, { { 0xe0, 0x3E, 0 }, { 0xe0, 0xF0, 0x3E, 0 } }, - { { 0xe0, 0x46, 0 }, { 0xe0, 0xF0, 0x46, 0 } }, { { 0xe0, 0x45, 0 }, { 0xe0, 0xF0, 0x45, 0 } }, /* 108 */ - { { 0xe0, 0x4E, 0 }, { 0xe0, 0xF0, 0x4E, 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0x66, 0 }, { 0xe0, 0xF0, 0x66, 0 } }, { { 0xe0, 0x0D, 0 }, { 0xe0, 0xF0, 0x0D, 0 } }, /* 10c */ - { { 0xe0, 0x15, 0 }, { 0xe0, 0xF0, 0x15, 0 } }, { { 0xe0, 0x1D, 0 }, { 0xe0, 0xF0, 0x1D, 0 } }, - { { 0xe0, 0x24, 0 }, { 0xe0, 0xF0, 0x24, 0 } }, { { 0xe0, 0x2D, 0 }, { 0xe0, 0xF0, 0x2D, 0 } }, /* 110 */ - { { 0xe0, 0x2C, 0 }, { 0xe0, 0xF0, 0x2C, 0 } }, { { 0xe0, 0x35, 0 }, { 0xe0, 0xF0, 0x35, 0 } }, - { { 0xe0, 0x3C, 0 }, { 0xe0, 0xF0, 0x3C, 0 } }, { { 0xe0, 0x43, 0 }, { 0xe0, 0xF0, 0x43, 0 } }, /* 114 */ - { { 0xe0, 0x44, 0 }, { 0xe0, 0xF0, 0x44, 0 } }, { { 0xe0, 0x4D, 0 }, { 0xe0, 0xF0, 0x4D, 0 } }, - { { 0xe0, 0x54, 0 }, { 0xe0, 0xF0, 0x54, 0 } }, { { 0xe0, 0x5B, 0 }, { 0xe0, 0xF0, 0x5B, 0 } }, /* 118 */ - { { 0xe0, 0x5A, 0 }, { 0xe0, 0xF0, 0x5A, 0 } }, { { 0xe0, 0x14, 0 }, { 0xe0, 0xF0, 0x14, 0 } }, - { { 0xe0, 0x1C, 0 }, { 0xe0, 0xF0, 0x1C, 0 } }, { { 0xe0, 0x1B, 0 }, { 0xe0, 0xF0, 0x1B, 0 } }, /* 11c */ - { { 0xe0, 0x23, 0 }, { 0xe0, 0xF0, 0x23, 0 } }, { { 0xe0, 0x2B, 0 }, { 0xe0, 0xF0, 0x2B, 0 } }, - { { 0xe0, 0x34, 0 }, { 0xe0, 0xF0, 0x34, 0 } }, { { 0xe0, 0x33, 0 }, { 0xe0, 0xF0, 0x33, 0 } }, /* 120 */ - { { 0xe0, 0x3B, 0 }, { 0xe0, 0xF0, 0x3B, 0 } }, { { 0xe0, 0x42, 0 }, { 0xe0, 0xF0, 0x42, 0 } }, - { { 0xe0, 0x4B, 0 }, { 0xe0, 0xF0, 0x4B, 0 } }, { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ - { { 0xe0, 0x1A, 0 }, { 0xe0, 0xF0, 0x1A, 0 } }, { { 0xe0, 0x22, 0 }, { 0xe0, 0xF0, 0x22, 0 } }, - { { 0xe0, 0x21, 0 }, { 0xe0, 0xF0, 0x21, 0 } }, { { 0xe0, 0x2A, 0 }, { 0xe0, 0xF0, 0x2A, 0 } }, /* 12c */ - { { 0xe0, 0x32, 0 }, { 0xe0, 0xF0, 0x32, 0 } }, { { 0xe0, 0x31, 0 }, { 0xe0, 0xF0, 0x31, 0 } }, - { { 0xe0, 0x3A, 0 }, { 0xe0, 0xF0, 0x3A, 0 } }, { { 0 }, { 0 } }, /* 130 */ - { { 0xe0, 0x49, 0 }, { 0xe0, 0xF0, 0x49, 0 } }, { { 0xe0, 0x4A, 0 }, { 0xe0, 0xF0, 0x4A, 0 } }, - { { 0 }, { 0 } }, { { 0xe0, 0x7C, 0 }, { 0xe0, 0xF0, 0x7C, 0 } }, /* 134 */ - { { 0xe0, 0x11, 0 }, { 0xe0, 0xF0, 0x11, 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0x58, 0 }, { 0xe0, 0xF0, 0x58, 0 } }, { { 0xe0, 0x05, 0 }, { 0xe0, 0xF0, 0x05, 0 } }, /* 138 */ - { { 0xe0, 0x06, 0 }, { 0xe0, 0xF0, 0x06, 0 } }, { { 0xe0, 0x04, 0 }, { 0xe0, 0xF0, 0x04, 0 } }, - { { 0xe0, 0x0C, 0 }, { 0xe0, 0xF0, 0x0C, 0 } }, { { 0xe0, 0x03, 0 }, { 0xe0, 0xF0, 0x03, 0 } }, /* 13c */ - { { 0xe0, 0x0B, 0 }, { 0xe0, 0xF0, 0x0B, 0 } }, { { 0xe0, 0x02, 0 }, { 0xe0, 0xF0, 0x02, 0 } }, - { { 0xe0, 0x0A, 0 }, { 0xe0, 0xF0, 0x0A, 0 } }, { { 0xe0, 0x01, 0 }, { 0xe0, 0xF0, 0x01, 0 } }, /* 140 */ - { { 0xe0, 0x09, 0 }, { 0xe0, 0xF0, 0x09, 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0x7E, 0 }, { 0xe0, 0xF0, 0x7E, 0 } }, { { 0xe0, 0x6C, 0 }, { 0xe0, 0xF0, 0x6C, 0 } }, /* 144 */ - { { 0xe0, 0x75, 0 }, { 0xe0, 0xF0, 0x75, 0 } }, { { 0xe0, 0x7D, 0 }, { 0xe0, 0xF0, 0x7D, 0 } }, - { { 0 }, { 0 } }, { { 0xe0, 0x6B, 0 }, { 0xe0, 0xF0, 0x6B, 0 } }, /* 148 */ - { { 0xe0, 0x73, 0 }, { 0xe0, 0xF0, 0x73, 0 } }, { { 0xe0, 0x74, 0 }, { 0xe0, 0xF0, 0x74, 0 } }, - { { 0xe0, 0x79, 0 }, { 0xe0, 0xF0, 0x79, 0 } }, { { 0xe0, 0x69, 0 }, { 0xe0, 0xF0, 0x69, 0 } }, /* 14c */ - { { 0xe0, 0x72, 0 }, { 0xe0, 0xF0, 0x72, 0 } }, { { 0xe0, 0x7A, 0 }, { 0xe0, 0xF0, 0x7A, 0 } }, - { { 0xe0, 0x70, 0 }, { 0xe0, 0xF0, 0x70, 0 } }, { { 0xe0, 0x71, 0 }, { 0xe0, 0xF0, 0x71, 0 } }, /* 150 */ - { { 0 }, { 0 } }, { { 0xe0, 0x60, 0 }, { 0xe0, 0xF0, 0x60, 0 } }, - { { 0 }, { 0 } }, { { 0xe0, 0x78, 0 }, { 0xe0, 0xF0, 0x78, 0 } }, /* 154 */ - { { 0xe0, 0x07, 0 }, { 0xe0, 0xF0, 0x07, 0 } }, { { 0xe0, 0x0F, 0 }, { 0xe0, 0xF0, 0x0F, 0 } }, - { { 0xe0, 0x17, 0 }, { 0xe0, 0xF0, 0x17, 0 } }, { { 0xe0, 0x1F, 0 }, { 0xe0, 0xF0, 0x1F, 0 } }, /* 158 */ - { { 0xe0, 0x27, 0 }, { 0xe0, 0xF0, 0x27, 0 } }, { { 0xe0, 0x2F, 0 }, { 0xe0, 0xF0, 0x2F, 0 } }, - { { 0xe0, 0x37, 0 }, { 0xe0, 0xF0, 0x37, 0 } }, { { 0xe0, 0x3F, 0 }, { 0xe0, 0xF0, 0x3F, 0 } }, /* 15c */ - { { 0 }, { 0 } }, { { 0xe0, 0x4F, 0 }, { 0xe0, 0xF0, 0x4F, 0 } }, - { { 0xe0, 0x56, 0 }, { 0xe0, 0xF0, 0x56, 0 } }, { { 0xe0, 0x5E, 0 }, { 0xe0, 0xF0, 0x5E, 0 } }, /* 160 */ - { { 0xe0, 0x08, 0 }, { 0xe0, 0xF0, 0x08, 0 } }, { { 0xe0, 0x10, 0 }, { 0xe0, 0xF0, 0x10, 0 } }, - { { 0xe0, 0x18, 0 }, { 0xe0, 0xF0, 0x18, 0 } }, { { 0xe0, 0x20, 0 }, { 0xe0, 0xF0, 0x20, 0 } }, /* 164 */ - { { 0xe0, 0x28, 0 }, { 0xe0, 0xF0, 0x28, 0 } }, { { 0xe0, 0x30, 0 }, { 0xe0, 0xF0, 0x30, 0 } }, - { { 0xe0, 0x38, 0 }, { 0xe0, 0xF0, 0x38, 0 } }, { { 0xe0, 0x40, 0 }, { 0xe0, 0xF0, 0x40, 0 } }, /* 168 */ - { { 0xe0, 0x48, 0 }, { 0xe0, 0xF0, 0x48, 0 } }, { { 0xe0, 0x50, 0 }, { 0xe0, 0xF0, 0x50, 0 } }, - { { 0xe0, 0x57, 0 }, { 0xe0, 0xF0, 0x57, 0 } }, { { 0 }, { 0 } }, /* 16c */ - { { 0xe0, 0x13, 0 }, { 0xe0, 0xF0, 0x13, 0 } }, { { 0xe0, 0x19, 0 }, { 0xe0, 0xF0, 0x19, 0 } }, - { { 0xe0, 0x39, 0 }, { 0xe0, 0xF0, 0x39, 0 } }, { { 0xe0, 0x51, 0 }, { 0xe0, 0xF0, 0x51, 0 } }, /* 170 */ - { { 0xe0, 0x53, 0 }, { 0xe0, 0xF0, 0x53, 0 } }, { { 0xe0, 0x5C, 0 }, { 0xe0, 0xF0, 0x5C, 0 } }, - { { 0 }, { 0 } }, { { 0xe0, 0x62, 0 }, { 0xe0, 0xF0, 0x62, 0 } }, /* 174 */ - { { 0xe0, 0x63, 0 }, { 0xe0, 0xF0, 0x63, 0 } }, { { 0xe0, 0x64, 0 }, { 0xe0, 0xF0, 0x64, 0 } }, - { { 0xe0, 0x65, 0 }, { 0xe0, 0xF0, 0x65, 0 } }, { { 0xe0, 0x67, 0 }, { 0xe0, 0xF0, 0x67, 0 } }, /* 178 */ - { { 0xe0, 0x68, 0 }, { 0xe0, 0xF0, 0x68, 0 } }, { { 0xe0, 0x6A, 0 }, { 0xe0, 0xF0, 0x6A, 0 } }, - { { 0xe0, 0x6D, 0 }, { 0xe0, 0xF0, 0x6D, 0 } }, { { 0xe0, 0x6E, 0 }, { 0xe0, 0xF0, 0x6E, 0 } }, /* 17c */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, { { 0xe0, 0xe1, 0 }, { 0xe0, 0xF0, 0xE1, 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0xee, 0 }, { 0xe0, 0xF0, 0xEE, 0 } }, { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, { { 0xe0, 0xf1, 0 }, { 0xe0, 0xF0, 0xF1, 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0xfe, 0 }, { 0xe0, 0xF0, 0xFE, 0 } }, { { 0xe0, 0xff, 0 }, { 0xe0, 0xF0, 0xFF, 0 } } /* 1fc */ + { { 0 }, { 0 } }, /* 000 */ + { { 0x76, 0 }, { 0xF0, 0x76, 0 } }, /* 001 */ + { { 0x16, 0 }, { 0xF0, 0x16, 0 } }, /* 002 */ + { { 0x1E, 0 }, { 0xF0, 0x1E, 0 } }, /* 003 */ + { { 0x26, 0 }, { 0xF0, 0x26, 0 } }, /* 004 */ + { { 0x25, 0 }, { 0xF0, 0x25, 0 } }, /* 005 */ + { { 0x2E, 0 }, { 0xF0, 0x2E, 0 } }, /* 006 */ + { { 0x36, 0 }, { 0xF0, 0x36, 0 } }, /* 007 */ + { { 0x3D, 0 }, { 0xF0, 0x3D, 0 } }, /* 008 */ + { { 0x3E, 0 }, { 0xF0, 0x3E, 0 } }, /* 009 */ + { { 0x46, 0 }, { 0xF0, 0x46, 0 } }, /* 00a */ + { { 0x45, 0 }, { 0xF0, 0x45, 0 } }, /* 00b */ + { { 0x4E, 0 }, { 0xF0, 0x4E, 0 } }, /* 00c */ + { { 0x55, 0 }, { 0xF0, 0x55, 0 } }, /* 00d */ + { { 0x66, 0 }, { 0xF0, 0x66, 0 } }, /* 00e */ + { { 0x0D, 0 }, { 0xF0, 0x0D, 0 } }, /* 00f */ + { { 0x15, 0 }, { 0xF0, 0x15, 0 } }, /* 010 */ + { { 0x1D, 0 }, { 0xF0, 0x1D, 0 } }, /* 011 */ + { { 0x24, 0 }, { 0xF0, 0x24, 0 } }, /* 012 */ + { { 0x2D, 0 }, { 0xF0, 0x2D, 0 } }, /* 013 */ + { { 0x2C, 0 }, { 0xF0, 0x2C, 0 } }, /* 014 */ + { { 0x35, 0 }, { 0xF0, 0x35, 0 } }, /* 015 */ + { { 0x3C, 0 }, { 0xF0, 0x3C, 0 } }, /* 016 */ + { { 0x43, 0 }, { 0xF0, 0x43, 0 } }, /* 017 */ + { { 0x44, 0 }, { 0xF0, 0x44, 0 } }, /* 018 */ + { { 0x4D, 0 }, { 0xF0, 0x4D, 0 } }, /* 019 */ + { { 0x54, 0 }, { 0xF0, 0x54, 0 } }, /* 01a */ + { { 0x5B, 0 }, { 0xF0, 0x5B, 0 } }, /* 01b */ + { { 0x5A, 0 }, { 0xF0, 0x5A, 0 } }, /* 01c */ + { { 0x14, 0 }, { 0xF0, 0x14, 0 } }, /* 01d */ + { { 0x1C, 0 }, { 0xF0, 0x1C, 0 } }, /* 01e */ + { { 0x1B, 0 }, { 0xF0, 0x1B, 0 } }, /* 01f */ + { { 0x23, 0 }, { 0xF0, 0x23, 0 } }, /* 020 */ + { { 0x2B, 0 }, { 0xF0, 0x2B, 0 } }, /* 021 */ + { { 0x34, 0 }, { 0xF0, 0x34, 0 } }, /* 022 */ + { { 0x33, 0 }, { 0xF0, 0x33, 0 } }, /* 023 */ + { { 0x3B, 0 }, { 0xF0, 0x3B, 0 } }, /* 024 */ + { { 0x42, 0 }, { 0xF0, 0x42, 0 } }, /* 025 */ + { { 0x4B, 0 }, { 0xF0, 0x4B, 0 } }, /* 026 */ + { { 0x4C, 0 }, { 0xF0, 0x4C, 0 } }, /* 027 */ + { { 0x52, 0 }, { 0xF0, 0x52, 0 } }, /* 028 */ + { { 0x0E, 0 }, { 0xF0, 0x0E, 0 } }, /* 029 */ + { { 0x12, 0 }, { 0xF0, 0x12, 0 } }, /* 02a */ + { { 0x5D, 0 }, { 0xF0, 0x5D, 0 } }, /* 02b */ + { { 0x1A, 0 }, { 0xF0, 0x1A, 0 } }, /* 02c */ + { { 0x22, 0 }, { 0xF0, 0x22, 0 } }, /* 02d */ + { { 0x21, 0 }, { 0xF0, 0x21, 0 } }, /* 02e */ + { { 0x2A, 0 }, { 0xF0, 0x2A, 0 } }, /* 02f */ + { { 0x32, 0 }, { 0xF0, 0x32, 0 } }, /* 030 */ + { { 0x31, 0 }, { 0xF0, 0x31, 0 } }, /* 031 */ + { { 0x3A, 0 }, { 0xF0, 0x3A, 0 } }, /* 032 */ + { { 0x41, 0 }, { 0xF0, 0x41, 0 } }, /* 033 */ + { { 0x49, 0 }, { 0xF0, 0x49, 0 } }, /* 034 */ + { { 0x4A, 0 }, { 0xF0, 0x4A, 0 } }, /* 035 */ + { { 0x59, 0 }, { 0xF0, 0x59, 0 } }, /* 036 */ + { { 0x7C, 0 }, { 0xF0, 0x7C, 0 } }, /* 037 */ + { { 0x11, 0 }, { 0xF0, 0x11, 0 } }, /* 038 */ + { { 0x29, 0 }, { 0xF0, 0x29, 0 } }, /* 039 */ + { { 0x58, 0 }, { 0xF0, 0x58, 0 } }, /* 03a */ + { { 0x05, 0 }, { 0xF0, 0x05, 0 } }, /* 03b */ + { { 0x06, 0 }, { 0xF0, 0x06, 0 } }, /* 03c */ + { { 0x04, 0 }, { 0xF0, 0x04, 0 } }, /* 03d */ + { { 0x0C, 0 }, { 0xF0, 0x0C, 0 } }, /* 03e */ + { { 0x03, 0 }, { 0xF0, 0x03, 0 } }, /* 03f */ + { { 0x0B, 0 }, { 0xF0, 0x0B, 0 } }, /* 040 */ + { { 0x83, 0 }, { 0xF0, 0x83, 0 } }, /* 041 */ + { { 0x0A, 0 }, { 0xF0, 0x0A, 0 } }, /* 042 */ + { { 0x01, 0 }, { 0xF0, 0x01, 0 } }, /* 043 */ + { { 0x09, 0 }, { 0xF0, 0x09, 0 } }, /* 044 */ + { { 0x77, 0 }, { 0xF0, 0x77, 0 } }, /* 045 */ + { { 0x7E, 0 }, { 0xF0, 0x7E, 0 } }, /* 046 */ + { { 0x6C, 0 }, { 0xF0, 0x6C, 0 } }, /* 047 */ + { { 0x75, 0 }, { 0xF0, 0x75, 0 } }, /* 048 */ + { { 0x7D, 0 }, { 0xF0, 0x7D, 0 } }, /* 049 */ + { { 0x7B, 0 }, { 0xF0, 0x7B, 0 } }, /* 04a */ + { { 0x6B, 0 }, { 0xF0, 0x6B, 0 } }, /* 04b */ + { { 0x73, 0 }, { 0xF0, 0x73, 0 } }, /* 04c */ + { { 0x74, 0 }, { 0xF0, 0x74, 0 } }, /* 04d */ + { { 0x79, 0 }, { 0xF0, 0x79, 0 } }, /* 04e */ + { { 0x69, 0 }, { 0xF0, 0x69, 0 } }, /* 04f */ + { { 0x72, 0 }, { 0xF0, 0x72, 0 } }, /* 050 */ + { { 0x7A, 0 }, { 0xF0, 0x7A, 0 } }, /* 051 */ + { { 0x70, 0 }, { 0xF0, 0x70, 0 } }, /* 052 */ + { { 0x71, 0 }, { 0xF0, 0x71, 0 } }, /* 053 */ + { { 0x84, 0 }, { 0xF0, 0x84, 0 } }, /* 054 */ + { { 0x60, 0 }, { 0xF0, 0x60, 0 } }, /* 055 */ + { { 0x61, 0 }, { 0xF0, 0x61, 0 } }, /* 056 */ + { { 0x78, 0 }, { 0xF0, 0x78, 0 } }, /* 057 */ + { { 0x07, 0 }, { 0xF0, 0x07, 0 } }, /* 058 */ + { { 0x0F, 0 }, { 0xF0, 0x0F, 0 } }, /* 059 */ + { { 0x17, 0 }, { 0xF0, 0x17, 0 } }, /* 05a */ + { { 0x1F, 0 }, { 0xF0, 0x1F, 0 } }, /* 05b */ + { { 0x27, 0 }, { 0xF0, 0x27, 0 } }, /* 05c */ + { { 0x2F, 0 }, { 0xF0, 0x2F, 0 } }, /* 05d */ + { { 0x37, 0 }, { 0xF0, 0x37, 0 } }, /* 05e */ + { { 0x3F, 0 }, { 0xF0, 0x3F, 0 } }, /* 05f */ + { { 0x47, 0 }, { 0xF0, 0x47, 0 } }, /* 060 */ + { { 0x4F, 0 }, { 0xF0, 0x4F, 0 } }, /* 061 */ + { { 0x56, 0 }, { 0xF0, 0x56, 0 } }, /* 062 */ + { { 0x5E, 0 }, { 0xF0, 0x5E, 0 } }, /* 063 */ + { { 0x08, 0 }, { 0xF0, 0x08, 0 } }, /* 064 */ + { { 0x10, 0 }, { 0xF0, 0x10, 0 } }, /* 065 */ + { { 0x18, 0 }, { 0xF0, 0x18, 0 } }, /* 066 */ + { { 0x20, 0 }, { 0xF0, 0x20, 0 } }, /* 067 */ + { { 0x28, 0 }, { 0xF0, 0x28, 0 } }, /* 068 */ + { { 0x30, 0 }, { 0xF0, 0x30, 0 } }, /* 069 */ + { { 0x38, 0 }, { 0xF0, 0x38, 0 } }, /* 06a */ + { { 0x40, 0 }, { 0xF0, 0x40, 0 } }, /* 06b */ + { { 0x48, 0 }, { 0xF0, 0x48, 0 } }, /* 06c */ + { { 0x50, 0 }, { 0xF0, 0x50, 0 } }, /* 06d */ + { { 0x57, 0 }, { 0xF0, 0x57, 0 } }, /* 06e */ + { { 0x6F, 0 }, { 0xF0, 0x6F, 0 } }, /* 06f */ + { { 0x13, 0 }, { 0xF0, 0x13, 0 } }, /* 070 */ + { { 0x19, 0 }, { 0xF0, 0x19, 0 } }, /* 071 */ + { { 0x39, 0 }, { 0xF0, 0x39, 0 } }, /* 072 */ + { { 0x51, 0 }, { 0xF0, 0x51, 0 } }, /* 073 */ + { { 0x53, 0 }, { 0xF0, 0x53, 0 } }, /* 074 */ + { { 0x5C, 0 }, { 0xF0, 0x5C, 0 } }, /* 075 */ + { { 0x5F, 0 }, { 0xF0, 0x5F, 0 } }, /* 076 */ + { { 0x62, 0 }, { 0xF0, 0x62, 0 } }, /* 077 */ + { { 0x63, 0 }, { 0xF0, 0x63, 0 } }, /* 078 */ + { { 0x64, 0 }, { 0xF0, 0x64, 0 } }, /* 079 */ + { { 0x65, 0 }, { 0xF0, 0x65, 0 } }, /* 07a */ + { { 0x67, 0 }, { 0xF0, 0x67, 0 } }, /* 07b */ + { { 0x68, 0 }, { 0xF0, 0x68, 0 } }, /* 07c */ + { { 0x6A, 0 }, { 0xF0, 0x6A, 0 } }, /* 07d */ + { { 0x6D, 0 }, { 0xF0, 0x6D, 0 } }, /* 07e */ + { { 0x6E, 0 }, { 0xF0, 0x6E, 0 } }, /* 07f */ + { { 0x80, 0 }, { 0xf0, 0x80, 0 } }, /* 080 */ + { { 0x81, 0 }, { 0xf0, 0x81, 0 } }, /* 081 */ + { { 0x82, 0 }, { 0xf0, 0x82, 0 } }, /* 082 */ + { { 0 }, { 0 } }, /* 083 */ + { { 0 }, { 0 } }, /* 084 */ + { { 0x85, 0 }, { 0xf0, 0x54, 0 } }, /* 085 */ + { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, /* 086 */ + { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 087 */ + { { 0x88, 0 }, { 0xf0, 0x88, 0 } }, /* 088 */ + { { 0x89, 0 }, { 0xf0, 0x89, 0 } }, /* 089 */ + { { 0x8a, 0 }, { 0xf0, 0x8a, 0 } }, /* 08a */ + { { 0x8b, 0 }, { 0xf0, 0x8b, 0 } }, /* 08b */ + { { 0x8c, 0 }, { 0xf0, 0x8c, 0 } }, /* 08c */ + { { 0x8d, 0 }, { 0xf0, 0x8d, 0 } }, /* 08d */ + { { 0x8e, 0 }, { 0xf0, 0x8e, 0 } }, /* 08e */ + { { 0x8f, 0 }, { 0xf0, 0x8f, 0 } }, /* 08f */ + { { 0x90, 0 }, { 0xf0, 0x90, 0 } }, /* 090 */ + { { 0x91, 0 }, { 0xf0, 0x91, 0 } }, /* 091 */ + { { 0x92, 0 }, { 0xf0, 0x92, 0 } }, /* 092 */ + { { 0x93, 0 }, { 0xf0, 0x93, 0 } }, /* 093 */ + { { 0x94, 0 }, { 0xf0, 0x94, 0 } }, /* 094 */ + { { 0x95, 0 }, { 0xf0, 0x95, 0 } }, /* 095 */ + { { 0x96, 0 }, { 0xf0, 0x96, 0 } }, /* 096 */ + { { 0x97, 0 }, { 0xf0, 0x97, 0 } }, /* 097 */ + { { 0x98, 0 }, { 0xf0, 0x98, 0 } }, /* 098 */ + { { 0x99, 0 }, { 0xf0, 0x99, 0 } }, /* 099 */ + { { 0x9a, 0 }, { 0xf0, 0x9a, 0 } }, /* 09a */ + { { 0x9b, 0 }, { 0xf0, 0x9b, 0 } }, /* 09b */ + { { 0x9c, 0 }, { 0xf0, 0x9c, 0 } }, /* 09c */ + { { 0x9d, 0 }, { 0xf0, 0x9d, 0 } }, /* 09d */ + { { 0x9e, 0 }, { 0xf0, 0x9e, 0 } }, /* 09e */ + { { 0x9f, 0 }, { 0xf0, 0x9f, 0 } }, /* 09f */ + { { 0xa0, 0 }, { 0xf0, 0xa0, 0 } }, /* 0a0 */ + { { 0xa1, 0 }, { 0xf0, 0xa1, 0 } }, /* 0a1 */ + { { 0xa2, 0 }, { 0xf0, 0xa2, 0 } }, /* 0a2 */ + { { 0xa3, 0 }, { 0xf0, 0xa3, 0 } }, /* 0a3 */ + { { 0xa4, 0 }, { 0xf0, 0xa4, 0 } }, /* 0a4 */ + { { 0xa5, 0 }, { 0xf0, 0xa5, 0 } }, /* 0a5 */ + { { 0xa6, 0 }, { 0xf0, 0xa6, 0 } }, /* 0a6 */ + { { 0xa7, 0 }, { 0xf0, 0xa7, 0 } }, /* 0a7 */ + { { 0xa8, 0 }, { 0xf0, 0xa8, 0 } }, /* 0a8 */ + { { 0xa9, 0 }, { 0xf0, 0xa9, 0 } }, /* 0a9 */ + { { 0xaa, 0 }, { 0xf0, 0xaa, 0 } }, /* 0aa */ + { { 0xab, 0 }, { 0xf0, 0xab, 0 } }, /* 0ab */ + { { 0xac, 0 }, { 0xf0, 0xac, 0 } }, /* 0ac */ + { { 0xad, 0 }, { 0xf0, 0xad, 0 } }, /* 0ad */ + { { 0xae, 0 }, { 0xf0, 0xae, 0 } }, /* 0ae */ + { { 0xaf, 0 }, { 0xf0, 0xaf, 0 } }, /* 0af */ + { { 0xb0, 0 }, { 0xf0, 0xb0, 0 } }, /* 0b0 */ + { { 0xb1, 0 }, { 0xf0, 0xb1, 0 } }, /* 0b1 */ + { { 0xb2, 0 }, { 0xf0, 0xb2, 0 } }, /* 0b2 */ + { { 0xb3, 0 }, { 0xf0, 0xb3, 0 } }, /* 0b3 */ + { { 0xb4, 0 }, { 0xf0, 0xb4, 0 } }, /* 0b4 */ + { { 0xb5, 0 }, { 0xf0, 0xb5, 0 } }, /* 0b5 */ + { { 0xb6, 0 }, { 0xf0, 0xb6, 0 } }, /* 0b6 */ + { { 0xb7, 0 }, { 0xf0, 0xb7, 0 } }, /* 0b7 */ + { { 0xb8, 0 }, { 0xf0, 0xb8, 0 } }, /* 0b8 */ + { { 0xb9, 0 }, { 0xf0, 0xb9, 0 } }, /* 0b9 */ + { { 0xba, 0 }, { 0xf0, 0xba, 0 } }, /* 0ba */ + { { 0xbb, 0 }, { 0xf0, 0xbb, 0 } }, /* 0bb */ + { { 0xbc, 0 }, { 0xf0, 0xbc, 0 } }, /* 0bc */ + { { 0xbd, 0 }, { 0xf0, 0xbd, 0 } }, /* 0bd */ + { { 0xbe, 0 }, { 0xf0, 0xbe, 0 } }, /* 0be */ + { { 0xbf, 0 }, { 0xf0, 0xbf, 0 } }, /* 0bf */ + { { 0xc0, 0 }, { 0xf0, 0xc0, 0 } }, /* 0c0 */ + { { 0xc1, 0 }, { 0xf0, 0xc1, 0 } }, /* 0c1 */ + { { 0xc2, 0 }, { 0xf0, 0xc2, 0 } }, /* 0c2 */ + { { 0xc3, 0 }, { 0xf0, 0xc3, 0 } }, /* 0c3 */ + { { 0xc4, 0 }, { 0xf0, 0xc4, 0 } }, /* 0c4 */ + { { 0xc5, 0 }, { 0xf0, 0xc5, 0 } }, /* 0c5 */ + { { 0xc6, 0 }, { 0xf0, 0xc6, 0 } }, /* 0c6 */ + { { 0xc7, 0 }, { 0xf0, 0xc7, 0 } }, /* 0c7 */ + { { 0xc8, 0 }, { 0xf0, 0xc8, 0 } }, /* 0c8 */ + { { 0xc9, 0 }, { 0xf0, 0xc9, 0 } }, /* 0c9 */ + { { 0xca, 0 }, { 0xf0, 0xca, 0 } }, /* 0ca */ + { { 0xcb, 0 }, { 0xf0, 0xcb, 0 } }, /* 0cb */ + { { 0xcc, 0 }, { 0xf0, 0xcc, 0 } }, /* 0cc */ + { { 0xcd, 0 }, { 0xf0, 0xcd, 0 } }, /* 0cd */ + { { 0xce, 0 }, { 0xf0, 0xce, 0 } }, /* 0ce */ + { { 0xcf, 0 }, { 0xf0, 0xcf, 0 } }, /* 0cf */ + { { 0xd0, 0 }, { 0xf0, 0xd0, 0 } }, /* 0d0 */ + { { 0xd1, 0 }, { 0xf0, 0xd0, 0 } }, /* 0d1 */ + { { 0xd2, 0 }, { 0xf0, 0xd2, 0 } }, /* 0d2 */ + { { 0xd3, 0 }, { 0xf0, 0xd3, 0 } }, /* 0d3 */ + { { 0xd4, 0 }, { 0xf0, 0xd4, 0 } }, /* 0d4 */ + { { 0xd5, 0 }, { 0xf0, 0xd5, 0 } }, /* 0d5 */ + { { 0xd6, 0 }, { 0xf0, 0xd6, 0 } }, /* 0d6 */ + { { 0xd7, 0 }, { 0xf0, 0xd7, 0 } }, /* 0d7 */ + { { 0xd8, 0 }, { 0xf0, 0xd8, 0 } }, /* 0d8 */ + { { 0xd9, 0 }, { 0xf0, 0xd9, 0 } }, /* 0d9 */ + { { 0xda, 0 }, { 0xf0, 0xda, 0 } }, /* 0da */ + { { 0xdb, 0 }, { 0xf0, 0xdb, 0 } }, /* 0db */ + { { 0xdc, 0 }, { 0xf0, 0xdc, 0 } }, /* 0dc */ + { { 0xdd, 0 }, { 0xf0, 0xdd, 0 } }, /* 0dd */ + { { 0xde, 0 }, { 0xf0, 0xde, 0 } }, /* 0de */ + { { 0xdf, 0 }, { 0xf0, 0xdf, 0 } }, /* 0df */ + { { 0xe0, 0 }, { 0xf0, 0xe0, 0 } }, /* 0e0 */ + { { 0xe1, 0 }, { 0xf0, 0xe1, 0 } }, /* 0e1 */ + { { 0xe2, 0 }, { 0xf0, 0xe2, 0 } }, /* 0e2 */ + { { 0xe3, 0 }, { 0xf0, 0xe3, 0 } }, /* 0e3 */ + { { 0xe4, 0 }, { 0xf0, 0xe4, 0 } }, /* 0e4 */ + { { 0xe5, 0 }, { 0xf0, 0xe5, 0 } }, /* 0e5 */ + { { 0xe6, 0 }, { 0xf0, 0xe6, 0 } }, /* 0e6 */ + { { 0xe7, 0 }, { 0xf0, 0xe7, 0 } }, /* 0e7 */ + { { 0xe8, 0 }, { 0xf0, 0xe8, 0 } }, /* 0e8 */ + { { 0xe9, 0 }, { 0xf0, 0xe9, 0 } }, /* 0e9 */ + { { 0xea, 0 }, { 0xf0, 0xea, 0 } }, /* 0ea */ + { { 0xeb, 0 }, { 0xf0, 0xeb, 0 } }, /* 0eb */ + { { 0xec, 0 }, { 0xf0, 0xec, 0 } }, /* 0ec */ + { { 0xed, 0 }, { 0xf0, 0xed, 0 } }, /* 0ed */ + { { 0xee, 0 }, { 0xf0, 0xee, 0 } }, /* 0ee */ + { { 0xef, 0 }, { 0xf0, 0xef, 0 } }, /* 0ef */ + { { 0 }, { 0 } }, /* 0f0 */ + { { 0xf1, 0 }, { 0xf0, 0xf1, 0 } }, /* 0f1 */ + { { 0xf2, 0 }, { 0xf0, 0xf2, 0 } }, /* 0f2 */ + { { 0xf3, 0 }, { 0xf0, 0xf3, 0 } }, /* 0f3 */ + { { 0xf4, 0 }, { 0xf0, 0xf4, 0 } }, /* 0f4 */ + { { 0xf5, 0 }, { 0xf0, 0xf5, 0 } }, /* 0f5 */ + { { 0xf6, 0 }, { 0xf0, 0xf6, 0 } }, /* 0f6 */ + { { 0xf7, 0 }, { 0xf0, 0xf7, 0 } }, /* 0f7 */ + { { 0xf8, 0 }, { 0xf0, 0xf8, 0 } }, /* 0f8 */ + { { 0xf9, 0 }, { 0xf0, 0xf9, 0 } }, /* 0f9 */ + { { 0xfa, 0 }, { 0xf0, 0xfa, 0 } }, /* 0fa */ + { { 0xfb, 0 }, { 0xf0, 0xfb, 0 } }, /* 0fb */ + { { 0xfc, 0 }, { 0xf0, 0xfc, 0 } }, /* 0fc */ + { { 0xfd, 0 }, { 0xf0, 0xfd, 0 } }, /* 0fd */ + { { 0xfe, 0 }, { 0xf0, 0xfe, 0 } }, /* 0fe */ + { { 0xff, 0 }, { 0xf0, 0xff, 0 } }, /* 0ff */ + { { 0xe1, 0x14, 0 }, { 0xe1, 0xf0, 0x14, 0 } }, /* 100 */ + { { 0xe0, 0x76, 0 }, { 0xe0, 0xF0, 0x76, 0 } }, /* 101 */ + { { 0xe0, 0x16, 0 }, { 0xe0, 0xF0, 0x16, 0 } }, /* 102 */ + { { 0xe0, 0x1E, 0 }, { 0xe0, 0xF0, 0x1E, 0 } }, /* 103 */ + { { 0xe0, 0x26, 0 }, { 0xe0, 0xF0, 0x26, 0 } }, /* 104 */ + { { 0xe0, 0x25, 0 }, { 0xe0, 0xF0, 0x25, 0 } }, /* 105 */ + { { 0xe0, 0x2E, 0 }, { 0xe0, 0xF0, 0x2E, 0 } }, /* 106 */ + { { 0xe0, 0x36, 0 }, { 0xe0, 0xF0, 0x36, 0 } }, /* 107 */ + { { 0xe0, 0x3D, 0 }, { 0xe0, 0xF0, 0x3D, 0 } }, /* 108 */ + { { 0xe0, 0x3E, 0 }, { 0xe0, 0xF0, 0x3E, 0 } }, /* 109 */ + { { 0xe0, 0x46, 0 }, { 0xe0, 0xF0, 0x46, 0 } }, /* 10a */ + { { 0xe0, 0x45, 0 }, { 0xe0, 0xF0, 0x45, 0 } }, /* 10b */ + { { 0xe0, 0x4E, 0 }, { 0xe0, 0xF0, 0x4E, 0 } }, /* 10c */ + { { 0 }, { 0 } }, /* 10d */ + { { 0xe0, 0x66, 0 }, { 0xe0, 0xF0, 0x66, 0 } }, /* 10e */ + { { 0xe0, 0x0D, 0 }, { 0xe0, 0xF0, 0x0D, 0 } }, /* 10f */ + { { 0xe0, 0x15, 0 }, { 0xe0, 0xF0, 0x15, 0 } }, /* 110 */ + { { 0xe0, 0x1D, 0 }, { 0xe0, 0xF0, 0x1D, 0 } }, /* 112 */ + { { 0xe0, 0x24, 0 }, { 0xe0, 0xF0, 0x24, 0 } }, /* 113 */ + { { 0xe0, 0x2D, 0 }, { 0xe0, 0xF0, 0x2D, 0 } }, /* 113 */ + { { 0xe0, 0x2C, 0 }, { 0xe0, 0xF0, 0x2C, 0 } }, /* 114 */ + { { 0xe0, 0x35, 0 }, { 0xe0, 0xF0, 0x35, 0 } }, /* 115 */ + { { 0xe0, 0x3C, 0 }, { 0xe0, 0xF0, 0x3C, 0 } }, /* 116 */ + { { 0xe0, 0x43, 0 }, { 0xe0, 0xF0, 0x43, 0 } }, /* 117 */ + { { 0xe0, 0x44, 0 }, { 0xe0, 0xF0, 0x44, 0 } }, /* 118 */ + { { 0xe0, 0x4D, 0 }, { 0xe0, 0xF0, 0x4D, 0 } }, /* 119 */ + { { 0xe0, 0x54, 0 }, { 0xe0, 0xF0, 0x54, 0 } }, /* 11a */ + { { 0xe0, 0x5B, 0 }, { 0xe0, 0xF0, 0x5B, 0 } }, /* 11b */ + { { 0xe0, 0x5A, 0 }, { 0xe0, 0xF0, 0x5A, 0 } }, /* 11c */ + { { 0xe0, 0x14, 0 }, { 0xe0, 0xF0, 0x14, 0 } }, /* 11d */ + { { 0xe0, 0x1C, 0 }, { 0xe0, 0xF0, 0x1C, 0 } }, /* 11e */ + { { 0xe0, 0x1B, 0 }, { 0xe0, 0xF0, 0x1B, 0 } }, /* 11f */ + { { 0xe0, 0x23, 0 }, { 0xe0, 0xF0, 0x23, 0 } }, /* 120 */ + { { 0xe0, 0x2B, 0 }, { 0xe0, 0xF0, 0x2B, 0 } }, /* 121 */ + { { 0xe0, 0x34, 0 }, { 0xe0, 0xF0, 0x34, 0 } }, /* 122 */ + { { 0xe0, 0x33, 0 }, { 0xe0, 0xF0, 0x33, 0 } }, /* 123 */ + { { 0xe0, 0x3B, 0 }, { 0xe0, 0xF0, 0x3B, 0 } }, /* 124 */ + { { 0xe0, 0x42, 0 }, { 0xe0, 0xF0, 0x42, 0 } }, /* 125 */ + { { 0xe0, 0x4B, 0 }, { 0xe0, 0xF0, 0x4B, 0 } }, /* 126 */ + { { 0 }, { 0 } }, /* 127 */ + { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, /* 129 */ + { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, /* 12b */ + { { 0xe0, 0x1A, 0 }, { 0xe0, 0xF0, 0x1A, 0 } }, /* 12c */ + { { 0xe0, 0x22, 0 }, { 0xe0, 0xF0, 0x22, 0 } }, /* 12d */ + { { 0xe0, 0x21, 0 }, { 0xe0, 0xF0, 0x21, 0 } }, /* 12e */ + { { 0xe0, 0x2A, 0 }, { 0xe0, 0xF0, 0x2A, 0 } }, /* 12f */ + { { 0xe0, 0x32, 0 }, { 0xe0, 0xF0, 0x32, 0 } }, /* 130 */ + { { 0xe0, 0x31, 0 }, { 0xe0, 0xF0, 0x31, 0 } }, /* 131 */ + { { 0xe0, 0x3A, 0 }, { 0xe0, 0xF0, 0x3A, 0 } }, /* 132 */ + { { 0 }, { 0 } }, /* 133 */ + { { 0xe0, 0x49, 0 }, { 0xe0, 0xF0, 0x49, 0 } }, /* 134 */ + { { 0xe0, 0x4A, 0 }, { 0xe0, 0xF0, 0x4A, 0 } }, /* 135 */ + { { 0 }, { 0 } }, /* 136 */ + { { 0xe0, 0x7C, 0 }, { 0xe0, 0xF0, 0x7C, 0 } }, /* 137 */ + { { 0xe0, 0x11, 0 }, { 0xe0, 0xF0, 0x11, 0 } }, /* 138 */ + { { 0 }, { 0 } }, /* 139 */ + { { 0xe0, 0x58, 0 }, { 0xe0, 0xF0, 0x58, 0 } }, /* 13a */ + { { 0xe0, 0x05, 0 }, { 0xe0, 0xF0, 0x05, 0 } }, /* 13b */ + { { 0xe0, 0x06, 0 }, { 0xe0, 0xF0, 0x06, 0 } }, /* 13c */ + { { 0xe0, 0x04, 0 }, { 0xe0, 0xF0, 0x04, 0 } }, /* 13d */ + { { 0xe0, 0x0C, 0 }, { 0xe0, 0xF0, 0x0C, 0 } }, /* 13e */ + { { 0xe0, 0x03, 0 }, { 0xe0, 0xF0, 0x03, 0 } }, /* 13f */ + { { 0xe0, 0x0B, 0 }, { 0xe0, 0xF0, 0x0B, 0 } }, /* 140 */ + { { 0xe0, 0x02, 0 }, { 0xe0, 0xF0, 0x02, 0 } }, /* 141 */ + { { 0xe0, 0x0A, 0 }, { 0xe0, 0xF0, 0x0A, 0 } }, /* 142 */ + { { 0xe0, 0x01, 0 }, { 0xe0, 0xF0, 0x01, 0 } }, /* 143 */ + { { 0xe0, 0x09, 0 }, { 0xe0, 0xF0, 0x09, 0 } }, /* 144 */ + { { 0 }, { 0 } }, /* 145 */ + { { 0xe0, 0x7E, 0 }, { 0xe0, 0xF0, 0x7E, 0 } }, /* 146 */ + { { 0xe0, 0x6C, 0 }, { 0xe0, 0xF0, 0x6C, 0 } }, /* 147 */ + { { 0xe0, 0x75, 0 }, { 0xe0, 0xF0, 0x75, 0 } }, /* 148 */ + { { 0xe0, 0x7D, 0 }, { 0xe0, 0xF0, 0x7D, 0 } }, /* 149 */ + { { 0 }, { 0 } }, /* 14a */ + { { 0xe0, 0x6B, 0 }, { 0xe0, 0xF0, 0x6B, 0 } }, /* 14b */ + { { 0xe0, 0x73, 0 }, { 0xe0, 0xF0, 0x73, 0 } }, /* 14c */ + { { 0xe0, 0x74, 0 }, { 0xe0, 0xF0, 0x74, 0 } }, /* 14d */ + { { 0xe0, 0x79, 0 }, { 0xe0, 0xF0, 0x79, 0 } }, /* 14e */ + { { 0xe0, 0x69, 0 }, { 0xe0, 0xF0, 0x69, 0 } }, /* 14f */ + { { 0xe0, 0x72, 0 }, { 0xe0, 0xF0, 0x72, 0 } }, /* 150 */ + { { 0xe0, 0x7A, 0 }, { 0xe0, 0xF0, 0x7A, 0 } }, /* 151 */ + { { 0xe0, 0x70, 0 }, { 0xe0, 0xF0, 0x70, 0 } }, /* 152 */ + { { 0xe0, 0x71, 0 }, { 0xe0, 0xF0, 0x71, 0 } }, /* 153 */ + { { 0 }, { 0 } }, /* 154 */ + { { 0xe0, 0x60, 0 }, { 0xe0, 0xF0, 0x60, 0 } }, /* 155 */ + { { 0 }, { 0 } }, /* 156 */ + { { 0xe0, 0x78, 0 }, { 0xe0, 0xF0, 0x78, 0 } }, /* 157 */ + { { 0xe0, 0x07, 0 }, { 0xe0, 0xF0, 0x07, 0 } }, /* 158 */ + { { 0xe0, 0x0F, 0 }, { 0xe0, 0xF0, 0x0F, 0 } }, /* 159 */ + { { 0xe0, 0x17, 0 }, { 0xe0, 0xF0, 0x17, 0 } }, /* 15a */ + { { 0xe0, 0x1F, 0 }, { 0xe0, 0xF0, 0x1F, 0 } }, /* 15b */ + { { 0xe0, 0x27, 0 }, { 0xe0, 0xF0, 0x27, 0 } }, /* 15c */ + { { 0xe0, 0x2F, 0 }, { 0xe0, 0xF0, 0x2F, 0 } }, /* 15d */ + { { 0xe0, 0x37, 0 }, { 0xe0, 0xF0, 0x37, 0 } }, /* 15e */ + { { 0xe0, 0x3F, 0 }, { 0xe0, 0xF0, 0x3F, 0 } }, /* 15f */ + { { 0 }, { 0 } }, /* 160 */ + { { 0xe0, 0x4F, 0 }, { 0xe0, 0xF0, 0x4F, 0 } }, /* 161 */ + { { 0xe0, 0x56, 0 }, { 0xe0, 0xF0, 0x56, 0 } }, /* 162 */ + { { 0xe0, 0x5E, 0 }, { 0xe0, 0xF0, 0x5E, 0 } }, /* 163 */ + { { 0xe0, 0x08, 0 }, { 0xe0, 0xF0, 0x08, 0 } }, /* 164 */ + { { 0xe0, 0x10, 0 }, { 0xe0, 0xF0, 0x10, 0 } }, /* 165 */ + { { 0xe0, 0x18, 0 }, { 0xe0, 0xF0, 0x18, 0 } }, /* 166 */ + { { 0xe0, 0x20, 0 }, { 0xe0, 0xF0, 0x20, 0 } }, /* 167 */ + { { 0xe0, 0x28, 0 }, { 0xe0, 0xF0, 0x28, 0 } }, /* 168 */ + { { 0xe0, 0x30, 0 }, { 0xe0, 0xF0, 0x30, 0 } }, /* 169 */ + { { 0xe0, 0x38, 0 }, { 0xe0, 0xF0, 0x38, 0 } }, /* 16a */ + { { 0xe0, 0x40, 0 }, { 0xe0, 0xF0, 0x40, 0 } }, /* 16b */ + { { 0xe0, 0x48, 0 }, { 0xe0, 0xF0, 0x48, 0 } }, /* 16c */ + { { 0xe0, 0x50, 0 }, { 0xe0, 0xF0, 0x50, 0 } }, /* 16d */ + { { 0xe0, 0x57, 0 }, { 0xe0, 0xF0, 0x57, 0 } }, /* 16e */ + { { 0 }, { 0 } }, /* 16f */ + { { 0xe0, 0x13, 0 }, { 0xe0, 0xF0, 0x13, 0 } }, /* 170 */ + { { 0xe0, 0x19, 0 }, { 0xe0, 0xF0, 0x19, 0 } }, /* 171 */ + { { 0xe0, 0x39, 0 }, { 0xe0, 0xF0, 0x39, 0 } }, /* 172 */ + { { 0xe0, 0x51, 0 }, { 0xe0, 0xF0, 0x51, 0 } }, /* 173 */ + { { 0xe0, 0x53, 0 }, { 0xe0, 0xF0, 0x53, 0 } }, /* 174 */ + { { 0xe0, 0x5C, 0 }, { 0xe0, 0xF0, 0x5C, 0 } }, /* 175 */ + { { 0 }, { 0 } }, /* 176 */ + { { 0xe0, 0x62, 0 }, { 0xe0, 0xF0, 0x62, 0 } }, /* 177 */ + { { 0xe0, 0x63, 0 }, { 0xe0, 0xF0, 0x63, 0 } }, /* 178 */ + { { 0xe0, 0x64, 0 }, { 0xe0, 0xF0, 0x64, 0 } }, /* 179 */ + { { 0xe0, 0x65, 0 }, { 0xe0, 0xF0, 0x65, 0 } }, /* 17a */ + { { 0xe0, 0x67, 0 }, { 0xe0, 0xF0, 0x67, 0 } }, /* 17b */ + { { 0xe0, 0x68, 0 }, { 0xe0, 0xF0, 0x68, 0 } }, /* 17c */ + { { 0xe0, 0x6A, 0 }, { 0xe0, 0xF0, 0x6A, 0 } }, /* 17d */ + { { 0xe0, 0x6D, 0 }, { 0xe0, 0xF0, 0x6D, 0 } }, /* 17e */ + { { 0xe0, 0x6E, 0 }, { 0xe0, 0xF0, 0x6E, 0 } }, /* 17f */ + { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, /* 181 */ + { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, /* 183 */ + { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, /* 185 */ + { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, /* 187 */ + { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, /* 189 */ + { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, /* 18b */ + { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, /* 18d */ + { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, /* 18f */ + { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, /* 191 */ + { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, /* 193 */ + { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, /* 195 */ + { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, /* 197 */ + { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, /* 199 */ + { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, /* 19b */ + { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, /* 19d */ + { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, /* 19f */ + { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, /* 1a1 */ + { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, /* 1a3 */ + { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, /* 1a5 */ + { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, /* 1a7 */ + { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, /* 1a9 */ + { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, /* 1ab */ + { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, /* 1ad */ + { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, /* 1c1 */ + { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, /* 1c3 */ + { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, /* 1c5 */ + { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, /* 1c7 */ + { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, /* 1c9 */ + { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, /* 1cb */ + { { 0 }, { 0 } }, /* 1cv */ + { { 0 }, { 0 } }, /* 1cd */ + { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, /* 1cf */ + { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, /* 1d1 */ + { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, /* 1d5 */ + { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, /* 1d7 */ + { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, /* 1d9 */ + { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, /* 1db */ + { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, /* 1dd */ + { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, /* 1df */ + { { 0 }, { 0 } }, /* 1e0 */ + { { 0xe0, 0xe1, 0 }, { 0xe0, 0xF0, 0xE1, 0 } }, /* 1e1 */ + { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, /* 1e3 */ + { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, /* 1e5 */ + { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, /* 1e7 */ + { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, /* 1e9 */ + { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, /* 1eb */ + { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, /* 1ed */ + { { 0xe0, 0xee, 0 }, { 0xe0, 0xF0, 0xEE, 0 } }, /* 1ee */ + { { 0 }, { 0 } }, /* 1ef */ + { { 0 }, { 0 } }, /* 1f0 */ + { { 0xe0, 0xf1, 0 }, { 0xe0, 0xF0, 0xF1, 0 } }, /* 1f1 */ + { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, /* 1f3 */ + { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, /* 1f5 */ + { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, /* 1f7 */ + { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, /* 1f9 */ + { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, /* 1fb */ + { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, /* 1fd */ + { { 0xe0, 0xfe, 0 }, { 0xe0, 0xF0, 0xFE, 0 } }, /* 1fe */ + { { 0xe0, 0xff, 0 }, { 0xe0, 0xF0, 0xFF, 0 } } /* 1ff */ // clang-format on }; static const scancode scancode_set3[512] = { // clang-format off - { { 0 }, { 0 } }, { { 0x08, 0 }, { 0xf0, 0x08, 0 } }, /* 000 */ - { { 0x16, 0 }, { 0xf0, 0x16, 0 } }, { { 0x1E, 0 }, { 0xf0, 0x1E, 0 } }, /* 002 */ - { { 0x26, 0 }, { 0xf0, 0x26, 0 } }, { { 0x25, 0 }, { 0xf0, 0x25, 0 } }, - { { 0x2E, 0 }, { 0xf0, 0x2E, 0 } }, { { 0x36, 0 }, { 0xf0, 0x36, 0 } }, /* 004 */ - { { 0x3D, 0 }, { 0xf0, 0x3D, 0 } }, { { 0x3E, 0 }, { 0xf0, 0x3E, 0 } }, - { { 0x46, 0 }, { 0xf0, 0x46, 0 } }, { { 0x45, 0 }, { 0xf0, 0x45, 0 } }, /* 008 */ - { { 0x4E, 0 }, { 0xf0, 0x4E, 0 } }, { { 0x55, 0 }, { 0xf0, 0x55, 0 } }, - { { 0x66, 0 }, { 0xf0, 0x66, 0 } }, { { 0x0D, 0 }, { 0xf0, 0x0D, 0 } }, /* 00c */ - { { 0x15, 0 }, { 0xf0, 0x15, 0 } }, { { 0x1D, 0 }, { 0xf0, 0x1D, 0 } }, - { { 0x24, 0 }, { 0xf0, 0x24, 0 } }, { { 0x2D, 0 }, { 0xf0, 0x2D, 0 } }, /* 010 */ - { { 0x2C, 0 }, { 0xf0, 0x2C, 0 } }, { { 0x35, 0 }, { 0xf0, 0x35, 0 } }, - { { 0x3C, 0 }, { 0xf0, 0x3C, 0 } }, { { 0x43, 0 }, { 0xf0, 0x43, 0 } }, /* 014 */ - { { 0x44, 0 }, { 0xf0, 0x44, 0 } }, { { 0x4D, 0 }, { 0xf0, 0x4D, 0 } }, - { { 0x54, 0 }, { 0xf0, 0x54, 0 } }, { { 0x5B, 0 }, { 0xf0, 0x5B, 0 } }, /* 018 */ - { { 0x5A, 0 }, { 0xf0, 0x5A, 0 } }, { { 0x11, 0 }, { 0xf0, 0x11, 0 } }, - { { 0x1C, 0 }, { 0xf0, 0x1C, 0 } }, { { 0x1B, 0 }, { 0xf0, 0x1B, 0 } }, /* 01c */ - { { 0x23, 0 }, { 0xf0, 0x23, 0 } }, { { 0x2B, 0 }, { 0xf0, 0x2B, 0 } }, - { { 0x34, 0 }, { 0xf0, 0x34, 0 } }, { { 0x33, 0 }, { 0xf0, 0x33, 0 } }, /* 020 */ - { { 0x3B, 0 }, { 0xf0, 0x3B, 0 } }, { { 0x42, 0 }, { 0xf0, 0x42, 0 } }, - { { 0x4B, 0 }, { 0xf0, 0x4B, 0 } }, { { 0x4C, 0 }, { 0xf0, 0x4C, 0 } }, /* 024 */ - { { 0x52, 0 }, { 0xf0, 0x52, 0 } }, { { 0x0E, 0 }, { 0xf0, 0x0E, 0 } }, - { { 0x12, 0 }, { 0xf0, 0x12, 0 } }, { { 0x5C, 0 }, { 0xf0, 0x5C, 0 } }, /* 028 */ - { { 0x1A, 0 }, { 0xf0, 0x1A, 0 } }, { { 0x22, 0 }, { 0xf0, 0x22, 0 } }, - { { 0x21, 0 }, { 0xf0, 0x21, 0 } }, { { 0x2A, 0 }, { 0xf0, 0x2A, 0 } }, /* 02c */ - { { 0x32, 0 }, { 0xf0, 0x32, 0 } }, { { 0x31, 0 }, { 0xf0, 0x31, 0 } }, - { { 0x3A, 0 }, { 0xf0, 0x3A, 0 } }, { { 0x41, 0 }, { 0xf0, 0x41, 0 } }, /* 030 */ - { { 0x49, 0 }, { 0xf0, 0x49, 0 } }, { { 0x4A, 0 }, { 0xf0, 0x4A, 0 } }, - { { 0x59, 0 }, { 0xf0, 0x59, 0 } }, { { 0x7E, 0 }, { 0xf0, 0x7E, 0 } }, /* 034 */ - { { 0x19, 0 }, { 0xf0, 0x19, 0 } }, { { 0x29, 0 }, { 0xf0, 0x29, 0 } }, - { { 0x14, 0 }, { 0xf0, 0x14, 0 } }, { { 0x07, 0 }, { 0xf0, 0x07, 0 } }, /* 038 */ - { { 0x0F, 0 }, { 0xf0, 0x0F, 0 } }, { { 0x17, 0 }, { 0xf0, 0x17, 0 } }, - { { 0x1F, 0 }, { 0xf0, 0x1F, 0 } }, { { 0x27, 0 }, { 0xf0, 0x27, 0 } }, /* 03c */ - { { 0x2F, 0 }, { 0xf0, 0x2F, 0 } }, { { 0x37, 0 }, { 0xf0, 0x37, 0 } }, - { { 0x3F, 0 }, { 0xf0, 0x3F, 0 } }, { { 0x47, 0 }, { 0xf0, 0x47, 0 } }, /* 040 */ - { { 0x4F, 0 }, { 0xf0, 0x4F, 0 } }, { { 0x76, 0 }, { 0xf0, 0x76, 0 } }, - { { 0x5F, 0 }, { 0xf0, 0x5F, 0 } }, { { 0x6C, 0 }, { 0xf0, 0x6C, 0 } }, /* 044 */ - { { 0x75, 0 }, { 0xf0, 0x75, 0 } }, { { 0x7D, 0 }, { 0xf0, 0x7D, 0 } }, - { { 0x84, 0 }, { 0xf0, 0x84, 0 } }, { { 0x6B, 0 }, { 0xf0, 0x6B, 0 } }, /* 048 */ - { { 0x73, 0 }, { 0xf0, 0x73, 0 } }, { { 0x74, 0 }, { 0xf0, 0x74, 0 } }, - { { 0x7C, 0 }, { 0xf0, 0x7C, 0 } }, { { 0x69, 0 }, { 0xf0, 0x69, 0 } }, /* 04c */ - { { 0x72, 0 }, { 0xf0, 0x72, 0 } }, { { 0x7A, 0 }, { 0xf0, 0x7A, 0 } }, - { { 0x70, 0 }, { 0xf0, 0x70, 0 } }, { { 0x71, 0 }, { 0xf0, 0x71, 0 } }, /* 050 */ - { { 0x57, 0 }, { 0xf0, 0x57, 0 } }, { { 0x60, 0 }, { 0xf0, 0x60, 0 } }, - { { 0 }, { 0 } }, { { 0x56, 0 }, { 0xf0, 0x56, 0 } }, /* 054 */ - { { 0x5E, 0 }, { 0xf0, 0x5E, 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 058 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, { { 0x10, 0 }, { 0xf0, 0x10, 0 } }, - { { 0x18, 0 }, { 0xf0, 0x18, 0 } }, { { 0x20, 0 }, { 0xf0, 0x20, 0 } }, /* 064 */ - { { 0x28, 0 }, { 0xf0, 0x28, 0 } }, { { 0x30, 0 }, { 0xf0, 0x30, 0 } }, - { { 0x38, 0 }, { 0xf0, 0x38, 0 } }, { { 0x40, 0 }, { 0xf0, 0x40, 0 } }, /* 068 */ - { { 0x48, 0 }, { 0xf0, 0x48, 0 } }, { { 0x50, 0 }, { 0xf0, 0x50, 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ - { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0x51, 0 }, { 0xf0, 0x51, 0 } }, /* 070 */ - { { 0x53, 0 }, { 0xf0, 0x53, 0 } }, { { 0x5C, 0 }, { 0xf0, 0x5C, 0 } }, - { { 0 }, { 0 } }, { { 0x62, 0 }, { 0xf0, 0x62, 0 } }, /* 074 */ - { { 0x63, 0 }, { 0xf0, 0x63, 0 } }, { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, - { { 0 }, { 0 } }, { { 0x85, 0 }, { 0xf0, 0x85, 0 } }, /* 078 */ - { { 0x68, 0 }, { 0xf0, 0x68, 0 } }, { { 0x13, 0 }, { 0xf0, 0x13, 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ - - { { 0x80, 0 }, { 0xf0, 0x80, 0 } }, { { 0x81, 0 }, { 0xf0, 0x81, 0 } }, /* 080 */ - { { 0x82, 0 }, { 0xf0, 0x82, 0 } }, { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, { { 0x85, 0 }, { 0xf0, 0x54, 0 } }, - { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 084 */ - { { 0x88, 0 }, { 0xf0, 0x88, 0 } }, { { 0x89, 0 }, { 0xf0, 0x89, 0 } }, - { { 0x8a, 0 }, { 0xf0, 0x8a, 0 } }, { { 0x8b, 0 }, { 0xf0, 0x8b, 0 } }, /* 088 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0x8e, 0 }, { 0xf0, 0x8e, 0 } }, { { 0x8f, 0 }, { 0xf0, 0x8f, 0 } }, /* 08c */ - { { 0x90, 0 }, { 0xf0, 0x90, 0 } }, { { 0x91, 0 }, { 0xf0, 0x91, 0 } }, - { { 0x92, 0 }, { 0xf0, 0x92, 0 } }, { { 0x93, 0 }, { 0xf0, 0x93, 0 } }, /* 090 */ - { { 0x94, 0 }, { 0xf0, 0x94, 0 } }, { { 0x95, 0 }, { 0xf0, 0x95, 0 } }, - { { 0x96, 0 }, { 0xf0, 0x96, 0 } }, { { 0x97, 0 }, { 0xf0, 0x97, 0 } }, /* 094 */ - { { 0x98, 0 }, { 0xf0, 0x98, 0 } }, { { 0x99, 0 }, { 0xf0, 0x99, 0 } }, - { { 0x9a, 0 }, { 0xf0, 0x9a, 0 } }, { { 0x9b, 0 }, { 0xf0, 0x9b, 0 } }, /* 098 */ - { { 0x9c, 0 }, { 0xf0, 0x9c, 0 } }, { { 0x9d, 0 }, { 0xf0, 0x9d, 0 } }, - { { 0x9e, 0 }, { 0xf0, 0x9e, 0 } }, { { 0x9f, 0 }, { 0xf0, 0x9f, 0 } }, /* 09c */ - { { 0xa0, 0 }, { 0xf0, 0xa0, 0 } }, { { 0xa1, 0 }, { 0xf0, 0xa1, 0 } }, - { { 0xa2, 0 }, { 0xf0, 0xa2, 0 } }, { { 0xa3, 0 }, { 0xf0, 0xa3, 0 } }, /* 0a0 */ - { { 0xa4, 0 }, { 0xf0, 0xa4, 0 } }, { { 0xa5, 0 }, { 0xf0, 0xa5, 0 } }, - { { 0xa6, 0 }, { 0xf0, 0xa6, 0 } }, { { 0xa7, 0 }, { 0xf0, 0xa7, 0 } }, /* 0a4 */ - { { 0xa8, 0 }, { 0xf0, 0xa8, 0 } }, { { 0xa9, 0 }, { 0xf0, 0xa9, 0 } }, - { { 0xaa, 0 }, { 0xf0, 0xaa, 0 } }, { { 0xab, 0 }, { 0xf0, 0xab, 0 } }, /* 0a8 */ - { { 0xac, 0 }, { 0xf0, 0xac, 0 } }, { { 0xad, 0 }, { 0xf0, 0xad, 0 } }, - { { 0xae, 0 }, { 0xf0, 0xae, 0 } }, { { 0xaf, 0 }, { 0xf0, 0xaf, 0 } }, /* 0ac */ - { { 0xb0, 0 }, { 0xf0, 0xb0, 0 } }, { { 0xb1, 0 }, { 0xf0, 0xb1, 0 } }, - { { 0xb2, 0 }, { 0xf0, 0xb2, 0 } }, { { 0xb3, 0 }, { 0xf0, 0xb3, 0 } }, /* 0b0 */ - { { 0xb4, 0 }, { 0xf0, 0xb4, 0 } }, { { 0xb5, 0 }, { 0xf0, 0xb5, 0 } }, - { { 0xb6, 0 }, { 0xf0, 0xb6, 0 } }, { { 0xb7, 0 }, { 0xf0, 0xb7, 0 } }, /* 0b4 */ - { { 0xb8, 0 }, { 0xf0, 0xb8, 0 } }, { { 0xb9, 0 }, { 0xf0, 0xb9, 0 } }, - { { 0xba, 0 }, { 0xf0, 0xba, 0 } }, { { 0xbb, 0 }, { 0xf0, 0xbb, 0 } }, /* 0b8 */ - { { 0xbc, 0 }, { 0xf0, 0xbc, 0 } }, { { 0xbd, 0 }, { 0xf0, 0xbd, 0 } }, - { { 0xbe, 0 }, { 0xf0, 0xbe, 0 } }, { { 0xbf, 0 }, { 0xf0, 0xbf, 0 } }, /* 0bc */ - { { 0xc0, 0 }, { 0xf0, 0xc0, 0 } }, { { 0xc1, 0 }, { 0xf0, 0xc1, 0 } }, - { { 0xc2, 0 }, { 0xf0, 0xc2, 0 } }, { { 0xc3, 0 }, { 0xf0, 0xc3, 0 } }, /* 0c0 */ - { { 0xc4, 0 }, { 0xf0, 0xc4, 0 } }, { { 0xc5, 0 }, { 0xf0, 0xc5, 0 } }, - { { 0xc6, 0 }, { 0xf0, 0xc6, 0 } }, { { 0xc7, 0 }, { 0xf0, 0xc7, 0 } }, /* 0c4 */ - { { 0xc8, 0 }, { 0xf0, 0xc8, 0 } }, { { 0xc9, 0 }, { 0xf0, 0xc9, 0 } }, - { { 0xca, 0 }, { 0xf0, 0xca, 0 } }, { { 0xcb, 0 }, { 0xf0, 0xcb, 0 } }, /* 0c8 */ - { { 0xcc, 0 }, { 0xf0, 0xcc, 0 } }, { { 0xcd, 0 }, { 0xf0, 0xcd, 0 } }, - { { 0xce, 0 }, { 0xf0, 0xce, 0 } }, { { 0xcf, 0 }, { 0xf0, 0xcf, 0 } }, /* 0cc */ - { { 0xd0, 0 }, { 0xf0, 0xd0, 0 } }, { { 0xd1, 0 }, { 0xf0, 0xd0, 0 } }, - { { 0xd2, 0 }, { 0xf0, 0xd2, 0 } }, { { 0xd3, 0 }, { 0xf0, 0xd3, 0 } }, /* 0d0 */ - { { 0xd4, 0 }, { 0xf0, 0xd4, 0 } }, { { 0xd5, 0 }, { 0xf0, 0xd5, 0 } }, - { { 0xd6, 0 }, { 0xf0, 0xd6, 0 } }, { { 0xd7, 0 }, { 0xf0, 0xd7, 0 } }, /* 0d4 */ - { { 0xd8, 0 }, { 0xf0, 0xd8, 0 } }, { { 0xd9, 0 }, { 0xf0, 0xd9, 0 } }, - { { 0xda, 0 }, { 0xf0, 0xda, 0 } }, { { 0xdb, 0 }, { 0xf0, 0xdb, 0 } }, /* 0d8 */ - { { 0xdc, 0 }, { 0xf0, 0xdc, 0 } }, { { 0xdd, 0 }, { 0xf0, 0xdd, 0 } }, - { { 0xde, 0 }, { 0xf0, 0xde, 0 } }, { { 0xdf, 0 }, { 0xf0, 0xdf, 0 } }, /* 0dc */ - { { 0xe0, 0 }, { 0xf0, 0xe0, 0 } }, { { 0xe1, 0 }, { 0xf0, 0xe1, 0 } }, - { { 0xe2, 0 }, { 0xf0, 0xe2, 0 } }, { { 0xe3, 0 }, { 0xf0, 0xe3, 0 } }, /* 0e0 */ - { { 0xe4, 0 }, { 0xf0, 0xe4, 0 } }, { { 0xe5, 0 }, { 0xf0, 0xe5, 0 } }, - { { 0xe6, 0 }, { 0xf0, 0xe6, 0 } }, { { 0xe7, 0 }, { 0xf0, 0xe7, 0 } }, /* 0e4 */ - { { 0xe8, 0 }, { 0xf0, 0xe8, 0 } }, { { 0xe9, 0 }, { 0xf0, 0xe9, 0 } }, - { { 0xea, 0 }, { 0xf0, 0xea, 0 } }, { { 0xeb, 0 }, { 0xf0, 0xeb, 0 } }, /* 0e8 */ - { { 0xec, 0 }, { 0xf0, 0xec, 0 } }, { { 0xed, 0 }, { 0xf0, 0xed, 0 } }, - { { 0xee, 0 }, { 0xf0, 0xee, 0 } }, { { 0xef, 0 }, { 0xf0, 0xef, 0 } }, /* 0ec */ - { { 0 }, { 0 } }, { { 0xf1, 0 }, { 0xf0, 0xf1, 0 } }, - { { 0xf2, 0 }, { 0xf0, 0xf2, 0 } }, { { 0xf3, 0 }, { 0xf0, 0xf3, 0 } }, /* 0f0 */ - { { 0xf4, 0 }, { 0xf0, 0xf4, 0 } }, { { 0xf5, 0 }, { 0xf0, 0xf5, 0 } }, - { { 0xf6, 0 }, { 0xf0, 0xf6, 0 } }, { { 0xf7, 0 }, { 0xf0, 0xf7, 0 } }, /* 0f4 */ - { { 0xf8, 0 }, { 0xf0, 0xf8, 0 } }, { { 0xf9, 0 }, { 0xf0, 0xf9, 0 } }, - { { 0xfa, 0 }, { 0xf0, 0xfa, 0 } }, { { 0xfb, 0 }, { 0xf0, 0xfb, 0 } }, /* 0f8 */ - { { 0xfc, 0 }, { 0xf0, 0xfc, 0 } }, { { 0xfd, 0 }, { 0xf0, 0xfd, 0 } }, - { { 0xfe, 0 }, { 0xf0, 0xfe, 0 } }, { { 0xff, 0 }, { 0xf0, 0xff, 0 } }, /* 0fc */ - - { { 0x62, 0 }, { 0xF0, 0x62, 0 } }, { { 0xe0, 0x76, 0 }, { 0xe0, 0xF0, 0x76, 0 } }, /* 100 */ - { { 0xe0, 0x16, 0 }, { 0xe0, 0xF0, 0x16, 0 } }, { { 0xe0, 0x1E, 0 }, { 0xe0, 0xF0, 0x1E, 0 } }, /* 102 */ - { { 0xe0, 0x26, 0 }, { 0xe0, 0xF0, 0x26, 0 } }, { { 0xe0, 0x25, 0 }, { 0xe0, 0xF0, 0x25, 0 } }, - { { 0xe0, 0x2E, 0 }, { 0xe0, 0xF0, 0x2E, 0 } }, { { 0xe0, 0x36, 0 }, { 0xe0, 0xF0, 0x36, 0 } }, /* 104 */ - { { 0xe0, 0x3D, 0 }, { 0xe0, 0xF0, 0x3D, 0 } }, { { 0xe0, 0x3E, 0 }, { 0xe0, 0xF0, 0x3E, 0 } }, - { { 0xe0, 0x46, 0 }, { 0xe0, 0xF0, 0x46, 0 } }, { { 0xe0, 0x45, 0 }, { 0xe0, 0xF0, 0x45, 0 } }, /* 108 */ - { { 0xe0, 0x4E, 0 }, { 0xe0, 0xF0, 0x4E, 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0x66, 0 }, { 0xe0, 0xF0, 0x66, 0 } }, { { 0xe0, 0x0D, 0 }, { 0xe0, 0xF0, 0x0D, 0 } }, /* 10c */ - { { 0xe0, 0x15, 0 }, { 0xe0, 0xF0, 0x15, 0 } }, { { 0xe0, 0x1D, 0 }, { 0xe0, 0xF0, 0x1D, 0 } }, - { { 0xe0, 0x24, 0 }, { 0xe0, 0xF0, 0x24, 0 } }, { { 0xe0, 0x2D, 0 }, { 0xe0, 0xF0, 0x2D, 0 } }, /* 110 */ - { { 0xe0, 0x2C, 0 }, { 0xe0, 0xF0, 0x2C, 0 } }, { { 0xe0, 0x35, 0 }, { 0xe0, 0xF0, 0x35, 0 } }, - { { 0xe0, 0x3C, 0 }, { 0xe0, 0xF0, 0x3C, 0 } }, { { 0xe0, 0x43, 0 }, { 0xe0, 0xF0, 0x43, 0 } }, /* 114 */ - { { 0xe0, 0x44, 0 }, { 0xe0, 0xF0, 0x44, 0 } }, { { 0xe0, 0x4D, 0 }, { 0xe0, 0xF0, 0x4D, 0 } }, - { { 0xe0, 0x54, 0 }, { 0xe0, 0xF0, 0x54, 0 } }, { { 0xe0, 0x5B, 0 }, { 0xe0, 0xF0, 0x5B, 0 } }, /* 118 */ - { { 0x79, 0 }, { 0xf0, 0x79, 0 } }, { { 0x58, 0 }, { 0xf0, 0x58, 0 } }, - { { 0xe0, 0x1C, 0 }, { 0xe0, 0xF0, 0x1C, 0 } }, { { 0xe0, 0x1B, 0 }, { 0xe0, 0xF0, 0x1B, 0 } }, /* 11c */ - { { 0xe0, 0x23, 0 }, { 0xe0, 0xF0, 0x23, 0 } }, { { 0xe0, 0x2B, 0 }, { 0xe0, 0xF0, 0x2B, 0 } }, - { { 0xe0, 0x34, 0 }, { 0xe0, 0xF0, 0x34, 0 } }, { { 0xe0, 0x33, 0 }, { 0xe0, 0xF0, 0x33, 0 } }, /* 120 */ - { { 0xe0, 0x3B, 0 }, { 0xe0, 0xF0, 0x3B, 0 } }, { { 0xe0, 0x42, 0 }, { 0xe0, 0xF0, 0x42, 0 } }, - { { 0xe0, 0x4B, 0 }, { 0xe0, 0xF0, 0x4B, 0 } }, { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ - { { 0xe0, 0x1A, 0 }, { 0xe0, 0xF0, 0x1A, 0 } }, { { 0xe0, 0x22, 0 }, { 0xe0, 0xF0, 0x22, 0 } }, - { { 0xe0, 0x21, 0 }, { 0xe0, 0xF0, 0x21, 0 } }, { { 0xe0, 0x2A, 0 }, { 0xe0, 0xF0, 0x2A, 0 } }, /* 12c */ - { { 0xe0, 0x32, 0 }, { 0xe0, 0xF0, 0x32, 0 } }, { { 0xe0, 0x31, 0 }, { 0xe0, 0xF0, 0x31, 0 } }, - { { 0xe0, 0x3A, 0 }, { 0xe0, 0xF0, 0x3A, 0 } }, { { 0 }, { 0 } }, /* 130 */ - { { 0xe0, 0x49, 0 }, { 0xe0, 0xF0, 0x49, 0 } }, { { 0x77, 0 }, { 0xf0, 0x77, 0 } }, - { { 0 }, { 0 } }, { { 0x57, 0 }, { 0xf0, 0x57, 0 } }, /* 134 */ - { { 0x39, 0 }, { 0xf0, 0x39, 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0x58, 0 }, { 0xe0, 0xF0, 0x58, 0 } }, { { 0xe0, 0x05, 0 }, { 0xe0, 0xF0, 0x05, 0 } }, /* 138 */ - { { 0xe0, 0x06, 0 }, { 0xe0, 0xF0, 0x06, 0 } }, { { 0xe0, 0x04, 0 }, { 0xe0, 0xF0, 0x04, 0 } }, - { { 0xe0, 0x0C, 0 }, { 0xe0, 0xF0, 0x0C, 0 } }, { { 0xe0, 0x03, 0 }, { 0xe0, 0xF0, 0x03, 0 } }, /* 13c */ - { { 0xe0, 0x0B, 0 }, { 0xe0, 0xF0, 0x0B, 0 } }, { { 0xe0, 0x02, 0 }, { 0xe0, 0xF0, 0x02, 0 } }, - { { 0xe0, 0x0A, 0 }, { 0xe0, 0xF0, 0x0A, 0 } }, { { 0xe0, 0x01, 0 }, { 0xe0, 0xF0, 0x01, 0 } }, /* 140 */ - { { 0xe0, 0x09, 0 }, { 0xe0, 0xF0, 0x09, 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0x7E, 0 }, { 0xe0, 0xF0, 0x7E, 0 } }, { { 0x6E, 0 }, { 0xf0, 0x6E, 0 } }, /* 144 */ - { { 0x63, 0 }, { 0xf0, 0x63, 0 } }, { { 0x6F, 0 }, { 0xf0, 0x6F, 0 } }, - { { 0 }, { 0 } }, { { 0x61, 0 }, { 0xf0, 0x61, 0 } }, /* 148 */ - { { 0xe0, 0x73, 0 }, { 0xe0, 0xF0, 0x73, 0 } }, { { 0x6A, 0 }, { 0xf0, 0x6A, 0 } }, - { { 0xe0, 0x79, 0 }, { 0xe0, 0xF0, 0x79, 0 } }, { { 0x65, 0 }, { 0xf0, 0x65, 0 } }, /* 14c */ - { { 0x60, 0 }, { 0xf0, 0x60, 0 } }, { { 0x6D, 0 }, { 0xf0, 0x6D, 0 } }, - { { 0x67, 0 }, { 0xf0, 0x67, 0 } }, { { 0x64, 0 }, { 0xf0, 0x64, 0 } }, /* 150 */ - { { 0xd4, 0 }, { 0xf0, 0xD4, 0 } }, { { 0xe0, 0x60, 0 }, { 0xe0, 0xF0, 0x60, 0 } }, - { { 0 }, { 0 } }, { { 0xe0, 0x78, 0 }, { 0xe0, 0xF0, 0x78, 0 } }, /* 154 */ - { { 0xe0, 0x07, 0 }, { 0xe0, 0xF0, 0x07, 0 } }, { { 0xe0, 0x0F, 0 }, { 0xe0, 0xF0, 0x0F, 0 } }, - { { 0xe0, 0x17, 0 }, { 0xe0, 0xF0, 0x17, 0 } }, { { 0x8B, 0 }, { 0xf0, 0x8B, 0 } }, /* 158 */ - { { 0x8C, 0 }, { 0xf0, 0x8C, 0 } }, { { 0x8D, 0 }, { 0xf0, 0x8D, 0 } }, - { { 0 }, { 0 } }, { { 0x7F, 0 }, { 0xf0, 0x7F, 0 } }, /* 15c */ - { { 0 }, { 0 } }, { { 0xe0, 0x4F, 0 }, { 0xe0, 0xF0, 0x4F, 0 } }, - { { 0xe0, 0x56, 0 }, { 0xe0, 0xF0, 0x56, 0 } }, { { 0 }, { 0 } }, /* 160 */ - { { 0xe0, 0x08, 0 }, { 0xe0, 0xF0, 0x08, 0 } }, { { 0xe0, 0x10, 0 }, { 0xe0, 0xF0, 0x10, 0 } }, - { { 0xe0, 0x18, 0 }, { 0xe0, 0xF0, 0x18, 0 } }, { { 0xe0, 0x20, 0 }, { 0xe0, 0xF0, 0x20, 0 } }, /* 164 */ - { { 0xe0, 0x28, 0 }, { 0xe0, 0xF0, 0x28, 0 } }, { { 0xe0, 0x30, 0 }, { 0xe0, 0xF0, 0x30, 0 } }, - { { 0xe0, 0x38, 0 }, { 0xe0, 0xF0, 0x38, 0 } }, { { 0xe0, 0x40, 0 }, { 0xe0, 0xF0, 0x40, 0 } }, /* 168 */ - { { 0xe0, 0x48, 0 }, { 0xe0, 0xF0, 0x48, 0 } }, { { 0xe0, 0x50, 0 }, { 0xe0, 0xF0, 0x50, 0 } }, - { { 0xe0, 0x57, 0 }, { 0xe0, 0xF0, 0x57, 0 } }, { { 0 }, { 0 } }, /* 16c */ - { { 0xe0, 0x13, 0 }, { 0xe0, 0xF0, 0x13, 0 } }, { { 0xe0, 0x19, 0 }, { 0xe0, 0xF0, 0x19, 0 } }, - { { 0xe0, 0x39, 0 }, { 0xe0, 0xF0, 0x39, 0 } }, { { 0xe0, 0x51, 0 }, { 0xe0, 0xF0, 0x51, 0 } }, /* 170 */ - { { 0xe0, 0x53, 0 }, { 0xe0, 0xF0, 0x53, 0 } }, { { 0xe0, 0x5C, 0 }, { 0xe0, 0xF0, 0x5C, 0 } }, - { { 0 }, { 0 } }, { { 0xe0, 0x62, 0 }, { 0xe0, 0xF0, 0x62, 0 } }, /* 174 */ - { { 0xe0, 0x63, 0 }, { 0xe0, 0xF0, 0x63, 0 } }, { { 0xe0, 0x64, 0 }, { 0xe0, 0xF0, 0x64, 0 } }, - { { 0xe0, 0x65, 0 }, { 0xe0, 0xF0, 0x65, 0 } }, { { 0xe0, 0x67, 0 }, { 0xe0, 0xF0, 0x67, 0 } }, /* 178 */ - { { 0xe0, 0x68, 0 }, { 0xe0, 0xF0, 0x68, 0 } }, { { 0xe0, 0x6A, 0 }, { 0xe0, 0xF0, 0x6A, 0 } }, - { { 0xe0, 0x6D, 0 }, { 0xe0, 0xF0, 0x6D, 0 } }, { { 0xe0, 0x6E, 0 }, { 0xe0, 0xF0, 0x6E, 0 } }, /* 17c */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, { { 0xe0, 0xe1, 0 }, { 0xe0, 0xF0, 0xE1, 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0xee, 0 }, { 0xe0, 0xF0, 0xEE, 0 } }, { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, { { 0xe0, 0xf1, 0 }, { 0xe0, 0xF0, 0xF1, 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, - { { 0xe0, 0xfe, 0 }, { 0xe0, 0xF0, 0xFE, 0 } }, { { 0xe0, 0xff, 0 }, { 0xe0, 0xF0, 0xFF, 0 } } /* 1fc */ + { { 0 }, { 0 } }, /* 000 */ + { { 0x08, 0 }, { 0xf0, 0x08, 0 } }, /* 001 */ + { { 0x16, 0 }, { 0xf0, 0x16, 0 } }, /* 002 */ + { { 0x1E, 0 }, { 0xf0, 0x1E, 0 } }, /* 003 */ + { { 0x26, 0 }, { 0xf0, 0x26, 0 } }, /* 004 */ + { { 0x25, 0 }, { 0xf0, 0x25, 0 } }, /* 005 */ + { { 0x2E, 0 }, { 0xf0, 0x2E, 0 } }, /* 006 */ + { { 0x36, 0 }, { 0xf0, 0x36, 0 } }, /* 007 */ + { { 0x3D, 0 }, { 0xf0, 0x3D, 0 } }, /* 008 */ + { { 0x3E, 0 }, { 0xf0, 0x3E, 0 } }, /* 009 */ + { { 0x46, 0 }, { 0xf0, 0x46, 0 } }, /* 00a */ + { { 0x45, 0 }, { 0xf0, 0x45, 0 } }, /* 00b */ + { { 0x4E, 0 }, { 0xf0, 0x4E, 0 } }, /* 00c */ + { { 0x55, 0 }, { 0xf0, 0x55, 0 } }, /* 00d */ + { { 0x66, 0 }, { 0xf0, 0x66, 0 } }, /* 00e */ + { { 0x0D, 0 }, { 0xf0, 0x0D, 0 } }, /* 00f */ + { { 0x15, 0 }, { 0xf0, 0x15, 0 } }, /* 010 */ + { { 0x1D, 0 }, { 0xf0, 0x1D, 0 } }, /* 011 */ + { { 0x24, 0 }, { 0xf0, 0x24, 0 } }, /* 012 */ + { { 0x2D, 0 }, { 0xf0, 0x2D, 0 } }, /* 013 */ + { { 0x2C, 0 }, { 0xf0, 0x2C, 0 } }, /* 014 */ + { { 0x35, 0 }, { 0xf0, 0x35, 0 } }, /* 015 */ + { { 0x3C, 0 }, { 0xf0, 0x3C, 0 } }, /* 016 */ + { { 0x43, 0 }, { 0xf0, 0x43, 0 } }, /* 017 */ + { { 0x44, 0 }, { 0xf0, 0x44, 0 } }, /* 018 */ + { { 0x4D, 0 }, { 0xf0, 0x4D, 0 } }, /* 019 */ + { { 0x54, 0 }, { 0xf0, 0x54, 0 } }, /* 01a */ + { { 0x5B, 0 }, { 0xf0, 0x5B, 0 } }, /* 01b */ + { { 0x5A, 0 }, { 0xf0, 0x5A, 0 } }, /* 01c */ + { { 0x11, 0 }, { 0xf0, 0x11, 0 } }, /* 01d */ + { { 0x1C, 0 }, { 0xf0, 0x1C, 0 } }, /* 01e */ + { { 0x1B, 0 }, { 0xf0, 0x1B, 0 } }, /* 01f */ + { { 0x23, 0 }, { 0xf0, 0x23, 0 } }, /* 020 */ + { { 0x2B, 0 }, { 0xf0, 0x2B, 0 } }, /* 021 */ + { { 0x34, 0 }, { 0xf0, 0x34, 0 } }, /* 022 */ + { { 0x33, 0 }, { 0xf0, 0x33, 0 } }, /* 023 */ + { { 0x3B, 0 }, { 0xf0, 0x3B, 0 } }, /* 024 */ + { { 0x42, 0 }, { 0xf0, 0x42, 0 } }, /* 025 */ + { { 0x4B, 0 }, { 0xf0, 0x4B, 0 } }, /* 026 */ + { { 0x4C, 0 }, { 0xf0, 0x4C, 0 } }, /* 027 */ + { { 0x52, 0 }, { 0xf0, 0x52, 0 } }, /* 028 */ + { { 0x0E, 0 }, { 0xf0, 0x0E, 0 } }, /* 029 */ + { { 0x12, 0 }, { 0xf0, 0x12, 0 } }, /* 02a */ + { { 0x5C, 0 }, { 0xf0, 0x5C, 0 } }, /* 02b */ + { { 0x1A, 0 }, { 0xf0, 0x1A, 0 } }, /* 02c */ + { { 0x22, 0 }, { 0xf0, 0x22, 0 } }, /* 02d */ + { { 0x21, 0 }, { 0xf0, 0x21, 0 } }, /* 02e */ + { { 0x2A, 0 }, { 0xf0, 0x2A, 0 } }, /* 02f */ + { { 0x32, 0 }, { 0xf0, 0x32, 0 } }, /* 030 */ + { { 0x31, 0 }, { 0xf0, 0x31, 0 } }, /* 031 */ + { { 0x3A, 0 }, { 0xf0, 0x3A, 0 } }, /* 032 */ + { { 0x41, 0 }, { 0xf0, 0x41, 0 } }, /* 033 */ + { { 0x49, 0 }, { 0xf0, 0x49, 0 } }, /* 034 */ + { { 0x4A, 0 }, { 0xf0, 0x4A, 0 } }, /* 035 */ + { { 0x59, 0 }, { 0xf0, 0x59, 0 } }, /* 036 */ + { { 0x7E, 0 }, { 0xf0, 0x7E, 0 } }, /* 037 */ + { { 0x19, 0 }, { 0xf0, 0x19, 0 } }, /* 038 */ + { { 0x29, 0 }, { 0xf0, 0x29, 0 } }, /* 039 */ + { { 0x14, 0 }, { 0xf0, 0x14, 0 } }, /* 03a */ + { { 0x07, 0 }, { 0xf0, 0x07, 0 } }, /* 03b */ + { { 0x0F, 0 }, { 0xf0, 0x0F, 0 } }, /* 03c */ + { { 0x17, 0 }, { 0xf0, 0x17, 0 } }, /* 03d */ + { { 0x1F, 0 }, { 0xf0, 0x1F, 0 } }, /* 03e */ + { { 0x27, 0 }, { 0xf0, 0x27, 0 } }, /* 03f */ + { { 0x2F, 0 }, { 0xf0, 0x2F, 0 } }, /* 040 */ + { { 0x37, 0 }, { 0xf0, 0x37, 0 } }, /* 041 */ + { { 0x3F, 0 }, { 0xf0, 0x3F, 0 } }, /* 042 */ + { { 0x47, 0 }, { 0xf0, 0x47, 0 } }, /* 043 */ + { { 0x4F, 0 }, { 0xf0, 0x4F, 0 } }, /* 044 */ + { { 0x76, 0 }, { 0xf0, 0x76, 0 } }, /* 045 */ + { { 0x5F, 0 }, { 0xf0, 0x5F, 0 } }, /* 046 */ + { { 0x6C, 0 }, { 0xf0, 0x6C, 0 } }, /* 047 */ + { { 0x75, 0 }, { 0xf0, 0x75, 0 } }, /* 048 */ + { { 0x7D, 0 }, { 0xf0, 0x7D, 0 } }, /* 049 */ + { { 0x84, 0 }, { 0xf0, 0x84, 0 } }, /* 04a */ + { { 0x6B, 0 }, { 0xf0, 0x6B, 0 } }, /* 04b */ + { { 0x73, 0 }, { 0xf0, 0x73, 0 } }, /* 04c */ + { { 0x74, 0 }, { 0xf0, 0x74, 0 } }, /* 04d */ + { { 0x7C, 0 }, { 0xf0, 0x7C, 0 } }, /* 04e */ + { { 0x69, 0 }, { 0xf0, 0x69, 0 } }, /* 04f */ + { { 0x72, 0 }, { 0xf0, 0x72, 0 } }, /* 050 */ + { { 0x7A, 0 }, { 0xf0, 0x7A, 0 } }, /* 051 */ + { { 0x70, 0 }, { 0xf0, 0x70, 0 } }, /* 052 */ + { { 0x71, 0 }, { 0xf0, 0x71, 0 } }, /* 053 */ + { { 0x57, 0 }, { 0xf0, 0x57, 0 } }, /* 054 */ + { { 0x60, 0 }, { 0xf0, 0x60, 0 } }, /* 055 */ + { { 0 }, { 0 } }, /* 056 */ + { { 0x56, 0 }, { 0xf0, 0x56, 0 } }, /* 057 */ + { { 0x5E, 0 }, { 0xf0, 0x5E, 0 } }, /* 058 */ + { { 0 }, { 0 } }, /* 059 */ + { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, /* 05b */ + { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, /* 05d */ + { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, /* 05f */ + { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, /* 061 */ + { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, /* 063 */ + { { 0 }, { 0 } }, /* 064 */ + { { 0x10, 0 }, { 0xf0, 0x10, 0 } }, /* 065 */ + { { 0x18, 0 }, { 0xf0, 0x18, 0 } }, /* 066 */ + { { 0x20, 0 }, { 0xf0, 0x20, 0 } }, /* 067 */ + { { 0x28, 0 }, { 0xf0, 0x28, 0 } }, /* 068 */ + { { 0x30, 0 }, { 0xf0, 0x30, 0 } }, /* 069 */ + { { 0x38, 0 }, { 0xf0, 0x38, 0 } }, /* 06a */ + { { 0x40, 0 }, { 0xf0, 0x40, 0 } }, /* 06b */ + { { 0x48, 0 }, { 0xf0, 0x48, 0 } }, /* 06c */ + { { 0x50, 0 }, { 0xf0, 0x50, 0 } }, /* 06d */ + { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, /* 06f */ + { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 070 */ + { { 0 }, { 0 } }, /* 071 */ + { { 0 }, { 0 } }, /* 072 */ + { { 0x51, 0 }, { 0xf0, 0x51, 0 } }, /* 073 */ + { { 0x53, 0 }, { 0xf0, 0x53, 0 } }, /* 074 */ + { { 0x5C, 0 }, { 0xf0, 0x5C, 0 } }, /* 075 */ + { { 0 }, { 0 } }, /* 076 */ + { { 0x62, 0 }, { 0xf0, 0x62, 0 } }, /* 077 */ + { { 0x63, 0 }, { 0xf0, 0x63, 0 } }, /* 078 */ + { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, /* 079 */ + { { 0 }, { 0 } }, /* 07a */ + { { 0x85, 0 }, { 0xf0, 0x85, 0 } }, /* 07b */ + { { 0x68, 0 }, { 0xf0, 0x68, 0 } }, /* 07c */ + { { 0x13, 0 }, { 0xf0, 0x13, 0 } }, /* 07d */ + { { 0 }, { 0 } }, /* 07e */ + { { 0 }, { 0 } }, /* 07f */ + { { 0x80, 0 }, { 0xf0, 0x80, 0 } }, /* 080 */ + { { 0x81, 0 }, { 0xf0, 0x81, 0 } }, /* 081 */ + { { 0x82, 0 }, { 0xf0, 0x82, 0 } }, /* 082 */ + { { 0 }, { 0 } }, /* 083 */ + { { 0 }, { 0 } }, /* 084 */ + { { 0x85, 0 }, { 0xf0, 0x54, 0 } }, /* 085 */ + { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, /* 086 */ + { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 087 */ + { { 0x88, 0 }, { 0xf0, 0x88, 0 } }, /* 087 */ + { { 0x89, 0 }, { 0xf0, 0x89, 0 } }, /* 088 */ + { { 0x8a, 0 }, { 0xf0, 0x8a, 0 } }, /* 089 */ + { { 0x8b, 0 }, { 0xf0, 0x8b, 0 } }, /* 08b */ + { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, /* 08d */ + { { 0x8e, 0 }, { 0xf0, 0x8e, 0 } }, /* 08e */ + { { 0x8f, 0 }, { 0xf0, 0x8f, 0 } }, /* 08f */ + { { 0x90, 0 }, { 0xf0, 0x90, 0 } }, /* 090 */ + { { 0x91, 0 }, { 0xf0, 0x91, 0 } }, /* 091 */ + { { 0x92, 0 }, { 0xf0, 0x92, 0 } }, /* 092 */ + { { 0x93, 0 }, { 0xf0, 0x93, 0 } }, /* 093 */ + { { 0x94, 0 }, { 0xf0, 0x94, 0 } }, /* 094 */ + { { 0x95, 0 }, { 0xf0, 0x95, 0 } }, /* 095 */ + { { 0x96, 0 }, { 0xf0, 0x96, 0 } }, /* 096 */ + { { 0x97, 0 }, { 0xf0, 0x97, 0 } }, /* 097 */ + { { 0x98, 0 }, { 0xf0, 0x98, 0 } }, /* 098 */ + { { 0x99, 0 }, { 0xf0, 0x99, 0 } }, /* 099 */ + { { 0x9a, 0 }, { 0xf0, 0x9a, 0 } }, /* 09a */ + { { 0x9b, 0 }, { 0xf0, 0x9b, 0 } }, /* 09b */ + { { 0x9c, 0 }, { 0xf0, 0x9c, 0 } }, /* 09c */ + { { 0x9d, 0 }, { 0xf0, 0x9d, 0 } }, /* 09d */ + { { 0x9e, 0 }, { 0xf0, 0x9e, 0 } }, /* 09e */ + { { 0x9f, 0 }, { 0xf0, 0x9f, 0 } }, /* 09f */ + { { 0xa0, 0 }, { 0xf0, 0xa0, 0 } }, /* 0a0 */ + { { 0xa1, 0 }, { 0xf0, 0xa1, 0 } }, /* 0a1 */ + { { 0xa2, 0 }, { 0xf0, 0xa2, 0 } }, /* 0a2 */ + { { 0xa3, 0 }, { 0xf0, 0xa3, 0 } }, /* 0a3 */ + { { 0xa4, 0 }, { 0xf0, 0xa4, 0 } }, /* 0a4 */ + { { 0xa5, 0 }, { 0xf0, 0xa5, 0 } }, /* 0a5 */ + { { 0xa6, 0 }, { 0xf0, 0xa6, 0 } }, /* 0a6 */ + { { 0xa7, 0 }, { 0xf0, 0xa7, 0 } }, /* 0a7 */ + { { 0xa8, 0 }, { 0xf0, 0xa8, 0 } }, /* 0a8 */ + { { 0xa9, 0 }, { 0xf0, 0xa9, 0 } }, /* 0a9 */ + { { 0xaa, 0 }, { 0xf0, 0xaa, 0 } }, /* 0aa */ + { { 0xab, 0 }, { 0xf0, 0xab, 0 } }, /* 0ab */ + { { 0xac, 0 }, { 0xf0, 0xac, 0 } }, /* 0ac */ + { { 0xad, 0 }, { 0xf0, 0xad, 0 } }, /* 0ad */ + { { 0xae, 0 }, { 0xf0, 0xae, 0 } }, /* 0ae */ + { { 0xaf, 0 }, { 0xf0, 0xaf, 0 } }, /* 0af */ + { { 0xb0, 0 }, { 0xf0, 0xb0, 0 } }, /* 0b0 */ + { { 0xb1, 0 }, { 0xf0, 0xb1, 0 } }, /* 0b1 */ + { { 0xb2, 0 }, { 0xf0, 0xb2, 0 } }, /* 0b2 */ + { { 0xb3, 0 }, { 0xf0, 0xb3, 0 } }, /* 0b3 */ + { { 0xb4, 0 }, { 0xf0, 0xb4, 0 } }, /* 0b4 */ + { { 0xb5, 0 }, { 0xf0, 0xb5, 0 } }, /* 0b5 */ + { { 0xb6, 0 }, { 0xf0, 0xb6, 0 } }, /* 0b6 */ + { { 0xb7, 0 }, { 0xf0, 0xb7, 0 } }, /* 0b7 */ + { { 0xb8, 0 }, { 0xf0, 0xb8, 0 } }, /* 0b8 */ + { { 0xb9, 0 }, { 0xf0, 0xb9, 0 } }, /* 0b9 */ + { { 0xba, 0 }, { 0xf0, 0xba, 0 } }, /* 0ba */ + { { 0xbb, 0 }, { 0xf0, 0xbb, 0 } }, /* 0bb */ + { { 0xbc, 0 }, { 0xf0, 0xbc, 0 } }, /* 0bc */ + { { 0xbd, 0 }, { 0xf0, 0xbd, 0 } }, /* 0bd */ + { { 0xbe, 0 }, { 0xf0, 0xbe, 0 } }, /* 0be */ + { { 0xbf, 0 }, { 0xf0, 0xbf, 0 } }, /* 0bf */ + { { 0xc0, 0 }, { 0xf0, 0xc0, 0 } }, /* 0c0 */ + { { 0xc1, 0 }, { 0xf0, 0xc1, 0 } }, /* 0c1 */ + { { 0xc2, 0 }, { 0xf0, 0xc2, 0 } }, /* 0c2 */ + { { 0xc3, 0 }, { 0xf0, 0xc3, 0 } }, /* 0c3 */ + { { 0xc4, 0 }, { 0xf0, 0xc4, 0 } }, /* 0c4 */ + { { 0xc5, 0 }, { 0xf0, 0xc5, 0 } }, /* 0c5 */ + { { 0xc6, 0 }, { 0xf0, 0xc6, 0 } }, /* 0c6 */ + { { 0xc7, 0 }, { 0xf0, 0xc7, 0 } }, /* 0c7 */ + { { 0xc8, 0 }, { 0xf0, 0xc8, 0 } }, /* 0c8 */ + { { 0xc9, 0 }, { 0xf0, 0xc9, 0 } }, /* 0c9 */ + { { 0xca, 0 }, { 0xf0, 0xca, 0 } }, /* 0ca */ + { { 0xcb, 0 }, { 0xf0, 0xcb, 0 } }, /* 0cb */ + { { 0xcc, 0 }, { 0xf0, 0xcc, 0 } }, /* 0cc */ + { { 0xcd, 0 }, { 0xf0, 0xcd, 0 } }, /* 0cd */ + { { 0xce, 0 }, { 0xf0, 0xce, 0 } }, /* 0ce */ + { { 0xcf, 0 }, { 0xf0, 0xcf, 0 } }, /* 0cf */ + { { 0xd0, 0 }, { 0xf0, 0xd0, 0 } }, /* 0d0 */ + { { 0xd1, 0 }, { 0xf0, 0xd0, 0 } }, /* 0d1 */ + { { 0xd2, 0 }, { 0xf0, 0xd2, 0 } }, /* 0d2 */ + { { 0xd3, 0 }, { 0xf0, 0xd3, 0 } }, /* 0d3 */ + { { 0xd4, 0 }, { 0xf0, 0xd4, 0 } }, /* 0d4 */ + { { 0xd5, 0 }, { 0xf0, 0xd5, 0 } }, /* 0d5 */ + { { 0xd6, 0 }, { 0xf0, 0xd6, 0 } }, /* 0d6 */ + { { 0xd7, 0 }, { 0xf0, 0xd7, 0 } }, /* 0d7 */ + { { 0xd8, 0 }, { 0xf0, 0xd8, 0 } }, /* 0d8 */ + { { 0xd9, 0 }, { 0xf0, 0xd9, 0 } }, /* 0d9 */ + { { 0xda, 0 }, { 0xf0, 0xda, 0 } }, /* 0da */ + { { 0xdb, 0 }, { 0xf0, 0xdb, 0 } }, /* 0db */ + { { 0xdc, 0 }, { 0xf0, 0xdc, 0 } }, /* 0dc */ + { { 0xdd, 0 }, { 0xf0, 0xdd, 0 } }, /* 0dd */ + { { 0xde, 0 }, { 0xf0, 0xde, 0 } }, /* 0de */ + { { 0xdf, 0 }, { 0xf0, 0xdf, 0 } }, /* 0df */ + { { 0xe0, 0 }, { 0xf0, 0xe0, 0 } }, /* 0e0 */ + { { 0xe1, 0 }, { 0xf0, 0xe1, 0 } }, /* 0e1 */ + { { 0xe2, 0 }, { 0xf0, 0xe2, 0 } }, /* 0e2 */ + { { 0xe3, 0 }, { 0xf0, 0xe3, 0 } }, /* 0e3 */ + { { 0xe4, 0 }, { 0xf0, 0xe4, 0 } }, /* 0e4 */ + { { 0xe5, 0 }, { 0xf0, 0xe5, 0 } }, /* 0e5 */ + { { 0xe6, 0 }, { 0xf0, 0xe6, 0 } }, /* 0e6 */ + { { 0xe7, 0 }, { 0xf0, 0xe7, 0 } }, /* 0e7 */ + { { 0xe8, 0 }, { 0xf0, 0xe8, 0 } }, /* 0e7 */ + { { 0xe9, 0 }, { 0xf0, 0xe9, 0 } }, /* 0e8 */ + { { 0xea, 0 }, { 0xf0, 0xea, 0 } }, /* 0e9 */ + { { 0xeb, 0 }, { 0xf0, 0xeb, 0 } }, /* 0eb */ + { { 0xec, 0 }, { 0xf0, 0xec, 0 } }, /* 0ec */ + { { 0xed, 0 }, { 0xf0, 0xed, 0 } }, /* 0ed */ + { { 0xee, 0 }, { 0xf0, 0xee, 0 } }, /* 0ee */ + { { 0xef, 0 }, { 0xf0, 0xef, 0 } }, /* 0ef */ + { { 0 }, { 0 } }, /* 0f0 */ + { { 0xf1, 0 }, { 0xf0, 0xf1, 0 } }, /* 0f1 */ + { { 0xf2, 0 }, { 0xf0, 0xf2, 0 } }, /* 0f2 */ + { { 0xf3, 0 }, { 0xf0, 0xf3, 0 } }, /* 0f3 */ + { { 0xf4, 0 }, { 0xf0, 0xf4, 0 } }, /* 0f4 */ + { { 0xf5, 0 }, { 0xf0, 0xf5, 0 } }, /* 0f5 */ + { { 0xf6, 0 }, { 0xf0, 0xf6, 0 } }, /* 0f6 */ + { { 0xf7, 0 }, { 0xf0, 0xf7, 0 } }, /* 0f7 */ + { { 0xf8, 0 }, { 0xf0, 0xf8, 0 } }, /* 0f8 */ + { { 0xf9, 0 }, { 0xf0, 0xf9, 0 } }, /* 0f9 */ + { { 0xfa, 0 }, { 0xf0, 0xfa, 0 } }, /* 0fa */ + { { 0xfb, 0 }, { 0xf0, 0xfb, 0 } }, /* 0fb */ + { { 0xfc, 0 }, { 0xf0, 0xfc, 0 } }, /* 0fc */ + { { 0xfd, 0 }, { 0xf0, 0xfd, 0 } }, /* 0fd */ + { { 0xfe, 0 }, { 0xf0, 0xfe, 0 } }, /* 0fe */ + { { 0xff, 0 }, { 0xf0, 0xff, 0 } }, /* 0ff */ + { { 0x62, 0 }, { 0xF0, 0x62, 0 } }, /* 100 */ + { { 0xe0, 0x76, 0 }, { 0xe0, 0xF0, 0x76, 0 } }, /* 101 */ + { { 0xe0, 0x16, 0 }, { 0xe0, 0xF0, 0x16, 0 } }, /* 102 */ + { { 0xe0, 0x1E, 0 }, { 0xe0, 0xF0, 0x1E, 0 } }, /* 103 */ + { { 0xe0, 0x26, 0 }, { 0xe0, 0xF0, 0x26, 0 } }, /* 104 */ + { { 0xe0, 0x25, 0 }, { 0xe0, 0xF0, 0x25, 0 } }, /* 105 */ + { { 0xe0, 0x2E, 0 }, { 0xe0, 0xF0, 0x2E, 0 } }, /* 106 */ + { { 0xe0, 0x36, 0 }, { 0xe0, 0xF0, 0x36, 0 } }, /* 107 */ + { { 0xe0, 0x3D, 0 }, { 0xe0, 0xF0, 0x3D, 0 } }, /* 108 */ + { { 0xe0, 0x3E, 0 }, { 0xe0, 0xF0, 0x3E, 0 } }, /* 109 */ + { { 0xe0, 0x46, 0 }, { 0xe0, 0xF0, 0x46, 0 } }, /* 10a */ + { { 0xe0, 0x45, 0 }, { 0xe0, 0xF0, 0x45, 0 } }, /* 10b */ + { { 0xe0, 0x4E, 0 }, { 0xe0, 0xF0, 0x4E, 0 } }, /* 10c */ + { { 0 }, { 0 } }, /* 10d */ + { { 0xe0, 0x66, 0 }, { 0xe0, 0xF0, 0x66, 0 } }, /* 10e */ + { { 0xe0, 0x0D, 0 }, { 0xe0, 0xF0, 0x0D, 0 } }, /* 10f */ + { { 0xe0, 0x15, 0 }, { 0xe0, 0xF0, 0x15, 0 } }, /* 110 */ + { { 0xe0, 0x1D, 0 }, { 0xe0, 0xF0, 0x1D, 0 } }, /* 111 */ + { { 0xe0, 0x24, 0 }, { 0xe0, 0xF0, 0x24, 0 } }, /* 112 */ + { { 0xe0, 0x2D, 0 }, { 0xe0, 0xF0, 0x2D, 0 } }, /* 113 */ + { { 0xe0, 0x2C, 0 }, { 0xe0, 0xF0, 0x2C, 0 } }, /* 114 */ + { { 0xe0, 0x35, 0 }, { 0xe0, 0xF0, 0x35, 0 } }, /* 115 */ + { { 0xe0, 0x3C, 0 }, { 0xe0, 0xF0, 0x3C, 0 } }, /* 116 */ + { { 0xe0, 0x43, 0 }, { 0xe0, 0xF0, 0x43, 0 } }, /* 117 */ + { { 0xe0, 0x44, 0 }, { 0xe0, 0xF0, 0x44, 0 } }, /* 118 */ + { { 0xe0, 0x4D, 0 }, { 0xe0, 0xF0, 0x4D, 0 } }, /* 119 */ + { { 0xe0, 0x54, 0 }, { 0xe0, 0xF0, 0x54, 0 } }, /* 11a */ + { { 0xe0, 0x5B, 0 }, { 0xe0, 0xF0, 0x5B, 0 } }, /* 11b */ + { { 0x79, 0 }, { 0xf0, 0x79, 0 } }, /* 11c */ + { { 0x58, 0 }, { 0xf0, 0x58, 0 } }, /* 11d */ + { { 0xe0, 0x1C, 0 }, { 0xe0, 0xF0, 0x1C, 0 } }, /* 11e */ + { { 0xe0, 0x1B, 0 }, { 0xe0, 0xF0, 0x1B, 0 } }, /* 11f */ + { { 0xe0, 0x23, 0 }, { 0xe0, 0xF0, 0x23, 0 } }, /* 120 */ + { { 0xe0, 0x2B, 0 }, { 0xe0, 0xF0, 0x2B, 0 } }, /* 121 */ + { { 0xe0, 0x34, 0 }, { 0xe0, 0xF0, 0x34, 0 } }, /* 122 */ + { { 0xe0, 0x33, 0 }, { 0xe0, 0xF0, 0x33, 0 } }, /* 123 */ + { { 0xe0, 0x3B, 0 }, { 0xe0, 0xF0, 0x3B, 0 } }, /* 124 */ + { { 0xe0, 0x42, 0 }, { 0xe0, 0xF0, 0x42, 0 } }, /* 125 */ + { { 0xe0, 0x4B, 0 }, { 0xe0, 0xF0, 0x4B, 0 } }, /* 126 */ + { { 0 }, { 0 } }, /* 127 */ + { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, /* 129 */ + { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, /* 12b */ + { { 0xe0, 0x1A, 0 }, { 0xe0, 0xF0, 0x1A, 0 } }, /* 12c */ + { { 0xe0, 0x22, 0 }, { 0xe0, 0xF0, 0x22, 0 } }, /* 12d */ + { { 0xe0, 0x21, 0 }, { 0xe0, 0xF0, 0x21, 0 } }, /* 12e */ + { { 0xe0, 0x2A, 0 }, { 0xe0, 0xF0, 0x2A, 0 } }, /* 12f */ + { { 0xe0, 0x32, 0 }, { 0xe0, 0xF0, 0x32, 0 } }, /* 130 */ + { { 0xe0, 0x31, 0 }, { 0xe0, 0xF0, 0x31, 0 } }, /* 131 */ + { { 0xe0, 0x3A, 0 }, { 0xe0, 0xF0, 0x3A, 0 } }, /* 132 */ + { { 0 }, { 0 } }, /* 133 */ + { { 0xe0, 0x49, 0 }, { 0xe0, 0xF0, 0x49, 0 } }, /* 134 */ + { { 0x77, 0 }, { 0xf0, 0x77, 0 } }, /* 135 */ + { { 0 }, { 0 } }, /* 136 */ + { { 0x57, 0 }, { 0xf0, 0x57, 0 } }, /* 137 */ + { { 0x39, 0 }, { 0xf0, 0x39, 0 } }, /* 138 */ + { { 0 }, { 0 } }, /* 139 */ + { { 0xe0, 0x58, 0 }, { 0xe0, 0xF0, 0x58, 0 } }, /* 13a */ + { { 0xe0, 0x05, 0 }, { 0xe0, 0xF0, 0x05, 0 } }, /* 13b */ + { { 0xe0, 0x06, 0 }, { 0xe0, 0xF0, 0x06, 0 } }, /* 13c */ + { { 0xe0, 0x04, 0 }, { 0xe0, 0xF0, 0x04, 0 } }, /* 13d */ + { { 0xe0, 0x0C, 0 }, { 0xe0, 0xF0, 0x0C, 0 } }, /* 13e */ + { { 0xe0, 0x03, 0 }, { 0xe0, 0xF0, 0x03, 0 } }, /* 13f */ + { { 0xe0, 0x0B, 0 }, { 0xe0, 0xF0, 0x0B, 0 } }, /* 140 */ + { { 0xe0, 0x02, 0 }, { 0xe0, 0xF0, 0x02, 0 } }, /* 141 */ + { { 0xe0, 0x0A, 0 }, { 0xe0, 0xF0, 0x0A, 0 } }, /* 142 */ + { { 0xe0, 0x01, 0 }, { 0xe0, 0xF0, 0x01, 0 } }, /* 143 */ + { { 0xe0, 0x09, 0 }, { 0xe0, 0xF0, 0x09, 0 } }, /* 144 */ + { { 0 }, { 0 } }, /* 145 */ + { { 0xe0, 0x7E, 0 }, { 0xe0, 0xF0, 0x7E, 0 } }, /* 146 */ + { { 0x6E, 0 }, { 0xf0, 0x6E, 0 } }, /* 147 */ + { { 0x63, 0 }, { 0xf0, 0x63, 0 } }, /* 148 */ + { { 0x6F, 0 }, { 0xf0, 0x6F, 0 } }, /* 149 */ + { { 0 }, { 0 } }, /* 14a */ + { { 0x61, 0 }, { 0xf0, 0x61, 0 } }, /* 14b */ + { { 0xe0, 0x73, 0 }, { 0xe0, 0xF0, 0x73, 0 } }, /* 14c */ + { { 0x6A, 0 }, { 0xf0, 0x6A, 0 } }, /* 14d */ + { { 0xe0, 0x79, 0 }, { 0xe0, 0xF0, 0x79, 0 } }, /* 14e */ + { { 0x65, 0 }, { 0xf0, 0x65, 0 } }, /* 14f */ + { { 0x60, 0 }, { 0xf0, 0x60, 0 } }, /* 150 */ + { { 0x6D, 0 }, { 0xf0, 0x6D, 0 } }, /* 151 */ + { { 0x67, 0 }, { 0xf0, 0x67, 0 } }, /* 152 */ + { { 0x64, 0 }, { 0xf0, 0x64, 0 } }, /* 153 */ + { { 0xd4, 0 }, { 0xf0, 0xD4, 0 } }, /* 154 */ + { { 0xe0, 0x60, 0 }, { 0xe0, 0xF0, 0x60, 0 } }, /* 155 */ + { { 0 }, { 0 } }, /* 156 */ + { { 0xe0, 0x78, 0 }, { 0xe0, 0xF0, 0x78, 0 } }, /* 157 */ + { { 0xe0, 0x07, 0 }, { 0xe0, 0xF0, 0x07, 0 } }, /* 158 */ + { { 0xe0, 0x0F, 0 }, { 0xe0, 0xF0, 0x0F, 0 } }, /* 159 */ + { { 0xe0, 0x17, 0 }, { 0xe0, 0xF0, 0x17, 0 } }, /* 15a */ + { { 0x8B, 0 }, { 0xf0, 0x8B, 0 } }, /* 15b */ + { { 0x8C, 0 }, { 0xf0, 0x8C, 0 } }, /* 15c */ + { { 0x8D, 0 }, { 0xf0, 0x8D, 0 } }, /* 15d */ + { { 0 }, { 0 } }, /* 15e */ + { { 0x7F, 0 }, { 0xf0, 0x7F, 0 } }, /* 15f */ + { { 0 }, { 0 } }, /* 160 */ + { { 0xe0, 0x4F, 0 }, { 0xe0, 0xF0, 0x4F, 0 } }, /* 161 */ + { { 0xe0, 0x56, 0 }, { 0xe0, 0xF0, 0x56, 0 } }, /* 162 */ + { { 0 }, { 0 } }, /* 163 */ + { { 0xe0, 0x08, 0 }, { 0xe0, 0xF0, 0x08, 0 } }, /* 164 */ + { { 0xe0, 0x10, 0 }, { 0xe0, 0xF0, 0x10, 0 } }, /* 165 */ + { { 0xe0, 0x18, 0 }, { 0xe0, 0xF0, 0x18, 0 } }, /* 166 */ + { { 0xe0, 0x20, 0 }, { 0xe0, 0xF0, 0x20, 0 } }, /* 167 */ + { { 0xe0, 0x28, 0 }, { 0xe0, 0xF0, 0x28, 0 } }, /* 168 */ + { { 0xe0, 0x30, 0 }, { 0xe0, 0xF0, 0x30, 0 } }, /* 169 */ + { { 0xe0, 0x38, 0 }, { 0xe0, 0xF0, 0x38, 0 } }, /* 16a */ + { { 0xe0, 0x40, 0 }, { 0xe0, 0xF0, 0x40, 0 } }, /* 16b */ + { { 0xe0, 0x48, 0 }, { 0xe0, 0xF0, 0x48, 0 } }, /* 16c */ + { { 0xe0, 0x50, 0 }, { 0xe0, 0xF0, 0x50, 0 } }, /* 16d */ + { { 0xe0, 0x57, 0 }, { 0xe0, 0xF0, 0x57, 0 } }, /* 16e */ + { { 0 }, { 0 } }, /* 16f */ + { { 0xe0, 0x13, 0 }, { 0xe0, 0xF0, 0x13, 0 } }, /* 170 */ + { { 0xe0, 0x19, 0 }, { 0xe0, 0xF0, 0x19, 0 } }, /* 171 */ + { { 0xe0, 0x39, 0 }, { 0xe0, 0xF0, 0x39, 0 } }, /* 172 */ + { { 0xe0, 0x51, 0 }, { 0xe0, 0xF0, 0x51, 0 } }, /* 173 */ + { { 0xe0, 0x53, 0 }, { 0xe0, 0xF0, 0x53, 0 } }, /* 174 */ + { { 0xe0, 0x5C, 0 }, { 0xe0, 0xF0, 0x5C, 0 } }, /* 175 */ + { { 0 }, { 0 } }, /* 176 */ + { { 0xe0, 0x62, 0 }, { 0xe0, 0xF0, 0x62, 0 } }, /* 177 */ + { { 0xe0, 0x63, 0 }, { 0xe0, 0xF0, 0x63, 0 } }, /* 178 */ + { { 0xe0, 0x64, 0 }, { 0xe0, 0xF0, 0x64, 0 } }, /* 179 */ + { { 0xe0, 0x65, 0 }, { 0xe0, 0xF0, 0x65, 0 } }, /* 17a */ + { { 0xe0, 0x67, 0 }, { 0xe0, 0xF0, 0x67, 0 } }, /* 17b */ + { { 0xe0, 0x68, 0 }, { 0xe0, 0xF0, 0x68, 0 } }, /* 17c */ + { { 0xe0, 0x6A, 0 }, { 0xe0, 0xF0, 0x6A, 0 } }, /* 17d */ + { { 0xe0, 0x6D, 0 }, { 0xe0, 0xF0, 0x6D, 0 } }, /* 17e */ + { { 0xe0, 0x6E, 0 }, { 0xe0, 0xF0, 0x6E, 0 } }, /* 17f */ + { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, /* 181 */ + { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, /* 183 */ + { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, /* 185 */ + { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, /* 187 */ + { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, /* 189 */ + { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, /* 18b */ + { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, /* 18d */ + { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, /* 18f */ + { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, /* 191 */ + { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, /* 193 */ + { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, /* 195 */ + { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, /* 197 */ + { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, /* 199 */ + { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, /* 19b */ + { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, /* 19d */ + { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, /* 19f */ + { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, /* 1a1 */ + { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, /* 1a3 */ + { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, /* 1a5 */ + { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, /* 1a7 */ + { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, /* 1a9 */ + { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, /* 1ab */ + { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, /* 1ad */ + { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, /* 1c1 */ + { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, /* 1c3 */ + { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, /* 1c5 */ + { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, /* 1c7 */ + { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, /* 1c9 */ + { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, /* 1cb */ + { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, /* 1cd */ + { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, /* 1cf */ + { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, /* 1d1 */ + { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, /* 1d5 */ + { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, /* 1d7 */ + { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, /* 1d9 */ + { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, /* 1db */ + { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, /* 1dd */ + { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, /* 1df */ + { { 0 }, { 0 } }, /* 1e0 */ + { { 0xe0, 0xe1, 0 }, { 0xe0, 0xF0, 0xE1, 0 } }, /* 1e1 */ + { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, /* 1e3 */ + { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, /* 1e5 */ + { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, /* 1e7 */ + { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, /* 1e9 */ + { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, /* 1eb */ + { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, /* 1ed */ + { { 0xe0, 0xee, 0 }, { 0xe0, 0xF0, 0xEE, 0 } }, /* 1ee */ + { { 0 }, { 0 } }, /* 1ef */ + { { 0 }, { 0 } }, /* 1f0 */ + { { 0xe0, 0xf1, 0 }, { 0xe0, 0xF0, 0xF1, 0 } }, /* 1f1 */ + { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, /* 1f3 */ + { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, /* 1f5 */ + { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, /* 1f7 */ + { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, /* 1f9 */ + { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, /* 1fb */ + { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, /* 1fd */ + { { 0xe0, 0xfe, 0 }, { 0xe0, 0xF0, 0xFE, 0 } }, /* 1fe */ + { { 0xe0, 0xff, 0 }, { 0xe0, 0xF0, 0xFF, 0 } } /* 1ff */ // clang-format on }; diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index c2404231f..ea2564aa9 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -90,265 +90,518 @@ typedef struct xtkbd_t { /*XT keyboard has no escape scancodes, and no scancodes beyond 53*/ const scancode scancode_xt[512] = { // clang-format off - { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ - { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ - { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ - { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ - { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ - { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ - { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ - { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ - { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ - { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ - { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ - { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ - { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ - { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ - { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ - { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ - { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ - { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ - { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ - { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ - { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ - { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ - { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ - { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ - { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ - { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ - { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ - { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ - { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ - { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ - { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ - { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ - { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ - { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ - { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ - { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 054 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 056 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 058 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 064 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 066 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 068 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 070 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 072 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 074 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 076 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 078 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 080 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 084 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 086 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 088 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 090 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 092 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 094 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 096 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 098 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ba */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0bc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0be */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0de */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ec */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fe */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 100 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 102 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 104 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 106 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 108 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 110 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 112 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 114 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 116 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 118 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11a */ - { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 11c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 120 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 122 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 130 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 132 */ - { { 0 }, { 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 134 */ - { { 0 }, { 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 136 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 140 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 142 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 144 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 146 */ - { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 148 */ - { { 0 }, { 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 14a */ - { { 0 }, { 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 14c */ - { { 0 }, { 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14e */ - { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 150 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 152 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 154 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 156 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 158 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 160 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 162 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 164 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 166 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 168 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 170 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 172 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 174 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 176 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 178 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } } /* 1fe */ + { { 0 }, { 0 } }, /* 000 */ + { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ + { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ + { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ + { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ + { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ + { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ + { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ + { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ + { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ + { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ + { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ + { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ + { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ + { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ + { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ + { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ + { { 0x12, 0 }, { 0x92, 0 } }, /* 012 */ + { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ + { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ + { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ + { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ + { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ + { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ + { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ + { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ + { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ + { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ + { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ + { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ + { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ + { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ + { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ + { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ + { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ + { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ + { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ + { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ + { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ + { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ + { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ + { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ + { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ + { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ + { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ + { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ + { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ + { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ + { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ + { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ + { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ + { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ + { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ + { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ + { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ + { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ + { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ + { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ + { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ + { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ + { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ + { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ + { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ + { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ + { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ + { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ + { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ + { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ + { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ + { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ + { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ + { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ + { { 0 }, { 0 } }, /* 054 */ + { { 0 }, { 0 } }, /* 055 */ + { { 0 }, { 0 } }, /* 056 */ + { { 0 }, { 0 } }, /* 057 */ + { { 0 }, { 0 } }, /* 058 */ + { { 0 }, { 0 } }, /* 059 */ + { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, /* 05b */ + { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, /* 05d */ + { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, /* 05f */ + { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, /* 061 */ + { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, /* 063 */ + { { 0 }, { 0 } }, /* 064 */ + { { 0 }, { 0 } }, /* 065 */ + { { 0 }, { 0 } }, /* 066 */ + { { 0 }, { 0 } }, /* 067 */ + { { 0 }, { 0 } }, /* 068 */ + { { 0 }, { 0 } }, /* 069 */ + { { 0 }, { 0 } }, /* 06a */ + { { 0 }, { 0 } }, /* 06b */ + { { 0 }, { 0 } }, /* 06c */ + { { 0 }, { 0 } }, /* 06d */ + { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, /* 06f */ + { { 0 }, { 0 } }, /* 070 */ + { { 0 }, { 0 } }, /* 071 */ + { { 0 }, { 0 } }, /* 072 */ + { { 0 }, { 0 } }, /* 073 */ + { { 0 }, { 0 } }, /* 074 */ + { { 0 }, { 0 } }, /* 075 */ + { { 0 }, { 0 } }, /* 076 */ + { { 0 }, { 0 } }, /* 077 */ + { { 0 }, { 0 } }, /* 078 */ + { { 0 }, { 0 } }, /* 079 */ + { { 0 }, { 0 } }, /* 07a */ + { { 0 }, { 0 } }, /* 07b */ + { { 0 }, { 0 } }, /* 07c */ + { { 0 }, { 0 } }, /* 07d */ + { { 0 }, { 0 } }, /* 07e */ + { { 0 }, { 0 } }, /* 07f */ + { { 0 }, { 0 } }, /* 080 */ + { { 0 }, { 0 } }, /* 081 */ + { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, /* 083 */ + { { 0 }, { 0 } }, /* 084 */ + { { 0 }, { 0 } }, /* 085 */ + { { 0 }, { 0 } }, /* 086 */ + { { 0 }, { 0 } }, /* 087 */ + { { 0 }, { 0 } }, /* 088 */ + { { 0 }, { 0 } }, /* 089 */ + { { 0 }, { 0 } }, /* 08a */ + { { 0 }, { 0 } }, /* 08b */ + { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, /* 08d */ + { { 0 }, { 0 } }, /* 08e */ + { { 0 }, { 0 } }, /* 08f */ + { { 0 }, { 0 } }, /* 090 */ + { { 0 }, { 0 } }, /* 091 */ + { { 0 }, { 0 } }, /* 092 */ + { { 0 }, { 0 } }, /* 093 */ + { { 0 }, { 0 } }, /* 094 */ + { { 0 }, { 0 } }, /* 095 */ + { { 0 }, { 0 } }, /* 096 */ + { { 0 }, { 0 } }, /* 097 */ + { { 0 }, { 0 } }, /* 098 */ + { { 0 }, { 0 } }, /* 099 */ + { { 0 }, { 0 } }, /* 09a */ + { { 0 }, { 0 } }, /* 09b */ + { { 0 }, { 0 } }, /* 09c */ + { { 0 }, { 0 } }, /* 09d */ + { { 0 }, { 0 } }, /* 09e */ + { { 0 }, { 0 } }, /* 09f */ + { { 0 }, { 0 } }, /* 0a0 */ + { { 0 }, { 0 } }, /* 0a1 */ + { { 0 }, { 0 } }, /* 0a2 */ + { { 0 }, { 0 } }, /* 0a3 */ + { { 0 }, { 0 } }, /* 0a4 */ + { { 0 }, { 0 } }, /* 0a5 */ + { { 0 }, { 0 } }, /* 0a6 */ + { { 0 }, { 0 } }, /* 0a7 */ + { { 0 }, { 0 } }, /* 0a8 */ + { { 0 }, { 0 } }, /* 0a9 */ + { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, /* 0ab */ + { { 0 }, { 0 } }, /* 0ac */ + { { 0 }, { 0 } }, /* 0ad */ + { { 0 }, { 0 } }, /* 0ae */ + { { 0 }, { 0 } }, /* 0af */ + { { 0 }, { 0 } }, /* 0b0 */ + { { 0 }, { 0 } }, /* 0b1 */ + { { 0 }, { 0 } }, /* 0b2 */ + { { 0 }, { 0 } }, /* 0b3 */ + { { 0 }, { 0 } }, /* 0b4 */ + { { 0 }, { 0 } }, /* 0b5 */ + { { 0 }, { 0 } }, /* 0b6 */ + { { 0 }, { 0 } }, /* 0b7 */ + { { 0 }, { 0 } }, /* 0b8 */ + { { 0 }, { 0 } }, /* 0b9 */ + { { 0 }, { 0 } }, /* 0ba */ + { { 0 }, { 0 } }, /* 0bb */ + { { 0 }, { 0 } }, /* 0bc */ + { { 0 }, { 0 } }, /* 0bd */ + { { 0 }, { 0 } }, /* 0be */ + { { 0 }, { 0 } }, /* 0bf */ + { { 0 }, { 0 } }, /* 0c0 */ + { { 0 }, { 0 } }, /* 0c1 */ + { { 0 }, { 0 } }, /* 0c2 */ + { { 0 }, { 0 } }, /* 0c3 */ + { { 0 }, { 0 } }, /* 0c4 */ + { { 0 }, { 0 } }, /* 0c5 */ + { { 0 }, { 0 } }, /* 0c6 */ + { { 0 }, { 0 } }, /* 0c7 */ + { { 0 }, { 0 } }, /* 0c8 */ + { { 0 }, { 0 } }, /* 0c9 */ + { { 0 }, { 0 } }, /* 0ca */ + { { 0 }, { 0 } }, /* 0cb */ + { { 0 }, { 0 } }, /* 0cc */ + { { 0 }, { 0 } }, /* 0cd */ + { { 0 }, { 0 } }, /* 0ce */ + { { 0 }, { 0 } }, /* 0cf */ + { { 0 }, { 0 } }, /* 0d0 */ + { { 0 }, { 0 } }, /* 0d1 */ + { { 0 }, { 0 } }, /* 0d2 */ + { { 0 }, { 0 } }, /* 0d3 */ + { { 0 }, { 0 } }, /* 0d4 */ + { { 0 }, { 0 } }, /* 0d5 */ + { { 0 }, { 0 } }, /* 0d6 */ + { { 0 }, { 0 } }, /* 0d7 */ + { { 0 }, { 0 } }, /* 0d8 */ + { { 0 }, { 0 } }, /* 0d9 */ + { { 0 }, { 0 } }, /* 0da */ + { { 0 }, { 0 } }, /* 0db */ + { { 0 }, { 0 } }, /* 0dc */ + { { 0 }, { 0 } }, /* 0dd */ + { { 0 }, { 0 } }, /* 0de */ + { { 0 }, { 0 } }, /* 0df */ + { { 0 }, { 0 } }, /* 0e0 */ + { { 0 }, { 0 } }, /* 0e1 */ + { { 0 }, { 0 } }, /* 0e2 */ + { { 0 }, { 0 } }, /* 0e3 */ + { { 0 }, { 0 } }, /* 0e4 */ + { { 0 }, { 0 } }, /* 0e5 */ + { { 0 }, { 0 } }, /* 0e6 */ + { { 0 }, { 0 } }, /* 0e7 */ + { { 0 }, { 0 } }, /* 0e8 */ + { { 0 }, { 0 } }, /* 0e9 */ + { { 0 }, { 0 } }, /* 0ea */ + { { 0 }, { 0 } }, /* 0eb */ + { { 0 }, { 0 } }, /* 0ec */ + { { 0 }, { 0 } }, /* 0ed */ + { { 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, /* 0ef */ + { { 0 }, { 0 } }, /* 0f0 */ + { { 0 }, { 0 } }, /* 0f1 */ + { { 0 }, { 0 } }, /* 0f2 */ + { { 0 }, { 0 } }, /* 0f3 */ + { { 0 }, { 0 } }, /* 0f4 */ + { { 0 }, { 0 } }, /* 0f5 */ + { { 0 }, { 0 } }, /* 0f6 */ + { { 0 }, { 0 } }, /* 0f7 */ + { { 0 }, { 0 } }, /* 0f8 */ + { { 0 }, { 0 } }, /* 0f9 */ + { { 0 }, { 0 } }, /* 0fa */ + { { 0 }, { 0 } }, /* 0fb */ + { { 0 }, { 0 } }, /* 0fc */ + { { 0 }, { 0 } }, /* 0fd */ + { { 0 }, { 0 } }, /* 0fe */ + { { 0 }, { 0 } }, /* 0ff */ + { { 0 }, { 0 } }, /* 100 */ + { { 0 }, { 0 } }, /* 101 */ + { { 0 }, { 0 } }, /* 102 */ + { { 0 }, { 0 } }, /* 103 */ + { { 0 }, { 0 } }, /* 104 */ + { { 0 }, { 0 } }, /* 105 */ + { { 0 }, { 0 } }, /* 106 */ + { { 0 }, { 0 } }, /* 107 */ + { { 0 }, { 0 } }, /* 108 */ + { { 0 }, { 0 } }, /* 109 */ + { { 0 }, { 0 } }, /* 10a */ + { { 0 }, { 0 } }, /* 10b */ + { { 0 }, { 0 } }, /* 10c */ + { { 0 }, { 0 } }, /* 10d */ + { { 0 }, { 0 } }, /* 10e */ + { { 0 }, { 0 } }, /* 10f */ + { { 0 }, { 0 } }, /* 110 */ + { { 0 }, { 0 } }, /* 111 */ + { { 0 }, { 0 } }, /* 112 */ + { { 0 }, { 0 } }, /* 113 */ + { { 0 }, { 0 } }, /* 114 */ + { { 0 }, { 0 } }, /* 115 */ + { { 0 }, { 0 } }, /* 116 */ + { { 0 }, { 0 } }, /* 117 */ + { { 0 }, { 0 } }, /* 118 */ + { { 0 }, { 0 } }, /* 119 */ + { { 0 }, { 0 } }, /* 11a */ + { { 0 }, { 0 } }, /* 11b */ + { { 0x1c, 0 }, { 0x9c, 0 } }, /* 11c */ + { { 0x1d, 0 }, { 0x9d, 0 } }, /* 11d */ + { { 0 }, { 0 } }, /* 11e */ + { { 0 }, { 0 } }, /* 11f */ + { { 0 }, { 0 } }, /* 120 */ + { { 0 }, { 0 } }, /* 121 */ + { { 0 }, { 0 } }, /* 122 */ + { { 0 }, { 0 } }, /* 123 */ + { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, /* 125 */ + { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, /* 127 */ + { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, /* 129 */ + { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, /* 12b */ + { { 0 }, { 0 } }, /* 12c */ + { { 0 }, { 0 } }, /* 12d */ + { { 0 }, { 0 } }, /* 12e */ + { { 0 }, { 0 } }, /* 12f */ + { { 0 }, { 0 } }, /* 130 */ + { { 0 }, { 0 } }, /* 131 */ + { { 0 }, { 0 } }, /* 132 */ + { { 0 }, { 0 } }, /* 133 */ + { { 0 }, { 0 } }, /* 134 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 135 */ + { { 0 }, { 0 } }, /* 136 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 137 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 138 */ + { { 0 }, { 0 } }, /* 139 */ + { { 0 }, { 0 } }, /* 13a */ + { { 0 }, { 0 } }, /* 13b */ + { { 0 }, { 0 } }, /* 13c */ + { { 0 }, { 0 } }, /* 13d */ + { { 0 }, { 0 } }, /* 13e */ + { { 0 }, { 0 } }, /* 13f */ + { { 0 }, { 0 } }, /* 140 */ + { { 0 }, { 0 } }, /* 141 */ + { { 0 }, { 0 } }, /* 142 */ + { { 0 }, { 0 } }, /* 143 */ + { { 0 }, { 0 } }, /* 144 */ + { { 0 }, { 0 } }, /* 145 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 146 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 147 */ + { { 0x48, 0 }, { 0xc8, 0 } }, /* 148 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 149 */ + { { 0 }, { 0 } }, /* 14a */ + { { 0x4b, 0 }, { 0xcb, 0 } }, /* 14b */ + { { 0 }, { 0 } }, /* 14c */ + { { 0x4d, 0 }, { 0xcd, 0 } }, /* 14d */ + { { 0 }, { 0 } }, /* 14e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14f */ + { { 0x50, 0 }, { 0xd0, 0 } }, /* 150 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 151 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 152 */ + { { 0x53, 0 }, { 0xd3, 0 } }, /* 153 */ + { { 0 }, { 0 } }, /* 154 */ + { { 0 }, { 0 } }, /* 155 */ + { { 0 }, { 0 } }, /* 156 */ + { { 0 }, { 0 } }, /* 157 */ + { { 0 }, { 0 } }, /* 158 */ + { { 0 }, { 0 } }, /* 159 */ + { { 0 }, { 0 } }, /* 15a */ + { { 0 }, { 0 } }, /* 15b */ + { { 0 }, { 0 } }, /* 15c */ + { { 0 }, { 0 } }, /* 15d */ + { { 0 }, { 0 } }, /* 15e */ + { { 0 }, { 0 } }, /* 15f */ + { { 0 }, { 0 } }, /* 160 */ + { { 0 }, { 0 } }, /* 161 */ + { { 0 }, { 0 } }, /* 162 */ + { { 0 }, { 0 } }, /* 163 */ + { { 0 }, { 0 } }, /* 164 */ + { { 0 }, { 0 } }, /* 165 */ + { { 0 }, { 0 } }, /* 166 */ + { { 0 }, { 0 } }, /* 167 */ + { { 0 }, { 0 } }, /* 168 */ + { { 0 }, { 0 } }, /* 169 */ + { { 0 }, { 0 } }, /* 16a */ + { { 0 }, { 0 } }, /* 16b */ + { { 0 }, { 0 } }, /* 16c */ + { { 0 }, { 0 } }, /* 16d */ + { { 0 }, { 0 } }, /* 16e */ + { { 0 }, { 0 } }, /* 16f */ + { { 0 }, { 0 } }, /* 170 */ + { { 0 }, { 0 } }, /* 171 */ + { { 0 }, { 0 } }, /* 172 */ + { { 0 }, { 0 } }, /* 173 */ + { { 0 }, { 0 } }, /* 174 */ + { { 0 }, { 0 } }, /* 175 */ + { { 0 }, { 0 } }, /* 176 */ + { { 0 }, { 0 } }, /* 177 */ + { { 0 }, { 0 } }, /* 178 */ + { { 0 }, { 0 } }, /* 179 */ + { { 0 }, { 0 } }, /* 17a */ + { { 0 }, { 0 } }, /* 17b */ + { { 0 }, { 0 } }, /* 17c */ + { { 0 }, { 0 } }, /* 17d */ + { { 0 }, { 0 } }, /* 17e */ + { { 0 }, { 0 } }, /* 17f */ + { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, /* 181 */ + { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, /* 183 */ + { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, /* 185 */ + { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, /* 187 */ + { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, /* 189 */ + { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, /* 18b */ + { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, /* 18d */ + { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, /* 18f */ + { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, /* 191 */ + { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, /* 193 */ + { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, /* 195 */ + { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, /* 197 */ + { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, /* 199 */ + { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, /* 19b */ + { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, /* 19d */ + { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, /* 19f */ + { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, /* 1a1 */ + { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, /* 1a3 */ + { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, /* 1a5 */ + { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, /* 1a7 */ + { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, /* 1a9 */ + { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, /* 1ab */ + { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, /* 1ad */ + { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, /* 1b1 */ + { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, /* 1b3 */ + { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, /* 1b5 */ + { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, /* 1b7 */ + { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, /* 1b9 */ + { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, /* 1bb */ + { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, /* 1bd */ + { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, /* 1bf */ + { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, /* 1c1 */ + { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, /* 1c3 */ + { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, /* 1c5 */ + { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, /* 1c7 */ + { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, /* 1c9 */ + { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, /* 1cb */ + { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, /* 1cd */ + { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, /* 1cf */ + { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, /* 1d1 */ + { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, /* 1d5 */ + { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, /* 1d7 */ + { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, /* 1d9 */ + { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, /* 1db */ + { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, /* 1dd */ + { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, /* 1df */ + { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, /* 1e1 */ + { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, /* 1e3 */ + { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, /* 1e5 */ + { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, /* 1e7 */ + { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, /* 1e9 */ + { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, /* 1eb */ + { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, /* 1ed */ + { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, /* 1ef */ + { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, /* 1f1 */ + { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, /* 1f3 */ + { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, /* 1f5 */ + { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, /* 1f7 */ + { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, /* 1f9 */ + { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, /* 1fb */ + { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, /* 1fd */ + { { 0 }, { 0 } }, /* 1fe */ + { { 0 }, { 0 } } /* 1ff */ // clang-format on }; diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 772a3a261..ff99c94da 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -2350,257 +2350,502 @@ ams_read(uint16_t port, void *priv) static const scancode scancode_pc200[512] = { // clang-format off - { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ - { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ - { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ - { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ - { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ - { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ - { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ - { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ - { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ - { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ - { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ - { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ - { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ - { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ - { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ - { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ - { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ - { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ - { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ - { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ - { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ - { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ - { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ - { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ - { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ - { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ - { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ - { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ - { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ - { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ - { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ - { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ - { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ - { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ - { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ - { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ - { { 0x54, 0 }, { 0xd4, 0 } }, { { 0x55, 0 }, { 0xd5, 0 } }, /* 054 */ - { { 0x56, 0 }, { 0xd6, 0 } }, { { 0x57, 0 }, { 0xd7, 0 } }, /* 056 */ - { { 0x58, 0 }, { 0xd8, 0 } }, { { 0x59, 0 }, { 0xd9, 0 } }, /* 058 */ - { { 0x5a, 0 }, { 0xda, 0 } }, { { 0x5b, 0 }, { 0xdb, 0 } }, /* 05a */ - { { 0x5c, 0 }, { 0xdc, 0 } }, { { 0x5d, 0 }, { 0xdd, 0 } }, /* 05c */ - { { 0x5e, 0 }, { 0xde, 0 } }, { { 0x5f, 0 }, { 0xdf, 0 } }, /* 05e */ - { { 0x60, 0 }, { 0xe0, 0 } }, { { 0x61, 0 }, { 0xe1, 0 } }, /* 060 */ - { { 0x62, 0 }, { 0xe2, 0 } }, { { 0x63, 0 }, { 0xe3, 0 } }, /* 062 */ - { { 0x64, 0 }, { 0xe4, 0 } }, { { 0x65, 0 }, { 0xe5, 0 } }, /* 064 */ - { { 0x66, 0 }, { 0xe6, 0 } }, { { 0x67, 0 }, { 0xe7, 0 } }, /* 066 */ - { { 0x68, 0 }, { 0xe8, 0 } }, { { 0x69, 0 }, { 0xe9, 0 } }, /* 068 */ - { { 0x6a, 0 }, { 0xea, 0 } }, { { 0x6b, 0 }, { 0xeb, 0 } }, /* 06a */ - { { 0x6c, 0 }, { 0xec, 0 } }, { { 0x6d, 0 }, { 0xed, 0 } }, /* 06c */ - { { 0x6e, 0 }, { 0xee, 0 } }, { { 0x6f, 0 }, { 0xef, 0 } }, /* 06e */ - { { 0x70, 0 }, { 0xf0, 0 } }, { { 0x71, 0 }, { 0xf1, 0 } }, /* 070 */ - { { 0x72, 0 }, { 0xf2, 0 } }, { { 0x73, 0 }, { 0xf3, 0 } }, /* 072 */ - { { 0x74, 0 }, { 0xf4, 0 } }, { { 0x75, 0 }, { 0xf5, 0 } }, /* 074 */ - { { 0x76, 0 }, { 0xf6, 0 } }, { { 0x77, 0 }, { 0xf7, 0 } }, /* 076 */ - { { 0x78, 0 }, { 0xf8, 0 } }, { { 0x79, 0 }, { 0xf9, 0 } }, /* 078 */ - { { 0x7a, 0 }, { 0xfa, 0 } }, { { 0x7b, 0 }, { 0xfb, 0 } }, /* 07a */ - { { 0x7c, 0 }, { 0xfc, 0 } }, { { 0x7d, 0 }, { 0xfd, 0 } }, /* 07c */ - { { 0x7e, 0 }, { 0xfe, 0 } }, { { 0x7f, 0 }, { 0xff, 0 } }, /* 07e */ - - { { 0x80, 0 }, { 0 } }, { { 0x81, 0 }, { 0 } }, /* 080 */ - { { 0x82, 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, { { 0x85, 0 }, { 0 } }, /* 084 */ - { { 0x86, 0 }, { 0 } }, { { 0x87, 0 }, { 0 } }, /* 086 */ - { { 0x88, 0 }, { 0 } }, { { 0x89, 0 }, { 0 } }, /* 088 */ - { { 0x8a, 0 }, { 0 } }, { { 0x8b, 0 }, { 0 } }, /* 08a */ - { { 0x8c, 0 }, { 0 } }, { { 0x8d, 0 }, { 0 } }, /* 08c */ - { { 0x8e, 0 }, { 0 } }, { { 0x8f, 0 }, { 0 } }, /* 08e */ - { { 0x90, 0 }, { 0 } }, { { 0x91, 0 }, { 0 } }, /* 090 */ - { { 0x92, 0 }, { 0 } }, { { 0x93, 0 }, { 0 } }, /* 092 */ - { { 0x94, 0 }, { 0 } }, { { 0x95, 0 }, { 0 } }, /* 094 */ - { { 0x96, 0 }, { 0 } }, { { 0x97, 0 }, { 0 } }, /* 096 */ - { { 0x98, 0 }, { 0 } }, { { 0x99, 0 }, { 0 } }, /* 098 */ - { { 0x9a, 0 }, { 0 } }, { { 0x9b, 0 }, { 0 } }, /* 09a */ - { { 0x9c, 0 }, { 0 } }, { { 0x9d, 0 }, { 0 } }, /* 09c */ - { { 0x9e, 0 }, { 0 } }, { { 0x9f, 0 }, { 0 } }, /* 09e */ - { { 0xa0, 0 }, { 0 } }, { { 0xa1, 0 }, { 0 } }, /* 0a0 */ - { { 0xa2, 0 }, { 0 } }, { { 0xa3, 0 }, { 0 } }, /* 0a2 */ - { { 0xa4, 0 }, { 0 } }, { { 0xa5, 0 }, { 0 } }, /* 0a4 */ - { { 0xa6, 0 }, { 0 } }, { { 0xa7, 0 }, { 0 } }, /* 0a6 */ - { { 0xa8, 0 }, { 0 } }, { { 0xa9, 0 }, { 0 } }, /* 0a8 */ - { { 0xaa, 0 }, { 0 } }, { { 0xab, 0 }, { 0 } }, /* 0aa */ - { { 0xac, 0 }, { 0 } }, { { 0xad, 0 }, { 0 } }, /* 0ac */ - { { 0xae, 0 }, { 0 } }, { { 0xaf, 0 }, { 0 } }, /* 0ae */ - { { 0xb0, 0 }, { 0 } }, { { 0xb1, 0 }, { 0 } }, /* 0b0 */ - { { 0xb2, 0 }, { 0 } }, { { 0xb3, 0 }, { 0 } }, /* 0b2 */ - { { 0xb4, 0 }, { 0 } }, { { 0xb5, 0 }, { 0 } }, /* 0b4 */ - { { 0xb6, 0 }, { 0 } }, { { 0xb7, 0 }, { 0 } }, /* 0b6 */ - { { 0xb8, 0 }, { 0 } }, { { 0xb9, 0 }, { 0 } }, /* 0b8 */ - { { 0xba, 0 }, { 0 } }, { { 0xbb, 0 }, { 0 } }, /* 0ba */ - { { 0xbc, 0 }, { 0 } }, { { 0xbd, 0 }, { 0 } }, /* 0bc */ - { { 0xbe, 0 }, { 0 } }, { { 0xbf, 0 }, { 0 } }, /* 0be */ - { { 0xc0, 0 }, { 0 } }, { { 0xc1, 0 }, { 0 } }, /* 0c0 */ - { { 0xc2, 0 }, { 0 } }, { { 0xc3, 0 }, { 0 } }, /* 0c2 */ - { { 0xc4, 0 }, { 0 } }, { { 0xc5, 0 }, { 0 } }, /* 0c4 */ - { { 0xc6, 0 }, { 0 } }, { { 0xc7, 0 }, { 0 } }, /* 0c6 */ - { { 0xc8, 0 }, { 0 } }, { { 0xc9, 0 }, { 0 } }, /* 0c8 */ - { { 0xca, 0 }, { 0 } }, { { 0xcb, 0 }, { 0 } }, /* 0ca */ - { { 0xcc, 0 }, { 0 } }, { { 0xcd, 0 }, { 0 } }, /* 0cc */ - { { 0xce, 0 }, { 0 } }, { { 0xcf, 0 }, { 0 } }, /* 0ce */ - { { 0xd0, 0 }, { 0 } }, { { 0xd1, 0 }, { 0 } }, /* 0d0 */ - { { 0xd2, 0 }, { 0 } }, { { 0xd3, 0 }, { 0 } }, /* 0d2 */ - { { 0xd4, 0 }, { 0 } }, { { 0xd5, 0 }, { 0 } }, /* 0d4 */ - { { 0xd6, 0 }, { 0 } }, { { 0xd7, 0 }, { 0 } }, /* 0d6 */ - { { 0xd8, 0 }, { 0 } }, { { 0xd9, 0 }, { 0 } }, /* 0d8 */ - { { 0xda, 0 }, { 0 } }, { { 0xdb, 0 }, { 0 } }, /* 0da */ - { { 0xdc, 0 }, { 0 } }, { { 0xdd, 0 }, { 0 } }, /* 0dc */ - { { 0xde, 0 }, { 0 } }, { { 0xdf, 0 }, { 0 } }, /* 0de */ - { { 0xe0, 0 }, { 0 } }, { { 0xe1, 0 }, { 0 } }, /* 0e0 */ - { { 0xe2, 0 }, { 0 } }, { { 0xe3, 0 }, { 0 } }, /* 0e2 */ - { { 0xe4, 0 }, { 0 } }, { { 0xe5, 0 }, { 0 } }, /* 0e4 */ - { { 0xe6, 0 }, { 0 } }, { { 0xe7, 0 }, { 0 } }, /* 0e6 */ - { { 0xe8, 0 }, { 0 } }, { { 0xe9, 0 }, { 0 } }, /* 0e8 */ - { { 0xea, 0 }, { 0 } }, { { 0xeb, 0 }, { 0 } }, /* 0ea */ - { { 0xec, 0 }, { 0 } }, { { 0xed, 0 }, { 0 } }, /* 0ec */ - { { 0xee, 0 }, { 0 } }, { { 0xef, 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, { { 0xf1, 0 }, { 0 } }, /* 0f0 */ - { { 0xf2, 0 }, { 0 } }, { { 0xf3, 0 }, { 0 } }, /* 0f2 */ - { { 0xf4, 0 }, { 0 } }, { { 0xf5, 0 }, { 0 } }, /* 0f4 */ - { { 0xf6, 0 }, { 0 } }, { { 0xf7, 0 }, { 0 } }, /* 0f6 */ - { { 0xf8, 0 }, { 0 } }, { { 0xf9, 0 }, { 0 } }, /* 0f8 */ - { { 0xfa, 0 }, { 0 } }, { { 0xfb, 0 }, { 0 } }, /* 0fa */ - { { 0xfc, 0 }, { 0 } }, { { 0xfd, 0 }, { 0 } }, /* 0fc */ - { { 0xfe, 0 }, { 0 } }, { { 0xff, 0 }, { 0 } }, /* 0fe */ - - { { 0xe1, 0x1d, 0 }, { 0xe1, 0x9d, 0 } }, { { 0xe0, 0x01, 0 }, { 0xe0, 0x81, 0 } }, /* 100 */ - { { 0xe0, 0x02, 0 }, { 0xe0, 0x82, 0 } }, { { 0xe0, 0x03, 0 }, { 0xe0, 0x83, 0 } }, /* 102 */ - { { 0xe0, 0x04, 0 }, { 0xe0, 0x84, 0 } }, { { 0xe0, 0x05, 0 }, { 0xe0, 0x85, 0 } }, /* 104 */ - { { 0xe0, 0x06, 0 }, { 0xe0, 0x86, 0 } }, { { 0xe0, 0x07, 0 }, { 0xe0, 0x87, 0 } }, /* 106 */ - { { 0xe0, 0x08, 0 }, { 0xe0, 0x88, 0 } }, { { 0xe0, 0x09, 0 }, { 0xe0, 0x89, 0 } }, /* 108 */ - { { 0xe0, 0x0a, 0 }, { 0xe0, 0x8a, 0 } }, { { 0xe0, 0x0b, 0 }, { 0xe0, 0x8b, 0 } }, /* 10a */ - { { 0xe0, 0x0c, 0 }, { 0xe0, 0x8c, 0 } }, { { 0 }, { 0 } }, /* 10c */ - { { 0xe0, 0x0e, 0 }, { 0xe0, 0x8e, 0 } }, { { 0xe0, 0x0f, 0 }, { 0xe0, 0x8f, 0 } }, /* 10e */ - { { 0xe0, 0x10, 0 }, { 0xe0, 0x90, 0 } }, { { 0xe0, 0x11, 0 }, { 0xe0, 0x91, 0 } }, /* 110 */ - { { 0xe0, 0x12, 0 }, { 0xe0, 0x92, 0 } }, { { 0xe0, 0x13, 0 }, { 0xe0, 0x93, 0 } }, /* 112 */ - { { 0xe0, 0x14, 0 }, { 0xe0, 0x94, 0 } }, { { 0xe0, 0x15, 0 }, { 0xe0, 0x95, 0 } }, /* 114 */ - { { 0xe0, 0x16, 0 }, { 0xe0, 0x96, 0 } }, { { 0xe0, 0x17, 0 }, { 0xe0, 0x97, 0 } }, /* 116 */ - { { 0xe0, 0x18, 0 }, { 0xe0, 0x98, 0 } }, { { 0xe0, 0x19, 0 }, { 0xe0, 0x99, 0 } }, /* 118 */ - { { 0xe0, 0x1a, 0 }, { 0xe0, 0x9a, 0 } }, { { 0xe0, 0x1b, 0 }, { 0xe0, 0x9b, 0 } }, /* 11a */ - { { 0xe0, 0x1c, 0 }, { 0xe0, 0x9c, 0 } }, { { 0xe0, 0x1d, 0 }, { 0xe0, 0x9d, 0 } }, /* 11c */ - { { 0xe0, 0x1e, 0 }, { 0xe0, 0x9e, 0 } }, { { 0xe0, 0x1f, 0 }, { 0xe0, 0x9f, 0 } }, /* 11e */ - { { 0xe0, 0x20, 0 }, { 0xe0, 0xa0, 0 } }, { { 0xe0, 0x21, 0 }, { 0xe0, 0xa1, 0 } }, /* 120 */ - { { 0xe0, 0x22, 0 }, { 0xe0, 0xa2, 0 } }, { { 0xe0, 0x23, 0 }, { 0xe0, 0xa3, 0 } }, /* 122 */ - { { 0xe0, 0x24, 0 }, { 0xe0, 0xa4, 0 } }, { { 0xe0, 0x25, 0 }, { 0xe0, 0xa5, 0 } }, /* 124 */ - { { 0xe0, 0x26, 0 }, { 0xe0, 0xa6, 0 } }, { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ - { { 0xe0, 0x2c, 0 }, { 0xe0, 0xac, 0 } }, { { 0xe0, 0x2d, 0 }, { 0xe0, 0xad, 0 } }, /* 12c */ - { { 0xe0, 0x2e, 0 }, { 0xe0, 0xae, 0 } }, { { 0xe0, 0x2f, 0 }, { 0xe0, 0xaf, 0 } }, /* 12e */ - { { 0xe0, 0x30, 0 }, { 0xe0, 0xb0, 0 } }, { { 0xe0, 0x31, 0 }, { 0xe0, 0xb1, 0 } }, /* 130 */ - { { 0xe0, 0x32, 0 }, { 0xe0, 0xb2, 0 } }, { { 0 }, { 0 } }, /* 132 */ - { { 0xe0, 0x34, 0 }, { 0xe0, 0xb4, 0 } }, { { 0xe0, 0x35, 0 }, { 0xe0, 0xb5, 0 } }, /* 134 */ - { { 0 }, { 0 } }, { { 0xe0, 0x37, 0 }, { 0xe0, 0xb7, 0 } }, /* 136 */ - { { 0xe0, 0x38, 0 }, { 0xe0, 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ - { { 0xe0, 0x3a, 0 }, { 0xe0, 0xba, 0 } }, { { 0xe0, 0x3b, 0 }, { 0xe0, 0xbb, 0 } }, /* 13a */ - { { 0xe0, 0x3c, 0 }, { 0xe0, 0xbc, 0 } }, { { 0xe0, 0x3d, 0 }, { 0xe0, 0xbd, 0 } }, /* 13c */ - { { 0xe0, 0x3e, 0 }, { 0xe0, 0xbe, 0 } }, { { 0xe0, 0x3f, 0 }, { 0xe0, 0xbf, 0 } }, /* 13e */ - { { 0xe0, 0x40, 0 }, { 0xe0, 0xc0, 0 } }, { { 0xe0, 0x41, 0 }, { 0xe0, 0xc1, 0 } }, /* 140 */ - { { 0xe0, 0x42, 0 }, { 0xe0, 0xc2, 0 } }, { { 0xe0, 0x43, 0 }, { 0xe0, 0xc3, 0 } }, /* 142 */ - { { 0xe0, 0x44, 0 }, { 0xe0, 0xc4, 0 } }, { { 0 }, { 0 } }, /* 144 */ - { { 0xe0, 0x46, 0 }, { 0xe0, 0xc6, 0 } }, { { 0xe0, 0x47, 0 }, { 0xe0, 0xc7, 0 } }, /* 146 */ - { { 0xe0, 0x48, 0 }, { 0xe0, 0xc8, 0 } }, { { 0xe0, 0x49, 0 }, { 0xe0, 0xc9, 0 } }, /* 148 */ - { { 0 }, { 0 } }, { { 0xe0, 0x4b, 0 }, { 0xe0, 0xcb, 0 } }, /* 14a */ - { { 0xe0, 0x4c, 0 }, { 0xe0, 0xcc, 0 } }, { { 0xe0, 0x4d, 0 }, { 0xe0, 0xcd, 0 } }, /* 14c */ - { { 0xe0, 0x4e, 0 }, { 0xe0, 0xce, 0 } }, { { 0xe0, 0x4f, 0 }, { 0xe0, 0xcf, 0 } }, /* 14e */ - { { 0xe0, 0x50, 0 }, { 0xe0, 0xd0, 0 } }, { { 0xe0, 0x51, 0 }, { 0xe0, 0xd1, 0 } }, /* 150 */ - { { 0xe0, 0x52, 0 }, { 0xe0, 0xd2, 0 } }, { { 0xe0, 0x53, 0 }, { 0xe0, 0xd3, 0 } }, /* 152 */ - { { 0 }, { 0 } }, { { 0xe0, 0x55, 0 }, { 0xe0, 0xd5, 0 } }, /* 154 */ - { { 0 }, { 0 } }, { { 0xe0, 0x57, 0 }, { 0xe0, 0xd7, 0 } }, /* 156 */ - { { 0xe0, 0x58, 0 }, { 0xe0, 0xd8, 0 } }, { { 0xe0, 0x59, 0 }, { 0xe0, 0xd9, 0 } }, /* 158 */ - { { 0xe0, 0x5a, 0 }, { 0xe0, 0xaa, 0 } }, { { 0xe0, 0x5b, 0 }, { 0xe0, 0xdb, 0 } }, /* 15a */ - { { 0xe0, 0x5c, 0 }, { 0xe0, 0xdc, 0 } }, { { 0xe0, 0x5d, 0 }, { 0xe0, 0xdd, 0 } }, /* 15c */ - { { 0xe0, 0x5e, 0 }, { 0xe0, 0xee, 0 } }, { { 0xe0, 0x5f, 0 }, { 0xe0, 0xdf, 0 } }, /* 15e */ - { { 0 }, { 0 } }, { { 0xe0, 0x61, 0 }, { 0xe0, 0xe1, 0 } }, /* 160 */ - { { 0xe0, 0x62, 0 }, { 0xe0, 0xe2, 0 } }, { { 0xe0, 0x63, 0 }, { 0xe0, 0xe3, 0 } }, /* 162 */ - { { 0xe0, 0x64, 0 }, { 0xe0, 0xe4, 0 } }, { { 0xe0, 0x65, 0 }, { 0xe0, 0xe5, 0 } }, /* 164 */ - { { 0xe0, 0x66, 0 }, { 0xe0, 0xe6, 0 } }, { { 0xe0, 0x67, 0 }, { 0xe0, 0xe7, 0 } }, /* 166 */ - { { 0xe0, 0x68, 0 }, { 0xe0, 0xe8, 0 } }, { { 0xe0, 0x69, 0 }, { 0xe0, 0xe9, 0 } }, /* 168 */ - { { 0xe0, 0x6a, 0 }, { 0xe0, 0xea, 0 } }, { { 0xe0, 0x6b, 0 }, { 0xe0, 0xeb, 0 } }, /* 16a */ - { { 0xe0, 0x6c, 0 }, { 0xe0, 0xec, 0 } }, { { 0xe0, 0x6d, 0 }, { 0xe0, 0xed, 0 } }, /* 16c */ - { { 0xe0, 0x6e, 0 }, { 0xe0, 0xee, 0 } }, { { 0 }, { 0 } }, /* 16e */ - { { 0xe0, 0x70, 0 }, { 0xe0, 0xf0, 0 } }, { { 0xe0, 0x71, 0 }, { 0xe0, 0xf1, 0 } }, /* 170 */ - { { 0xe0, 0x72, 0 }, { 0xe0, 0xf2, 0 } }, { { 0xe0, 0x73, 0 }, { 0xe0, 0xf3, 0 } }, /* 172 */ - { { 0xe0, 0x74, 0 }, { 0xe0, 0xf4, 0 } }, { { 0xe0, 0x75, 0 }, { 0xe0, 0xf5, 0 } }, /* 174 */ - { { 0 }, { 0 } }, { { 0xe0, 0x77, 0 }, { 0xe0, 0xf7, 0 } }, /* 176 */ - { { 0xe0, 0x78, 0 }, { 0xe0, 0xf8, 0 } }, { { 0xe0, 0x79, 0 }, { 0xe0, 0xf9, 0 } }, /* 178 */ - { { 0xe0, 0x7a, 0 }, { 0xe0, 0xfa, 0 } }, { { 0xe0, 0x7b, 0 }, { 0xe0, 0xfb, 0 } }, /* 17a */ - { { 0xe0, 0x7c, 0 }, { 0xe0, 0xfc, 0 } }, { { 0xe0, 0x7d, 0 }, { 0xe0, 0xfd, 0 } }, /* 17c */ - { { 0xe0, 0x7e, 0 }, { 0xe0, 0xfe, 0 } }, { { 0xe0, 0x7f, 0 }, { 0xe0, 0xff, 0 } }, /* 17e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, { { 0xe0, 0xe1, 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ - { { 0xe0, 0xee, 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, { { 0xe0, 0xf1, 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ - { { 0xe0, 0xfe, 0 }, { 0 } }, { { 0xe0, 0xff, 0 }, { 0 } } /* 1fe */ + { { 0 }, { 0 } }, /* 000 */ + { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ + { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ + { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ + { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ + { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ + { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ + { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ + { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ + { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ + { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ + { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ + { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ + { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ + { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ + { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ + { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ + { { 0x12, 0 }, { 0x92, 0 } }, /* 012 */ + { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ + { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ + { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ + { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ + { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ + { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ + { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ + { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ + { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ + { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ + { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ + { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ + { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ + { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ + { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ + { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ + { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ + { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ + { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ + { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ + { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ + { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ + { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ + { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ + { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ + { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ + { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ + { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ + { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ + { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ + { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ + { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ + { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ + { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ + { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ + { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ + { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ + { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ + { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ + { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ + { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ + { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ + { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ + { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ + { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ + { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ + { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ + { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ + { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ + { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ + { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ + { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ + { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ + { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ + { { 0x54, 0 }, { 0xd4, 0 } }, /* 054 */ + { { 0x55, 0 }, { 0xd5, 0 } }, /* 055 */ + { { 0x56, 0 }, { 0xd6, 0 } }, /* 056 */ + { { 0x57, 0 }, { 0xd7, 0 } }, /* 057 */ + { { 0x58, 0 }, { 0xd8, 0 } }, /* 058 */ + { { 0x59, 0 }, { 0xd9, 0 } }, /* 059 */ + { { 0x5a, 0 }, { 0xda, 0 } }, /* 05a */ + { { 0x5b, 0 }, { 0xdb, 0 } }, /* 05b */ + { { 0x5c, 0 }, { 0xdc, 0 } }, /* 05c */ + { { 0x5d, 0 }, { 0xdd, 0 } }, /* 05d */ + { { 0x5e, 0 }, { 0xde, 0 } }, /* 05e */ + { { 0x5f, 0 }, { 0xdf, 0 } }, /* 05f */ + { { 0x60, 0 }, { 0xe0, 0 } }, /* 060 */ + { { 0x61, 0 }, { 0xe1, 0 } }, /* 061 */ + { { 0x62, 0 }, { 0xe2, 0 } }, /* 062 */ + { { 0x63, 0 }, { 0xe3, 0 } }, /* 063 */ + { { 0x64, 0 }, { 0xe4, 0 } }, /* 064 */ + { { 0x65, 0 }, { 0xe5, 0 } }, /* 065 */ + { { 0x66, 0 }, { 0xe6, 0 } }, /* 066 */ + { { 0x67, 0 }, { 0xe7, 0 } }, /* 067 */ + { { 0x68, 0 }, { 0xe8, 0 } }, /* 068 */ + { { 0x69, 0 }, { 0xe9, 0 } }, /* 069 */ + { { 0x6a, 0 }, { 0xea, 0 } }, /* 06a */ + { { 0x6b, 0 }, { 0xeb, 0 } }, /* 06b */ + { { 0x6c, 0 }, { 0xec, 0 } }, /* 06c */ + { { 0x6d, 0 }, { 0xed, 0 } }, /* 06d */ + { { 0x6e, 0 }, { 0xee, 0 } }, /* 06e */ + { { 0x6f, 0 }, { 0xef, 0 } }, /* 06f */ + { { 0x70, 0 }, { 0xf0, 0 } }, /* 070 */ + { { 0x71, 0 }, { 0xf1, 0 } }, /* 071 */ + { { 0x72, 0 }, { 0xf2, 0 } }, /* 072 */ + { { 0x73, 0 }, { 0xf3, 0 } }, /* 073 */ + { { 0x74, 0 }, { 0xf4, 0 } }, /* 074 */ + { { 0x75, 0 }, { 0xf5, 0 } }, /* 075 */ + { { 0x76, 0 }, { 0xf6, 0 } }, /* 076 */ + { { 0x77, 0 }, { 0xf7, 0 } }, /* 077 */ + { { 0x78, 0 }, { 0xf8, 0 } }, /* 078 */ + { { 0x79, 0 }, { 0xf9, 0 } }, /* 079 */ + { { 0x7a, 0 }, { 0xfa, 0 } }, /* 07a */ + { { 0x7b, 0 }, { 0xfb, 0 } }, /* 07b */ + { { 0x7c, 0 }, { 0xfc, 0 } }, /* 07c */ + { { 0x7d, 0 }, { 0xfd, 0 } }, /* 07d */ + { { 0x7e, 0 }, { 0xfe, 0 } }, /* 07e */ + { { 0x7f, 0 }, { 0xff, 0 } }, /* 07f */ + { { 0x80, 0 }, { 0 } }, /* 080 */ + { { 0x81, 0 }, { 0 } }, /* 081 */ + { { 0x82, 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, /* 083 */ + { { 0 }, { 0 } }, /* 084 */ + { { 0x85, 0 }, { 0 } }, /* 085 */ + { { 0x86, 0 }, { 0 } }, /* 086 */ + { { 0x87, 0 }, { 0 } }, /* 087 */ + { { 0x88, 0 }, { 0 } }, /* 088 */ + { { 0x89, 0 }, { 0 } }, /* 089 */ + { { 0x8a, 0 }, { 0 } }, /* 08a */ + { { 0x8b, 0 }, { 0 } }, /* 08b */ + { { 0x8c, 0 }, { 0 } }, /* 08c */ + { { 0x8d, 0 }, { 0 } }, /* 08d */ + { { 0x8e, 0 }, { 0 } }, /* 08e */ + { { 0x8f, 0 }, { 0 } }, /* 08f */ + { { 0x90, 0 }, { 0 } }, /* 090 */ + { { 0x91, 0 }, { 0 } }, /* 091 */ + { { 0x92, 0 }, { 0 } }, /* 092 */ + { { 0x93, 0 }, { 0 } }, /* 093 */ + { { 0x94, 0 }, { 0 } }, /* 094 */ + { { 0x95, 0 }, { 0 } }, /* 095 */ + { { 0x96, 0 }, { 0 } }, /* 096 */ + { { 0x97, 0 }, { 0 } }, /* 097 */ + { { 0x98, 0 }, { 0 } }, /* 098 */ + { { 0x99, 0 }, { 0 } }, /* 099 */ + { { 0x9a, 0 }, { 0 } }, /* 09a */ + { { 0x9b, 0 }, { 0 } }, /* 09b */ + { { 0x9c, 0 }, { 0 } }, /* 09c */ + { { 0x9d, 0 }, { 0 } }, /* 09d */ + { { 0x9e, 0 }, { 0 } }, /* 09e */ + { { 0x9f, 0 }, { 0 } }, /* 09f */ + { { 0xa0, 0 }, { 0 } }, /* 0a0 */ + { { 0xa1, 0 }, { 0 } }, /* 0a1 */ + { { 0xa2, 0 }, { 0 } }, /* 0a2 */ + { { 0xa3, 0 }, { 0 } }, /* 0a3 */ + { { 0xa4, 0 }, { 0 } }, /* 0a4 */ + { { 0xa5, 0 }, { 0 } }, /* 0a5 */ + { { 0xa6, 0 }, { 0 } }, /* 0a6 */ + { { 0xa7, 0 }, { 0 } }, /* 0a7 */ + { { 0xa8, 0 }, { 0 } }, /* 0a8 */ + { { 0xa9, 0 }, { 0 } }, /* 0a9 */ + { { 0xaa, 0 }, { 0 } }, /* 0aa */ + { { 0xab, 0 }, { 0 } }, /* 0ab */ + { { 0xac, 0 }, { 0 } }, /* 0ac */ + { { 0xad, 0 }, { 0 } }, /* 0ad */ + { { 0xae, 0 }, { 0 } }, /* 0ae */ + { { 0xaf, 0 }, { 0 } }, /* 0af */ + { { 0xb0, 0 }, { 0 } }, /* 0b0 */ + { { 0xb1, 0 }, { 0 } }, /* 0b1 */ + { { 0xb2, 0 }, { 0 } }, /* 0b2 */ + { { 0xb3, 0 }, { 0 } }, /* 0b3 */ + { { 0xb4, 0 }, { 0 } }, /* 0b4 */ + { { 0xb5, 0 }, { 0 } }, /* 0b5 */ + { { 0xb6, 0 }, { 0 } }, /* 0b6 */ + { { 0xb7, 0 }, { 0 } }, /* 0b7 */ + { { 0xb8, 0 }, { 0 } }, /* 0b8 */ + { { 0xb9, 0 }, { 0 } }, /* 0b9 */ + { { 0xba, 0 }, { 0 } }, /* 0ba */ + { { 0xbb, 0 }, { 0 } }, /* 0bb */ + { { 0xbc, 0 }, { 0 } }, /* 0bc */ + { { 0xbd, 0 }, { 0 } }, /* 0bd */ + { { 0xbe, 0 }, { 0 } }, /* 0be */ + { { 0xbf, 0 }, { 0 } }, /* 0bf */ + { { 0xc0, 0 }, { 0 } }, /* 0c0 */ + { { 0xc1, 0 }, { 0 } }, /* 0c1 */ + { { 0xc2, 0 }, { 0 } }, /* 0c2 */ + { { 0xc3, 0 }, { 0 } }, /* 0c3 */ + { { 0xc4, 0 }, { 0 } }, /* 0c4 */ + { { 0xc5, 0 }, { 0 } }, /* 0c5 */ + { { 0xc6, 0 }, { 0 } }, /* 0c6 */ + { { 0xc7, 0 }, { 0 } }, /* 0c7 */ + { { 0xc8, 0 }, { 0 } }, /* 0c8 */ + { { 0xc9, 0 }, { 0 } }, /* 0c9 */ + { { 0xca, 0 }, { 0 } }, /* 0ca */ + { { 0xcb, 0 }, { 0 } }, /* 0cb */ + { { 0xcc, 0 }, { 0 } }, /* 0cc */ + { { 0xcd, 0 }, { 0 } }, /* 0cd */ + { { 0xce, 0 }, { 0 } }, /* 0ce */ + { { 0xcf, 0 }, { 0 } }, /* 0cf */ + { { 0xd0, 0 }, { 0 } }, /* 0d0 */ + { { 0xd1, 0 }, { 0 } }, /* 0d1 */ + { { 0xd2, 0 }, { 0 } }, /* 0d2 */ + { { 0xd3, 0 }, { 0 } }, /* 0d3 */ + { { 0xd4, 0 }, { 0 } }, /* 0d4 */ + { { 0xd5, 0 }, { 0 } }, /* 0d5 */ + { { 0xd6, 0 }, { 0 } }, /* 0d6 */ + { { 0xd7, 0 }, { 0 } }, /* 0d7 */ + { { 0xd8, 0 }, { 0 } }, /* 0d8 */ + { { 0xd9, 0 }, { 0 } }, /* 0d9 */ + { { 0xda, 0 }, { 0 } }, /* 0da */ + { { 0xdb, 0 }, { 0 } }, /* 0db */ + { { 0xdc, 0 }, { 0 } }, /* 0dc */ + { { 0xdd, 0 }, { 0 } }, /* 0dd */ + { { 0xde, 0 }, { 0 } }, /* 0de */ + { { 0xdf, 0 }, { 0 } }, /* 0df */ + { { 0xe0, 0 }, { 0 } }, /* 0e0 */ + { { 0xe1, 0 }, { 0 } }, /* 0e1 */ + { { 0xe2, 0 }, { 0 } }, /* 0e2 */ + { { 0xe3, 0 }, { 0 } }, /* 0e3 */ + { { 0xe4, 0 }, { 0 } }, /* 0e4 */ + { { 0xe5, 0 }, { 0 } }, /* 0e5 */ + { { 0xe6, 0 }, { 0 } }, /* 0e6 */ + { { 0xe7, 0 }, { 0 } }, /* 0e7 */ + { { 0xe8, 0 }, { 0 } }, /* 0e8 */ + { { 0xe9, 0 }, { 0 } }, /* 0e9 */ + { { 0xea, 0 }, { 0 } }, /* 0ea */ + { { 0xeb, 0 }, { 0 } }, /* 0eb */ + { { 0xec, 0 }, { 0 } }, /* 0ec */ + { { 0xed, 0 }, { 0 } }, /* 0ed */ + { { 0xee, 0 }, { 0 } }, /* 0ee */ + { { 0xef, 0 }, { 0 } }, /* 0ef */ + { { 0 }, { 0 } }, /* 0f0 */ + { { 0xf1, 0 }, { 0 } }, /* 0f1 */ + { { 0xf2, 0 }, { 0 } }, /* 0f2 */ + { { 0xf3, 0 }, { 0 } }, /* 0f3 */ + { { 0xf4, 0 }, { 0 } }, /* 0f4 */ + { { 0xf5, 0 }, { 0 } }, /* 0f5 */ + { { 0xf6, 0 }, { 0 } }, /* 0f6 */ + { { 0xf7, 0 }, { 0 } }, /* 0f7 */ + { { 0xf8, 0 }, { 0 } }, /* 0f8 */ + { { 0xf9, 0 }, { 0 } }, /* 0f9 */ + { { 0xfa, 0 }, { 0 } }, /* 0fa */ + { { 0xfb, 0 }, { 0 } }, /* 0fb */ + { { 0xfc, 0 }, { 0 } }, /* 0fc */ + { { 0xfd, 0 }, { 0 } }, /* 0fd */ + { { 0xfe, 0 }, { 0 } }, /* 0fe */ + { { 0xff, 0 }, { 0 } }, /* 0ff */ + { { 0xe1, 0x1d, 0 }, { 0xe1, 0x9d, 0 } }, /* 100 */ + { { 0xe0, 0x01, 0 }, { 0xe0, 0x81, 0 } }, /* 101 */ + { { 0xe0, 0x02, 0 }, { 0xe0, 0x82, 0 } }, /* 102 */ + { { 0xe0, 0x03, 0 }, { 0xe0, 0x83, 0 } }, /* 103 */ + { { 0xe0, 0x04, 0 }, { 0xe0, 0x84, 0 } }, /* 104 */ + { { 0xe0, 0x05, 0 }, { 0xe0, 0x85, 0 } }, /* 105 */ + { { 0xe0, 0x06, 0 }, { 0xe0, 0x86, 0 } }, /* 106 */ + { { 0xe0, 0x07, 0 }, { 0xe0, 0x87, 0 } }, /* 107 */ + { { 0xe0, 0x08, 0 }, { 0xe0, 0x88, 0 } }, /* 108 */ + { { 0xe0, 0x09, 0 }, { 0xe0, 0x89, 0 } }, /* 109 */ + { { 0xe0, 0x0a, 0 }, { 0xe0, 0x8a, 0 } }, /* 10a */ + { { 0xe0, 0x0b, 0 }, { 0xe0, 0x8b, 0 } }, /* 10b */ + { { 0xe0, 0x0c, 0 }, { 0xe0, 0x8c, 0 } }, /* 10c */ + { { 0 }, { 0 } }, /* 10d */ + { { 0xe0, 0x0e, 0 }, { 0xe0, 0x8e, 0 } }, /* 10e */ + { { 0xe0, 0x0f, 0 }, { 0xe0, 0x8f, 0 } }, /* 10f */ + { { 0xe0, 0x10, 0 }, { 0xe0, 0x90, 0 } }, /* 110 */ + { { 0xe0, 0x11, 0 }, { 0xe0, 0x91, 0 } }, /* 111 */ + { { 0xe0, 0x12, 0 }, { 0xe0, 0x92, 0 } }, /* 112 */ + { { 0xe0, 0x13, 0 }, { 0xe0, 0x93, 0 } }, /* 113 */ + { { 0xe0, 0x14, 0 }, { 0xe0, 0x94, 0 } }, /* 114 */ + { { 0xe0, 0x15, 0 }, { 0xe0, 0x95, 0 } }, /* 115 */ + { { 0xe0, 0x16, 0 }, { 0xe0, 0x96, 0 } }, /* 116 */ + { { 0xe0, 0x17, 0 }, { 0xe0, 0x97, 0 } }, /* 117 */ + { { 0xe0, 0x18, 0 }, { 0xe0, 0x98, 0 } }, /* 118 */ + { { 0xe0, 0x19, 0 }, { 0xe0, 0x99, 0 } }, /* 119 */ + { { 0xe0, 0x1a, 0 }, { 0xe0, 0x9a, 0 } }, /* 11a */ + { { 0xe0, 0x1b, 0 }, { 0xe0, 0x9b, 0 } }, /* 11b */ + { { 0xe0, 0x1c, 0 }, { 0xe0, 0x9c, 0 } }, /* 11c */ + { { 0xe0, 0x1d, 0 }, { 0xe0, 0x9d, 0 } }, /* 11d */ + { { 0xe0, 0x1e, 0 }, { 0xe0, 0x9e, 0 } }, /* 11e */ + { { 0xe0, 0x1f, 0 }, { 0xe0, 0x9f, 0 } }, /* 11f */ + { { 0xe0, 0x20, 0 }, { 0xe0, 0xa0, 0 } }, /* 120 */ + { { 0xe0, 0x21, 0 }, { 0xe0, 0xa1, 0 } }, /* 121 */ + { { 0xe0, 0x22, 0 }, { 0xe0, 0xa2, 0 } }, /* 122 */ + { { 0xe0, 0x23, 0 }, { 0xe0, 0xa3, 0 } }, /* 123 */ + { { 0xe0, 0x24, 0 }, { 0xe0, 0xa4, 0 } }, /* 124 */ + { { 0xe0, 0x25, 0 }, { 0xe0, 0xa5, 0 } }, /* 125 */ + { { 0xe0, 0x26, 0 }, { 0xe0, 0xa6, 0 } }, /* 126 */ + { { 0 }, { 0 } }, /* 127 */ + { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, /* 129 */ + { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, /* 12b */ + { { 0xe0, 0x2c, 0 }, { 0xe0, 0xac, 0 } }, /* 12c */ + { { 0xe0, 0x2d, 0 }, { 0xe0, 0xad, 0 } }, /* 12d */ + { { 0xe0, 0x2e, 0 }, { 0xe0, 0xae, 0 } }, /* 12e */ + { { 0xe0, 0x2f, 0 }, { 0xe0, 0xaf, 0 } }, /* 12f */ + { { 0xe0, 0x30, 0 }, { 0xe0, 0xb0, 0 } }, /* 130 */ + { { 0xe0, 0x31, 0 }, { 0xe0, 0xb1, 0 } }, /* 131 */ + { { 0xe0, 0x32, 0 }, { 0xe0, 0xb2, 0 } }, /* 132 */ + { { 0 }, { 0 } }, /* 133 */ + { { 0xe0, 0x34, 0 }, { 0xe0, 0xb4, 0 } }, /* 134 */ + { { 0xe0, 0x35, 0 }, { 0xe0, 0xb5, 0 } }, /* 135 */ + { { 0 }, { 0 } }, /* 136 */ + { { 0xe0, 0x37, 0 }, { 0xe0, 0xb7, 0 } }, /* 137 */ + { { 0xe0, 0x38, 0 }, { 0xe0, 0xb8, 0 } }, /* 138 */ + { { 0 }, { 0 } }, /* 139 */ + { { 0xe0, 0x3a, 0 }, { 0xe0, 0xba, 0 } }, /* 13a */ + { { 0xe0, 0x3b, 0 }, { 0xe0, 0xbb, 0 } }, /* 13b */ + { { 0xe0, 0x3c, 0 }, { 0xe0, 0xbc, 0 } }, /* 13c */ + { { 0xe0, 0x3d, 0 }, { 0xe0, 0xbd, 0 } }, /* 13d */ + { { 0xe0, 0x3e, 0 }, { 0xe0, 0xbe, 0 } }, /* 13e */ + { { 0xe0, 0x3f, 0 }, { 0xe0, 0xbf, 0 } }, /* 13f */ + { { 0xe0, 0x40, 0 }, { 0xe0, 0xc0, 0 } }, /* 140 */ + { { 0xe0, 0x41, 0 }, { 0xe0, 0xc1, 0 } }, /* 141 */ + { { 0xe0, 0x42, 0 }, { 0xe0, 0xc2, 0 } }, /* 142 */ + { { 0xe0, 0x43, 0 }, { 0xe0, 0xc3, 0 } }, /* 143 */ + { { 0xe0, 0x44, 0 }, { 0xe0, 0xc4, 0 } }, /* 144 */ + { { 0 }, { 0 } }, /* 145 */ + { { 0xe0, 0x46, 0 }, { 0xe0, 0xc6, 0 } }, /* 146 */ + { { 0xe0, 0x47, 0 }, { 0xe0, 0xc7, 0 } }, /* 147 */ + { { 0xe0, 0x48, 0 }, { 0xe0, 0xc8, 0 } }, /* 148 */ + { { 0xe0, 0x49, 0 }, { 0xe0, 0xc9, 0 } }, /* 149 */ + { { 0 }, { 0 } }, /* 14a */ + { { 0xe0, 0x4b, 0 }, { 0xe0, 0xcb, 0 } }, /* 14b */ + { { 0xe0, 0x4c, 0 }, { 0xe0, 0xcc, 0 } }, /* 14c */ + { { 0xe0, 0x4d, 0 }, { 0xe0, 0xcd, 0 } }, /* 14d */ + { { 0xe0, 0x4e, 0 }, { 0xe0, 0xce, 0 } }, /* 14e */ + { { 0xe0, 0x4f, 0 }, { 0xe0, 0xcf, 0 } }, /* 14f */ + { { 0xe0, 0x50, 0 }, { 0xe0, 0xd0, 0 } }, /* 150 */ + { { 0xe0, 0x51, 0 }, { 0xe0, 0xd1, 0 } }, /* 151 */ + { { 0xe0, 0x52, 0 }, { 0xe0, 0xd2, 0 } }, /* 152 */ + { { 0xe0, 0x53, 0 }, { 0xe0, 0xd3, 0 } }, /* 153 */ + { { 0 }, { 0 } }, /* 154 */ + { { 0xe0, 0x55, 0 }, { 0xe0, 0xd5, 0 } }, /* 155 */ + { { 0 }, { 0 } }, /* 156 */ + { { 0xe0, 0x57, 0 }, { 0xe0, 0xd7, 0 } }, /* 157 */ + { { 0xe0, 0x58, 0 }, { 0xe0, 0xd8, 0 } }, /* 158 */ + { { 0xe0, 0x59, 0 }, { 0xe0, 0xd9, 0 } }, /* 159 */ + { { 0xe0, 0x5a, 0 }, { 0xe0, 0xaa, 0 } }, /* 15a */ + { { 0xe0, 0x5b, 0 }, { 0xe0, 0xdb, 0 } }, /* 15b */ + { { 0xe0, 0x5c, 0 }, { 0xe0, 0xdc, 0 } }, /* 15c */ + { { 0xe0, 0x5d, 0 }, { 0xe0, 0xdd, 0 } }, /* 15d */ + { { 0xe0, 0x5e, 0 }, { 0xe0, 0xee, 0 } }, /* 15e */ + { { 0xe0, 0x5f, 0 }, { 0xe0, 0xdf, 0 } }, /* 15f */ + { { 0 }, { 0 } }, /* 160 */ + { { 0xe0, 0x61, 0 }, { 0xe0, 0xe1, 0 } }, /* 161 */ + { { 0xe0, 0x62, 0 }, { 0xe0, 0xe2, 0 } }, /* 162 */ + { { 0xe0, 0x63, 0 }, { 0xe0, 0xe3, 0 } }, /* 163 */ + { { 0xe0, 0x64, 0 }, { 0xe0, 0xe4, 0 } }, /* 164 */ + { { 0xe0, 0x65, 0 }, { 0xe0, 0xe5, 0 } }, /* 165 */ + { { 0xe0, 0x66, 0 }, { 0xe0, 0xe6, 0 } }, /* 166 */ + { { 0xe0, 0x67, 0 }, { 0xe0, 0xe7, 0 } }, /* 167 */ + { { 0xe0, 0x68, 0 }, { 0xe0, 0xe8, 0 } }, /* 168 */ + { { 0xe0, 0x69, 0 }, { 0xe0, 0xe9, 0 } }, /* 169 */ + { { 0xe0, 0x6a, 0 }, { 0xe0, 0xea, 0 } }, /* 16a */ + { { 0xe0, 0x6b, 0 }, { 0xe0, 0xeb, 0 } }, /* 16b */ + { { 0xe0, 0x6c, 0 }, { 0xe0, 0xec, 0 } }, /* 16c */ + { { 0xe0, 0x6d, 0 }, { 0xe0, 0xed, 0 } }, /* 16d */ + { { 0xe0, 0x6e, 0 }, { 0xe0, 0xee, 0 } }, /* 16e */ + { { 0 }, { 0 } }, /* 16f */ + { { 0xe0, 0x70, 0 }, { 0xe0, 0xf0, 0 } }, /* 170 */ + { { 0xe0, 0x71, 0 }, { 0xe0, 0xf1, 0 } }, /* 171 */ + { { 0xe0, 0x72, 0 }, { 0xe0, 0xf2, 0 } }, /* 172 */ + { { 0xe0, 0x73, 0 }, { 0xe0, 0xf3, 0 } }, /* 173 */ + { { 0xe0, 0x74, 0 }, { 0xe0, 0xf4, 0 } }, /* 174 */ + { { 0xe0, 0x75, 0 }, { 0xe0, 0xf5, 0 } }, /* 175 */ + { { 0 }, { 0 } }, /* 176 */ + { { 0xe0, 0x77, 0 }, { 0xe0, 0xf7, 0 } }, /* 177 */ + { { 0xe0, 0x78, 0 }, { 0xe0, 0xf8, 0 } }, /* 178 */ + { { 0xe0, 0x79, 0 }, { 0xe0, 0xf9, 0 } }, /* 179 */ + { { 0xe0, 0x7a, 0 }, { 0xe0, 0xfa, 0 } }, /* 17a */ + { { 0xe0, 0x7b, 0 }, { 0xe0, 0xfb, 0 } }, /* 17b */ + { { 0xe0, 0x7c, 0 }, { 0xe0, 0xfc, 0 } }, /* 17c */ + { { 0xe0, 0x7d, 0 }, { 0xe0, 0xfd, 0 } }, /* 17d */ + { { 0xe0, 0x7e, 0 }, { 0xe0, 0xfe, 0 } }, /* 17e */ + { { 0xe0, 0x7f, 0 }, { 0xe0, 0xff, 0 } }, /* 17f */ + { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, /* 181 */ + { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, /* 183 */ + { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, /* 185 */ + { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, /* 187 */ + { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, /* 189 */ + { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, /* 18b */ + { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, /* 18d */ + { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, /* 18f */ + { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, /* 191 */ + { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, /* 193 */ + { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, /* 195 */ + { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, /* 197 */ + { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, /* 199 */ + { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, /* 19b */ + { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, /* 19d */ + { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, /* 19f */ + { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, /* 1a1 */ + { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, /* 1a3 */ + { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, /* 1a5 */ + { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, /* 1a7 */ + { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, /* 1a9 */ + { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, /* 1ab */ + { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, /* 1ad */ + { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, /* 1c1 */ + { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, /* 1c3 */ + { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, /* 1c5 */ + { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, /* 1c7 */ + { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, /* 1c9 */ + { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, /* 1cb */ + { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, /* 1cd */ + { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, /* 1cf */ + { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, /* 1d1 */ + { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, /* 1d5 */ + { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, /* 1d7 */ + { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, /* 1d9 */ + { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, /* 1db */ + { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, /* 1dd */ + { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, /* 1df */ + { { 0 }, { 0 } }, /* 1e0 */ + { { 0xe0, 0xe1, 0 }, { 0 } }, /* 1e1 */ + { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, /* 1e3 */ + { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, /* 1e5 */ + { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, /* 1e7 */ + { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, /* 1e9 */ + { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, /* 1eb */ + { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, /* 1ed */ + { { 0xe0, 0xee, 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, /* 1ef */ + { { 0 }, { 0 } }, /* 1f0 */ + { { 0xe0, 0xf1, 0 }, { 0 } }, /* 1f1 */ + { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, /* 1f3 */ + { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, /* 1f5 */ + { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, /* 1f7 */ + { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, /* 1f9 */ + { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, /* 1fb */ + { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, /* 1fd */ + { { 0xe0, 0xfe, 0 }, { 0 } }, /* 1fe */ + { { 0xe0, 0xff, 0 }, { 0 } } /* 1ff */ // clang-format on }; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 39cb43d70..593b673e2 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -138,265 +138,518 @@ static video_timings_t timing_dram = { VIDEO_BUS, 0, 0, 0, 0, 0, 0 }; /*No addit static const scancode scancode_tandy[512] = { // clang-format off - { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ - { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ - { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ - { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ - { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ - { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ - { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ - { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ - { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ - { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ - { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ - { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ - { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ - { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ - { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ - { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ - { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ - { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ - { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ - { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ - { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ - { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ - { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ - { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ - { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ - { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ - { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ - { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ - { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ - { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ - { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ - { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ - { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ - { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ - { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ - { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x56, 0 }, { 0xd6, 0 } }, /* 052 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 054 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 056 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 058 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 064 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 066 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 068 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 070 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 072 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 074 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 076 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 078 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 080 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 084 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 086 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 088 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 090 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 092 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 094 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 096 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 098 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ba */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0bc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0be */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0de */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ec */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fe */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 100 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 102 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 104 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 106 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 108 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 110 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 112 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 114 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 116 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 118 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11a */ - { { 0x57, 0 }, { 0xd7, 0 } }, { { 0 }, { 0 } }, /* 11c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 120 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 122 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 130 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 132 */ - { { 0 }, { 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 134 */ - { { 0 }, { 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 136 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 140 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 142 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 144 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 146 */ - { { 0x29, 0 }, { 0xa9, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 148 */ - { { 0 }, { 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 14a */ - { { 0 }, { 0 } }, { { 0x4e, 0 }, { 0xce, 0 } }, /* 14c */ - { { 0 }, { 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14e */ - { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 150 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 152 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 154 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 156 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 158 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 160 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 162 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 164 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 166 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 168 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 170 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 172 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 174 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 176 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 178 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } } /* 1fe */ + { { 0 }, { 0 } }, /* 000 */ + { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ + { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ + { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ + { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ + { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ + { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ + { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ + { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ + { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ + { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ + { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ + { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ + { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ + { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ + { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ + { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ + { { 0x12, 0 }, { 0x92, 0 } }, /* 013 */ + { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ + { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ + { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ + { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ + { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ + { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ + { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ + { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ + { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ + { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ + { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ + { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ + { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ + { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ + { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ + { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ + { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ + { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ + { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ + { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ + { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ + { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ + { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ + { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ + { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ + { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ + { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ + { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ + { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ + { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ + { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ + { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ + { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ + { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ + { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ + { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ + { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ + { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ + { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ + { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ + { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ + { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ + { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ + { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ + { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ + { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ + { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ + { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ + { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ + { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ + { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ + { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ + { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ + { { 0x56, 0 }, { 0xd6, 0 } }, /* 053 */ + { { 0 }, { 0 } }, /* 054 */ + { { 0 }, { 0 } }, /* 055 */ + { { 0 }, { 0 } }, /* 056 */ + { { 0 }, { 0 } }, /* 057 */ + { { 0 }, { 0 } }, /* 058 */ + { { 0 }, { 0 } }, /* 059 */ + { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, /* 05b */ + { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, /* 05d */ + { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, /* 05f */ + { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, /* 061 */ + { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, /* 063 */ + { { 0 }, { 0 } }, /* 064 */ + { { 0 }, { 0 } }, /* 065 */ + { { 0 }, { 0 } }, /* 066 */ + { { 0 }, { 0 } }, /* 067 */ + { { 0 }, { 0 } }, /* 068 */ + { { 0 }, { 0 } }, /* 069 */ + { { 0 }, { 0 } }, /* 06a */ + { { 0 }, { 0 } }, /* 06b */ + { { 0 }, { 0 } }, /* 06c */ + { { 0 }, { 0 } }, /* 06d */ + { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, /* 06f */ + { { 0 }, { 0 } }, /* 070 */ + { { 0 }, { 0 } }, /* 071 */ + { { 0 }, { 0 } }, /* 072 */ + { { 0 }, { 0 } }, /* 073 */ + { { 0 }, { 0 } }, /* 074 */ + { { 0 }, { 0 } }, /* 075 */ + { { 0 }, { 0 } }, /* 076 */ + { { 0 }, { 0 } }, /* 077 */ + { { 0 }, { 0 } }, /* 078 */ + { { 0 }, { 0 } }, /* 079 */ + { { 0 }, { 0 } }, /* 07a */ + { { 0 }, { 0 } }, /* 07b */ + { { 0 }, { 0 } }, /* 07c */ + { { 0 }, { 0 } }, /* 07d */ + { { 0 }, { 0 } }, /* 07e */ + { { 0 }, { 0 } }, /* 07f */ + { { 0 }, { 0 } }, /* 080 */ + { { 0 }, { 0 } }, /* 081 */ + { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, /* 083 */ + { { 0 }, { 0 } }, /* 084 */ + { { 0 }, { 0 } }, /* 085 */ + { { 0 }, { 0 } }, /* 086 */ + { { 0 }, { 0 } }, /* 087 */ + { { 0 }, { 0 } }, /* 088 */ + { { 0 }, { 0 } }, /* 089 */ + { { 0 }, { 0 } }, /* 08a */ + { { 0 }, { 0 } }, /* 08b */ + { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, /* 08d */ + { { 0 }, { 0 } }, /* 08e */ + { { 0 }, { 0 } }, /* 08f */ + { { 0 }, { 0 } }, /* 090 */ + { { 0 }, { 0 } }, /* 091 */ + { { 0 }, { 0 } }, /* 092 */ + { { 0 }, { 0 } }, /* 093 */ + { { 0 }, { 0 } }, /* 094 */ + { { 0 }, { 0 } }, /* 095 */ + { { 0 }, { 0 } }, /* 096 */ + { { 0 }, { 0 } }, /* 097 */ + { { 0 }, { 0 } }, /* 098 */ + { { 0 }, { 0 } }, /* 099 */ + { { 0 }, { 0 } }, /* 09a */ + { { 0 }, { 0 } }, /* 09b */ + { { 0 }, { 0 } }, /* 09c */ + { { 0 }, { 0 } }, /* 09d */ + { { 0 }, { 0 } }, /* 09e */ + { { 0 }, { 0 } }, /* 09f */ + { { 0 }, { 0 } }, /* 0a0 */ + { { 0 }, { 0 } }, /* 0a1 */ + { { 0 }, { 0 } }, /* 0a2 */ + { { 0 }, { 0 } }, /* 0a3 */ + { { 0 }, { 0 } }, /* 0a4 */ + { { 0 }, { 0 } }, /* 0a5 */ + { { 0 }, { 0 } }, /* 0a6 */ + { { 0 }, { 0 } }, /* 0a7 */ + { { 0 }, { 0 } }, /* 0a8 */ + { { 0 }, { 0 } }, /* 0a9 */ + { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, /* 0ab */ + { { 0 }, { 0 } }, /* 0ac */ + { { 0 }, { 0 } }, /* 0ad */ + { { 0 }, { 0 } }, /* 0ae */ + { { 0 }, { 0 } }, /* 0af */ + { { 0 }, { 0 } }, /* 0b0 */ + { { 0 }, { 0 } }, /* 0b1 */ + { { 0 }, { 0 } }, /* 0b2 */ + { { 0 }, { 0 } }, /* 0b3 */ + { { 0 }, { 0 } }, /* 0b4 */ + { { 0 }, { 0 } }, /* 0b5 */ + { { 0 }, { 0 } }, /* 0b6 */ + { { 0 }, { 0 } }, /* 0b7 */ + { { 0 }, { 0 } }, /* 0b8 */ + { { 0 }, { 0 } }, /* 0b9 */ + { { 0 }, { 0 } }, /* 0ba */ + { { 0 }, { 0 } }, /* 0bb */ + { { 0 }, { 0 } }, /* 0bc */ + { { 0 }, { 0 } }, /* 0bd */ + { { 0 }, { 0 } }, /* 0be */ + { { 0 }, { 0 } }, /* 0bf */ + { { 0 }, { 0 } }, /* 0c0 */ + { { 0 }, { 0 } }, /* 0c1 */ + { { 0 }, { 0 } }, /* 0c2 */ + { { 0 }, { 0 } }, /* 0c3 */ + { { 0 }, { 0 } }, /* 0c4 */ + { { 0 }, { 0 } }, /* 0c5 */ + { { 0 }, { 0 } }, /* 0c6 */ + { { 0 }, { 0 } }, /* 0c7 */ + { { 0 }, { 0 } }, /* 0c8 */ + { { 0 }, { 0 } }, /* 0c9 */ + { { 0 }, { 0 } }, /* 0ca */ + { { 0 }, { 0 } }, /* 0cb */ + { { 0 }, { 0 } }, /* 0cc */ + { { 0 }, { 0 } }, /* 0cd */ + { { 0 }, { 0 } }, /* 0ce */ + { { 0 }, { 0 } }, /* 0cf */ + { { 0 }, { 0 } }, /* 0d0 */ + { { 0 }, { 0 } }, /* 0d1 */ + { { 0 }, { 0 } }, /* 0d2 */ + { { 0 }, { 0 } }, /* 0d3 */ + { { 0 }, { 0 } }, /* 0d4 */ + { { 0 }, { 0 } }, /* 0d5 */ + { { 0 }, { 0 } }, /* 0d6 */ + { { 0 }, { 0 } }, /* 0d7 */ + { { 0 }, { 0 } }, /* 0d8 */ + { { 0 }, { 0 } }, /* 0d9 */ + { { 0 }, { 0 } }, /* 0da */ + { { 0 }, { 0 } }, /* 0db */ + { { 0 }, { 0 } }, /* 0dc */ + { { 0 }, { 0 } }, /* 0dd */ + { { 0 }, { 0 } }, /* 0de */ + { { 0 }, { 0 } }, /* 0df */ + { { 0 }, { 0 } }, /* 0e0 */ + { { 0 }, { 0 } }, /* 0e1 */ + { { 0 }, { 0 } }, /* 0e2 */ + { { 0 }, { 0 } }, /* 0e3 */ + { { 0 }, { 0 } }, /* 0e4 */ + { { 0 }, { 0 } }, /* 0e5 */ + { { 0 }, { 0 } }, /* 0e6 */ + { { 0 }, { 0 } }, /* 0e7 */ + { { 0 }, { 0 } }, /* 0e8 */ + { { 0 }, { 0 } }, /* 0e9 */ + { { 0 }, { 0 } }, /* 0ea */ + { { 0 }, { 0 } }, /* 0eb */ + { { 0 }, { 0 } }, /* 0ec */ + { { 0 }, { 0 } }, /* 0ed */ + { { 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, /* 0ef */ + { { 0 }, { 0 } }, /* 0f0 */ + { { 0 }, { 0 } }, /* 0f1 */ + { { 0 }, { 0 } }, /* 0f2 */ + { { 0 }, { 0 } }, /* 0f3 */ + { { 0 }, { 0 } }, /* 0f4 */ + { { 0 }, { 0 } }, /* 0f5 */ + { { 0 }, { 0 } }, /* 0f6 */ + { { 0 }, { 0 } }, /* 0f7 */ + { { 0 }, { 0 } }, /* 0f8 */ + { { 0 }, { 0 } }, /* 0f9 */ + { { 0 }, { 0 } }, /* 0fa */ + { { 0 }, { 0 } }, /* 0fb */ + { { 0 }, { 0 } }, /* 0fc */ + { { 0 }, { 0 } }, /* 0fd */ + { { 0 }, { 0 } }, /* 0fe */ + { { 0 }, { 0 } }, /* 0ff */ + { { 0 }, { 0 } }, /* 100 */ + { { 0 }, { 0 } }, /* 101 */ + { { 0 }, { 0 } }, /* 102 */ + { { 0 }, { 0 } }, /* 103 */ + { { 0 }, { 0 } }, /* 104 */ + { { 0 }, { 0 } }, /* 105 */ + { { 0 }, { 0 } }, /* 106 */ + { { 0 }, { 0 } }, /* 107 */ + { { 0 }, { 0 } }, /* 108 */ + { { 0 }, { 0 } }, /* 109 */ + { { 0 }, { 0 } }, /* 10a */ + { { 0 }, { 0 } }, /* 10b */ + { { 0 }, { 0 } }, /* 10c */ + { { 0 }, { 0 } }, /* 10d */ + { { 0 }, { 0 } }, /* 10e */ + { { 0 }, { 0 } }, /* 10f */ + { { 0 }, { 0 } }, /* 110 */ + { { 0 }, { 0 } }, /* 111 */ + { { 0 }, { 0 } }, /* 112 */ + { { 0 }, { 0 } }, /* 113 */ + { { 0 }, { 0 } }, /* 114 */ + { { 0 }, { 0 } }, /* 115 */ + { { 0 }, { 0 } }, /* 116 */ + { { 0 }, { 0 } }, /* 117 */ + { { 0 }, { 0 } }, /* 118 */ + { { 0 }, { 0 } }, /* 119 */ + { { 0 }, { 0 } }, /* 11a */ + { { 0 }, { 0 } }, /* 11b */ + { { 0x57, 0 }, { 0xd7, 0 } }, /* 11c */ + { { 0 }, { 0 } }, /* 11d */ + { { 0 }, { 0 } }, /* 11e */ + { { 0 }, { 0 } }, /* 11f */ + { { 0 }, { 0 } }, /* 120 */ + { { 0 }, { 0 } }, /* 121 */ + { { 0 }, { 0 } }, /* 122 */ + { { 0 }, { 0 } }, /* 123 */ + { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, /* 125 */ + { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, /* 127 */ + { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, /* 129 */ + { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, /* 12b */ + { { 0 }, { 0 } }, /* 12c */ + { { 0 }, { 0 } }, /* 12d */ + { { 0 }, { 0 } }, /* 12e */ + { { 0 }, { 0 } }, /* 12f */ + { { 0 }, { 0 } }, /* 130 */ + { { 0 }, { 0 } }, /* 131 */ + { { 0 }, { 0 } }, /* 132 */ + { { 0 }, { 0 } }, /* 133 */ + { { 0 }, { 0 } }, /* 134 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 135 */ + { { 0 }, { 0 } }, /* 136 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 137 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 138 */ + { { 0 }, { 0 } }, /* 139 */ + { { 0 }, { 0 } }, /* 13a */ + { { 0 }, { 0 } }, /* 13b */ + { { 0 }, { 0 } }, /* 13c */ + { { 0 }, { 0 } }, /* 13d */ + { { 0 }, { 0 } }, /* 13e */ + { { 0 }, { 0 } }, /* 13f */ + { { 0 }, { 0 } }, /* 140 */ + { { 0 }, { 0 } }, /* 141 */ + { { 0 }, { 0 } }, /* 142 */ + { { 0 }, { 0 } }, /* 143 */ + { { 0 }, { 0 } }, /* 144 */ + { { 0 }, { 0 } }, /* 145 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 146 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 147 */ + { { 0x29, 0 }, { 0xa9, 0 } }, /* 148 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 149 */ + { { 0 }, { 0 } }, /* 14a */ + { { 0x2b, 0 }, { 0xab, 0 } }, /* 14b */ + { { 0 }, { 0 } }, /* 14c */ + { { 0x4e, 0 }, { 0xce, 0 } }, /* 14d */ + { { 0 }, { 0 } }, /* 14e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14f */ + { { 0x4a, 0 }, { 0xca, 0 } }, /* 150 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 151 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 152 */ + { { 0x53, 0 }, { 0xd3, 0 } }, /* 153 */ + { { 0 }, { 0 } }, /* 154 */ + { { 0 }, { 0 } }, /* 155 */ + { { 0 }, { 0 } }, /* 156 */ + { { 0 }, { 0 } }, /* 157 */ + { { 0 }, { 0 } }, /* 158 */ + { { 0 }, { 0 } }, /* 159 */ + { { 0 }, { 0 } }, /* 15a */ + { { 0 }, { 0 } }, /* 15b */ + { { 0 }, { 0 } }, /* 15c */ + { { 0 }, { 0 } }, /* 15d */ + { { 0 }, { 0 } }, /* 15e */ + { { 0 }, { 0 } }, /* 15f */ + { { 0 }, { 0 } }, /* 160 */ + { { 0 }, { 0 } }, /* 161 */ + { { 0 }, { 0 } }, /* 162 */ + { { 0 }, { 0 } }, /* 163 */ + { { 0 }, { 0 } }, /* 164 */ + { { 0 }, { 0 } }, /* 165 */ + { { 0 }, { 0 } }, /* 166 */ + { { 0 }, { 0 } }, /* 167 */ + { { 0 }, { 0 } }, /* 168 */ + { { 0 }, { 0 } }, /* 169 */ + { { 0 }, { 0 } }, /* 16a */ + { { 0 }, { 0 } }, /* 16b */ + { { 0 }, { 0 } }, /* 16c */ + { { 0 }, { 0 } }, /* 16d */ + { { 0 }, { 0 } }, /* 16e */ + { { 0 }, { 0 } }, /* 16f */ + { { 0 }, { 0 } }, /* 170 */ + { { 0 }, { 0 } }, /* 171 */ + { { 0 }, { 0 } }, /* 172 */ + { { 0 }, { 0 } }, /* 173 */ + { { 0 }, { 0 } }, /* 174 */ + { { 0 }, { 0 } }, /* 175 */ + { { 0 }, { 0 } }, /* 176 */ + { { 0 }, { 0 } }, /* 177 */ + { { 0 }, { 0 } }, /* 178 */ + { { 0 }, { 0 } }, /* 179 */ + { { 0 }, { 0 } }, /* 17a */ + { { 0 }, { 0 } }, /* 17b */ + { { 0 }, { 0 } }, /* 17c */ + { { 0 }, { 0 } }, /* 17d */ + { { 0 }, { 0 } }, /* 17e */ + { { 0 }, { 0 } }, /* 17f */ + { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, /* 181 */ + { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, /* 183 */ + { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, /* 185 */ + { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, /* 187 */ + { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, /* 189 */ + { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, /* 18b */ + { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, /* 18d */ + { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, /* 18f */ + { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, /* 191 */ + { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, /* 193 */ + { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, /* 195 */ + { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, /* 197 */ + { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, /* 199 */ + { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, /* 19b */ + { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, /* 19d */ + { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, /* 19f */ + { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, /* 1a1 */ + { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, /* 1a3 */ + { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, /* 1a5 */ + { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, /* 1a7 */ + { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, /* 1a9 */ + { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, /* 1ab */ + { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, /* 1ad */ + { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, /* 1b1 */ + { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, /* 1b3 */ + { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, /* 1b5 */ + { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, /* 1b7 */ + { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, /* 1b9 */ + { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, /* 1bb */ + { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, /* 1bd */ + { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, /* 1bf */ + { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, /* 1c1 */ + { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, /* 1c3 */ + { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, /* 1c5 */ + { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, /* 1c7 */ + { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, /* 1c9 */ + { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, /* 1cb */ + { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, /* 1cd */ + { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, /* 1cf */ + { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, /* 1d1 */ + { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, /* 1d5 */ + { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, /* 1d7 */ + { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, /* 1d9 */ + { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, /* 1db */ + { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, /* 1dd */ + { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, /* 1df */ + { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, /* 1e1 */ + { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, /* 1e3 */ + { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, /* 1e5 */ + { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, /* 1e7 */ + { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, /* 1e9 */ + { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, /* 1eb */ + { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, /* 1ed */ + { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, /* 1ef */ + { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, /* 1f1 */ + { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, /* 1f3 */ + { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, /* 1f5 */ + { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, /* 1f7 */ + { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, /* 1f9 */ + { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, /* 1fb */ + { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, /* 1fd */ + { { 0 }, { 0 } }, /* 1fe */ + { { 0 }, { 0 } } /* 1ff */ // clang-format on }; static uint8_t crtcmask[32] = { diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index 6cc359892..b6bcbf3ca 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -846,265 +846,518 @@ ms_poll(void *priv) */ const scancode scancode_olivetti_m24_deluxe[512] = { // clang-format off - { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ - { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ - { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ - { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ - { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ - { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ - { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ - { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ - { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ - { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ - { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ - { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ - { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ - { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ - { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ - { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ - { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ - { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ - { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ - { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ - { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ - { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ - { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ - { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ - { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ - { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ - { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ - { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ - { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ - { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ - { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ - { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ - { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ - { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ - { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ - { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 054 */ - { { 0x5e, 0 }, { 0xde, 0 } }, { { 0x60, 0 }, { 0xe0, 0 } }, /* 056 */ - { { 0x61, 0 }, { 0xe1, 0 } }, { { 0 }, { 0 } }, /* 058 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 064 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 066 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 068 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 070 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 072 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 074 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 076 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 078 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 080 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 084 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 086 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 088 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 090 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 092 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 094 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 096 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 098 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ba */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0bc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0be */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0de */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ec */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fe */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 100 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 102 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 104 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 106 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 108 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 110 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 112 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 114 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 116 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 118 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11a */ - { { 0x57, 0 }, { 0xd7, 0 } }, { { 0 }, { 0 } }, /* 11c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 120 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 122 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 130 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 132 */ - { { 0 }, { 0 } }, { { 0x5f, 0 }, { 0xdf, 0 } }, /* 134 */ - { { 0 }, { 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 136 */ - { { 0x66, 0 }, { 0xe6, 0 } }, { { 0x55, 0 }, { 0xd5, 0 } }, /* 138 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 140 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 142 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 144 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x63, 0 }, { 0xe3, 0 } }, /* 146 */ - { { 0x5b, 0 }, { 0xdb, 0 } }, { { 0x5c, 0 }, { 0xdc, 0 } }, /* 148 */ - { { 0 }, { 0 } }, { { 0x58, 0 }, { 0xd8, 0 } }, /* 14a */ - { { 0 }, { 0 } }, { { 0x5a, 0 }, { 0xda, 0 } }, /* 14c */ - { { 0 }, { 0 } }, { { 0x65, 0 }, { 0xe5, 0 } }, /* 14e */ - { { 0x59, 0 }, { 0xd9, 0 } }, { { 0x5d, 0 }, { 0xdd, 0 } }, /* 150 */ - { { 0x62, 0 }, { 0xe2, 0 } }, { { 0x64, 0 }, { 0xe4, 0 } }, /* 152 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 154 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 156 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 158 */ - { { 0 }, { 0 } }, { { 0x54, 0 }, { 0xd4, 0 } }, /* 15a */ - { { 0x67, 0 }, { 0xe7, 0 } }, { { 0x56, 0 }, { 0xd6, 0 } }, /* 15c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 160 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 162 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 164 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 166 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 168 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 170 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 172 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 174 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 176 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 178 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } } /* 1fe */ + { { 0 }, { 0 } }, /* 000 */ + { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ + { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ + { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ + { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ + { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ + { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ + { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ + { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ + { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ + { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ + { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ + { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ + { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ + { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ + { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ + { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ + { { 0x12, 0 }, { 0x92, 0 } }, /* 013 */ + { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ + { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ + { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ + { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ + { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ + { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ + { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ + { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ + { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ + { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ + { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ + { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ + { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ + { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ + { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ + { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ + { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ + { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ + { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ + { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ + { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ + { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ + { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ + { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ + { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ + { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ + { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ + { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ + { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ + { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ + { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ + { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ + { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ + { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ + { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ + { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ + { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ + { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ + { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ + { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ + { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ + { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ + { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ + { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ + { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ + { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ + { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ + { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ + { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ + { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ + { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ + { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ + { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ + { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ + { { 0 }, { 0 } }, /* 054 */ + { { 0 }, { 0 } }, /* 055 */ + { { 0x5e, 0 }, { 0xde, 0 } }, /* 056 */ + { { 0x60, 0 }, { 0xe0, 0 } }, /* 057 */ + { { 0x61, 0 }, { 0xe1, 0 } }, /* 058 */ + { { 0 }, { 0 } }, /* 059 */ + { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, /* 05b */ + { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, /* 05d */ + { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, /* 05f */ + { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, /* 061 */ + { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, /* 063 */ + { { 0 }, { 0 } }, /* 064 */ + { { 0 }, { 0 } }, /* 065 */ + { { 0 }, { 0 } }, /* 066 */ + { { 0 }, { 0 } }, /* 067 */ + { { 0 }, { 0 } }, /* 068 */ + { { 0 }, { 0 } }, /* 069 */ + { { 0 }, { 0 } }, /* 06a */ + { { 0 }, { 0 } }, /* 06b */ + { { 0 }, { 0 } }, /* 06c */ + { { 0 }, { 0 } }, /* 06d */ + { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, /* 06f */ + { { 0 }, { 0 } }, /* 070 */ + { { 0 }, { 0 } }, /* 071 */ + { { 0 }, { 0 } }, /* 072 */ + { { 0 }, { 0 } }, /* 073 */ + { { 0 }, { 0 } }, /* 074 */ + { { 0 }, { 0 } }, /* 075 */ + { { 0 }, { 0 } }, /* 076 */ + { { 0 }, { 0 } }, /* 077 */ + { { 0 }, { 0 } }, /* 078 */ + { { 0 }, { 0 } }, /* 079 */ + { { 0 }, { 0 } }, /* 07a */ + { { 0 }, { 0 } }, /* 07b */ + { { 0 }, { 0 } }, /* 07c */ + { { 0 }, { 0 } }, /* 07d */ + { { 0 }, { 0 } }, /* 07e */ + { { 0 }, { 0 } }, /* 07f */ + { { 0 }, { 0 } }, /* 080 */ + { { 0 }, { 0 } }, /* 081 */ + { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, /* 083 */ + { { 0 }, { 0 } }, /* 084 */ + { { 0 }, { 0 } }, /* 085 */ + { { 0 }, { 0 } }, /* 086 */ + { { 0 }, { 0 } }, /* 087 */ + { { 0 }, { 0 } }, /* 088 */ + { { 0 }, { 0 } }, /* 089 */ + { { 0 }, { 0 } }, /* 08a */ + { { 0 }, { 0 } }, /* 08b */ + { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, /* 08d */ + { { 0 }, { 0 } }, /* 08e */ + { { 0 }, { 0 } }, /* 08f */ + { { 0 }, { 0 } }, /* 090 */ + { { 0 }, { 0 } }, /* 091 */ + { { 0 }, { 0 } }, /* 092 */ + { { 0 }, { 0 } }, /* 093 */ + { { 0 }, { 0 } }, /* 094 */ + { { 0 }, { 0 } }, /* 095 */ + { { 0 }, { 0 } }, /* 096 */ + { { 0 }, { 0 } }, /* 097 */ + { { 0 }, { 0 } }, /* 098 */ + { { 0 }, { 0 } }, /* 099 */ + { { 0 }, { 0 } }, /* 09a */ + { { 0 }, { 0 } }, /* 09b */ + { { 0 }, { 0 } }, /* 09c */ + { { 0 }, { 0 } }, /* 09d */ + { { 0 }, { 0 } }, /* 09e */ + { { 0 }, { 0 } }, /* 09f */ + { { 0 }, { 0 } }, /* 0a0 */ + { { 0 }, { 0 } }, /* 0a1 */ + { { 0 }, { 0 } }, /* 0a2 */ + { { 0 }, { 0 } }, /* 0a3 */ + { { 0 }, { 0 } }, /* 0a4 */ + { { 0 }, { 0 } }, /* 0a5 */ + { { 0 }, { 0 } }, /* 0a6 */ + { { 0 }, { 0 } }, /* 0a7 */ + { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, /* 0a9 */ + { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, /* 0ab */ + { { 0 }, { 0 } }, /* 0ac */ + { { 0 }, { 0 } }, /* 0ad */ + { { 0 }, { 0 } }, /* 0ae */ + { { 0 }, { 0 } }, /* 0af */ + { { 0 }, { 0 } }, /* 0b0 */ + { { 0 }, { 0 } }, /* 0b1 */ + { { 0 }, { 0 } }, /* 0b2 */ + { { 0 }, { 0 } }, /* 0b3 */ + { { 0 }, { 0 } }, /* 0b4 */ + { { 0 }, { 0 } }, /* 0b5 */ + { { 0 }, { 0 } }, /* 0b6 */ + { { 0 }, { 0 } }, /* 0b7 */ + { { 0 }, { 0 } }, /* 0b8 */ + { { 0 }, { 0 } }, /* 0b9 */ + { { 0 }, { 0 } }, /* 0ba */ + { { 0 }, { 0 } }, /* 0bb */ + { { 0 }, { 0 } }, /* 0bc */ + { { 0 }, { 0 } }, /* 0bd */ + { { 0 }, { 0 } }, /* 0be */ + { { 0 }, { 0 } }, /* 0bf */ + { { 0 }, { 0 } }, /* 0c0 */ + { { 0 }, { 0 } }, /* 0c1 */ + { { 0 }, { 0 } }, /* 0c2 */ + { { 0 }, { 0 } }, /* 0c3 */ + { { 0 }, { 0 } }, /* 0c4 */ + { { 0 }, { 0 } }, /* 0c5 */ + { { 0 }, { 0 } }, /* 0c6 */ + { { 0 }, { 0 } }, /* 0c7 */ + { { 0 }, { 0 } }, /* 0c8 */ + { { 0 }, { 0 } }, /* 0c9 */ + { { 0 }, { 0 } }, /* 0ca */ + { { 0 }, { 0 } }, /* 0cb */ + { { 0 }, { 0 } }, /* 0cc */ + { { 0 }, { 0 } }, /* 0cd */ + { { 0 }, { 0 } }, /* 0ce */ + { { 0 }, { 0 } }, /* 0cf */ + { { 0 }, { 0 } }, /* 0d0 */ + { { 0 }, { 0 } }, /* 0d1 */ + { { 0 }, { 0 } }, /* 0d2 */ + { { 0 }, { 0 } }, /* 0d3 */ + { { 0 }, { 0 } }, /* 0d4 */ + { { 0 }, { 0 } }, /* 0d5 */ + { { 0 }, { 0 } }, /* 0d6 */ + { { 0 }, { 0 } }, /* 0d7 */ + { { 0 }, { 0 } }, /* 0d8 */ + { { 0 }, { 0 } }, /* 0d9 */ + { { 0 }, { 0 } }, /* 0da */ + { { 0 }, { 0 } }, /* 0db */ + { { 0 }, { 0 } }, /* 0dc */ + { { 0 }, { 0 } }, /* 0dd */ + { { 0 }, { 0 } }, /* 0de */ + { { 0 }, { 0 } }, /* 0df */ + { { 0 }, { 0 } }, /* 0e0 */ + { { 0 }, { 0 } }, /* 0e1 */ + { { 0 }, { 0 } }, /* 0e2 */ + { { 0 }, { 0 } }, /* 0e3 */ + { { 0 }, { 0 } }, /* 0e4 */ + { { 0 }, { 0 } }, /* 0e5 */ + { { 0 }, { 0 } }, /* 0e6 */ + { { 0 }, { 0 } }, /* 0e7 */ + { { 0 }, { 0 } }, /* 0e8 */ + { { 0 }, { 0 } }, /* 0e9 */ + { { 0 }, { 0 } }, /* 0ea */ + { { 0 }, { 0 } }, /* 0eb */ + { { 0 }, { 0 } }, /* 0ec */ + { { 0 }, { 0 } }, /* 0ed */ + { { 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, /* 0ef */ + { { 0 }, { 0 } }, /* 0f0 */ + { { 0 }, { 0 } }, /* 0f1 */ + { { 0 }, { 0 } }, /* 0f2 */ + { { 0 }, { 0 } }, /* 0f3 */ + { { 0 }, { 0 } }, /* 0f4 */ + { { 0 }, { 0 } }, /* 0f5 */ + { { 0 }, { 0 } }, /* 0f6 */ + { { 0 }, { 0 } }, /* 0f7 */ + { { 0 }, { 0 } }, /* 0f8 */ + { { 0 }, { 0 } }, /* 0f9 */ + { { 0 }, { 0 } }, /* 0fa */ + { { 0 }, { 0 } }, /* 0fb */ + { { 0 }, { 0 } }, /* 0fc */ + { { 0 }, { 0 } }, /* 0fd */ + { { 0 }, { 0 } }, /* 0fe */ + { { 0 }, { 0 } }, /* 0ff */ + { { 0 }, { 0 } }, /* 100 */ + { { 0 }, { 0 } }, /* 101 */ + { { 0 }, { 0 } }, /* 102 */ + { { 0 }, { 0 } }, /* 103 */ + { { 0 }, { 0 } }, /* 104 */ + { { 0 }, { 0 } }, /* 105 */ + { { 0 }, { 0 } }, /* 106 */ + { { 0 }, { 0 } }, /* 107 */ + { { 0 }, { 0 } }, /* 108 */ + { { 0 }, { 0 } }, /* 109 */ + { { 0 }, { 0 } }, /* 10a */ + { { 0 }, { 0 } }, /* 10b */ + { { 0 }, { 0 } }, /* 10c */ + { { 0 }, { 0 } }, /* 10d */ + { { 0 }, { 0 } }, /* 10e */ + { { 0 }, { 0 } }, /* 10f */ + { { 0 }, { 0 } }, /* 110 */ + { { 0 }, { 0 } }, /* 111 */ + { { 0 }, { 0 } }, /* 112 */ + { { 0 }, { 0 } }, /* 113 */ + { { 0 }, { 0 } }, /* 114 */ + { { 0 }, { 0 } }, /* 115 */ + { { 0 }, { 0 } }, /* 116 */ + { { 0 }, { 0 } }, /* 117 */ + { { 0 }, { 0 } }, /* 118 */ + { { 0 }, { 0 } }, /* 119 */ + { { 0 }, { 0 } }, /* 11a */ + { { 0 }, { 0 } }, /* 11b */ + { { 0x57, 0 }, { 0xd7, 0 } }, /* 11c */ + { { 0 }, { 0 } }, /* 11d */ + { { 0 }, { 0 } }, /* 11e */ + { { 0 }, { 0 } }, /* 11f */ + { { 0 }, { 0 } }, /* 120 */ + { { 0 }, { 0 } }, /* 121 */ + { { 0 }, { 0 } }, /* 122 */ + { { 0 }, { 0 } }, /* 123 */ + { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, /* 125 */ + { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, /* 127 */ + { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, /* 129 */ + { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, /* 12b */ + { { 0 }, { 0 } }, /* 12c */ + { { 0 }, { 0 } }, /* 12d */ + { { 0 }, { 0 } }, /* 12e */ + { { 0 }, { 0 } }, /* 12f */ + { { 0 }, { 0 } }, /* 130 */ + { { 0 }, { 0 } }, /* 131 */ + { { 0 }, { 0 } }, /* 132 */ + { { 0 }, { 0 } }, /* 133 */ + { { 0 }, { 0 } }, /* 134 */ + { { 0x5f, 0 }, { 0xdf, 0 } }, /* 135 */ + { { 0 }, { 0 } }, /* 136 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 137 */ + { { 0x66, 0 }, { 0xe6, 0 } }, /* 138 */ + { { 0x55, 0 }, { 0xd5, 0 } }, /* 139 */ + { { 0 }, { 0 } }, /* 13a */ + { { 0 }, { 0 } }, /* 13b */ + { { 0 }, { 0 } }, /* 13c */ + { { 0 }, { 0 } }, /* 13d */ + { { 0 }, { 0 } }, /* 13e */ + { { 0 }, { 0 } }, /* 13f */ + { { 0 }, { 0 } }, /* 140 */ + { { 0 }, { 0 } }, /* 141 */ + { { 0 }, { 0 } }, /* 142 */ + { { 0 }, { 0 } }, /* 143 */ + { { 0 }, { 0 } }, /* 144 */ + { { 0 }, { 0 } }, /* 145 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 146 */ + { { 0x63, 0 }, { 0xe3, 0 } }, /* 147 */ + { { 0x5b, 0 }, { 0xdb, 0 } }, /* 148 */ + { { 0x5c, 0 }, { 0xdc, 0 } }, /* 149 */ + { { 0 }, { 0 } }, /* 14a */ + { { 0x58, 0 }, { 0xd8, 0 } }, /* 14b */ + { { 0 }, { 0 } }, /* 14c */ + { { 0x5a, 0 }, { 0xda, 0 } }, /* 14d */ + { { 0 }, { 0 } }, /* 14e */ + { { 0x65, 0 }, { 0xe5, 0 } }, /* 14f */ + { { 0x59, 0 }, { 0xd9, 0 } }, /* 150 */ + { { 0x5d, 0 }, { 0xdd, 0 } }, /* 151 */ + { { 0x62, 0 }, { 0xe2, 0 } }, /* 152 */ + { { 0x64, 0 }, { 0xe4, 0 } }, /* 153 */ + { { 0 }, { 0 } }, /* 154 */ + { { 0 }, { 0 } }, /* 155 */ + { { 0 }, { 0 } }, /* 156 */ + { { 0 }, { 0 } }, /* 157 */ + { { 0 }, { 0 } }, /* 158 */ + { { 0 }, { 0 } }, /* 159 */ + { { 0 }, { 0 } }, /* 15a */ + { { 0x54, 0 }, { 0xd4, 0 } }, /* 15b */ + { { 0x67, 0 }, { 0xe7, 0 } }, /* 15c */ + { { 0x56, 0 }, { 0xd6, 0 } }, /* 15d */ + { { 0 }, { 0 } }, /* 15e */ + { { 0 }, { 0 } }, /* 15f */ + { { 0 }, { 0 } }, /* 160 */ + { { 0 }, { 0 } }, /* 161 */ + { { 0 }, { 0 } }, /* 162 */ + { { 0 }, { 0 } }, /* 163 */ + { { 0 }, { 0 } }, /* 164 */ + { { 0 }, { 0 } }, /* 165 */ + { { 0 }, { 0 } }, /* 166 */ + { { 0 }, { 0 } }, /* 167 */ + { { 0 }, { 0 } }, /* 168 */ + { { 0 }, { 0 } }, /* 169 */ + { { 0 }, { 0 } }, /* 16a */ + { { 0 }, { 0 } }, /* 16b */ + { { 0 }, { 0 } }, /* 16c */ + { { 0 }, { 0 } }, /* 16d */ + { { 0 }, { 0 } }, /* 16e */ + { { 0 }, { 0 } }, /* 16f */ + { { 0 }, { 0 } }, /* 170 */ + { { 0 }, { 0 } }, /* 171 */ + { { 0 }, { 0 } }, /* 172 */ + { { 0 }, { 0 } }, /* 173 */ + { { 0 }, { 0 } }, /* 174 */ + { { 0 }, { 0 } }, /* 175 */ + { { 0 }, { 0 } }, /* 176 */ + { { 0 }, { 0 } }, /* 177 */ + { { 0 }, { 0 } }, /* 178 */ + { { 0 }, { 0 } }, /* 179 */ + { { 0 }, { 0 } }, /* 17a */ + { { 0 }, { 0 } }, /* 17b */ + { { 0 }, { 0 } }, /* 17c */ + { { 0 }, { 0 } }, /* 17d */ + { { 0 }, { 0 } }, /* 17e */ + { { 0 }, { 0 } }, /* 17f */ + { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, /* 181 */ + { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, /* 183 */ + { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, /* 185 */ + { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, /* 187 */ + { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, /* 189 */ + { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, /* 18b */ + { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, /* 18d */ + { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, /* 18f */ + { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, /* 191 */ + { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, /* 193 */ + { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, /* 195 */ + { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, /* 197 */ + { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, /* 199 */ + { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, /* 19b */ + { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, /* 19d */ + { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, /* 19f */ + { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, /* 1a1 */ + { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, /* 1a3 */ + { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, /* 1a5 */ + { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, /* 1a7 */ + { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, /* 1a9 */ + { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, /* 1ab */ + { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, /* 1ad */ + { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, /* 1b1 */ + { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, /* 1b3 */ + { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, /* 1b5 */ + { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, /* 1b7 */ + { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, /* 1b9 */ + { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, /* 1bb */ + { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, /* 1bd */ + { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, /* 1bf */ + { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, /* 1c1 */ + { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, /* 1c3 */ + { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, /* 1c5 */ + { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, /* 1c7 */ + { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, /* 1c9 */ + { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, /* 1cb */ + { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, /* 1cd */ + { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, /* 1cf */ + { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, /* 1d1 */ + { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, /* 1d5 */ + { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, /* 1d7 */ + { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, /* 1d9 */ + { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, /* 1db */ + { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, /* 1dd */ + { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, /* 1df */ + { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, /* 1e1 */ + { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, /* 1e3 */ + { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, /* 1e5 */ + { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, /* 1e7 */ + { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, /* 1e9 */ + { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, /* 1eb */ + { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, /* 1ed */ + { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, /* 1ef */ + { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, /* 1f1 */ + { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, /* 1f3 */ + { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, /* 1f5 */ + { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, /* 1f7 */ + { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, /* 1f9 */ + { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, /* 1fb */ + { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, /* 1fd */ + { { 0 }, { 0 } }, /* 1fe */ + { { 0 }, { 0 } } /* 1ff */ // clang-format on }; @@ -1116,265 +1369,518 @@ const scancode scancode_olivetti_m24_deluxe[512] = { */ const scancode scancode_olivetti_m240[512] = { // clang-format off - { { 0 }, { 0 } }, { { 0x01, 0 }, { 0x81, 0 } }, /* 000 */ - { { 0x02, 0 }, { 0x82, 0 } }, { { 0x03, 0 }, { 0x83, 0 } }, /* 002 */ - { { 0x04, 0 }, { 0x84, 0 } }, { { 0x05, 0 }, { 0x85, 0 } }, /* 004 */ - { { 0x06, 0 }, { 0x86, 0 } }, { { 0x07, 0 }, { 0x87, 0 } }, /* 006 */ - { { 0x08, 0 }, { 0x88, 0 } }, { { 0x09, 0 }, { 0x89, 0 } }, /* 008 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00a */ - { { 0x0c, 0 }, { 0x8c, 0 } }, { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00c */ - { { 0x0e, 0 }, { 0x8e, 0 } }, { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00e */ - { { 0x10, 0 }, { 0x90, 0 } }, { { 0x11, 0 }, { 0x91, 0 } }, /* 010 */ - { { 0x12, 0 }, { 0x92, 0 } }, { { 0x13, 0 }, { 0x93, 0 } }, /* 012 */ - { { 0x14, 0 }, { 0x94, 0 } }, { { 0x15, 0 }, { 0x95, 0 } }, /* 014 */ - { { 0x16, 0 }, { 0x96, 0 } }, { { 0x17, 0 }, { 0x97, 0 } }, /* 016 */ - { { 0x18, 0 }, { 0x98, 0 } }, { { 0x19, 0 }, { 0x99, 0 } }, /* 018 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01a */ - { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01c */ - { { 0x1e, 0 }, { 0x9e, 0 } }, { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01e */ - { { 0x20, 0 }, { 0xa0, 0 } }, { { 0x21, 0 }, { 0xa1, 0 } }, /* 020 */ - { { 0x22, 0 }, { 0xa2, 0 } }, { { 0x23, 0 }, { 0xa3, 0 } }, /* 022 */ - { { 0x24, 0 }, { 0xa4, 0 } }, { { 0x25, 0 }, { 0xa5, 0 } }, /* 024 */ - { { 0x26, 0 }, { 0xa6, 0 } }, { { 0x27, 0 }, { 0xa7, 0 } }, /* 026 */ - { { 0x28, 0 }, { 0xa8, 0 } }, { { 0x29, 0 }, { 0xa9, 0 } }, /* 028 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, { { 0x2b, 0 }, { 0xab, 0 } }, /* 02a */ - { { 0x2c, 0 }, { 0xac, 0 } }, { { 0x2d, 0 }, { 0xad, 0 } }, /* 02c */ - { { 0x2e, 0 }, { 0xae, 0 } }, { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02e */ - { { 0x30, 0 }, { 0xb0, 0 } }, { { 0x31, 0 }, { 0xb1, 0 } }, /* 030 */ - { { 0x32, 0 }, { 0xb2, 0 } }, { { 0x33, 0 }, { 0xb3, 0 } }, /* 032 */ - { { 0x34, 0 }, { 0xb4, 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 034 */ - { { 0x36, 0 }, { 0xb6, 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 036 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0x39, 0 }, { 0xb9, 0 } }, /* 038 */ - { { 0x3a, 0 }, { 0xba, 0 } }, { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03a */ - { { 0x3c, 0 }, { 0xbc, 0 } }, { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03c */ - { { 0x3e, 0 }, { 0xbe, 0 } }, { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03e */ - { { 0x40, 0 }, { 0xc0, 0 } }, { { 0x41, 0 }, { 0xc1, 0 } }, /* 040 */ - { { 0x42, 0 }, { 0xc2, 0 } }, { { 0x43, 0 }, { 0xc3, 0 } }, /* 042 */ - { { 0x44, 0 }, { 0xc4, 0 } }, { { 0x45, 0 }, { 0xc5, 0 } }, /* 044 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 046 */ - { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 048 */ - { { 0x4a, 0 }, { 0xca, 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04a */ - { { 0x4c, 0 }, { 0xcc, 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04c */ - { { 0x4e, 0 }, { 0xce, 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04e */ - { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 050 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 052 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 054 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 056 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 058 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 064 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 066 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 068 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 070 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 072 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 074 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 076 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 078 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 07e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 080 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 084 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 086 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 088 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 08e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 090 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 092 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 094 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 096 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 098 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 09e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0b8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ba */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0bc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0be */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0de */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ec */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 0fe */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 100 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 102 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 104 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 106 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 108 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 10e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 110 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 112 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 114 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 116 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 118 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11a */ - { { 0x1c, 0 }, { 0x9c, 0 } }, { { 0x1d, 0 }, { 0x9d, 0 } }, /* 11c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 11e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 120 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 122 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 12e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 130 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 132 */ - { { 0 }, { 0 } }, { { 0x35, 0 }, { 0xb5, 0 } }, /* 134 */ - { { 0 }, { 0 } }, { { 0x37, 0 }, { 0xb7, 0 } }, /* 136 */ - { { 0x38, 0 }, { 0xb8, 0 } }, { { 0 }, { 0 } }, /* 138 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 13e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 140 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 142 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 144 */ - { { 0x46, 0 }, { 0xc6, 0 } }, { { 0x47, 0 }, { 0xc7, 0 } }, /* 146 */ - { { 0x48, 0 }, { 0xc8, 0 } }, { { 0x49, 0 }, { 0xc9, 0 } }, /* 148 */ - { { 0 }, { 0 } }, { { 0x4b, 0 }, { 0xcb, 0 } }, /* 14a */ - { { 0 }, { 0 } }, { { 0x4d, 0 }, { 0xcd, 0 } }, /* 14c */ - { { 0 }, { 0 } }, { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14e */ - { { 0x50, 0 }, { 0xd0, 0 } }, { { 0x51, 0 }, { 0xd1, 0 } }, /* 150 */ - { { 0x52, 0 }, { 0xd2, 0 } }, { { 0x53, 0 }, { 0xd3, 0 } }, /* 152 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 154 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 156 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 158 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 15a */ - { { 0 }, { 0 } }, { { 0x54, 0 }, { 0xd4, 0 } }, /* 15c */ - { { 0x56, 0 }, { 0xd6, 0 } }, { { 0x5c, 0 }, { 0xdc, 0 } }, /* 15e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 160 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 162 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 164 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 166 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 168 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 16e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 170 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 172 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 174 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 176 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 178 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 17e */ - - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, { { 0 }, { 0 } } /* 1fe */ + { { 0 }, { 0 } }, /* 000 */ + { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ + { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ + { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ + { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ + { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ + { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ + { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ + { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ + { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ + { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ + { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ + { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ + { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ + { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ + { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ + { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ + { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ + { { 0x12, 0 }, { 0x92, 0 } }, /* 012 */ + { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ + { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ + { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ + { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ + { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ + { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ + { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ + { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ + { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ + { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ + { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ + { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ + { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ + { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ + { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ + { { 0x22, 0 }, { 0xa2, 0 } }, /* 023 */ + { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ + { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ + { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ + { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ + { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ + { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ + { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ + { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ + { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ + { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ + { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ + { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ + { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ + { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ + { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ + { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ + { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ + { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ + { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ + { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ + { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ + { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ + { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ + { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ + { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ + { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ + { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ + { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ + { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ + { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ + { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ + { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ + { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ + { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ + { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ + { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ + { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ + { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ + { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ + { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ + { { 0 }, { 0 } }, /* 054 */ + { { 0 }, { 0 } }, /* 055 */ + { { 0 }, { 0 } }, /* 056 */ + { { 0 }, { 0 } }, /* 057 */ + { { 0 }, { 0 } }, /* 058 */ + { { 0 }, { 0 } }, /* 059 */ + { { 0 }, { 0 } }, /* 05a */ + { { 0 }, { 0 } }, /* 05b */ + { { 0 }, { 0 } }, /* 05c */ + { { 0 }, { 0 } }, /* 05d */ + { { 0 }, { 0 } }, /* 05e */ + { { 0 }, { 0 } }, /* 05f */ + { { 0 }, { 0 } }, /* 060 */ + { { 0 }, { 0 } }, /* 061 */ + { { 0 }, { 0 } }, /* 062 */ + { { 0 }, { 0 } }, /* 063 */ + { { 0 }, { 0 } }, /* 064 */ + { { 0 }, { 0 } }, /* 065 */ + { { 0 }, { 0 } }, /* 066 */ + { { 0 }, { 0 } }, /* 067 */ + { { 0 }, { 0 } }, /* 068 */ + { { 0 }, { 0 } }, /* 069 */ + { { 0 }, { 0 } }, /* 06a */ + { { 0 }, { 0 } }, /* 06b */ + { { 0 }, { 0 } }, /* 06c */ + { { 0 }, { 0 } }, /* 06d */ + { { 0 }, { 0 } }, /* 06e */ + { { 0 }, { 0 } }, /* 06f */ + { { 0 }, { 0 } }, /* 070 */ + { { 0 }, { 0 } }, /* 071 */ + { { 0 }, { 0 } }, /* 072 */ + { { 0 }, { 0 } }, /* 073 */ + { { 0 }, { 0 } }, /* 074 */ + { { 0 }, { 0 } }, /* 075 */ + { { 0 }, { 0 } }, /* 076 */ + { { 0 }, { 0 } }, /* 077 */ + { { 0 }, { 0 } }, /* 078 */ + { { 0 }, { 0 } }, /* 079 */ + { { 0 }, { 0 } }, /* 07a */ + { { 0 }, { 0 } }, /* 07b */ + { { 0 }, { 0 } }, /* 07c */ + { { 0 }, { 0 } }, /* 07d */ + { { 0 }, { 0 } }, /* 07e */ + { { 0 }, { 0 } }, /* 07f */ + { { 0 }, { 0 } }, /* 080 */ + { { 0 }, { 0 } }, /* 081 */ + { { 0 }, { 0 } }, /* 082 */ + { { 0 }, { 0 } }, /* 083 */ + { { 0 }, { 0 } }, /* 084 */ + { { 0 }, { 0 } }, /* 085 */ + { { 0 }, { 0 } }, /* 086 */ + { { 0 }, { 0 } }, /* 087 */ + { { 0 }, { 0 } }, /* 088 */ + { { 0 }, { 0 } }, /* 089 */ + { { 0 }, { 0 } }, /* 08a */ + { { 0 }, { 0 } }, /* 08b */ + { { 0 }, { 0 } }, /* 08c */ + { { 0 }, { 0 } }, /* 08d */ + { { 0 }, { 0 } }, /* 08e */ + { { 0 }, { 0 } }, /* 08f */ + { { 0 }, { 0 } }, /* 090 */ + { { 0 }, { 0 } }, /* 091 */ + { { 0 }, { 0 } }, /* 092 */ + { { 0 }, { 0 } }, /* 093 */ + { { 0 }, { 0 } }, /* 094 */ + { { 0 }, { 0 } }, /* 095 */ + { { 0 }, { 0 } }, /* 096 */ + { { 0 }, { 0 } }, /* 097 */ + { { 0 }, { 0 } }, /* 098 */ + { { 0 }, { 0 } }, /* 099 */ + { { 0 }, { 0 } }, /* 09a */ + { { 0 }, { 0 } }, /* 09b */ + { { 0 }, { 0 } }, /* 09c */ + { { 0 }, { 0 } }, /* 09d */ + { { 0 }, { 0 } }, /* 09e */ + { { 0 }, { 0 } }, /* 09f */ + { { 0 }, { 0 } }, /* 0a0 */ + { { 0 }, { 0 } }, /* 0a1 */ + { { 0 }, { 0 } }, /* 0a2 */ + { { 0 }, { 0 } }, /* 0a3 */ + { { 0 }, { 0 } }, /* 0a4 */ + { { 0 }, { 0 } }, /* 0a5 */ + { { 0 }, { 0 } }, /* 0a6 */ + { { 0 }, { 0 } }, /* 0a7 */ + { { 0 }, { 0 } }, /* 0a8 */ + { { 0 }, { 0 } }, /* 0a9 */ + { { 0 }, { 0 } }, /* 0aa */ + { { 0 }, { 0 } }, /* 0ab */ + { { 0 }, { 0 } }, /* 0ac */ + { { 0 }, { 0 } }, /* 0ad */ + { { 0 }, { 0 } }, /* 0ae */ + { { 0 }, { 0 } }, /* 0af */ + { { 0 }, { 0 } }, /* 0b0 */ + { { 0 }, { 0 } }, /* 0b1 */ + { { 0 }, { 0 } }, /* 0b2 */ + { { 0 }, { 0 } }, /* 0b3 */ + { { 0 }, { 0 } }, /* 0b4 */ + { { 0 }, { 0 } }, /* 0b5 */ + { { 0 }, { 0 } }, /* 0b6 */ + { { 0 }, { 0 } }, /* 0b7 */ + { { 0 }, { 0 } }, /* 0b8 */ + { { 0 }, { 0 } }, /* 0b9 */ + { { 0 }, { 0 } }, /* 0ba */ + { { 0 }, { 0 } }, /* 0bb */ + { { 0 }, { 0 } }, /* 0bc */ + { { 0 }, { 0 } }, /* 0bd */ + { { 0 }, { 0 } }, /* 0be */ + { { 0 }, { 0 } }, /* 0bf */ + { { 0 }, { 0 } }, /* 0c0 */ + { { 0 }, { 0 } }, /* 0c1 */ + { { 0 }, { 0 } }, /* 0c2 */ + { { 0 }, { 0 } }, /* 0c3 */ + { { 0 }, { 0 } }, /* 0c4 */ + { { 0 }, { 0 } }, /* 0c5 */ + { { 0 }, { 0 } }, /* 0c6 */ + { { 0 }, { 0 } }, /* 0c7 */ + { { 0 }, { 0 } }, /* 0c8 */ + { { 0 }, { 0 } }, /* 0c9 */ + { { 0 }, { 0 } }, /* 0ca */ + { { 0 }, { 0 } }, /* 0cb */ + { { 0 }, { 0 } }, /* 0cc */ + { { 0 }, { 0 } }, /* 0cd */ + { { 0 }, { 0 } }, /* 0ce */ + { { 0 }, { 0 } }, /* 0cf */ + { { 0 }, { 0 } }, /* 0d0 */ + { { 0 }, { 0 } }, /* 0d1 */ + { { 0 }, { 0 } }, /* 0d2 */ + { { 0 }, { 0 } }, /* 0d3 */ + { { 0 }, { 0 } }, /* 0d4 */ + { { 0 }, { 0 } }, /* 0d5 */ + { { 0 }, { 0 } }, /* 0d6 */ + { { 0 }, { 0 } }, /* 0d7 */ + { { 0 }, { 0 } }, /* 0d8 */ + { { 0 }, { 0 } }, /* 0d9 */ + { { 0 }, { 0 } }, /* 0da */ + { { 0 }, { 0 } }, /* 0db */ + { { 0 }, { 0 } }, /* 0dc */ + { { 0 }, { 0 } }, /* 0dd */ + { { 0 }, { 0 } }, /* 0de */ + { { 0 }, { 0 } }, /* 0df */ + { { 0 }, { 0 } }, /* 0e0 */ + { { 0 }, { 0 } }, /* 0e1 */ + { { 0 }, { 0 } }, /* 0e2 */ + { { 0 }, { 0 } }, /* 0e3 */ + { { 0 }, { 0 } }, /* 0e4 */ + { { 0 }, { 0 } }, /* 0e5 */ + { { 0 }, { 0 } }, /* 0e6 */ + { { 0 }, { 0 } }, /* 0e7 */ + { { 0 }, { 0 } }, /* 0e8 */ + { { 0 }, { 0 } }, /* 0e9 */ + { { 0 }, { 0 } }, /* 0ea */ + { { 0 }, { 0 } }, /* 0eb */ + { { 0 }, { 0 } }, /* 0ec */ + { { 0 }, { 0 } }, /* 0ed */ + { { 0 }, { 0 } }, /* 0ee */ + { { 0 }, { 0 } }, /* 0ef */ + { { 0 }, { 0 } }, /* 0f0 */ + { { 0 }, { 0 } }, /* 0f1 */ + { { 0 }, { 0 } }, /* 0f2 */ + { { 0 }, { 0 } }, /* 0f3 */ + { { 0 }, { 0 } }, /* 0f4 */ + { { 0 }, { 0 } }, /* 0f5 */ + { { 0 }, { 0 } }, /* 0f6 */ + { { 0 }, { 0 } }, /* 0f7 */ + { { 0 }, { 0 } }, /* 0f8 */ + { { 0 }, { 0 } }, /* 0f9 */ + { { 0 }, { 0 } }, /* 0fa */ + { { 0 }, { 0 } }, /* 0fb */ + { { 0 }, { 0 } }, /* 0fc */ + { { 0 }, { 0 } }, /* 0fd */ + { { 0 }, { 0 } }, /* 0fe */ + { { 0 }, { 0 } }, /* 0ff */ + { { 0 }, { 0 } }, /* 100 */ + { { 0 }, { 0 } }, /* 101 */ + { { 0 }, { 0 } }, /* 102 */ + { { 0 }, { 0 } }, /* 103 */ + { { 0 }, { 0 } }, /* 104 */ + { { 0 }, { 0 } }, /* 105 */ + { { 0 }, { 0 } }, /* 106 */ + { { 0 }, { 0 } }, /* 107 */ + { { 0 }, { 0 } }, /* 108 */ + { { 0 }, { 0 } }, /* 109 */ + { { 0 }, { 0 } }, /* 10a */ + { { 0 }, { 0 } }, /* 10b */ + { { 0 }, { 0 } }, /* 10c */ + { { 0 }, { 0 } }, /* 10d */ + { { 0 }, { 0 } }, /* 10e */ + { { 0 }, { 0 } }, /* 10f */ + { { 0 }, { 0 } }, /* 110 */ + { { 0 }, { 0 } }, /* 111 */ + { { 0 }, { 0 } }, /* 112 */ + { { 0 }, { 0 } }, /* 113 */ + { { 0 }, { 0 } }, /* 114 */ + { { 0 }, { 0 } }, /* 115 */ + { { 0 }, { 0 } }, /* 116 */ + { { 0 }, { 0 } }, /* 117 */ + { { 0 }, { 0 } }, /* 118 */ + { { 0 }, { 0 } }, /* 119 */ + { { 0 }, { 0 } }, /* 11a */ + { { 0 }, { 0 } }, /* 11b */ + { { 0x1c, 0 }, { 0x9c, 0 } }, /* 11c */ + { { 0x1d, 0 }, { 0x9d, 0 } }, /* 11d */ + { { 0 }, { 0 } }, /* 11e */ + { { 0 }, { 0 } }, /* 11f */ + { { 0 }, { 0 } }, /* 120 */ + { { 0 }, { 0 } }, /* 121 */ + { { 0 }, { 0 } }, /* 122 */ + { { 0 }, { 0 } }, /* 123 */ + { { 0 }, { 0 } }, /* 124 */ + { { 0 }, { 0 } }, /* 125 */ + { { 0 }, { 0 } }, /* 126 */ + { { 0 }, { 0 } }, /* 127 */ + { { 0 }, { 0 } }, /* 128 */ + { { 0 }, { 0 } }, /* 129 */ + { { 0 }, { 0 } }, /* 12a */ + { { 0 }, { 0 } }, /* 12b */ + { { 0 }, { 0 } }, /* 12c */ + { { 0 }, { 0 } }, /* 12d */ + { { 0 }, { 0 } }, /* 12e */ + { { 0 }, { 0 } }, /* 12f */ + { { 0 }, { 0 } }, /* 130 */ + { { 0 }, { 0 } }, /* 131 */ + { { 0 }, { 0 } }, /* 132 */ + { { 0 }, { 0 } }, /* 133 */ + { { 0 }, { 0 } }, /* 134 */ + { { 0x35, 0 }, { 0xb5, 0 } }, /* 135 */ + { { 0 }, { 0 } }, /* 136 */ + { { 0x37, 0 }, { 0xb7, 0 } }, /* 137 */ + { { 0x38, 0 }, { 0xb8, 0 } }, /* 138 */ + { { 0 }, { 0 } }, /* 139 */ + { { 0 }, { 0 } }, /* 13a */ + { { 0 }, { 0 } }, /* 13b */ + { { 0 }, { 0 } }, /* 13c */ + { { 0 }, { 0 } }, /* 13d */ + { { 0 }, { 0 } }, /* 13e */ + { { 0 }, { 0 } }, /* 13f */ + { { 0 }, { 0 } }, /* 140 */ + { { 0 }, { 0 } }, /* 141 */ + { { 0 }, { 0 } }, /* 142 */ + { { 0 }, { 0 } }, /* 143 */ + { { 0 }, { 0 } }, /* 144 */ + { { 0 }, { 0 } }, /* 145 */ + { { 0x46, 0 }, { 0xc6, 0 } }, /* 146 */ + { { 0x47, 0 }, { 0xc7, 0 } }, /* 147 */ + { { 0x48, 0 }, { 0xc8, 0 } }, /* 148 */ + { { 0x49, 0 }, { 0xc9, 0 } }, /* 149 */ + { { 0 }, { 0 } }, /* 14a */ + { { 0x4b, 0 }, { 0xcb, 0 } }, /* 14b */ + { { 0 }, { 0 } }, /* 14c */ + { { 0x4d, 0 }, { 0xcd, 0 } }, /* 14d */ + { { 0 }, { 0 } }, /* 14e */ + { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14f */ + { { 0x50, 0 }, { 0xd0, 0 } }, /* 150 */ + { { 0x51, 0 }, { 0xd1, 0 } }, /* 151 */ + { { 0x52, 0 }, { 0xd2, 0 } }, /* 152 */ + { { 0x53, 0 }, { 0xd3, 0 } }, /* 153 */ + { { 0 }, { 0 } }, /* 154 */ + { { 0 }, { 0 } }, /* 155 */ + { { 0 }, { 0 } }, /* 156 */ + { { 0 }, { 0 } }, /* 157 */ + { { 0 }, { 0 } }, /* 158 */ + { { 0 }, { 0 } }, /* 159 */ + { { 0 }, { 0 } }, /* 15a */ + { { 0 }, { 0 } }, /* 15b */ + { { 0 }, { 0 } }, /* 15c */ + { { 0x54, 0 }, { 0xd4, 0 } }, /* 15d */ + { { 0x56, 0 }, { 0xd6, 0 } }, /* 15e */ + { { 0x5c, 0 }, { 0xdc, 0 } }, /* 15f */ + { { 0 }, { 0 } }, /* 160 */ + { { 0 }, { 0 } }, /* 161 */ + { { 0 }, { 0 } }, /* 162 */ + { { 0 }, { 0 } }, /* 163 */ + { { 0 }, { 0 } }, /* 164 */ + { { 0 }, { 0 } }, /* 165 */ + { { 0 }, { 0 } }, /* 166 */ + { { 0 }, { 0 } }, /* 167 */ + { { 0 }, { 0 } }, /* 168 */ + { { 0 }, { 0 } }, /* 169 */ + { { 0 }, { 0 } }, /* 16a */ + { { 0 }, { 0 } }, /* 16b */ + { { 0 }, { 0 } }, /* 16c */ + { { 0 }, { 0 } }, /* 16d */ + { { 0 }, { 0 } }, /* 16e */ + { { 0 }, { 0 } }, /* 16f */ + { { 0 }, { 0 } }, /* 170 */ + { { 0 }, { 0 } }, /* 171 */ + { { 0 }, { 0 } }, /* 172 */ + { { 0 }, { 0 } }, /* 173 */ + { { 0 }, { 0 } }, /* 174 */ + { { 0 }, { 0 } }, /* 175 */ + { { 0 }, { 0 } }, /* 176 */ + { { 0 }, { 0 } }, /* 177 */ + { { 0 }, { 0 } }, /* 178 */ + { { 0 }, { 0 } }, /* 179 */ + { { 0 }, { 0 } }, /* 17a */ + { { 0 }, { 0 } }, /* 17b */ + { { 0 }, { 0 } }, /* 17c */ + { { 0 }, { 0 } }, /* 17d */ + { { 0 }, { 0 } }, /* 17e */ + { { 0 }, { 0 } }, /* 17f */ + { { 0 }, { 0 } }, /* 180 */ + { { 0 }, { 0 } }, /* 181 */ + { { 0 }, { 0 } }, /* 182 */ + { { 0 }, { 0 } }, /* 183 */ + { { 0 }, { 0 } }, /* 184 */ + { { 0 }, { 0 } }, /* 185 */ + { { 0 }, { 0 } }, /* 186 */ + { { 0 }, { 0 } }, /* 187 */ + { { 0 }, { 0 } }, /* 188 */ + { { 0 }, { 0 } }, /* 189 */ + { { 0 }, { 0 } }, /* 18a */ + { { 0 }, { 0 } }, /* 18b */ + { { 0 }, { 0 } }, /* 18c */ + { { 0 }, { 0 } }, /* 18d */ + { { 0 }, { 0 } }, /* 18e */ + { { 0 }, { 0 } }, /* 18f */ + { { 0 }, { 0 } }, /* 190 */ + { { 0 }, { 0 } }, /* 191 */ + { { 0 }, { 0 } }, /* 192 */ + { { 0 }, { 0 } }, /* 193 */ + { { 0 }, { 0 } }, /* 194 */ + { { 0 }, { 0 } }, /* 195 */ + { { 0 }, { 0 } }, /* 196 */ + { { 0 }, { 0 } }, /* 197 */ + { { 0 }, { 0 } }, /* 198 */ + { { 0 }, { 0 } }, /* 199 */ + { { 0 }, { 0 } }, /* 19a */ + { { 0 }, { 0 } }, /* 19b */ + { { 0 }, { 0 } }, /* 19c */ + { { 0 }, { 0 } }, /* 19d */ + { { 0 }, { 0 } }, /* 19e */ + { { 0 }, { 0 } }, /* 19f */ + { { 0 }, { 0 } }, /* 1a0 */ + { { 0 }, { 0 } }, /* 1a1 */ + { { 0 }, { 0 } }, /* 1a2 */ + { { 0 }, { 0 } }, /* 1a3 */ + { { 0 }, { 0 } }, /* 1a4 */ + { { 0 }, { 0 } }, /* 1a5 */ + { { 0 }, { 0 } }, /* 1a6 */ + { { 0 }, { 0 } }, /* 1a7 */ + { { 0 }, { 0 } }, /* 1a8 */ + { { 0 }, { 0 } }, /* 1a9 */ + { { 0 }, { 0 } }, /* 1aa */ + { { 0 }, { 0 } }, /* 1ab */ + { { 0 }, { 0 } }, /* 1ac */ + { { 0 }, { 0 } }, /* 1ad */ + { { 0 }, { 0 } }, /* 1ae */ + { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, /* 1b1 */ + { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, /* 1b3 */ + { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, /* 1b5 */ + { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, /* 1b7 */ + { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, /* 1b9 */ + { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, /* 1bb */ + { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, /* 1bd */ + { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, /* 1bf */ + { { 0 }, { 0 } }, /* 1c0 */ + { { 0 }, { 0 } }, /* 1c1 */ + { { 0 }, { 0 } }, /* 1c2 */ + { { 0 }, { 0 } }, /* 1c3 */ + { { 0 }, { 0 } }, /* 1c4 */ + { { 0 }, { 0 } }, /* 1c5 */ + { { 0 }, { 0 } }, /* 1c6 */ + { { 0 }, { 0 } }, /* 1c7 */ + { { 0 }, { 0 } }, /* 1c8 */ + { { 0 }, { 0 } }, /* 1c9 */ + { { 0 }, { 0 } }, /* 1ca */ + { { 0 }, { 0 } }, /* 1cb */ + { { 0 }, { 0 } }, /* 1cc */ + { { 0 }, { 0 } }, /* 1cd */ + { { 0 }, { 0 } }, /* 1ce */ + { { 0 }, { 0 } }, /* 1cf */ + { { 0 }, { 0 } }, /* 1d0 */ + { { 0 }, { 0 } }, /* 1d1 */ + { { 0 }, { 0 } }, /* 1d2 */ + { { 0 }, { 0 } }, /* 1d3 */ + { { 0 }, { 0 } }, /* 1d4 */ + { { 0 }, { 0 } }, /* 1d5 */ + { { 0 }, { 0 } }, /* 1d6 */ + { { 0 }, { 0 } }, /* 1d7 */ + { { 0 }, { 0 } }, /* 1d8 */ + { { 0 }, { 0 } }, /* 1d9 */ + { { 0 }, { 0 } }, /* 1da */ + { { 0 }, { 0 } }, /* 1db */ + { { 0 }, { 0 } }, /* 1dc */ + { { 0 }, { 0 } }, /* 1dd */ + { { 0 }, { 0 } }, /* 1de */ + { { 0 }, { 0 } }, /* 1df */ + { { 0 }, { 0 } }, /* 1e0 */ + { { 0 }, { 0 } }, /* 1e1 */ + { { 0 }, { 0 } }, /* 1e2 */ + { { 0 }, { 0 } }, /* 1e3 */ + { { 0 }, { 0 } }, /* 1e4 */ + { { 0 }, { 0 } }, /* 1e5 */ + { { 0 }, { 0 } }, /* 1e6 */ + { { 0 }, { 0 } }, /* 1e7 */ + { { 0 }, { 0 } }, /* 1e8 */ + { { 0 }, { 0 } }, /* 1e9 */ + { { 0 }, { 0 } }, /* 1ea */ + { { 0 }, { 0 } }, /* 1eb */ + { { 0 }, { 0 } }, /* 1ec */ + { { 0 }, { 0 } }, /* 1ed */ + { { 0 }, { 0 } }, /* 1ee */ + { { 0 }, { 0 } }, /* 1ef */ + { { 0 }, { 0 } }, /* 1f0 */ + { { 0 }, { 0 } }, /* 1f1 */ + { { 0 }, { 0 } }, /* 1f2 */ + { { 0 }, { 0 } }, /* 1f3 */ + { { 0 }, { 0 } }, /* 1f4 */ + { { 0 }, { 0 } }, /* 1f5 */ + { { 0 }, { 0 } }, /* 1f6 */ + { { 0 }, { 0 } }, /* 1f7 */ + { { 0 }, { 0 } }, /* 1f8 */ + { { 0 }, { 0 } }, /* 1f9 */ + { { 0 }, { 0 } }, /* 1fa */ + { { 0 }, { 0 } }, /* 1fb */ + { { 0 }, { 0 } }, /* 1fc */ + { { 0 }, { 0 } }, /* 1fd */ + { { 0 }, { 0 } }, /* 1fe */ + { { 0 }, { 0 } } /* 1ff */ // clang-format on }; From 734e40b6d75d430516d74974c78b0b538cd6e80e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 22 Jun 2024 00:40:41 -0400 Subject: [PATCH 020/624] Fix missing entries in amstrad kbd scancode table --- src/machine/m_amstrad.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index ff99c94da..a00e7d8e8 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -2782,6 +2782,22 @@ static const scancode scancode_pc200[512] = { { { 0 }, { 0 } }, /* 1ad */ { { 0 }, { 0 } }, /* 1ae */ { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, /* 1b1 */ + { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, /* 1b3 */ + { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, /* 1b5 */ + { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, /* 1b7 */ + { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, /* 1b9 */ + { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, /* 1bb */ + { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, /* 1bd */ + { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, /* 1bf */ { { 0 }, { 0 } }, /* 1c0 */ { { 0 }, { 0 } }, /* 1c1 */ { { 0 }, { 0 } }, /* 1c2 */ From 88a4ca68eae716965a7aface035cb209a40c26cb Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 22 Jun 2024 01:18:41 -0400 Subject: [PATCH 021/624] Fix missing entries in at kbd scancode tables --- src/device/keyboard_at.c | 48 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index 915dbe2b8..c0e9fdb33 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -513,6 +513,22 @@ static const scancode scancode_set1[512] = { { { 0 }, { 0 } }, /* 1ad */ { { 0 }, { 0 } }, /* 1ae */ { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, /* 1b1 */ + { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, /* 1b3 */ + { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, /* 1b5 */ + { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, /* 1b7 */ + { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, /* 1b9 */ + { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, /* 1bb */ + { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, /* 1bd */ + { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, /* 1bf */ { { 0 }, { 0 } }, /* 1c0 */ { { 0 }, { 0 } }, /* 1c1 */ { { 0 }, { 0 } }, /* 1c2 */ @@ -1014,6 +1030,22 @@ static const scancode scancode_set2[512] = { { { 0 }, { 0 } }, /* 1ad */ { { 0 }, { 0 } }, /* 1ae */ { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, /* 1b1 */ + { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, /* 1b3 */ + { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, /* 1b5 */ + { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, /* 1b7 */ + { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, /* 1b9 */ + { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, /* 1bb */ + { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, /* 1bd */ + { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, /* 1bf */ { { 0 }, { 0 } }, /* 1c0 */ { { 0 }, { 0 } }, /* 1c1 */ { { 0 }, { 0 } }, /* 1c2 */ @@ -1515,6 +1547,22 @@ static const scancode scancode_set3[512] = { { { 0 }, { 0 } }, /* 1ad */ { { 0 }, { 0 } }, /* 1ae */ { { 0 }, { 0 } }, /* 1af */ + { { 0 }, { 0 } }, /* 1b0 */ + { { 0 }, { 0 } }, /* 1b1 */ + { { 0 }, { 0 } }, /* 1b2 */ + { { 0 }, { 0 } }, /* 1b3 */ + { { 0 }, { 0 } }, /* 1b4 */ + { { 0 }, { 0 } }, /* 1b5 */ + { { 0 }, { 0 } }, /* 1b6 */ + { { 0 }, { 0 } }, /* 1b7 */ + { { 0 }, { 0 } }, /* 1b8 */ + { { 0 }, { 0 } }, /* 1b9 */ + { { 0 }, { 0 } }, /* 1ba */ + { { 0 }, { 0 } }, /* 1bb */ + { { 0 }, { 0 } }, /* 1bc */ + { { 0 }, { 0 } }, /* 1bd */ + { { 0 }, { 0 } }, /* 1be */ + { { 0 }, { 0 } }, /* 1bf */ { { 0 }, { 0 } }, /* 1c0 */ { { 0 }, { 0 } }, /* 1c1 */ { { 0 }, { 0 } }, /* 1c2 */ From 4efd072a65f560541ec849b037ca74e8a30339a6 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 22 Jun 2024 04:27:51 -0400 Subject: [PATCH 022/624] Default keyboard should be 101/102 key This change doesn't matter yet, but it will later when this gets used. --- src/device/keyboard_at.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index c0e9fdb33..ce26a499e 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -2184,7 +2184,7 @@ static const device_config_t keyboard_at_config[] = { .description = "Type", .type = CONFIG_SELECTION, .default_string = "", - .default_int = 2, + .default_int = 1, .file_filter = "", .spinner = { 0 }, .selection = { From 8a90de40bc65a7036afd40743f116199c9cc0410 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 22 Jun 2024 17:44:45 +0200 Subject: [PATCH 023/624] Matrox: Fix MSITUTOR, fixes #4554. --- src/video/vid_mga.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index fdbb2e411..2d71d36f3 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -5328,6 +5328,15 @@ blit_texture_trap(mystique_t *mystique) } break; + case (TEXCTL_STRANS | TEXCTL_ITRANS | TEXCTL_DECALCKEY): + if (!ctransp) + goto skip_pixel; + + tex_r = i_r; + tex_g = i_g; + tex_b = i_b; + break; + default: fatal("Bad TEXCTL %08x %08x\n", mystique->dwgreg.texctl, mystique->dwgreg.texctl & (TEXCTL_TMODULATE | TEXCTL_STRANS | TEXCTL_ITRANS | TEXCTL_DECALCKEY)); } From 3f4df1132934565cbcc448d52b3f6dc84b572455 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 22 Jun 2024 18:30:20 +0200 Subject: [PATCH 024/624] Fixes to the GhostPCL library names on Linux and Mac. --- src/printer/prt_ps.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c index 3e6612ce1..998343c4d 100644 --- a/src/printer/prt_ps.c +++ b/src/printer/prt_ps.c @@ -54,13 +54,14 @@ # endif #elif defined __APPLE__ # define PATH_GHOSTSCRIPT_DLL "libgs.dylib" -# define PATH_GHOSTPCL_DLL "libgpcl6.dylib" +# define PATH_GHOSTPCL_DLL "libgpcl6.9.54.dylib" #else # define PATH_GHOSTSCRIPT_DLL "libgs.so.9" # define PATH_GHOSTSCRIPT_DLL_ALT1 "libgs.so.10" # define PATH_GHOSTSCRIPT_DLL_ALT2 "libgs.so" -# define PATH_GHOSTPCL_DLL "libgpcl6.so.10" -# define PATH_GHOSTPCL_DLL_ALT "libgpcl6.so" +# define PATH_GHOSTPCL_DLL "libgpcl6.so.9" +# define PATH_GHOSTPCL_DLL_ALT1 "libgpcl6.so.10" +# define PATH_GHOSTPCL_DLL_ALT2 "libgpcl6.so" #endif #define POSTSCRIPT_BUFFER_LENGTH 65536 @@ -424,9 +425,13 @@ pcl_init(void *lpt) /* Try loading the DLL. */ ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL, ghostscript_imports); -#ifdef PATH_GHOSTPCL_DLL_ALT +#ifdef PATH_GHOSTPCL_DLL_ALT1 if (ghostscript_handle == NULL) { - ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL_ALT, ghostscript_imports); + ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL_ALT1, ghostscript_imports); +# ifdef PATH_GHOSTPCL_DLL_ALT2 + if (ghostscript_handle == NULL) + ghostscript_handle = dynld_module(PATH_GHOSTPCL_DLL_ALT2, ghostscript_imports); +# endif } #endif if (ghostscript_handle == NULL) { From 499a4e1d770323bdfe76460897fee2b2fa3fb7f0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 22 Jun 2024 23:54:14 +0200 Subject: [PATCH 025/624] MGA: Implement linestyles. --- src/video/vid_mga.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 2d71d36f3..ada8b89cf 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -491,7 +491,7 @@ typedef struct mystique_t { struct { - uint8_t funcnt, stylelen, + uint8_t funcnt : 7, stylelen, dmamod; int16_t fxleft, fxright, @@ -505,7 +505,7 @@ typedef struct mystique_t { ta_key, ta_mask, lastpix_r, lastpix_g, lastpix_b, highv_line, beta, dither, err, k1, k2; - int pattern[8][16]; + bool pattern[8][16]; uint32_t dwgctrl, dwgctrl_running, bcol, fcol, pitch, plnwt, ybot, ydstorg, @@ -3885,7 +3885,6 @@ blit_iload_iload(mystique_t *mystique, uint32_t data, int size) data64 = mystique->dwgreg.iload_rem_data | ((uint64_t) data << mystique->dwgreg.iload_rem_count); while (size >= 32) { int draw = (!transc || (data & bltcmsk) != bltckey) && trans[mystique->dwgreg.xdst & 3]; - pclog("maccess = 0x%X\n", mystique->maccess_running & MACCESS_PWIDTH_MASK); if (mystique->dwgreg.xdst >= mystique->dwgreg.cxleft && mystique->dwgreg.xdst <= mystique->dwgreg.cxright && mystique->dwgreg.ydst_lin >= mystique->dwgreg.ytop && mystique->dwgreg.ydst_lin <= mystique->dwgreg.ybot && draw) { switch (mystique->maccess_running & MACCESS_PWIDTH_MASK) { @@ -4377,15 +4376,20 @@ blit_line(mystique_t *mystique, int closed, int autoline) uint32_t old_dst; int x = mystique->dwgreg.xdst; int z_write; + int pattern_x, pattern_y; + bool transc = !!(mystique->dwgreg.dwgctrl_running & DWGCTRL_TRANSC); switch (mystique->dwgreg.dwgctrl_running & DWGCTRL_ATYPE_MASK) { case DWGCTRL_ATYPE_RSTR: case DWGCTRL_ATYPE_RPL: while (mystique->dwgreg.length >= 0) { if (x >= mystique->dwgreg.cxleft && x <= mystique->dwgreg.cxright && mystique->dwgreg.ydst_lin >= mystique->dwgreg.ytop && mystique->dwgreg.ydst_lin <= mystique->dwgreg.ybot) { + pattern_y = ((mystique->dwgreg.funcnt % (mystique->dwgreg.stylelen + 1)) >> 4) & 0x7; + pattern_x = (mystique->dwgreg.funcnt % (mystique->dwgreg.stylelen + 1)) & 0xf; + if (!transc || (transc && (mystique->dwgreg.pattern[pattern_y][pattern_x]))) switch (mystique->maccess_running & MACCESS_PWIDTH_MASK) { case MACCESS_PWIDTH_8: - src = mystique->dwgreg.fcol; + src = mystique->dwgreg.pattern[pattern_y][pattern_x] ? mystique->dwgreg.fcol : mystique->dwgreg.bcol; dst = svga->vram[(mystique->dwgreg.ydst_lin + x) & mystique->vram_mask]; dst = bitop(src, dst, mystique->dwgreg.dwgctrl_running); @@ -4402,7 +4406,7 @@ blit_line(mystique_t *mystique, int closed, int autoline) break; case MACCESS_PWIDTH_16: - src = mystique->dwgreg.fcol; + src = mystique->dwgreg.pattern[pattern_y][pattern_x] ? mystique->dwgreg.fcol : mystique->dwgreg.bcol; dst = ((uint16_t *) svga->vram)[(mystique->dwgreg.ydst_lin + x) & mystique->vram_mask_w]; dst = bitop(src, dst, mystique->dwgreg.dwgctrl_running); @@ -4419,7 +4423,7 @@ blit_line(mystique_t *mystique, int closed, int autoline) break; case MACCESS_PWIDTH_24: - src = mystique->dwgreg.fcol; + src = mystique->dwgreg.pattern[pattern_y][pattern_x] ? mystique->dwgreg.fcol : mystique->dwgreg.bcol; old_dst = *(uint32_t *) &svga->vram[((mystique->dwgreg.ydst_lin + x) * 3) & mystique->vram_mask]; dst = bitop(src, old_dst, mystique->dwgreg.dwgctrl_running); @@ -4436,7 +4440,7 @@ blit_line(mystique_t *mystique, int closed, int autoline) break; case MACCESS_PWIDTH_32: - src = mystique->dwgreg.fcol; + src = mystique->dwgreg.pattern[pattern_y][pattern_x] ? mystique->dwgreg.fcol : mystique->dwgreg.bcol; dst = ((uint32_t *) svga->vram)[(mystique->dwgreg.ydst_lin + x) & mystique->vram_mask_l]; dst = bitop(src, dst, mystique->dwgreg.dwgctrl_running); @@ -4479,6 +4483,7 @@ blit_line(mystique_t *mystique, int closed, int autoline) mystique->dwgreg.err += mystique->dwgreg.k1; mystique->dwgreg.length--; + mystique->dwgreg.funcnt--; } break; From bbe035b62a291b05267ee6f0f9197feac4b0e512 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 23 Jun 2024 02:28:22 +0200 Subject: [PATCH 026/624] Implement special selector pushing behavior and improve the opcode length heuristic for CS limit checks, fixes #4552. --- src/cpu/386.c | 14 ++++++++++---- src/cpu/386_common.c | 22 ++++++++++++++++++++++ src/cpu/386_common.h | 1 + src/cpu/x86seg.c | 37 +++++++++++++++++++++++++++++-------- 4 files changed, 62 insertions(+), 12 deletions(-) diff --git a/src/cpu/386.c b/src/cpu/386.c index 3e96911ba..657bd0894 100644 --- a/src/cpu/386.c +++ b/src/cpu/386.c @@ -212,11 +212,11 @@ fetch_ea_16_long(uint32_t rmdat) #define CLOCK_CYCLES_ALWAYS(c) cycles -= (c) #define CHECK_READ_CS(size) \ - if ((cpu_state.pc < cpu_state.seg_cs.limit_low) || \ - ((cpu_state.pc + size - 1) > cpu_state.seg_cs.limit_high)) \ - x86gpf("Limit check (READ)", 0); \ if (msw & 1 && !(cpu_state.eflags & VM_FLAG) && !(cpu_state.seg_cs.access & 0x80)) \ x86np("Read from seg not present", cpu_state.seg_cs.seg & 0xfffc); \ + else if ((cpu_state.pc < cpu_state.seg_cs.limit_low) || \ + ((cpu_state.pc + size - 1) > cpu_state.seg_cs.limit_high)) \ + x86gpf("Limit check (READ CS)", 0); #include "386_ops.h" @@ -261,7 +261,13 @@ exec386_2386(int32_t cycs) fetchdat = fastreadl_fetch(cs + cpu_state.pc); ol = opcode_length[fetchdat & 0xff]; - CHECK_READ_CS(MIN(ol, 4)); + if ((ol == 3) && opcode_has_modrm[fetchdat & 0xff] && (((fetchdat >> 14) & 0x03) == 0x03)) + ol = 2; + if (cpu_16bitbus) { + CHECK_READ_CS(MIN(ol, 2)); + } else { + CHECK_READ_CS(MIN(ol, 4)); + } ins_fetch_fault = cpu_386_check_instruction_fault(); /* Breakpoint fault has priority over other faults. */ diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index d1d38006b..1d130cd8a 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -106,6 +106,28 @@ uint32_t backupregs[16]; x86seg _oldds; +int opcode_has_modrm[256] = { + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*00*/ + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*10*/ + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*20*/ + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, /*30*/ + + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*40*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*50*/ + 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, /*60*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*70*/ + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /*80*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*90*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*a0*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*b0*/ + + 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, /*c0*/ + 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, /*d0*/ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /*e0*/ + 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, /*f0*/ +}; + int opcode_length[256] = { 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 1, 3, /* 0x0x */ 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, /* 0x1x */ 3, 3, 3, 3, 3, 3, 1, 1, 3, 3, 3, 3, 3, 3, 1, 1, /* 0x2x */ diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index 6ef65771d..8ca89181c 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -449,6 +449,7 @@ get_ram_ptr(uint32_t a) } } +extern int opcode_has_modrm[256]; extern int opcode_length[256]; #ifdef OPS_286_386 diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index d912a755b..96ec726b0 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -798,6 +798,27 @@ PUSHL(uint32_t v) } } +static void +PUSHL_SEL(uint32_t v) +{ + if (cpu_16bitbus) { + PUSHW(v >> 16); + PUSHW(v & 0xffff); + } else { + if (stack32) { + writememw(ss, ESP - 4, v); + if (cpu_state.abrt) + return; + ESP -= 4; + } else { + writememw(ss, ((SP - 4) & 0xffff), v); + if (cpu_state.abrt) + return; + SP -= 4; + } + } +} + static uint16_t POPW(void) { @@ -1092,7 +1113,7 @@ loadcscall(uint16_t seg) x86seg_log("Type %04X\n", type); if (type == 0x0c00) { - PUSHL(oldss); + PUSHL_SEL(oldss); PUSHL(oldsp2); if (cpu_state.abrt) { SS = oldss; @@ -1622,10 +1643,10 @@ pmodeint(int num, int soft) cpl_override = 1; if (type >= 0x0800) { if (cpu_state.eflags & VM_FLAG) { - PUSHL(GS); - PUSHL(FS); - PUSHL(DS); - PUSHL(ES); + PUSHL_SEL(GS); + PUSHL_SEL(FS); + PUSHL_SEL(DS); + PUSHL_SEL(ES); if (cpu_state.abrt) return; op_loadseg(0, &cpu_state.seg_ds); @@ -1633,10 +1654,10 @@ pmodeint(int num, int soft) op_loadseg(0, &cpu_state.seg_fs); op_loadseg(0, &cpu_state.seg_gs); } - PUSHL(oldss); + PUSHL_SEL(oldss); PUSHL(oldsp); PUSHL(cpu_state.flags | (cpu_state.eflags << 16)); - PUSHL(CS); + PUSHL_SEL(CS); PUSHL(cpu_state.pc); if (cpu_state.abrt) return; @@ -1672,7 +1693,7 @@ pmodeint(int num, int soft) } if (type > 0x0800) { PUSHL(cpu_state.flags | (cpu_state.eflags << 16)); - PUSHL(CS); + PUSHL_SEL(CS); PUSHL(cpu_state.pc); if (cpu_state.abrt) return; From 049579919eccb28b50d5b5826573fe72a263b3f9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 24 Jun 2024 15:13:12 +0200 Subject: [PATCH 027/624] MGA: Fix textures in certain cases. --- src/video/vid_mga.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index ada8b89cf..79d669bdc 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -5121,7 +5121,7 @@ texture_read(mystique_t *mystique, int *tex_r, int *tex_g, int *tex_b, int *atra s = ((int64_t) (int32_t) mystique->dwgreg.tmr[6] * q) >> s_shift; t = ((int64_t) (int32_t) mystique->dwgreg.tmr[7] * q) >> t_shift; s_frac = (((int64_t) (int32_t) mystique->dwgreg.tmr[6] * q) & ((1 << s_shift) - 1)) / (double)(1 << s_shift); - t_frac = (((int64_t) (int32_t) mystique->dwgreg.tmr[6] * q) & ((1 << t_shift) - 1)) / (double)(1 << t_shift); + t_frac = (((int64_t) (int32_t) mystique->dwgreg.tmr[7] * q) & ((1 << t_shift) - 1)) / (double)(1 << t_shift); } if (mystique->dwgreg.texctl & TEXCTL_CLAMPU) { From bfb4602e85b82751e2cda0da21d35e001cd1208b Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 26 Jun 2024 22:51:34 +0200 Subject: [PATCH 028/624] S3 fixes of the day. 1. Ported the S3 ViRGE reset fix to the Pre-ViRGE cards. 2. Slight cleanup on the acceleration and logs. 3. Unused sequencer register data now return 0xff instead of 0. This fixes Scorched Earth 1.x on DOS using S3 Trio32/64/V+/V2/868/968 cards (on other S3 it works fine as is). --- src/video/vid_s3.c | 229 +++++++++++++-------------------------------- 1 file changed, 66 insertions(+), 163 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 8ecd3711e..16dd83f45 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -387,6 +387,8 @@ typedef struct s3_t { void (*accel_start)(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, void *priv); } s3_t; +static s3_t *reset_state = NULL; + #define INT_VSY (1 << 0) #define INT_GE_BSY (1 << 1) #define INT_FIFO_OVR (1 << 2) @@ -3091,7 +3093,10 @@ s3_in(uint16_t addr, void *priv) (s3->card_type == S3_CARDEX_TRIO64VPLUS)) && (svga->seqaddr == 0x17)) svga->seqregs[svga->seqaddr] ^= 0x01; return temp; - } + } else if ((svga->seqaddr >= 5) && (svga->seqaddr < 8)) + return 0xff; + else + return svga->seqregs[svga->seqaddr]; break; case 0x3c6: @@ -3145,7 +3150,6 @@ s3_in(uint16_t addr, void *priv) } break; case 0x30: - s3_log("[%04X:%08X]: Read CRTC30=%02x.\n", CS, cpu_state.pc, s3->id); return s3->id; /*Chip ID*/ case 0x31: return (svga->crtc[0x31] & 0xcf) | ((s3->ma_ext & 3) << 4); @@ -3187,7 +3191,7 @@ s3_in(uint16_t addr, void *priv) return svga->crtc[0x6b]; break; case 0x6c: - s3_log("[%04X:%08X]: Read CRTC6c=%02x.\n", CS, cpu_state.pc, svga->crtc[0x6b]); + s3_log("[%04X:%08X]: Read CRTC6c=%02x.\n", CS, cpu_state.pc, svga->crtc[0x6c]); if (s3->chip != S3_TRIO64V2) { if (svga->crtc[0x53] & 0x08) { return 0x00; @@ -3200,7 +3204,6 @@ s3_in(uint16_t addr, void *priv) default: break; } - s3_log("[%04X:%08X]: Read CRTC%02x=%02x.\n", CS, cpu_state.pc, svga->crtcreg, svga->crtc[svga->crtcreg]); return svga->crtc[svga->crtcreg]; default: @@ -4348,6 +4351,7 @@ s3_updatemapping(s3_t *s3) /*Banked framebuffer*/ if (svga->crtc[0x31] & 0x08) /*Enhanced mode mappings*/ { + s3_log("Enhanced Mode Mapping.\n"); /* Enhanced mode forces 64kb at 0xa0000*/ mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); svga->banked_mask = 0xffff; @@ -4734,6 +4738,7 @@ s3_accel_in(uint16_t port, void *priv) s3->data_available = 0; } } + s3_log("FIFO Status Temp=%02x.\n", temp); return temp; case 0x9d48: @@ -5235,7 +5240,7 @@ s3_accel_in(uint16_t port, void *priv) case 0xe2e8: if (!s3_cpu_dest(s3)) break; - READ_PIXTRANS_BYTE_IO(0) + READ_PIXTRANS_BYTE_IO(0); if (s3->accel.cmd & 0x100) { switch (s3->accel.cmd & 0x600) { case 0x000: @@ -5317,7 +5322,7 @@ s3_accel_in(uint16_t port, void *priv) case 0xe2eb: if (!s3_cpu_dest(s3)) break; - READ_PIXTRANS_BYTE_IO(3) + READ_PIXTRANS_BYTE_IO(3); if (s3->accel.cmd & 0x100) { switch (s3->accel.cmd & 0x600) { case 0x000: @@ -5331,12 +5336,23 @@ s3_accel_in(uint16_t port, void *priv) break; case 0x200: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { - if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) - s3->accel_start(16, 1, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8) | (s3->accel.pix_trans[2] << 16) | (s3->accel.pix_trans[3] << 24), 0, s3); + if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + if (s3->accel.cmd & 0x1000) + s3->accel_start(16, 1, s3->accel.pix_trans[3] | (s3->accel.pix_trans[2] << 8) | (s3->accel.pix_trans[1] << 16) | (s3->accel.pix_trans[0] << 24), 0, s3); + else + s3->accel_start(16, 1, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8) | (s3->accel.pix_trans[2] << 16) | (s3->accel.pix_trans[3] << 24), 0, s3); + } else { + if (s3->accel.cmd & 0x1000) + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[3] | (s3->accel.pix_trans[2] << 8) | (s3->accel.pix_trans[1] << 16) | (s3->accel.pix_trans[0] << 24), s3); + else + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8) | (s3->accel.pix_trans[2] << 16) | (s3->accel.pix_trans[3] << 24), s3); + } + } else { + if (s3->accel.cmd & 0x1000) + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[3] | (s3->accel.pix_trans[2] << 8) | (s3->accel.pix_trans[1] << 16) | (s3->accel.pix_trans[0] << 24), s3); else s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8) | (s3->accel.pix_trans[2] << 16) | (s3->accel.pix_trans[3] << 24), s3); - } else - s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8) | (s3->accel.pix_trans[2] << 16) | (s3->accel.pix_trans[3] << 24), s3); + } break; default: @@ -7757,9 +7773,8 @@ s3_911_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, } } - if ((s3->accel.cmd & 0x100) && !cpu_input) { + if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ - } frgd_mix = (s3->accel.frgd_mix >> 5) & 3; bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; @@ -9409,157 +9424,41 @@ static int vram_sizes[] = { }; static void -s3_reset(void *priv) +s3_disable_handlers(s3_t *s3) { - s3_t *s3 = (s3_t *) priv; - svga_t *svga = &s3->svga; - - memset(svga->crtc, 0x00, sizeof(svga->crtc)); - svga->crtc[0] = 63; - svga->crtc[6] = 255; - svga->dispontime = 1000ULL << 32; - svga->dispofftime = 1000ULL << 32; - svga->bpp = 8; - - if (s3->pci) - svga->crtc[0x36] = 2 | (3 << 2) | (1 << 4); - else if (s3->vlb) - svga->crtc[0x36] = 1 | (3 << 2) | (1 << 4); - else - svga->crtc[0x36] = 3 | (1 << 4); - - if (s3->chip >= S3_86C928) - svga->crtc[0x36] |= (vram_sizes[s3->vram] << 5); - else - svga->crtc[0x36] |= ((s3->vram == 1) ? 0x00 : 0x20) | 0x80; - - svga->crtc[0x37] = 1 | (7 << 5); - - if (s3->chip >= S3_86C928) - svga->crtc[0x37] |= 0x04; - - s3_io_set(s3); - - memset(s3->pci_regs, 0x00, 256); - - s3->pci_regs[PCI_REG_COMMAND] = 7; - - s3->pci_regs[0x30] = 0x00; - s3->pci_regs[0x32] = 0x0c; - s3->pci_regs[0x33] = 0x00; - - if (s3->chip <= S3_86C924) - s3->accel_start = s3_911_accel_start; - else - s3->accel_start = s3_accel_start; - - switch (s3->card_type) { - case S3_MIROCRYSTAL8S_805: - case S3_MIROCRYSTAL10SD_805: - svga->crtc[0x5a] = 0x0a; - svga->getclock = sdac_getclock; - break; - - case S3_SPEA_MIRAGE_86C801: - case S3_SPEA_MIRAGE_86C805: - svga->crtc[0x5a] = 0x0a; - break; - - case S3_PHOENIX_86C801: - case S3_PHOENIX_86C805: - svga->crtc[0x5a] = 0x0a; - break; - - case S3_METHEUS_86C928: - case S3_SPEA_MERCURY_LITE_PCI: - svga->crtc[0x5a] = 0x0a; - break; - - case S3_PARADISE_BAHAMAS64: - case S3_PHOENIX_VISION864: - case S3_MIROCRYSTAL20SD_864: - svga->crtc[0x5a] = 0x0a; - break; - - case S3_DIAMOND_STEALTH64_964: - case S3_ELSAWIN2KPROX_964: - case S3_MIROCRYSTAL20SV_964: - svga->crtc[0x5a] = 0x0a; - break; - - case S3_DIAMOND_STEALTH64_968: - case S3_ELSAWIN2KPROX: - case S3_SPEA_MERCURY_P64V: - case S3_MIROVIDEO40SV_ERGO_968: - case S3_NUMBER9_9FX_771: - case S3_PHOENIX_VISION968: - if (s3->pci) { - svga->crtc[0x53] = 0x18; - svga->crtc[0x58] = 0x10; - svga->crtc[0x59] = 0x70; - svga->crtc[0x5a] = 0x00; - svga->crtc[0x6c] = 1; - } else { - svga->crtc[0x53] = 0x00; - svga->crtc[0x59] = 0x00; - svga->crtc[0x5a] = 0x0a; - } - break; - - case S3_NUMBER9_9FX_531: - case S3_PHOENIX_VISION868: - if (s3->pci) { - svga->crtc[0x53] = 0x18; - svga->crtc[0x58] = 0x10; - svga->crtc[0x59] = 0x70; - svga->crtc[0x5a] = 0x00; - svga->crtc[0x6c] = 1; - } else { - svga->crtc[0x53] = 0x00; - svga->crtc[0x59] = 0x00; - svga->crtc[0x5a] = 0x0a; - } - break; - - case S3_PHOENIX_TRIO64: - case S3_PHOENIX_TRIO64_ONBOARD: - case S3_STB_POWERGRAPH_64_VIDEO: - case S3_CARDEX_TRIO64VPLUS: - case S3_PHOENIX_TRIO64VPLUS: - case S3_PHOENIX_TRIO64VPLUS_ONBOARD: - case S3_DIAMOND_STEALTH64_764: - case S3_SPEA_MIRAGE_P64: - case S3_NUMBER9_9FX: - if (s3->chip == S3_TRIO64V) - svga->crtc[0x53] = 0x08; - break; - - case S3_TRIO64V2_DX: - svga->crtc[0x53] = 0x08; - svga->crtc[0x59] = 0x70; - svga->crtc[0x5a] = 0x00; - svga->crtc[0x6c] = 1; - s3->pci_regs[0x05] = 0; - s3->pci_regs[0x06] = 0; - s3->pci_regs[0x07] = 2; - s3->pci_regs[0x3d] = 1; - s3->pci_regs[0x3e] = 4; - s3->pci_regs[0x3f] = 0xff; - break; - - default: - break; - } - - if (s3->has_bios) { - if (s3->pci) - mem_mapping_disable(&s3->bios_rom.mapping); - } - - s3_updatemapping(s3); + s3_io_remove(s3); + mem_mapping_disable(&s3->linear_mapping); mem_mapping_disable(&s3->mmio_mapping); mem_mapping_disable(&s3->new_mmio_mapping); + mem_mapping_disable(&s3->svga.mapping); + if (s3->pci) + mem_mapping_disable(&s3->bios_rom.mapping); + + /* Save all the mappings and the timers because they are part of linked lists. */ + reset_state->linear_mapping = s3->linear_mapping; + reset_state->mmio_mapping = s3->mmio_mapping; + reset_state->new_mmio_mapping = s3->new_mmio_mapping; + reset_state->svga.mapping = s3->svga.mapping; + reset_state->bios_rom.mapping = s3->bios_rom.mapping; + + reset_state->svga.timer = s3->svga.timer; + reset_state->svga.timer8514 = s3->svga.timer8514; +} + +static void +s3_reset(void *priv) +{ + s3_t *s3 = (s3_t *) priv; + + if (reset_state != NULL) { + s3->accel.multifunc[0xe] &= ~(0x200 | 0x10); + s3_disable_handlers(s3); + if (s3->pci) + reset_state->pci_slot = s3->pci_slot; + + *s3 = *reset_state; + } } static void * @@ -9568,8 +9467,9 @@ s3_init(const device_t *info) const char *bios_fn; int chip; int stepping; - s3_t *s3 = malloc(sizeof(s3_t)); - svga_t *svga = &s3->svga; + s3_t *s3 = calloc(1, sizeof(s3_t)); + reset_state = calloc(1, sizeof(s3_t)); + svga_t *svga = &s3->svga; int vram; uint32_t vram_size; @@ -9829,8 +9729,6 @@ s3_init(const device_t *info) return NULL; } - memset(s3, 0, sizeof(s3_t)); - vram = device_get_config_int("memory"); if (vram) @@ -10301,6 +10199,8 @@ s3_init(const device_t *info) s3->fifo_thread_run = 1; s3->fifo_thread = thread_create(fifo_thread, s3); + *reset_state = *s3; + return s3; } @@ -10530,6 +10430,9 @@ s3_close(void *priv) ddc_close(s3->ddc); i2c_gpio_close(s3->i2c); + free(reset_state); + reset_state = NULL; + free(s3); } From 1df242d9bb7a456a33e9b81393986cdab5a60465 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 26 Jun 2024 23:07:59 +0200 Subject: [PATCH 029/624] MGA: Fix texture filtering completely on G100. --- src/video/vid_mga.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 79d669bdc..f6f38b4de 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -5111,8 +5111,8 @@ texture_read(mystique_t *mystique, int *tex_r, int *tex_g, int *tex_b, int *atra s = (int32_t) mystique->dwgreg.tmr[6] >> s_shift; t = (int32_t) mystique->dwgreg.tmr[7] >> t_shift; - s_frac = (((int32_t) mystique->dwgreg.tmr[6] >> s_shift) & ((1 << s_shift) - 1)) / (double)(1 << s_shift); - t_frac = (((int32_t) mystique->dwgreg.tmr[7] >> t_shift) & ((1 << t_shift) - 1)) / (double)(1 << t_shift); + s_frac = (((int32_t) mystique->dwgreg.tmr[6]) & ((1 << s_shift) - 1)) / (double)(1 << s_shift); + t_frac = (((int32_t) mystique->dwgreg.tmr[7]) & ((1 << t_shift) - 1)) / (double)(1 << t_shift); } else { const int s_shift = (20 + 16) - (mystique->dwgreg.texwidth & TEXWIDTH_TW_MASK); const int t_shift = (20 + 16) - (mystique->dwgreg.texheight & TEXHEIGHT_TH_MASK); From d2ce14f9679dfd99fef52e451c3c24a4a7b2e876 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 26 Jun 2024 23:09:55 +0200 Subject: [PATCH 030/624] Fatals now work again. --- src/86box.c | 12 ++++++++---- src/chipset/intel_piix.c | 2 ++ src/qt/qt_mainwindow.cpp | 16 +++++++++++++--- src/qt/qt_mainwindow.hpp | 5 +++-- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/86box.c b/src/86box.c index 61b81bbf3..60423b2a1 100644 --- a/src/86box.c +++ b/src/86box.c @@ -354,12 +354,14 @@ fatal(const char *fmt, ...) if ((sp = strchr(temp, '\n')) != NULL) *sp = '\0'; + do_pause(2); + + ui_msgbox(MBX_ERROR | MBX_FATAL | MBX_ANSI, temp); + /* Cleanly terminate all of the emulator's components so as to avoid things like threads getting stuck. */ do_stop(); - ui_msgbox(MBX_ERROR | MBX_FATAL | MBX_ANSI, temp); - fflush(stdlog); exit(-1); @@ -396,12 +398,14 @@ fatal_ex(const char *fmt, va_list ap) if ((sp = strchr(temp, '\n')) != NULL) *sp = '\0'; + do_pause(2); + + ui_msgbox(MBX_ERROR | MBX_FATAL | MBX_ANSI, temp); + /* Cleanly terminate all of the emulator's components so as to avoid things like threads getting stuck. */ do_stop(); - ui_msgbox(MBX_ERROR | MBX_FATAL | MBX_ANSI, temp); - fflush(stdlog); } diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index 1f95c28b3..e76486917 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -243,6 +243,8 @@ smbus_update_io_mapping(piix_t *dev) static void nvr_update_io_mapping(piix_t *dev) { + return; + if (dev->nvr_io_base != 0x0000) { piix_log("Removing NVR at %04X...\n", dev->nvr_io_base); nvr_at_handler(0, dev->nvr_io_base, dev->nvr); diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 112d1cf23..0b7ebb33d 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -214,7 +214,7 @@ MainWindow::MainWindow(QWidget *parent) #endif }); - connect(this, &MainWindow::showMessageForNonQtThread, this, &MainWindow::showMessage_, Qt::BlockingQueuedConnection); + connect(this, &MainWindow::showMessageForNonQtThread, this, &MainWindow::showMessage_, Qt::QueuedConnection); connect(this, &MainWindow::setTitle, this, [this, toolbar_label](const QString &title) { if (dopause && !hide_tool_bar) { @@ -1267,13 +1267,20 @@ MainWindow::showMessage(int flags, const QString &header, const QString &message if (QThread::currentThread() == this->thread()) { showMessage_(flags, header, message); } else { - emit showMessageForNonQtThread(flags, header, message); + std::atomic_bool done = false; + emit showMessageForNonQtThread(flags, header, message, &done); + while (!done) { + QThread::msleep(1); + } } } void -MainWindow::showMessage_(int flags, const QString &header, const QString &message) +MainWindow::showMessage_(int flags, const QString &header, const QString &message, std::atomic_bool *done) { + if (done) { + *done = false; + } QMessageBox box(QMessageBox::Warning, header, message, QMessageBox::NoButton, this); if (flags & (MBX_FATAL)) { box.setIcon(QMessageBox::Critical); @@ -1282,6 +1289,9 @@ MainWindow::showMessage_(int flags, const QString &header, const QString &messag } box.setTextFormat(Qt::TextFormat::RichText); box.exec(); + if (done) { + *done = true; + } if (cpu_thread_run == 0) QApplication::exit(-1); } diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 1fca09231..175ef5b7e 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -8,6 +8,7 @@ #include #include +#include class MediaMenu; class RendererStack; @@ -54,7 +55,7 @@ signals: void setFullscreen(bool state); void setMouseCapture(bool state); - void showMessageForNonQtThread(int flags, const QString &header, const QString &message); + void showMessageForNonQtThread(int flags, const QString &header, const QString &message, std::atomic_bool* done); void getTitleForNonQtThread(wchar_t *title); public slots: void showSettings(); @@ -120,7 +121,7 @@ private slots: void on_actionRenderer_options_triggered(); void refreshMediaMenu(); - void showMessage_(int flags, const QString &header, const QString &message); + void showMessage_(int flags, const QString &header, const QString &message, std::atomic_bool* done = nullptr); void getTitle_(wchar_t *title); void on_actionMCA_devices_triggered(); From 7d18b0ca0771069ac5eb97b3eff15eeebf52ece0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 27 Jun 2024 00:07:43 +0200 Subject: [PATCH 031/624] PIIX4: Revert test changes that should never have been committed. --- src/chipset/intel_piix.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index e76486917..1f95c28b3 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -243,8 +243,6 @@ smbus_update_io_mapping(piix_t *dev) static void nvr_update_io_mapping(piix_t *dev) { - return; - if (dev->nvr_io_base != 0x0000) { piix_log("Removing NVR at %04X...\n", dev->nvr_io_base); nvr_at_handler(0, dev->nvr_io_base, dev->nvr); From 4b9b6e08156989013a225ad504743d414ec70fa1 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 24 Jun 2024 20:02:06 -0400 Subject: [PATCH 032/624] Named Initializers in keyboard scancode tables --- src/device/keyboard_at.c | 3072 +++++++++++++++++------------------ src/device/keyboard_xt.c | 1024 ++++++------ src/machine/m_amstrad.c | 1024 ++++++------ src/machine/m_tandy.c | 1024 ++++++------ src/machine/m_xt_olivetti.c | 2048 +++++++++++------------ 5 files changed, 4096 insertions(+), 4096 deletions(-) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index ce26a499e..bcb4d646b 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -81,1552 +81,1552 @@ static uint16_t bat_counter = 0; static const scancode scancode_set1[512] = { // clang-format off - { { 0 }, { 0 } }, /* 000 */ - { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ - { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ - { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ - { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ - { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ - { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ - { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ - { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ - { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ - { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ - { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ - { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ - { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ - { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ - { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ - { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ - { { 0x12, 0 }, { 0x92, 0 } }, /* 012 */ - { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ - { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ - { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ - { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ - { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ - { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ - { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ - { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ - { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ - { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ - { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ - { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ - { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ - { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ - { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ - { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ - { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ - { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ - { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ - { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ - { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ - { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ - { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ - { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ - { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ - { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ - { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ - { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ - { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ - { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ - { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ - { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ - { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ - { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ - { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ - { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ - { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ - { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ - { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ - { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ - { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ - { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ - { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ - { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ - { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ - { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ - { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ - { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ - { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ - { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ - { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ - { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ - { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ - { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ - { { 0x54, 0 }, { 0xd4, 0 } }, /* 054 */ - { { 0x55, 0 }, { 0xd5, 0 } }, /* 055 */ - { { 0x56, 0 }, { 0xd6, 0 } }, /* 056 */ - { { 0x57, 0 }, { 0xd7, 0 } }, /* 057 */ - { { 0x58, 0 }, { 0xd8, 0 } }, /* 058 */ - { { 0x59, 0 }, { 0xd9, 0 } }, /* 059 */ - { { 0x5a, 0 }, { 0xda, 0 } }, /* 05a */ - { { 0x5b, 0 }, { 0xdb, 0 } }, /* 05b */ - { { 0x5c, 0 }, { 0xdc, 0 } }, /* 05c */ - { { 0x5d, 0 }, { 0xdd, 0 } }, /* 05d */ - { { 0x5e, 0 }, { 0xde, 0 } }, /* 05e */ - { { 0x5f, 0 }, { 0xdf, 0 } }, /* 05f */ - { { 0x60, 0 }, { 0xe0, 0 } }, /* 060 */ - { { 0x61, 0 }, { 0xe1, 0 } }, /* 061 */ - { { 0x62, 0 }, { 0xe2, 0 } }, /* 062 */ - { { 0x63, 0 }, { 0xe3, 0 } }, /* 063 */ - { { 0x64, 0 }, { 0xe4, 0 } }, /* 064 */ - { { 0x65, 0 }, { 0xe5, 0 } }, /* 065 */ - { { 0x66, 0 }, { 0xe6, 0 } }, /* 066 */ - { { 0x67, 0 }, { 0xe7, 0 } }, /* 067 */ - { { 0x68, 0 }, { 0xe8, 0 } }, /* 068 */ - { { 0x69, 0 }, { 0xe9, 0 } }, /* 069 */ - { { 0x6a, 0 }, { 0xea, 0 } }, /* 06a */ - { { 0x6b, 0 }, { 0xeb, 0 } }, /* 06b */ - { { 0x6c, 0 }, { 0xec, 0 } }, /* 06c */ - { { 0x6d, 0 }, { 0xed, 0 } }, /* 06d */ - { { 0x6e, 0 }, { 0xee, 0 } }, /* 06e */ - { { 0x6f, 0 }, { 0xef, 0 } }, /* 06f */ - { { 0x70, 0 }, { 0xf0, 0 } }, /* 070 */ - { { 0x71, 0 }, { 0xf1, 0 } }, /* 071 */ - { { 0x72, 0 }, { 0xf2, 0 } }, /* 072 */ - { { 0x73, 0 }, { 0xf3, 0 } }, /* 073 */ - { { 0x74, 0 }, { 0xf4, 0 } }, /* 074 */ - { { 0x75, 0 }, { 0xf5, 0 } }, /* 075 */ - { { 0x76, 0 }, { 0xf6, 0 } }, /* 076 */ - { { 0x77, 0 }, { 0xf7, 0 } }, /* 077 */ - { { 0x78, 0 }, { 0xf8, 0 } }, /* 078 */ - { { 0x79, 0 }, { 0xf9, 0 } }, /* 079 */ - { { 0x7a, 0 }, { 0xfa, 0 } }, /* 07a */ - { { 0x7b, 0 }, { 0xfb, 0 } }, /* 07b */ - { { 0x7c, 0 }, { 0xfc, 0 } }, /* 07c */ - { { 0x7d, 0 }, { 0xfd, 0 } }, /* 07d */ - { { 0x7e, 0 }, { 0xfe, 0 } }, /* 07e */ - { { 0x7f, 0 }, { 0xff, 0 } }, /* 07f */ - { { 0x80, 0 }, { 0 } }, /* 080 */ - { { 0x81, 0 }, { 0 } }, /* 081 */ - { { 0x82, 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, /* 083 */ - { { 0 }, { 0 } }, /* 084 */ - { { 0x85, 0 }, { 0 } }, /* 085 */ - { { 0x86, 0 }, { 0 } }, /* 086 */ - { { 0x87, 0 }, { 0 } }, /* 087 */ - { { 0x88, 0 }, { 0 } }, /* 088 */ - { { 0x89, 0 }, { 0 } }, /* 089 */ - { { 0x8a, 0 }, { 0 } }, /* 08a */ - { { 0x8b, 0 }, { 0 } }, /* 08b */ - { { 0x8c, 0 }, { 0 } }, /* 08c */ - { { 0x8d, 0 }, { 0 } }, /* 08d */ - { { 0x8e, 0 }, { 0 } }, /* 08e */ - { { 0x8f, 0 }, { 0 } }, /* 08f */ - { { 0x90, 0 }, { 0 } }, /* 090 */ - { { 0x91, 0 }, { 0 } }, /* 091 */ - { { 0x92, 0 }, { 0 } }, /* 092 */ - { { 0x93, 0 }, { 0 } }, /* 093 */ - { { 0x94, 0 }, { 0 } }, /* 094 */ - { { 0x95, 0 }, { 0 } }, /* 095 */ - { { 0x96, 0 }, { 0 } }, /* 096 */ - { { 0x97, 0 }, { 0 } }, /* 097 */ - { { 0x98, 0 }, { 0 } }, /* 098 */ - { { 0x99, 0 }, { 0 } }, /* 099 */ - { { 0x9a, 0 }, { 0 } }, /* 09a */ - { { 0x9b, 0 }, { 0 } }, /* 09b */ - { { 0x9c, 0 }, { 0 } }, /* 09c */ - { { 0x9d, 0 }, { 0 } }, /* 09d */ - { { 0x9e, 0 }, { 0 } }, /* 09e */ - { { 0x9f, 0 }, { 0 } }, /* 09f */ - { { 0xa0, 0 }, { 0 } }, /* 0a0 */ - { { 0xa1, 0 }, { 0 } }, /* 0a1 */ - { { 0xa2, 0 }, { 0 } }, /* 0a2 */ - { { 0xa3, 0 }, { 0 } }, /* 0a3 */ - { { 0xa4, 0 }, { 0 } }, /* 0a4 */ - { { 0xa5, 0 }, { 0 } }, /* 0a5 */ - { { 0xa6, 0 }, { 0 } }, /* 0a6 */ - { { 0xa7, 0 }, { 0 } }, /* 0a7 */ - { { 0xa8, 0 }, { 0 } }, /* 0a8 */ - { { 0xa9, 0 }, { 0 } }, /* 0a9 */ - { { 0xaa, 0 }, { 0 } }, /* 0aa */ - { { 0xab, 0 }, { 0 } }, /* 0ab */ - { { 0xac, 0 }, { 0 } }, /* 0ac */ - { { 0xad, 0 }, { 0 } }, /* 0ad */ - { { 0xae, 0 }, { 0 } }, /* 0ae */ - { { 0xaf, 0 }, { 0 } }, /* 0af */ - { { 0xb0, 0 }, { 0 } }, /* 0b0 */ - { { 0xb1, 0 }, { 0 } }, /* 0b1 */ - { { 0xb2, 0 }, { 0 } }, /* 0b2 */ - { { 0xb3, 0 }, { 0 } }, /* 0b3 */ - { { 0xb4, 0 }, { 0 } }, /* 0b4 */ - { { 0xb5, 0 }, { 0 } }, /* 0b5 */ - { { 0xb6, 0 }, { 0 } }, /* 0b6 */ - { { 0xb7, 0 }, { 0 } }, /* 0b7 */ - { { 0xb8, 0 }, { 0 } }, /* 0b8 */ - { { 0xb9, 0 }, { 0 } }, /* 0b9 */ - { { 0xba, 0 }, { 0 } }, /* 0ba */ - { { 0xbb, 0 }, { 0 } }, /* 0bb */ - { { 0xbc, 0 }, { 0 } }, /* 0bc */ - { { 0xbd, 0 }, { 0 } }, /* 0bd */ - { { 0xbe, 0 }, { 0 } }, /* 0be */ - { { 0xbf, 0 }, { 0 } }, /* 0bf */ - { { 0xc0, 0 }, { 0 } }, /* 0c0 */ - { { 0xc1, 0 }, { 0 } }, /* 0c1 */ - { { 0xc2, 0 }, { 0 } }, /* 0c2 */ - { { 0xc3, 0 }, { 0 } }, /* 0c3 */ - { { 0xc4, 0 }, { 0 } }, /* 0c4 */ - { { 0xc5, 0 }, { 0 } }, /* 0c5 */ - { { 0xc6, 0 }, { 0 } }, /* 0c6 */ - { { 0xc7, 0 }, { 0 } }, /* 0c7 */ - { { 0xc8, 0 }, { 0 } }, /* 0c8 */ - { { 0xc9, 0 }, { 0 } }, /* 0c9 */ - { { 0xca, 0 }, { 0 } }, /* 0ca */ - { { 0xcb, 0 }, { 0 } }, /* 0cb */ - { { 0xcc, 0 }, { 0 } }, /* 0cc */ - { { 0xcd, 0 }, { 0 } }, /* 0cd */ - { { 0xce, 0 }, { 0 } }, /* 0ce */ - { { 0xcf, 0 }, { 0 } }, /* 0cf */ - { { 0xd0, 0 }, { 0 } }, /* 0d0 */ - { { 0xd1, 0 }, { 0 } }, /* 0d1 */ - { { 0xd2, 0 }, { 0 } }, /* 0d2 */ - { { 0xd3, 0 }, { 0 } }, /* 0d3 */ - { { 0xd4, 0 }, { 0 } }, /* 0d4 */ - { { 0xd5, 0 }, { 0 } }, /* 0d5 */ - { { 0xd6, 0 }, { 0 } }, /* 0d6 */ - { { 0xd7, 0 }, { 0 } }, /* 0d7 */ - { { 0xd8, 0 }, { 0 } }, /* 0d8 */ - { { 0xd9, 0 }, { 0 } }, /* 0d9 */ - { { 0xda, 0 }, { 0 } }, /* 0da */ - { { 0xdb, 0 }, { 0 } }, /* 0db */ - { { 0xdc, 0 }, { 0 } }, /* 0dc */ - { { 0xdd, 0 }, { 0 } }, /* 0dd */ - { { 0xde, 0 }, { 0 } }, /* 0de */ - { { 0xdf, 0 }, { 0 } }, /* 0df */ - { { 0xe0, 0 }, { 0 } }, /* 0e0 */ - { { 0xe1, 0 }, { 0 } }, /* 0e1 */ - { { 0xe2, 0 }, { 0 } }, /* 0e2 */ - { { 0xe3, 0 }, { 0 } }, /* 0e3 */ - { { 0xe4, 0 }, { 0 } }, /* 0e4 */ - { { 0xe5, 0 }, { 0 } }, /* 0e5 */ - { { 0xe6, 0 }, { 0 } }, /* 0e6 */ - { { 0xe7, 0 }, { 0 } }, /* 0e7 */ - { { 0xe8, 0 }, { 0 } }, /* 0e8 */ - { { 0xe9, 0 }, { 0 } }, /* 0e9 */ - { { 0xea, 0 }, { 0 } }, /* 0ea */ - { { 0xeb, 0 }, { 0 } }, /* 0eb */ - { { 0xec, 0 }, { 0 } }, /* 0ec */ - { { 0xed, 0 }, { 0 } }, /* 0ed */ - { { 0xee, 0 }, { 0 } }, /* 0ee */ - { { 0xef, 0 }, { 0 } }, /* 0ef */ - { { 0 }, { 0 } }, /* 0f0 */ - { { 0xf1, 0 }, { 0 } }, /* 0f1 */ - { { 0xf2, 0 }, { 0 } }, /* 0f2 */ - { { 0xf3, 0 }, { 0 } }, /* 0f3 */ - { { 0xf4, 0 }, { 0 } }, /* 0f4 */ - { { 0xf5, 0 }, { 0 } }, /* 0f5 */ - { { 0xf6, 0 }, { 0 } }, /* 0f6 */ - { { 0xf7, 0 }, { 0 } }, /* 0f7 */ - { { 0xf8, 0 }, { 0 } }, /* 0f8 */ - { { 0xf9, 0 }, { 0 } }, /* 0f9 */ - { { 0xfa, 0 }, { 0 } }, /* 0fa */ - { { 0xfb, 0 }, { 0 } }, /* 0fb */ - { { 0xfc, 0 }, { 0 } }, /* 0fc */ - { { 0xfd, 0 }, { 0 } }, /* 0fd */ - { { 0xfe, 0 }, { 0 } }, /* 0fe */ - { { 0xff, 0 }, { 0 } }, /* 0ff */ - { { 0xe1, 0x1d, 0 }, { 0xe1, 0x9d, 0 } }, /* 100 */ - { { 0xe0, 0x01, 0 }, { 0xe0, 0x81, 0 } }, /* 101 */ - { { 0xe0, 0x02, 0 }, { 0xe0, 0x82, 0 } }, /* 102 */ - { { 0xe0, 0x03, 0 }, { 0xe0, 0x83, 0 } }, /* 103 */ - { { 0xe0, 0x04, 0 }, { 0xe0, 0x84, 0 } }, /* 104 */ - { { 0xe0, 0x05, 0 }, { 0xe0, 0x85, 0 } }, /* 105 */ - { { 0xe0, 0x06, 0 }, { 0xe0, 0x86, 0 } }, /* 106 */ - { { 0xe0, 0x07, 0 }, { 0xe0, 0x87, 0 } }, /* 107 */ - { { 0xe0, 0x08, 0 }, { 0xe0, 0x88, 0 } }, /* 108 */ - { { 0xe0, 0x09, 0 }, { 0xe0, 0x89, 0 } }, /* 109 */ - { { 0xe0, 0x0a, 0 }, { 0xe0, 0x8a, 0 } }, /* 10a */ - { { 0xe0, 0x0b, 0 }, { 0xe0, 0x8b, 0 } }, /* 10b */ - { { 0xe0, 0x0c, 0 }, { 0xe0, 0x8c, 0 } }, /* 10c */ - { { 0 }, { 0 } }, /* 10d */ - { { 0xe0, 0x0e, 0 }, { 0xe0, 0x8e, 0 } }, /* 10e */ - { { 0xe0, 0x0f, 0 }, { 0xe0, 0x8f, 0 } }, /* 10f */ - { { 0xe0, 0x10, 0 }, { 0xe0, 0x90, 0 } }, /* 110 */ - { { 0xe0, 0x11, 0 }, { 0xe0, 0x91, 0 } }, /* 111 */ - { { 0xe0, 0x12, 0 }, { 0xe0, 0x92, 0 } }, /* 112 */ - { { 0xe0, 0x13, 0 }, { 0xe0, 0x93, 0 } }, /* 113 */ - { { 0xe0, 0x14, 0 }, { 0xe0, 0x94, 0 } }, /* 114 */ - { { 0xe0, 0x15, 0 }, { 0xe0, 0x95, 0 } }, /* 115 */ - { { 0xe0, 0x16, 0 }, { 0xe0, 0x96, 0 } }, /* 116 */ - { { 0xe0, 0x17, 0 }, { 0xe0, 0x97, 0 } }, /* 117 */ - { { 0xe0, 0x18, 0 }, { 0xe0, 0x98, 0 } }, /* 118 */ - { { 0xe0, 0x19, 0 }, { 0xe0, 0x99, 0 } }, /* 119 */ - { { 0xe0, 0x1a, 0 }, { 0xe0, 0x9a, 0 } }, /* 11a */ - { { 0xe0, 0x1b, 0 }, { 0xe0, 0x9b, 0 } }, /* 11b */ - { { 0xe0, 0x1c, 0 }, { 0xe0, 0x9c, 0 } }, /* 11c */ - { { 0xe0, 0x1d, 0 }, { 0xe0, 0x9d, 0 } }, /* 11d */ - { { 0xe0, 0x1e, 0 }, { 0xe0, 0x9e, 0 } }, /* 11e */ - { { 0xe0, 0x1f, 0 }, { 0xe0, 0x9f, 0 } }, /* 11f */ - { { 0xe0, 0x20, 0 }, { 0xe0, 0xa0, 0 } }, /* 120 */ - { { 0xe0, 0x21, 0 }, { 0xe0, 0xa1, 0 } }, /* 121 */ - { { 0xe0, 0x22, 0 }, { 0xe0, 0xa2, 0 } }, /* 122 */ - { { 0xe0, 0x23, 0 }, { 0xe0, 0xa3, 0 } }, /* 123 */ - { { 0xe0, 0x24, 0 }, { 0xe0, 0xa4, 0 } }, /* 124 */ - { { 0xe0, 0x25, 0 }, { 0xe0, 0xa5, 0 } }, /* 125 */ - { { 0xe0, 0x26, 0 }, { 0xe0, 0xa6, 0 } }, /* 126 */ - { { 0 }, { 0 } }, /* 127 */ - { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, /* 129 */ - { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, /* 12b */ - { { 0xe0, 0x2c, 0 }, { 0xe0, 0xac, 0 } }, /* 12c */ - { { 0xe0, 0x2d, 0 }, { 0xe0, 0xad, 0 } }, /* 12d */ - { { 0xe0, 0x2e, 0 }, { 0xe0, 0xae, 0 } }, /* 12e */ - { { 0xe0, 0x2f, 0 }, { 0xe0, 0xaf, 0 } }, /* 12f */ - { { 0xe0, 0x30, 0 }, { 0xe0, 0xb0, 0 } }, /* 130 */ - { { 0xe0, 0x31, 0 }, { 0xe0, 0xb1, 0 } }, /* 131 */ - { { 0xe0, 0x32, 0 }, { 0xe0, 0xb2, 0 } }, /* 132 */ - { { 0 }, { 0 } }, /* 133 */ - { { 0xe0, 0x34, 0 }, { 0xe0, 0xb4, 0 } }, /* 134 */ - { { 0xe0, 0x35, 0 }, { 0xe0, 0xb5, 0 } }, /* 135 */ - { { 0 }, { 0 } }, /* 136 */ - { { 0xe0, 0x37, 0 }, { 0xe0, 0xb7, 0 } }, /* 137 */ - { { 0xe0, 0x38, 0 }, { 0xe0, 0xb8, 0 } }, /* 138 */ - { { 0 }, { 0 } }, /* 139 */ - { { 0xe0, 0x3a, 0 }, { 0xe0, 0xba, 0 } }, /* 13a */ - { { 0xe0, 0x3b, 0 }, { 0xe0, 0xbb, 0 } }, /* 13b */ - { { 0xe0, 0x3c, 0 }, { 0xe0, 0xbc, 0 } }, /* 13c */ - { { 0xe0, 0x3d, 0 }, { 0xe0, 0xbd, 0 } }, /* 13d */ - { { 0xe0, 0x3e, 0 }, { 0xe0, 0xbe, 0 } }, /* 13e */ - { { 0xe0, 0x3f, 0 }, { 0xe0, 0xbf, 0 } }, /* 13f */ - { { 0xe0, 0x40, 0 }, { 0xe0, 0xc0, 0 } }, /* 140 */ - { { 0xe0, 0x41, 0 }, { 0xe0, 0xc1, 0 } }, /* 141 */ - { { 0xe0, 0x42, 0 }, { 0xe0, 0xc2, 0 } }, /* 142 */ - { { 0xe0, 0x43, 0 }, { 0xe0, 0xc3, 0 } }, /* 143 */ - { { 0xe0, 0x44, 0 }, { 0xe0, 0xc4, 0 } }, /* 144 */ - { { 0 }, { 0 } }, /* 145 */ - { { 0xe0, 0x46, 0 }, { 0xe0, 0xc6, 0 } }, /* 146 */ - { { 0xe0, 0x47, 0 }, { 0xe0, 0xc7, 0 } }, /* 147 */ - { { 0xe0, 0x48, 0 }, { 0xe0, 0xc8, 0 } }, /* 148 */ - { { 0xe0, 0x49, 0 }, { 0xe0, 0xc9, 0 } }, /* 149 */ - { { 0 }, { 0 } }, /* 14a */ - { { 0xe0, 0x4b, 0 }, { 0xe0, 0xcb, 0 } }, /* 14b */ - { { 0xe0, 0x4c, 0 }, { 0xe0, 0xcc, 0 } }, /* 14c */ - { { 0xe0, 0x4d, 0 }, { 0xe0, 0xcd, 0 } }, /* 14d */ - { { 0xe0, 0x4e, 0 }, { 0xe0, 0xce, 0 } }, /* 14e */ - { { 0xe0, 0x4f, 0 }, { 0xe0, 0xcf, 0 } }, /* 14f */ - { { 0xe0, 0x50, 0 }, { 0xe0, 0xd0, 0 } }, /* 150 */ - { { 0xe0, 0x51, 0 }, { 0xe0, 0xd1, 0 } }, /* 151 */ - { { 0xe0, 0x52, 0 }, { 0xe0, 0xd2, 0 } }, /* 152 */ - { { 0xe0, 0x53, 0 }, { 0xe0, 0xd3, 0 } }, /* 153 */ - { { 0 }, { 0 } }, /* 154 */ - { { 0xe0, 0x55, 0 }, { 0xe0, 0xd5, 0 } }, /* 155 */ - { { 0 }, { 0 } }, /* 156 */ - { { 0xe0, 0x57, 0 }, { 0xe0, 0xd7, 0 } }, /* 157 */ - { { 0xe0, 0x58, 0 }, { 0xe0, 0xd8, 0 } }, /* 158 */ - { { 0xe0, 0x59, 0 }, { 0xe0, 0xd9, 0 } }, /* 159 */ - { { 0xe0, 0x5a, 0 }, { 0xe0, 0xaa, 0 } }, /* 15a */ - { { 0xe0, 0x5b, 0 }, { 0xe0, 0xdb, 0 } }, /* 15b */ - { { 0xe0, 0x5c, 0 }, { 0xe0, 0xdc, 0 } }, /* 15c */ - { { 0xe0, 0x5d, 0 }, { 0xe0, 0xdd, 0 } }, /* 15d */ - { { 0xe0, 0x5e, 0 }, { 0xe0, 0xee, 0 } }, /* 15e */ - { { 0xe0, 0x5f, 0 }, { 0xe0, 0xdf, 0 } }, /* 15f */ - { { 0 }, { 0 } }, /* 160 */ - { { 0xe0, 0x61, 0 }, { 0xe0, 0xe1, 0 } }, /* 161 */ - { { 0xe0, 0x62, 0 }, { 0xe0, 0xe2, 0 } }, /* 162 */ - { { 0xe0, 0x63, 0 }, { 0xe0, 0xe3, 0 } }, /* 163 */ - { { 0xe0, 0x64, 0 }, { 0xe0, 0xe4, 0 } }, /* 164 */ - { { 0xe0, 0x65, 0 }, { 0xe0, 0xe5, 0 } }, /* 165 */ - { { 0xe0, 0x66, 0 }, { 0xe0, 0xe6, 0 } }, /* 166 */ - { { 0xe0, 0x67, 0 }, { 0xe0, 0xe7, 0 } }, /* 167 */ - { { 0xe0, 0x68, 0 }, { 0xe0, 0xe8, 0 } }, /* 168 */ - { { 0xe0, 0x69, 0 }, { 0xe0, 0xe9, 0 } }, /* 169 */ - { { 0xe0, 0x6a, 0 }, { 0xe0, 0xea, 0 } }, /* 16a */ - { { 0xe0, 0x6b, 0 }, { 0xe0, 0xeb, 0 } }, /* 16b */ - { { 0xe0, 0x6c, 0 }, { 0xe0, 0xec, 0 } }, /* 16c */ - { { 0xe0, 0x6d, 0 }, { 0xe0, 0xed, 0 } }, /* 16d */ - { { 0xe0, 0x6e, 0 }, { 0xe0, 0xee, 0 } }, /* 16e */ - { { 0 }, { 0 } }, /* 16f */ - { { 0xe0, 0x70, 0 }, { 0xe0, 0xf0, 0 } }, /* 170 */ - { { 0xe0, 0x71, 0 }, { 0xe0, 0xf1, 0 } }, /* 171 */ - { { 0xe0, 0x72, 0 }, { 0xe0, 0xf2, 0 } }, /* 172 */ - { { 0xe0, 0x73, 0 }, { 0xe0, 0xf3, 0 } }, /* 173 */ - { { 0xe0, 0x74, 0 }, { 0xe0, 0xf4, 0 } }, /* 174 */ - { { 0xe0, 0x75, 0 }, { 0xe0, 0xf5, 0 } }, /* 175 */ - { { 0 }, { 0 } }, /* 176 */ - { { 0xe0, 0x77, 0 }, { 0xe0, 0xf7, 0 } }, /* 177 */ - { { 0xe0, 0x78, 0 }, { 0xe0, 0xf8, 0 } }, /* 178 */ - { { 0xe0, 0x79, 0 }, { 0xe0, 0xf9, 0 } }, /* 179 */ - { { 0xe0, 0x7a, 0 }, { 0xe0, 0xfa, 0 } }, /* 17a */ - { { 0xe0, 0x7b, 0 }, { 0xe0, 0xfb, 0 } }, /* 17b */ - { { 0xe0, 0x7c, 0 }, { 0xe0, 0xfc, 0 } }, /* 17c */ - { { 0xe0, 0x7d, 0 }, { 0xe0, 0xfd, 0 } }, /* 17d */ - { { 0xe0, 0x7e, 0 }, { 0xe0, 0xfe, 0 } }, /* 17e */ - { { 0xe0, 0x7f, 0 }, { 0xe0, 0xff, 0 } }, /* 17f */ - { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, /* 181 */ - { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, /* 183 */ - { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, /* 185 */ - { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, /* 187 */ - { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, /* 189 */ - { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, /* 18b */ - { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, /* 18d */ - { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, /* 18f */ - { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, /* 191 */ - { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, /* 193 */ - { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, /* 195 */ - { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, /* 197 */ - { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, /* 199 */ - { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, /* 19b */ - { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, /* 19d */ - { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, /* 19f */ - { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, /* 1a1 */ - { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, /* 1a3 */ - { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, /* 1a5 */ - { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, /* 1a7 */ - { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, /* 1a9 */ - { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, /* 1ab */ - { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, /* 1ad */ - { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, /* 1af */ - { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, /* 1b1 */ - { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, /* 1b3 */ - { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, /* 1b5 */ - { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, /* 1b7 */ - { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, /* 1b9 */ - { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, /* 1bb */ - { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, /* 1bd */ - { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, /* 1bf */ - { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, /* 1c1 */ - { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, /* 1c3 */ - { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, /* 1c5 */ - { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, /* 1c7 */ - { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, /* 1c9 */ - { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, /* 1cb */ - { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, /* 1cd */ - { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, /* 1cf */ - { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, /* 1d1 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, /* 1d5 */ - { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, /* 1d7 */ - { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, /* 1d9 */ - { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, /* 1db */ - { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, /* 1dd */ - { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, /* 1df */ - { { 0 }, { 0 } }, /* 1e0 */ - { { 0xe0, 0xe1, 0 }, { 0 } }, /* 1e1 */ - { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, /* 1e3 */ - { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, /* 1e5 */ - { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, /* 1e7 */ - { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, /* 1e9 */ - { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, /* 1eb */ - { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, /* 1ed */ - { { 0xe0, 0xee, 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, /* 1ef */ - { { 0 }, { 0 } }, /* 1f0 */ - { { 0xe0, 0xf1, 0 }, { 0 } }, /* 1f1 */ - { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, /* 1f3 */ - { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, /* 1f5 */ - { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, /* 1f7 */ - { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, /* 1f9 */ - { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, /* 1fb */ - { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, /* 1fd */ - { { 0xe0, 0xfe, 0 }, { 0 } }, /* 1fe */ - { { 0xe0, 0xff, 0 }, { 0 } } /* 1ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x01, 0 }, .brk = { 0x81, 0 } }, /* 001 */ + { .mk = { 0x02, 0 }, .brk = { 0x82, 0 } }, /* 002 */ + { .mk = { 0x03, 0 }, .brk = { 0x83, 0 } }, /* 003 */ + { .mk = { 0x04, 0 }, .brk = { 0x84, 0 } }, /* 004 */ + { .mk = { 0x05, 0 }, .brk = { 0x85, 0 } }, /* 005 */ + { .mk = { 0x06, 0 }, .brk = { 0x86, 0 } }, /* 006 */ + { .mk = { 0x07, 0 }, .brk = { 0x87, 0 } }, /* 007 */ + { .mk = { 0x08, 0 }, .brk = { 0x88, 0 } }, /* 008 */ + { .mk = { 0x09, 0 }, .brk = { 0x89, 0 } }, /* 009 */ + { .mk = { 0x0a, 0 }, .brk = { 0x8a, 0 } }, /* 00a */ + { .mk = { 0x0b, 0 }, .brk = { 0x8b, 0 } }, /* 00b */ + { .mk = { 0x0c, 0 }, .brk = { 0x8c, 0 } }, /* 00c */ + { .mk = { 0x0d, 0 }, .brk = { 0x8d, 0 } }, /* 00d */ + { .mk = { 0x0e, 0 }, .brk = { 0x8e, 0 } }, /* 00e */ + { .mk = { 0x0f, 0 }, .brk = { 0x8f, 0 } }, /* 00f */ + { .mk = { 0x10, 0 }, .brk = { 0x90, 0 } }, /* 010 */ + { .mk = { 0x11, 0 }, .brk = { 0x91, 0 } }, /* 011 */ + { .mk = { 0x12, 0 }, .brk = { 0x92, 0 } }, /* 012 */ + { .mk = { 0x13, 0 }, .brk = { 0x93, 0 } }, /* 013 */ + { .mk = { 0x14, 0 }, .brk = { 0x94, 0 } }, /* 014 */ + { .mk = { 0x15, 0 }, .brk = { 0x95, 0 } }, /* 015 */ + { .mk = { 0x16, 0 }, .brk = { 0x96, 0 } }, /* 016 */ + { .mk = { 0x17, 0 }, .brk = { 0x97, 0 } }, /* 017 */ + { .mk = { 0x18, 0 }, .brk = { 0x98, 0 } }, /* 018 */ + { .mk = { 0x19, 0 }, .brk = { 0x99, 0 } }, /* 019 */ + { .mk = { 0x1a, 0 }, .brk = { 0x9a, 0 } }, /* 01a */ + { .mk = { 0x1b, 0 }, .brk = { 0x9b, 0 } }, /* 01b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 01c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 01d */ + { .mk = { 0x1e, 0 }, .brk = { 0x9e, 0 } }, /* 01e */ + { .mk = { 0x1f, 0 }, .brk = { 0x9f, 0 } }, /* 01f */ + { .mk = { 0x20, 0 }, .brk = { 0xa0, 0 } }, /* 020 */ + { .mk = { 0x21, 0 }, .brk = { 0xa1, 0 } }, /* 021 */ + { .mk = { 0x22, 0 }, .brk = { 0xa2, 0 } }, /* 022 */ + { .mk = { 0x23, 0 }, .brk = { 0xa3, 0 } }, /* 023 */ + { .mk = { 0x24, 0 }, .brk = { 0xa4, 0 } }, /* 024 */ + { .mk = { 0x25, 0 }, .brk = { 0xa5, 0 } }, /* 025 */ + { .mk = { 0x26, 0 }, .brk = { 0xa6, 0 } }, /* 026 */ + { .mk = { 0x27, 0 }, .brk = { 0xa7, 0 } }, /* 027 */ + { .mk = { 0x28, 0 }, .brk = { 0xa8, 0 } }, /* 028 */ + { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 029 */ + { .mk = { 0x2a, 0 }, .brk = { 0xaa, 0 } }, /* 02a */ + { .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 02b */ + { .mk = { 0x2c, 0 }, .brk = { 0xac, 0 } }, /* 02c */ + { .mk = { 0x2d, 0 }, .brk = { 0xad, 0 } }, /* 02d */ + { .mk = { 0x2e, 0 }, .brk = { 0xae, 0 } }, /* 02e */ + { .mk = { 0x2f, 0 }, .brk = { 0xaf, 0 } }, /* 02f */ + { .mk = { 0x30, 0 }, .brk = { 0xb0, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 031 */ + { .mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 032 */ + { .mk = { 0x33, 0 }, .brk = { 0xb3, 0 } }, /* 033 */ + { .mk = { 0x34, 0 }, .brk = { 0xb4, 0 } }, /* 034 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 035 */ + { .mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 036 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 037 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 038 */ + { .mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 039 */ + { .mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 03a */ + { .mk = { 0x3b, 0 }, .brk = { 0xbb, 0 } }, /* 03b */ + { .mk = { 0x3c, 0 }, .brk = { 0xbc, 0 } }, /* 03c */ + { .mk = { 0x3d, 0 }, .brk = { 0xbd, 0 } }, /* 03d */ + { .mk = { 0x3e, 0 }, .brk = { 0xbe, 0 } }, /* 03e */ + { .mk = { 0x3f, 0 }, .brk = { 0xbf, 0 } }, /* 03f */ + { .mk = { 0x40, 0 }, .brk = { 0xc0, 0 } }, /* 040 */ + { .mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 041 */ + { .mk = { 0x42, 0 }, .brk = { 0xc2, 0 } }, /* 042 */ + { .mk = { 0x43, 0 }, .brk = { 0xc3, 0 } }, /* 043 */ + { .mk = { 0x44, 0 }, .brk = { 0xc4, 0 } }, /* 044 */ + { .mk = { 0x45, 0 }, .brk = { 0xc5, 0 } }, /* 045 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 046 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 047 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 048 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 049 */ + { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 04a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 04b */ + { .mk = { 0x4c, 0 }, .brk = { 0xcc, 0 } }, /* 04c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 04d */ + { .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 04e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 04f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 050 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 053 */ + { .mk = { 0x54, 0 }, .brk = { 0xd4, 0 } }, /* 054 */ + { .mk = { 0x55, 0 }, .brk = { 0xd5, 0 } }, /* 055 */ + { .mk = { 0x56, 0 }, .brk = { 0xd6, 0 } }, /* 056 */ + { .mk = { 0x57, 0 }, .brk = { 0xd7, 0 } }, /* 057 */ + { .mk = { 0x58, 0 }, .brk = { 0xd8, 0 } }, /* 058 */ + { .mk = { 0x59, 0 }, .brk = { 0xd9, 0 } }, /* 059 */ + { .mk = { 0x5a, 0 }, .brk = { 0xda, 0 } }, /* 05a */ + { .mk = { 0x5b, 0 }, .brk = { 0xdb, 0 } }, /* 05b */ + { .mk = { 0x5c, 0 }, .brk = { 0xdc, 0 } }, /* 05c */ + { .mk = { 0x5d, 0 }, .brk = { 0xdd, 0 } }, /* 05d */ + { .mk = { 0x5e, 0 }, .brk = { 0xde, 0 } }, /* 05e */ + { .mk = { 0x5f, 0 }, .brk = { 0xdf, 0 } }, /* 05f */ + { .mk = { 0x60, 0 }, .brk = { 0xe0, 0 } }, /* 060 */ + { .mk = { 0x61, 0 }, .brk = { 0xe1, 0 } }, /* 061 */ + { .mk = { 0x62, 0 }, .brk = { 0xe2, 0 } }, /* 062 */ + { .mk = { 0x63, 0 }, .brk = { 0xe3, 0 } }, /* 063 */ + { .mk = { 0x64, 0 }, .brk = { 0xe4, 0 } }, /* 064 */ + { .mk = { 0x65, 0 }, .brk = { 0xe5, 0 } }, /* 065 */ + { .mk = { 0x66, 0 }, .brk = { 0xe6, 0 } }, /* 066 */ + { .mk = { 0x67, 0 }, .brk = { 0xe7, 0 } }, /* 067 */ + { .mk = { 0x68, 0 }, .brk = { 0xe8, 0 } }, /* 068 */ + { .mk = { 0x69, 0 }, .brk = { 0xe9, 0 } }, /* 069 */ + { .mk = { 0x6a, 0 }, .brk = { 0xea, 0 } }, /* 06a */ + { .mk = { 0x6b, 0 }, .brk = { 0xeb, 0 } }, /* 06b */ + { .mk = { 0x6c, 0 }, .brk = { 0xec, 0 } }, /* 06c */ + { .mk = { 0x6d, 0 }, .brk = { 0xed, 0 } }, /* 06d */ + { .mk = { 0x6e, 0 }, .brk = { 0xee, 0 } }, /* 06e */ + { .mk = { 0x6f, 0 }, .brk = { 0xef, 0 } }, /* 06f */ + { .mk = { 0x70, 0 }, .brk = { 0xf0, 0 } }, /* 070 */ + { .mk = { 0x71, 0 }, .brk = { 0xf1, 0 } }, /* 071 */ + { .mk = { 0x72, 0 }, .brk = { 0xf2, 0 } }, /* 072 */ + { .mk = { 0x73, 0 }, .brk = { 0xf3, 0 } }, /* 073 */ + { .mk = { 0x74, 0 }, .brk = { 0xf4, 0 } }, /* 074 */ + { .mk = { 0x75, 0 }, .brk = { 0xf5, 0 } }, /* 075 */ + { .mk = { 0x76, 0 }, .brk = { 0xf6, 0 } }, /* 076 */ + { .mk = { 0x77, 0 }, .brk = { 0xf7, 0 } }, /* 077 */ + { .mk = { 0x78, 0 }, .brk = { 0xf8, 0 } }, /* 078 */ + { .mk = { 0x79, 0 }, .brk = { 0xf9, 0 } }, /* 079 */ + { .mk = { 0x7a, 0 }, .brk = { 0xfa, 0 } }, /* 07a */ + { .mk = { 0x7b, 0 }, .brk = { 0xfb, 0 } }, /* 07b */ + { .mk = { 0x7c, 0 }, .brk = { 0xfc, 0 } }, /* 07c */ + { .mk = { 0x7d, 0 }, .brk = { 0xfd, 0 } }, /* 07d */ + { .mk = { 0x7e, 0 }, .brk = { 0xfe, 0 } }, /* 07e */ + { .mk = { 0x7f, 0 }, .brk = { 0xff, 0 } }, /* 07f */ + { .mk = { 0x80, 0 }, .brk = { 0 } }, /* 080 */ + { .mk = { 0x81, 0 }, .brk = { 0 } }, /* 081 */ + { .mk = { 0x82, 0 }, .brk = { 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0x85, 0 }, .brk = { 0 } }, /* 085 */ + { .mk = { 0x86, 0 }, .brk = { 0 } }, /* 086 */ + { .mk = { 0x87, 0 }, .brk = { 0 } }, /* 087 */ + { .mk = { 0x88, 0 }, .brk = { 0 } }, /* 088 */ + { .mk = { 0x89, 0 }, .brk = { 0 } }, /* 089 */ + { .mk = { 0x8a, 0 }, .brk = { 0 } }, /* 08a */ + { .mk = { 0x8b, 0 }, .brk = { 0 } }, /* 08b */ + { .mk = { 0x8c, 0 }, .brk = { 0 } }, /* 08c */ + { .mk = { 0x8d, 0 }, .brk = { 0 } }, /* 08d */ + { .mk = { 0x8e, 0 }, .brk = { 0 } }, /* 08e */ + { .mk = { 0x8f, 0 }, .brk = { 0 } }, /* 08f */ + { .mk = { 0x90, 0 }, .brk = { 0 } }, /* 090 */ + { .mk = { 0x91, 0 }, .brk = { 0 } }, /* 091 */ + { .mk = { 0x92, 0 }, .brk = { 0 } }, /* 092 */ + { .mk = { 0x93, 0 }, .brk = { 0 } }, /* 093 */ + { .mk = { 0x94, 0 }, .brk = { 0 } }, /* 094 */ + { .mk = { 0x95, 0 }, .brk = { 0 } }, /* 095 */ + { .mk = { 0x96, 0 }, .brk = { 0 } }, /* 096 */ + { .mk = { 0x97, 0 }, .brk = { 0 } }, /* 097 */ + { .mk = { 0x98, 0 }, .brk = { 0 } }, /* 098 */ + { .mk = { 0x99, 0 }, .brk = { 0 } }, /* 099 */ + { .mk = { 0x9a, 0 }, .brk = { 0 } }, /* 09a */ + { .mk = { 0x9b, 0 }, .brk = { 0 } }, /* 09b */ + { .mk = { 0x9c, 0 }, .brk = { 0 } }, /* 09c */ + { .mk = { 0x9d, 0 }, .brk = { 0 } }, /* 09d */ + { .mk = { 0x9e, 0 }, .brk = { 0 } }, /* 09e */ + { .mk = { 0x9f, 0 }, .brk = { 0 } }, /* 09f */ + { .mk = { 0xa0, 0 }, .brk = { 0 } }, /* 0a0 */ + { .mk = { 0xa1, 0 }, .brk = { 0 } }, /* 0a1 */ + { .mk = { 0xa2, 0 }, .brk = { 0 } }, /* 0a2 */ + { .mk = { 0xa3, 0 }, .brk = { 0 } }, /* 0a3 */ + { .mk = { 0xa4, 0 }, .brk = { 0 } }, /* 0a4 */ + { .mk = { 0xa5, 0 }, .brk = { 0 } }, /* 0a5 */ + { .mk = { 0xa6, 0 }, .brk = { 0 } }, /* 0a6 */ + { .mk = { 0xa7, 0 }, .brk = { 0 } }, /* 0a7 */ + { .mk = { 0xa8, 0 }, .brk = { 0 } }, /* 0a8 */ + { .mk = { 0xa9, 0 }, .brk = { 0 } }, /* 0a9 */ + { .mk = { 0xaa, 0 }, .brk = { 0 } }, /* 0aa */ + { .mk = { 0xab, 0 }, .brk = { 0 } }, /* 0ab */ + { .mk = { 0xac, 0 }, .brk = { 0 } }, /* 0ac */ + { .mk = { 0xad, 0 }, .brk = { 0 } }, /* 0ad */ + { .mk = { 0xae, 0 }, .brk = { 0 } }, /* 0ae */ + { .mk = { 0xaf, 0 }, .brk = { 0 } }, /* 0af */ + { .mk = { 0xb0, 0 }, .brk = { 0 } }, /* 0b0 */ + { .mk = { 0xb1, 0 }, .brk = { 0 } }, /* 0b1 */ + { .mk = { 0xb2, 0 }, .brk = { 0 } }, /* 0b2 */ + { .mk = { 0xb3, 0 }, .brk = { 0 } }, /* 0b3 */ + { .mk = { 0xb4, 0 }, .brk = { 0 } }, /* 0b4 */ + { .mk = { 0xb5, 0 }, .brk = { 0 } }, /* 0b5 */ + { .mk = { 0xb6, 0 }, .brk = { 0 } }, /* 0b6 */ + { .mk = { 0xb7, 0 }, .brk = { 0 } }, /* 0b7 */ + { .mk = { 0xb8, 0 }, .brk = { 0 } }, /* 0b8 */ + { .mk = { 0xb9, 0 }, .brk = { 0 } }, /* 0b9 */ + { .mk = { 0xba, 0 }, .brk = { 0 } }, /* 0ba */ + { .mk = { 0xbb, 0 }, .brk = { 0 } }, /* 0bb */ + { .mk = { 0xbc, 0 }, .brk = { 0 } }, /* 0bc */ + { .mk = { 0xbd, 0 }, .brk = { 0 } }, /* 0bd */ + { .mk = { 0xbe, 0 }, .brk = { 0 } }, /* 0be */ + { .mk = { 0xbf, 0 }, .brk = { 0 } }, /* 0bf */ + { .mk = { 0xc0, 0 }, .brk = { 0 } }, /* 0c0 */ + { .mk = { 0xc1, 0 }, .brk = { 0 } }, /* 0c1 */ + { .mk = { 0xc2, 0 }, .brk = { 0 } }, /* 0c2 */ + { .mk = { 0xc3, 0 }, .brk = { 0 } }, /* 0c3 */ + { .mk = { 0xc4, 0 }, .brk = { 0 } }, /* 0c4 */ + { .mk = { 0xc5, 0 }, .brk = { 0 } }, /* 0c5 */ + { .mk = { 0xc6, 0 }, .brk = { 0 } }, /* 0c6 */ + { .mk = { 0xc7, 0 }, .brk = { 0 } }, /* 0c7 */ + { .mk = { 0xc8, 0 }, .brk = { 0 } }, /* 0c8 */ + { .mk = { 0xc9, 0 }, .brk = { 0 } }, /* 0c9 */ + { .mk = { 0xca, 0 }, .brk = { 0 } }, /* 0ca */ + { .mk = { 0xcb, 0 }, .brk = { 0 } }, /* 0cb */ + { .mk = { 0xcc, 0 }, .brk = { 0 } }, /* 0cc */ + { .mk = { 0xcd, 0 }, .brk = { 0 } }, /* 0cd */ + { .mk = { 0xce, 0 }, .brk = { 0 } }, /* 0ce */ + { .mk = { 0xcf, 0 }, .brk = { 0 } }, /* 0cf */ + { .mk = { 0xd0, 0 }, .brk = { 0 } }, /* 0d0 */ + { .mk = { 0xd1, 0 }, .brk = { 0 } }, /* 0d1 */ + { .mk = { 0xd2, 0 }, .brk = { 0 } }, /* 0d2 */ + { .mk = { 0xd3, 0 }, .brk = { 0 } }, /* 0d3 */ + { .mk = { 0xd4, 0 }, .brk = { 0 } }, /* 0d4 */ + { .mk = { 0xd5, 0 }, .brk = { 0 } }, /* 0d5 */ + { .mk = { 0xd6, 0 }, .brk = { 0 } }, /* 0d6 */ + { .mk = { 0xd7, 0 }, .brk = { 0 } }, /* 0d7 */ + { .mk = { 0xd8, 0 }, .brk = { 0 } }, /* 0d8 */ + { .mk = { 0xd9, 0 }, .brk = { 0 } }, /* 0d9 */ + { .mk = { 0xda, 0 }, .brk = { 0 } }, /* 0da */ + { .mk = { 0xdb, 0 }, .brk = { 0 } }, /* 0db */ + { .mk = { 0xdc, 0 }, .brk = { 0 } }, /* 0dc */ + { .mk = { 0xdd, 0 }, .brk = { 0 } }, /* 0dd */ + { .mk = { 0xde, 0 }, .brk = { 0 } }, /* 0de */ + { .mk = { 0xdf, 0 }, .brk = { 0 } }, /* 0df */ + { .mk = { 0xe0, 0 }, .brk = { 0 } }, /* 0e0 */ + { .mk = { 0xe1, 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0xe2, 0 }, .brk = { 0 } }, /* 0e2 */ + { .mk = { 0xe3, 0 }, .brk = { 0 } }, /* 0e3 */ + { .mk = { 0xe4, 0 }, .brk = { 0 } }, /* 0e4 */ + { .mk = { 0xe5, 0 }, .brk = { 0 } }, /* 0e5 */ + { .mk = { 0xe6, 0 }, .brk = { 0 } }, /* 0e6 */ + { .mk = { 0xe7, 0 }, .brk = { 0 } }, /* 0e7 */ + { .mk = { 0xe8, 0 }, .brk = { 0 } }, /* 0e8 */ + { .mk = { 0xe9, 0 }, .brk = { 0 } }, /* 0e9 */ + { .mk = { 0xea, 0 }, .brk = { 0 } }, /* 0ea */ + { .mk = { 0xeb, 0 }, .brk = { 0 } }, /* 0eb */ + { .mk = { 0xec, 0 }, .brk = { 0 } }, /* 0ec */ + { .mk = { 0xed, 0 }, .brk = { 0 } }, /* 0ed */ + { .mk = { 0xee, 0 }, .brk = { 0 } }, /* 0ee */ + { .mk = { 0xef, 0 }, .brk = { 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0xf1, 0 }, .brk = { 0 } }, /* 0f1 */ + { .mk = { 0xf2, 0 }, .brk = { 0 } }, /* 0f2 */ + { .mk = { 0xf3, 0 }, .brk = { 0 } }, /* 0f3 */ + { .mk = { 0xf4, 0 }, .brk = { 0 } }, /* 0f4 */ + { .mk = { 0xf5, 0 }, .brk = { 0 } }, /* 0f5 */ + { .mk = { 0xf6, 0 }, .brk = { 0 } }, /* 0f6 */ + { .mk = { 0xf7, 0 }, .brk = { 0 } }, /* 0f7 */ + { .mk = { 0xf8, 0 }, .brk = { 0 } }, /* 0f8 */ + { .mk = { 0xf9, 0 }, .brk = { 0 } }, /* 0f9 */ + { .mk = { 0xfa, 0 }, .brk = { 0 } }, /* 0fa */ + { .mk = { 0xfb, 0 }, .brk = { 0 } }, /* 0fb */ + { .mk = { 0xfc, 0 }, .brk = { 0 } }, /* 0fc */ + { .mk = { 0xfd, 0 }, .brk = { 0 } }, /* 0fd */ + { .mk = { 0xfe, 0 }, .brk = { 0 } }, /* 0fe */ + { .mk = { 0xff, 0 }, .brk = { 0 } }, /* 0ff */ + { .mk = {0xe1, 0x1d, 0 }, .brk = { 0xe1, 0x9d, 0 } }, /* 100 */ + { .mk = {0xe0, 0x01, 0 }, .brk = { 0xe0, 0x81, 0 } }, /* 101 */ + { .mk = {0xe0, 0x02, 0 }, .brk = { 0xe0, 0x82, 0 } }, /* 102 */ + { .mk = {0xe0, 0x03, 0 }, .brk = { 0xe0, 0x83, 0 } }, /* 103 */ + { .mk = {0xe0, 0x04, 0 }, .brk = { 0xe0, 0x84, 0 } }, /* 104 */ + { .mk = {0xe0, 0x05, 0 }, .brk = { 0xe0, 0x85, 0 } }, /* 105 */ + { .mk = {0xe0, 0x06, 0 }, .brk = { 0xe0, 0x86, 0 } }, /* 106 */ + { .mk = {0xe0, 0x07, 0 }, .brk = { 0xe0, 0x87, 0 } }, /* 107 */ + { .mk = {0xe0, 0x08, 0 }, .brk = { 0xe0, 0x88, 0 } }, /* 108 */ + { .mk = {0xe0, 0x09, 0 }, .brk = { 0xe0, 0x89, 0 } }, /* 109 */ + { .mk = {0xe0, 0x0a, 0 }, .brk = { 0xe0, 0x8a, 0 } }, /* 10a */ + { .mk = {0xe0, 0x0b, 0 }, .brk = { 0xe0, 0x8b, 0 } }, /* 10b */ + { .mk = {0xe0, 0x0c, 0 }, .brk = { 0xe0, 0x8c, 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = {0xe0, 0x0e, 0 }, .brk = { 0xe0, 0x8e, 0 } }, /* 10e */ + { .mk = {0xe0, 0x0f, 0 }, .brk = { 0xe0, 0x8f, 0 } }, /* 10f */ + { .mk = {0xe0, 0x10, 0 }, .brk = { 0xe0, 0x90, 0 } }, /* 110 */ + { .mk = {0xe0, 0x11, 0 }, .brk = { 0xe0, 0x91, 0 } }, /* 111 */ + { .mk = {0xe0, 0x12, 0 }, .brk = { 0xe0, 0x92, 0 } }, /* 112 */ + { .mk = {0xe0, 0x13, 0 }, .brk = { 0xe0, 0x93, 0 } }, /* 113 */ + { .mk = {0xe0, 0x14, 0 }, .brk = { 0xe0, 0x94, 0 } }, /* 114 */ + { .mk = {0xe0, 0x15, 0 }, .brk = { 0xe0, 0x95, 0 } }, /* 115 */ + { .mk = {0xe0, 0x16, 0 }, .brk = { 0xe0, 0x96, 0 } }, /* 116 */ + { .mk = {0xe0, 0x17, 0 }, .brk = { 0xe0, 0x97, 0 } }, /* 117 */ + { .mk = {0xe0, 0x18, 0 }, .brk = { 0xe0, 0x98, 0 } }, /* 118 */ + { .mk = {0xe0, 0x19, 0 }, .brk = { 0xe0, 0x99, 0 } }, /* 119 */ + { .mk = {0xe0, 0x1a, 0 }, .brk = { 0xe0, 0x9a, 0 } }, /* 11a */ + { .mk = {0xe0, 0x1b, 0 }, .brk = { 0xe0, 0x9b, 0 } }, /* 11b */ + { .mk = {0xe0, 0x1c, 0 }, .brk = { 0xe0, 0x9c, 0 } }, /* 11c */ + { .mk = {0xe0, 0x1d, 0 }, .brk = { 0xe0, 0x9d, 0 } }, /* 11d */ + { .mk = {0xe0, 0x1e, 0 }, .brk = { 0xe0, 0x9e, 0 } }, /* 11e */ + { .mk = {0xe0, 0x1f, 0 }, .brk = { 0xe0, 0x9f, 0 } }, /* 11f */ + { .mk = {0xe0, 0x20, 0 }, .brk = { 0xe0, 0xa0, 0 } }, /* 120 */ + { .mk = {0xe0, 0x21, 0 }, .brk = { 0xe0, 0xa1, 0 } }, /* 121 */ + { .mk = {0xe0, 0x22, 0 }, .brk = { 0xe0, 0xa2, 0 } }, /* 122 */ + { .mk = {0xe0, 0x23, 0 }, .brk = { 0xe0, 0xa3, 0 } }, /* 123 */ + { .mk = {0xe0, 0x24, 0 }, .brk = { 0xe0, 0xa4, 0 } }, /* 124 */ + { .mk = {0xe0, 0x25, 0 }, .brk = { 0xe0, 0xa5, 0 } }, /* 125 */ + { .mk = {0xe0, 0x26, 0 }, .brk = { 0xe0, 0xa6, 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = {0xe0, 0x2c, 0 }, .brk = { 0xe0, 0xac, 0 } }, /* 12c */ + { .mk = {0xe0, 0x2d, 0 }, .brk = { 0xe0, 0xad, 0 } }, /* 12d */ + { .mk = {0xe0, 0x2e, 0 }, .brk = { 0xe0, 0xae, 0 } }, /* 12e */ + { .mk = {0xe0, 0x2f, 0 }, .brk = { 0xe0, 0xaf, 0 } }, /* 12f */ + { .mk = {0xe0, 0x30, 0 }, .brk = { 0xe0, 0xb0, 0 } }, /* 130 */ + { .mk = {0xe0, 0x31, 0 }, .brk = { 0xe0, 0xb1, 0 } }, /* 131 */ + { .mk = {0xe0, 0x32, 0 }, .brk = { 0xe0, 0xb2, 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = {0xe0, 0x34, 0 }, .brk = { 0xe0, 0xb4, 0 } }, /* 134 */ + { .mk = {0xe0, 0x35, 0 }, .brk = { 0xe0, 0xb5, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = {0xe0, 0x37, 0 }, .brk = { 0xe0, 0xb7, 0 } }, /* 137 */ + { .mk = {0xe0, 0x38, 0 }, .brk = { 0xe0, 0xb8, 0 } }, /* 138 */ + { .mk = { 0 }, .brk = { 0 } }, /* 139 */ + { .mk = {0xe0, 0x3a, 0 }, .brk = { 0xe0, 0xba, 0 } }, /* 13a */ + { .mk = {0xe0, 0x3b, 0 }, .brk = { 0xe0, 0xbb, 0 } }, /* 13b */ + { .mk = {0xe0, 0x3c, 0 }, .brk = { 0xe0, 0xbc, 0 } }, /* 13c */ + { .mk = {0xe0, 0x3d, 0 }, .brk = { 0xe0, 0xbd, 0 } }, /* 13d */ + { .mk = {0xe0, 0x3e, 0 }, .brk = { 0xe0, 0xbe, 0 } }, /* 13e */ + { .mk = {0xe0, 0x3f, 0 }, .brk = { 0xe0, 0xbf, 0 } }, /* 13f */ + { .mk = {0xe0, 0x40, 0 }, .brk = { 0xe0, 0xc0, 0 } }, /* 140 */ + { .mk = {0xe0, 0x41, 0 }, .brk = { 0xe0, 0xc1, 0 } }, /* 141 */ + { .mk = {0xe0, 0x42, 0 }, .brk = { 0xe0, 0xc2, 0 } }, /* 142 */ + { .mk = {0xe0, 0x43, 0 }, .brk = { 0xe0, 0xc3, 0 } }, /* 143 */ + { .mk = {0xe0, 0x44, 0 }, .brk = { 0xe0, 0xc4, 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = {0xe0, 0x46, 0 }, .brk = { 0xe0, 0xc6, 0 } }, /* 146 */ + { .mk = {0xe0, 0x47, 0 }, .brk = { 0xe0, 0xc7, 0 } }, /* 147 */ + { .mk = {0xe0, 0x48, 0 }, .brk = { 0xe0, 0xc8, 0 } }, /* 148 */ + { .mk = {0xe0, 0x49, 0 }, .brk = { 0xe0, 0xc9, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = {0xe0, 0x4b, 0 }, .brk = { 0xe0, 0xcb, 0 } }, /* 14b */ + { .mk = {0xe0, 0x4c, 0 }, .brk = { 0xe0, 0xcc, 0 } }, /* 14c */ + { .mk = {0xe0, 0x4d, 0 }, .brk = { 0xe0, 0xcd, 0 } }, /* 14d */ + { .mk = {0xe0, 0x4e, 0 }, .brk = { 0xe0, 0xce, 0 } }, /* 14e */ + { .mk = {0xe0, 0x4f, 0 }, .brk = { 0xe0, 0xcf, 0 } }, /* 14f */ + { .mk = {0xe0, 0x50, 0 }, .brk = { 0xe0, 0xd0, 0 } }, /* 150 */ + { .mk = {0xe0, 0x51, 0 }, .brk = { 0xe0, 0xd1, 0 } }, /* 151 */ + { .mk = {0xe0, 0x52, 0 }, .brk = { 0xe0, 0xd2, 0 } }, /* 152 */ + { .mk = {0xe0, 0x53, 0 }, .brk = { 0xe0, 0xd3, 0 } }, /* 153 */ + { .mk = { 0 }, .brk = { 0 } }, /* 154 */ + { .mk = {0xe0, 0x55, 0 }, .brk = { 0xe0, 0xd5, 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = {0xe0, 0x57, 0 }, .brk = { 0xe0, 0xd7, 0 } }, /* 157 */ + { .mk = {0xe0, 0x58, 0 }, .brk = { 0xe0, 0xd8, 0 } }, /* 158 */ + { .mk = {0xe0, 0x59, 0 }, .brk = { 0xe0, 0xd9, 0 } }, /* 159 */ + { .mk = {0xe0, 0x5a, 0 }, .brk = { 0xe0, 0xaa, 0 } }, /* 15a */ + { .mk = {0xe0, 0x5b, 0 }, .brk = { 0xe0, 0xdb, 0 } }, /* 15b */ + { .mk = {0xe0, 0x5c, 0 }, .brk = { 0xe0, 0xdc, 0 } }, /* 15c */ + { .mk = {0xe0, 0x5d, 0 }, .brk = { 0xe0, 0xdd, 0 } }, /* 15d */ + { .mk = {0xe0, 0x5e, 0 }, .brk = { 0xe0, 0xee, 0 } }, /* 15e */ + { .mk = {0xe0, 0x5f, 0 }, .brk = { 0xe0, 0xdf, 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = {0xe0, 0x61, 0 }, .brk = { 0xe0, 0xe1, 0 } }, /* 161 */ + { .mk = {0xe0, 0x62, 0 }, .brk = { 0xe0, 0xe2, 0 } }, /* 162 */ + { .mk = {0xe0, 0x63, 0 }, .brk = { 0xe0, 0xe3, 0 } }, /* 163 */ + { .mk = {0xe0, 0x64, 0 }, .brk = { 0xe0, 0xe4, 0 } }, /* 164 */ + { .mk = {0xe0, 0x65, 0 }, .brk = { 0xe0, 0xe5, 0 } }, /* 165 */ + { .mk = {0xe0, 0x66, 0 }, .brk = { 0xe0, 0xe6, 0 } }, /* 166 */ + { .mk = {0xe0, 0x67, 0 }, .brk = { 0xe0, 0xe7, 0 } }, /* 167 */ + { .mk = {0xe0, 0x68, 0 }, .brk = { 0xe0, 0xe8, 0 } }, /* 168 */ + { .mk = {0xe0, 0x69, 0 }, .brk = { 0xe0, 0xe9, 0 } }, /* 169 */ + { .mk = {0xe0, 0x6a, 0 }, .brk = { 0xe0, 0xea, 0 } }, /* 16a */ + { .mk = {0xe0, 0x6b, 0 }, .brk = { 0xe0, 0xeb, 0 } }, /* 16b */ + { .mk = {0xe0, 0x6c, 0 }, .brk = { 0xe0, 0xec, 0 } }, /* 16c */ + { .mk = {0xe0, 0x6d, 0 }, .brk = { 0xe0, 0xed, 0 } }, /* 16d */ + { .mk = {0xe0, 0x6e, 0 }, .brk = { 0xe0, 0xee, 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = {0xe0, 0x70, 0 }, .brk = { 0xe0, 0xf0, 0 } }, /* 170 */ + { .mk = {0xe0, 0x71, 0 }, .brk = { 0xe0, 0xf1, 0 } }, /* 171 */ + { .mk = {0xe0, 0x72, 0 }, .brk = { 0xe0, 0xf2, 0 } }, /* 172 */ + { .mk = {0xe0, 0x73, 0 }, .brk = { 0xe0, 0xf3, 0 } }, /* 173 */ + { .mk = {0xe0, 0x74, 0 }, .brk = { 0xe0, 0xf4, 0 } }, /* 174 */ + { .mk = {0xe0, 0x75, 0 }, .brk = { 0xe0, 0xf5, 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = {0xe0, 0x77, 0 }, .brk = { 0xe0, 0xf7, 0 } }, /* 177 */ + { .mk = {0xe0, 0x78, 0 }, .brk = { 0xe0, 0xf8, 0 } }, /* 178 */ + { .mk = {0xe0, 0x79, 0 }, .brk = { 0xe0, 0xf9, 0 } }, /* 179 */ + { .mk = {0xe0, 0x7a, 0 }, .brk = { 0xe0, 0xfa, 0 } }, /* 17a */ + { .mk = {0xe0, 0x7b, 0 }, .brk = { 0xe0, 0xfb, 0 } }, /* 17b */ + { .mk = {0xe0, 0x7c, 0 }, .brk = { 0xe0, 0xfc, 0 } }, /* 17c */ + { .mk = {0xe0, 0x7d, 0 }, .brk = { 0xe0, 0xfd, 0 } }, /* 17d */ + { .mk = {0xe0, 0x7e, 0 }, .brk = { 0xe0, 0xfe, 0 } }, /* 17e */ + { .mk = {0xe0, 0x7f, 0 }, .brk = { 0xe0, 0xff, 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = {0xe0, 0xe1, 0 }, .brk = { 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = {0xe0, 0xee, 0 }, .brk = { 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = {0xe0, 0xf1, 0 }, .brk = { 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = {0xe0, 0xfe, 0 }, .brk = { 0 } }, /* 1fe */ + { .mk = {0xe0, 0xff, 0 }, .brk = { 0 } } /* 1ff */ // clang-format on }; static const scancode scancode_set2[512] = { // clang-format off - { { 0 }, { 0 } }, /* 000 */ - { { 0x76, 0 }, { 0xF0, 0x76, 0 } }, /* 001 */ - { { 0x16, 0 }, { 0xF0, 0x16, 0 } }, /* 002 */ - { { 0x1E, 0 }, { 0xF0, 0x1E, 0 } }, /* 003 */ - { { 0x26, 0 }, { 0xF0, 0x26, 0 } }, /* 004 */ - { { 0x25, 0 }, { 0xF0, 0x25, 0 } }, /* 005 */ - { { 0x2E, 0 }, { 0xF0, 0x2E, 0 } }, /* 006 */ - { { 0x36, 0 }, { 0xF0, 0x36, 0 } }, /* 007 */ - { { 0x3D, 0 }, { 0xF0, 0x3D, 0 } }, /* 008 */ - { { 0x3E, 0 }, { 0xF0, 0x3E, 0 } }, /* 009 */ - { { 0x46, 0 }, { 0xF0, 0x46, 0 } }, /* 00a */ - { { 0x45, 0 }, { 0xF0, 0x45, 0 } }, /* 00b */ - { { 0x4E, 0 }, { 0xF0, 0x4E, 0 } }, /* 00c */ - { { 0x55, 0 }, { 0xF0, 0x55, 0 } }, /* 00d */ - { { 0x66, 0 }, { 0xF0, 0x66, 0 } }, /* 00e */ - { { 0x0D, 0 }, { 0xF0, 0x0D, 0 } }, /* 00f */ - { { 0x15, 0 }, { 0xF0, 0x15, 0 } }, /* 010 */ - { { 0x1D, 0 }, { 0xF0, 0x1D, 0 } }, /* 011 */ - { { 0x24, 0 }, { 0xF0, 0x24, 0 } }, /* 012 */ - { { 0x2D, 0 }, { 0xF0, 0x2D, 0 } }, /* 013 */ - { { 0x2C, 0 }, { 0xF0, 0x2C, 0 } }, /* 014 */ - { { 0x35, 0 }, { 0xF0, 0x35, 0 } }, /* 015 */ - { { 0x3C, 0 }, { 0xF0, 0x3C, 0 } }, /* 016 */ - { { 0x43, 0 }, { 0xF0, 0x43, 0 } }, /* 017 */ - { { 0x44, 0 }, { 0xF0, 0x44, 0 } }, /* 018 */ - { { 0x4D, 0 }, { 0xF0, 0x4D, 0 } }, /* 019 */ - { { 0x54, 0 }, { 0xF0, 0x54, 0 } }, /* 01a */ - { { 0x5B, 0 }, { 0xF0, 0x5B, 0 } }, /* 01b */ - { { 0x5A, 0 }, { 0xF0, 0x5A, 0 } }, /* 01c */ - { { 0x14, 0 }, { 0xF0, 0x14, 0 } }, /* 01d */ - { { 0x1C, 0 }, { 0xF0, 0x1C, 0 } }, /* 01e */ - { { 0x1B, 0 }, { 0xF0, 0x1B, 0 } }, /* 01f */ - { { 0x23, 0 }, { 0xF0, 0x23, 0 } }, /* 020 */ - { { 0x2B, 0 }, { 0xF0, 0x2B, 0 } }, /* 021 */ - { { 0x34, 0 }, { 0xF0, 0x34, 0 } }, /* 022 */ - { { 0x33, 0 }, { 0xF0, 0x33, 0 } }, /* 023 */ - { { 0x3B, 0 }, { 0xF0, 0x3B, 0 } }, /* 024 */ - { { 0x42, 0 }, { 0xF0, 0x42, 0 } }, /* 025 */ - { { 0x4B, 0 }, { 0xF0, 0x4B, 0 } }, /* 026 */ - { { 0x4C, 0 }, { 0xF0, 0x4C, 0 } }, /* 027 */ - { { 0x52, 0 }, { 0xF0, 0x52, 0 } }, /* 028 */ - { { 0x0E, 0 }, { 0xF0, 0x0E, 0 } }, /* 029 */ - { { 0x12, 0 }, { 0xF0, 0x12, 0 } }, /* 02a */ - { { 0x5D, 0 }, { 0xF0, 0x5D, 0 } }, /* 02b */ - { { 0x1A, 0 }, { 0xF0, 0x1A, 0 } }, /* 02c */ - { { 0x22, 0 }, { 0xF0, 0x22, 0 } }, /* 02d */ - { { 0x21, 0 }, { 0xF0, 0x21, 0 } }, /* 02e */ - { { 0x2A, 0 }, { 0xF0, 0x2A, 0 } }, /* 02f */ - { { 0x32, 0 }, { 0xF0, 0x32, 0 } }, /* 030 */ - { { 0x31, 0 }, { 0xF0, 0x31, 0 } }, /* 031 */ - { { 0x3A, 0 }, { 0xF0, 0x3A, 0 } }, /* 032 */ - { { 0x41, 0 }, { 0xF0, 0x41, 0 } }, /* 033 */ - { { 0x49, 0 }, { 0xF0, 0x49, 0 } }, /* 034 */ - { { 0x4A, 0 }, { 0xF0, 0x4A, 0 } }, /* 035 */ - { { 0x59, 0 }, { 0xF0, 0x59, 0 } }, /* 036 */ - { { 0x7C, 0 }, { 0xF0, 0x7C, 0 } }, /* 037 */ - { { 0x11, 0 }, { 0xF0, 0x11, 0 } }, /* 038 */ - { { 0x29, 0 }, { 0xF0, 0x29, 0 } }, /* 039 */ - { { 0x58, 0 }, { 0xF0, 0x58, 0 } }, /* 03a */ - { { 0x05, 0 }, { 0xF0, 0x05, 0 } }, /* 03b */ - { { 0x06, 0 }, { 0xF0, 0x06, 0 } }, /* 03c */ - { { 0x04, 0 }, { 0xF0, 0x04, 0 } }, /* 03d */ - { { 0x0C, 0 }, { 0xF0, 0x0C, 0 } }, /* 03e */ - { { 0x03, 0 }, { 0xF0, 0x03, 0 } }, /* 03f */ - { { 0x0B, 0 }, { 0xF0, 0x0B, 0 } }, /* 040 */ - { { 0x83, 0 }, { 0xF0, 0x83, 0 } }, /* 041 */ - { { 0x0A, 0 }, { 0xF0, 0x0A, 0 } }, /* 042 */ - { { 0x01, 0 }, { 0xF0, 0x01, 0 } }, /* 043 */ - { { 0x09, 0 }, { 0xF0, 0x09, 0 } }, /* 044 */ - { { 0x77, 0 }, { 0xF0, 0x77, 0 } }, /* 045 */ - { { 0x7E, 0 }, { 0xF0, 0x7E, 0 } }, /* 046 */ - { { 0x6C, 0 }, { 0xF0, 0x6C, 0 } }, /* 047 */ - { { 0x75, 0 }, { 0xF0, 0x75, 0 } }, /* 048 */ - { { 0x7D, 0 }, { 0xF0, 0x7D, 0 } }, /* 049 */ - { { 0x7B, 0 }, { 0xF0, 0x7B, 0 } }, /* 04a */ - { { 0x6B, 0 }, { 0xF0, 0x6B, 0 } }, /* 04b */ - { { 0x73, 0 }, { 0xF0, 0x73, 0 } }, /* 04c */ - { { 0x74, 0 }, { 0xF0, 0x74, 0 } }, /* 04d */ - { { 0x79, 0 }, { 0xF0, 0x79, 0 } }, /* 04e */ - { { 0x69, 0 }, { 0xF0, 0x69, 0 } }, /* 04f */ - { { 0x72, 0 }, { 0xF0, 0x72, 0 } }, /* 050 */ - { { 0x7A, 0 }, { 0xF0, 0x7A, 0 } }, /* 051 */ - { { 0x70, 0 }, { 0xF0, 0x70, 0 } }, /* 052 */ - { { 0x71, 0 }, { 0xF0, 0x71, 0 } }, /* 053 */ - { { 0x84, 0 }, { 0xF0, 0x84, 0 } }, /* 054 */ - { { 0x60, 0 }, { 0xF0, 0x60, 0 } }, /* 055 */ - { { 0x61, 0 }, { 0xF0, 0x61, 0 } }, /* 056 */ - { { 0x78, 0 }, { 0xF0, 0x78, 0 } }, /* 057 */ - { { 0x07, 0 }, { 0xF0, 0x07, 0 } }, /* 058 */ - { { 0x0F, 0 }, { 0xF0, 0x0F, 0 } }, /* 059 */ - { { 0x17, 0 }, { 0xF0, 0x17, 0 } }, /* 05a */ - { { 0x1F, 0 }, { 0xF0, 0x1F, 0 } }, /* 05b */ - { { 0x27, 0 }, { 0xF0, 0x27, 0 } }, /* 05c */ - { { 0x2F, 0 }, { 0xF0, 0x2F, 0 } }, /* 05d */ - { { 0x37, 0 }, { 0xF0, 0x37, 0 } }, /* 05e */ - { { 0x3F, 0 }, { 0xF0, 0x3F, 0 } }, /* 05f */ - { { 0x47, 0 }, { 0xF0, 0x47, 0 } }, /* 060 */ - { { 0x4F, 0 }, { 0xF0, 0x4F, 0 } }, /* 061 */ - { { 0x56, 0 }, { 0xF0, 0x56, 0 } }, /* 062 */ - { { 0x5E, 0 }, { 0xF0, 0x5E, 0 } }, /* 063 */ - { { 0x08, 0 }, { 0xF0, 0x08, 0 } }, /* 064 */ - { { 0x10, 0 }, { 0xF0, 0x10, 0 } }, /* 065 */ - { { 0x18, 0 }, { 0xF0, 0x18, 0 } }, /* 066 */ - { { 0x20, 0 }, { 0xF0, 0x20, 0 } }, /* 067 */ - { { 0x28, 0 }, { 0xF0, 0x28, 0 } }, /* 068 */ - { { 0x30, 0 }, { 0xF0, 0x30, 0 } }, /* 069 */ - { { 0x38, 0 }, { 0xF0, 0x38, 0 } }, /* 06a */ - { { 0x40, 0 }, { 0xF0, 0x40, 0 } }, /* 06b */ - { { 0x48, 0 }, { 0xF0, 0x48, 0 } }, /* 06c */ - { { 0x50, 0 }, { 0xF0, 0x50, 0 } }, /* 06d */ - { { 0x57, 0 }, { 0xF0, 0x57, 0 } }, /* 06e */ - { { 0x6F, 0 }, { 0xF0, 0x6F, 0 } }, /* 06f */ - { { 0x13, 0 }, { 0xF0, 0x13, 0 } }, /* 070 */ - { { 0x19, 0 }, { 0xF0, 0x19, 0 } }, /* 071 */ - { { 0x39, 0 }, { 0xF0, 0x39, 0 } }, /* 072 */ - { { 0x51, 0 }, { 0xF0, 0x51, 0 } }, /* 073 */ - { { 0x53, 0 }, { 0xF0, 0x53, 0 } }, /* 074 */ - { { 0x5C, 0 }, { 0xF0, 0x5C, 0 } }, /* 075 */ - { { 0x5F, 0 }, { 0xF0, 0x5F, 0 } }, /* 076 */ - { { 0x62, 0 }, { 0xF0, 0x62, 0 } }, /* 077 */ - { { 0x63, 0 }, { 0xF0, 0x63, 0 } }, /* 078 */ - { { 0x64, 0 }, { 0xF0, 0x64, 0 } }, /* 079 */ - { { 0x65, 0 }, { 0xF0, 0x65, 0 } }, /* 07a */ - { { 0x67, 0 }, { 0xF0, 0x67, 0 } }, /* 07b */ - { { 0x68, 0 }, { 0xF0, 0x68, 0 } }, /* 07c */ - { { 0x6A, 0 }, { 0xF0, 0x6A, 0 } }, /* 07d */ - { { 0x6D, 0 }, { 0xF0, 0x6D, 0 } }, /* 07e */ - { { 0x6E, 0 }, { 0xF0, 0x6E, 0 } }, /* 07f */ - { { 0x80, 0 }, { 0xf0, 0x80, 0 } }, /* 080 */ - { { 0x81, 0 }, { 0xf0, 0x81, 0 } }, /* 081 */ - { { 0x82, 0 }, { 0xf0, 0x82, 0 } }, /* 082 */ - { { 0 }, { 0 } }, /* 083 */ - { { 0 }, { 0 } }, /* 084 */ - { { 0x85, 0 }, { 0xf0, 0x54, 0 } }, /* 085 */ - { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, /* 086 */ - { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 087 */ - { { 0x88, 0 }, { 0xf0, 0x88, 0 } }, /* 088 */ - { { 0x89, 0 }, { 0xf0, 0x89, 0 } }, /* 089 */ - { { 0x8a, 0 }, { 0xf0, 0x8a, 0 } }, /* 08a */ - { { 0x8b, 0 }, { 0xf0, 0x8b, 0 } }, /* 08b */ - { { 0x8c, 0 }, { 0xf0, 0x8c, 0 } }, /* 08c */ - { { 0x8d, 0 }, { 0xf0, 0x8d, 0 } }, /* 08d */ - { { 0x8e, 0 }, { 0xf0, 0x8e, 0 } }, /* 08e */ - { { 0x8f, 0 }, { 0xf0, 0x8f, 0 } }, /* 08f */ - { { 0x90, 0 }, { 0xf0, 0x90, 0 } }, /* 090 */ - { { 0x91, 0 }, { 0xf0, 0x91, 0 } }, /* 091 */ - { { 0x92, 0 }, { 0xf0, 0x92, 0 } }, /* 092 */ - { { 0x93, 0 }, { 0xf0, 0x93, 0 } }, /* 093 */ - { { 0x94, 0 }, { 0xf0, 0x94, 0 } }, /* 094 */ - { { 0x95, 0 }, { 0xf0, 0x95, 0 } }, /* 095 */ - { { 0x96, 0 }, { 0xf0, 0x96, 0 } }, /* 096 */ - { { 0x97, 0 }, { 0xf0, 0x97, 0 } }, /* 097 */ - { { 0x98, 0 }, { 0xf0, 0x98, 0 } }, /* 098 */ - { { 0x99, 0 }, { 0xf0, 0x99, 0 } }, /* 099 */ - { { 0x9a, 0 }, { 0xf0, 0x9a, 0 } }, /* 09a */ - { { 0x9b, 0 }, { 0xf0, 0x9b, 0 } }, /* 09b */ - { { 0x9c, 0 }, { 0xf0, 0x9c, 0 } }, /* 09c */ - { { 0x9d, 0 }, { 0xf0, 0x9d, 0 } }, /* 09d */ - { { 0x9e, 0 }, { 0xf0, 0x9e, 0 } }, /* 09e */ - { { 0x9f, 0 }, { 0xf0, 0x9f, 0 } }, /* 09f */ - { { 0xa0, 0 }, { 0xf0, 0xa0, 0 } }, /* 0a0 */ - { { 0xa1, 0 }, { 0xf0, 0xa1, 0 } }, /* 0a1 */ - { { 0xa2, 0 }, { 0xf0, 0xa2, 0 } }, /* 0a2 */ - { { 0xa3, 0 }, { 0xf0, 0xa3, 0 } }, /* 0a3 */ - { { 0xa4, 0 }, { 0xf0, 0xa4, 0 } }, /* 0a4 */ - { { 0xa5, 0 }, { 0xf0, 0xa5, 0 } }, /* 0a5 */ - { { 0xa6, 0 }, { 0xf0, 0xa6, 0 } }, /* 0a6 */ - { { 0xa7, 0 }, { 0xf0, 0xa7, 0 } }, /* 0a7 */ - { { 0xa8, 0 }, { 0xf0, 0xa8, 0 } }, /* 0a8 */ - { { 0xa9, 0 }, { 0xf0, 0xa9, 0 } }, /* 0a9 */ - { { 0xaa, 0 }, { 0xf0, 0xaa, 0 } }, /* 0aa */ - { { 0xab, 0 }, { 0xf0, 0xab, 0 } }, /* 0ab */ - { { 0xac, 0 }, { 0xf0, 0xac, 0 } }, /* 0ac */ - { { 0xad, 0 }, { 0xf0, 0xad, 0 } }, /* 0ad */ - { { 0xae, 0 }, { 0xf0, 0xae, 0 } }, /* 0ae */ - { { 0xaf, 0 }, { 0xf0, 0xaf, 0 } }, /* 0af */ - { { 0xb0, 0 }, { 0xf0, 0xb0, 0 } }, /* 0b0 */ - { { 0xb1, 0 }, { 0xf0, 0xb1, 0 } }, /* 0b1 */ - { { 0xb2, 0 }, { 0xf0, 0xb2, 0 } }, /* 0b2 */ - { { 0xb3, 0 }, { 0xf0, 0xb3, 0 } }, /* 0b3 */ - { { 0xb4, 0 }, { 0xf0, 0xb4, 0 } }, /* 0b4 */ - { { 0xb5, 0 }, { 0xf0, 0xb5, 0 } }, /* 0b5 */ - { { 0xb6, 0 }, { 0xf0, 0xb6, 0 } }, /* 0b6 */ - { { 0xb7, 0 }, { 0xf0, 0xb7, 0 } }, /* 0b7 */ - { { 0xb8, 0 }, { 0xf0, 0xb8, 0 } }, /* 0b8 */ - { { 0xb9, 0 }, { 0xf0, 0xb9, 0 } }, /* 0b9 */ - { { 0xba, 0 }, { 0xf0, 0xba, 0 } }, /* 0ba */ - { { 0xbb, 0 }, { 0xf0, 0xbb, 0 } }, /* 0bb */ - { { 0xbc, 0 }, { 0xf0, 0xbc, 0 } }, /* 0bc */ - { { 0xbd, 0 }, { 0xf0, 0xbd, 0 } }, /* 0bd */ - { { 0xbe, 0 }, { 0xf0, 0xbe, 0 } }, /* 0be */ - { { 0xbf, 0 }, { 0xf0, 0xbf, 0 } }, /* 0bf */ - { { 0xc0, 0 }, { 0xf0, 0xc0, 0 } }, /* 0c0 */ - { { 0xc1, 0 }, { 0xf0, 0xc1, 0 } }, /* 0c1 */ - { { 0xc2, 0 }, { 0xf0, 0xc2, 0 } }, /* 0c2 */ - { { 0xc3, 0 }, { 0xf0, 0xc3, 0 } }, /* 0c3 */ - { { 0xc4, 0 }, { 0xf0, 0xc4, 0 } }, /* 0c4 */ - { { 0xc5, 0 }, { 0xf0, 0xc5, 0 } }, /* 0c5 */ - { { 0xc6, 0 }, { 0xf0, 0xc6, 0 } }, /* 0c6 */ - { { 0xc7, 0 }, { 0xf0, 0xc7, 0 } }, /* 0c7 */ - { { 0xc8, 0 }, { 0xf0, 0xc8, 0 } }, /* 0c8 */ - { { 0xc9, 0 }, { 0xf0, 0xc9, 0 } }, /* 0c9 */ - { { 0xca, 0 }, { 0xf0, 0xca, 0 } }, /* 0ca */ - { { 0xcb, 0 }, { 0xf0, 0xcb, 0 } }, /* 0cb */ - { { 0xcc, 0 }, { 0xf0, 0xcc, 0 } }, /* 0cc */ - { { 0xcd, 0 }, { 0xf0, 0xcd, 0 } }, /* 0cd */ - { { 0xce, 0 }, { 0xf0, 0xce, 0 } }, /* 0ce */ - { { 0xcf, 0 }, { 0xf0, 0xcf, 0 } }, /* 0cf */ - { { 0xd0, 0 }, { 0xf0, 0xd0, 0 } }, /* 0d0 */ - { { 0xd1, 0 }, { 0xf0, 0xd0, 0 } }, /* 0d1 */ - { { 0xd2, 0 }, { 0xf0, 0xd2, 0 } }, /* 0d2 */ - { { 0xd3, 0 }, { 0xf0, 0xd3, 0 } }, /* 0d3 */ - { { 0xd4, 0 }, { 0xf0, 0xd4, 0 } }, /* 0d4 */ - { { 0xd5, 0 }, { 0xf0, 0xd5, 0 } }, /* 0d5 */ - { { 0xd6, 0 }, { 0xf0, 0xd6, 0 } }, /* 0d6 */ - { { 0xd7, 0 }, { 0xf0, 0xd7, 0 } }, /* 0d7 */ - { { 0xd8, 0 }, { 0xf0, 0xd8, 0 } }, /* 0d8 */ - { { 0xd9, 0 }, { 0xf0, 0xd9, 0 } }, /* 0d9 */ - { { 0xda, 0 }, { 0xf0, 0xda, 0 } }, /* 0da */ - { { 0xdb, 0 }, { 0xf0, 0xdb, 0 } }, /* 0db */ - { { 0xdc, 0 }, { 0xf0, 0xdc, 0 } }, /* 0dc */ - { { 0xdd, 0 }, { 0xf0, 0xdd, 0 } }, /* 0dd */ - { { 0xde, 0 }, { 0xf0, 0xde, 0 } }, /* 0de */ - { { 0xdf, 0 }, { 0xf0, 0xdf, 0 } }, /* 0df */ - { { 0xe0, 0 }, { 0xf0, 0xe0, 0 } }, /* 0e0 */ - { { 0xe1, 0 }, { 0xf0, 0xe1, 0 } }, /* 0e1 */ - { { 0xe2, 0 }, { 0xf0, 0xe2, 0 } }, /* 0e2 */ - { { 0xe3, 0 }, { 0xf0, 0xe3, 0 } }, /* 0e3 */ - { { 0xe4, 0 }, { 0xf0, 0xe4, 0 } }, /* 0e4 */ - { { 0xe5, 0 }, { 0xf0, 0xe5, 0 } }, /* 0e5 */ - { { 0xe6, 0 }, { 0xf0, 0xe6, 0 } }, /* 0e6 */ - { { 0xe7, 0 }, { 0xf0, 0xe7, 0 } }, /* 0e7 */ - { { 0xe8, 0 }, { 0xf0, 0xe8, 0 } }, /* 0e8 */ - { { 0xe9, 0 }, { 0xf0, 0xe9, 0 } }, /* 0e9 */ - { { 0xea, 0 }, { 0xf0, 0xea, 0 } }, /* 0ea */ - { { 0xeb, 0 }, { 0xf0, 0xeb, 0 } }, /* 0eb */ - { { 0xec, 0 }, { 0xf0, 0xec, 0 } }, /* 0ec */ - { { 0xed, 0 }, { 0xf0, 0xed, 0 } }, /* 0ed */ - { { 0xee, 0 }, { 0xf0, 0xee, 0 } }, /* 0ee */ - { { 0xef, 0 }, { 0xf0, 0xef, 0 } }, /* 0ef */ - { { 0 }, { 0 } }, /* 0f0 */ - { { 0xf1, 0 }, { 0xf0, 0xf1, 0 } }, /* 0f1 */ - { { 0xf2, 0 }, { 0xf0, 0xf2, 0 } }, /* 0f2 */ - { { 0xf3, 0 }, { 0xf0, 0xf3, 0 } }, /* 0f3 */ - { { 0xf4, 0 }, { 0xf0, 0xf4, 0 } }, /* 0f4 */ - { { 0xf5, 0 }, { 0xf0, 0xf5, 0 } }, /* 0f5 */ - { { 0xf6, 0 }, { 0xf0, 0xf6, 0 } }, /* 0f6 */ - { { 0xf7, 0 }, { 0xf0, 0xf7, 0 } }, /* 0f7 */ - { { 0xf8, 0 }, { 0xf0, 0xf8, 0 } }, /* 0f8 */ - { { 0xf9, 0 }, { 0xf0, 0xf9, 0 } }, /* 0f9 */ - { { 0xfa, 0 }, { 0xf0, 0xfa, 0 } }, /* 0fa */ - { { 0xfb, 0 }, { 0xf0, 0xfb, 0 } }, /* 0fb */ - { { 0xfc, 0 }, { 0xf0, 0xfc, 0 } }, /* 0fc */ - { { 0xfd, 0 }, { 0xf0, 0xfd, 0 } }, /* 0fd */ - { { 0xfe, 0 }, { 0xf0, 0xfe, 0 } }, /* 0fe */ - { { 0xff, 0 }, { 0xf0, 0xff, 0 } }, /* 0ff */ - { { 0xe1, 0x14, 0 }, { 0xe1, 0xf0, 0x14, 0 } }, /* 100 */ - { { 0xe0, 0x76, 0 }, { 0xe0, 0xF0, 0x76, 0 } }, /* 101 */ - { { 0xe0, 0x16, 0 }, { 0xe0, 0xF0, 0x16, 0 } }, /* 102 */ - { { 0xe0, 0x1E, 0 }, { 0xe0, 0xF0, 0x1E, 0 } }, /* 103 */ - { { 0xe0, 0x26, 0 }, { 0xe0, 0xF0, 0x26, 0 } }, /* 104 */ - { { 0xe0, 0x25, 0 }, { 0xe0, 0xF0, 0x25, 0 } }, /* 105 */ - { { 0xe0, 0x2E, 0 }, { 0xe0, 0xF0, 0x2E, 0 } }, /* 106 */ - { { 0xe0, 0x36, 0 }, { 0xe0, 0xF0, 0x36, 0 } }, /* 107 */ - { { 0xe0, 0x3D, 0 }, { 0xe0, 0xF0, 0x3D, 0 } }, /* 108 */ - { { 0xe0, 0x3E, 0 }, { 0xe0, 0xF0, 0x3E, 0 } }, /* 109 */ - { { 0xe0, 0x46, 0 }, { 0xe0, 0xF0, 0x46, 0 } }, /* 10a */ - { { 0xe0, 0x45, 0 }, { 0xe0, 0xF0, 0x45, 0 } }, /* 10b */ - { { 0xe0, 0x4E, 0 }, { 0xe0, 0xF0, 0x4E, 0 } }, /* 10c */ - { { 0 }, { 0 } }, /* 10d */ - { { 0xe0, 0x66, 0 }, { 0xe0, 0xF0, 0x66, 0 } }, /* 10e */ - { { 0xe0, 0x0D, 0 }, { 0xe0, 0xF0, 0x0D, 0 } }, /* 10f */ - { { 0xe0, 0x15, 0 }, { 0xe0, 0xF0, 0x15, 0 } }, /* 110 */ - { { 0xe0, 0x1D, 0 }, { 0xe0, 0xF0, 0x1D, 0 } }, /* 112 */ - { { 0xe0, 0x24, 0 }, { 0xe0, 0xF0, 0x24, 0 } }, /* 113 */ - { { 0xe0, 0x2D, 0 }, { 0xe0, 0xF0, 0x2D, 0 } }, /* 113 */ - { { 0xe0, 0x2C, 0 }, { 0xe0, 0xF0, 0x2C, 0 } }, /* 114 */ - { { 0xe0, 0x35, 0 }, { 0xe0, 0xF0, 0x35, 0 } }, /* 115 */ - { { 0xe0, 0x3C, 0 }, { 0xe0, 0xF0, 0x3C, 0 } }, /* 116 */ - { { 0xe0, 0x43, 0 }, { 0xe0, 0xF0, 0x43, 0 } }, /* 117 */ - { { 0xe0, 0x44, 0 }, { 0xe0, 0xF0, 0x44, 0 } }, /* 118 */ - { { 0xe0, 0x4D, 0 }, { 0xe0, 0xF0, 0x4D, 0 } }, /* 119 */ - { { 0xe0, 0x54, 0 }, { 0xe0, 0xF0, 0x54, 0 } }, /* 11a */ - { { 0xe0, 0x5B, 0 }, { 0xe0, 0xF0, 0x5B, 0 } }, /* 11b */ - { { 0xe0, 0x5A, 0 }, { 0xe0, 0xF0, 0x5A, 0 } }, /* 11c */ - { { 0xe0, 0x14, 0 }, { 0xe0, 0xF0, 0x14, 0 } }, /* 11d */ - { { 0xe0, 0x1C, 0 }, { 0xe0, 0xF0, 0x1C, 0 } }, /* 11e */ - { { 0xe0, 0x1B, 0 }, { 0xe0, 0xF0, 0x1B, 0 } }, /* 11f */ - { { 0xe0, 0x23, 0 }, { 0xe0, 0xF0, 0x23, 0 } }, /* 120 */ - { { 0xe0, 0x2B, 0 }, { 0xe0, 0xF0, 0x2B, 0 } }, /* 121 */ - { { 0xe0, 0x34, 0 }, { 0xe0, 0xF0, 0x34, 0 } }, /* 122 */ - { { 0xe0, 0x33, 0 }, { 0xe0, 0xF0, 0x33, 0 } }, /* 123 */ - { { 0xe0, 0x3B, 0 }, { 0xe0, 0xF0, 0x3B, 0 } }, /* 124 */ - { { 0xe0, 0x42, 0 }, { 0xe0, 0xF0, 0x42, 0 } }, /* 125 */ - { { 0xe0, 0x4B, 0 }, { 0xe0, 0xF0, 0x4B, 0 } }, /* 126 */ - { { 0 }, { 0 } }, /* 127 */ - { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, /* 129 */ - { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, /* 12b */ - { { 0xe0, 0x1A, 0 }, { 0xe0, 0xF0, 0x1A, 0 } }, /* 12c */ - { { 0xe0, 0x22, 0 }, { 0xe0, 0xF0, 0x22, 0 } }, /* 12d */ - { { 0xe0, 0x21, 0 }, { 0xe0, 0xF0, 0x21, 0 } }, /* 12e */ - { { 0xe0, 0x2A, 0 }, { 0xe0, 0xF0, 0x2A, 0 } }, /* 12f */ - { { 0xe0, 0x32, 0 }, { 0xe0, 0xF0, 0x32, 0 } }, /* 130 */ - { { 0xe0, 0x31, 0 }, { 0xe0, 0xF0, 0x31, 0 } }, /* 131 */ - { { 0xe0, 0x3A, 0 }, { 0xe0, 0xF0, 0x3A, 0 } }, /* 132 */ - { { 0 }, { 0 } }, /* 133 */ - { { 0xe0, 0x49, 0 }, { 0xe0, 0xF0, 0x49, 0 } }, /* 134 */ - { { 0xe0, 0x4A, 0 }, { 0xe0, 0xF0, 0x4A, 0 } }, /* 135 */ - { { 0 }, { 0 } }, /* 136 */ - { { 0xe0, 0x7C, 0 }, { 0xe0, 0xF0, 0x7C, 0 } }, /* 137 */ - { { 0xe0, 0x11, 0 }, { 0xe0, 0xF0, 0x11, 0 } }, /* 138 */ - { { 0 }, { 0 } }, /* 139 */ - { { 0xe0, 0x58, 0 }, { 0xe0, 0xF0, 0x58, 0 } }, /* 13a */ - { { 0xe0, 0x05, 0 }, { 0xe0, 0xF0, 0x05, 0 } }, /* 13b */ - { { 0xe0, 0x06, 0 }, { 0xe0, 0xF0, 0x06, 0 } }, /* 13c */ - { { 0xe0, 0x04, 0 }, { 0xe0, 0xF0, 0x04, 0 } }, /* 13d */ - { { 0xe0, 0x0C, 0 }, { 0xe0, 0xF0, 0x0C, 0 } }, /* 13e */ - { { 0xe0, 0x03, 0 }, { 0xe0, 0xF0, 0x03, 0 } }, /* 13f */ - { { 0xe0, 0x0B, 0 }, { 0xe0, 0xF0, 0x0B, 0 } }, /* 140 */ - { { 0xe0, 0x02, 0 }, { 0xe0, 0xF0, 0x02, 0 } }, /* 141 */ - { { 0xe0, 0x0A, 0 }, { 0xe0, 0xF0, 0x0A, 0 } }, /* 142 */ - { { 0xe0, 0x01, 0 }, { 0xe0, 0xF0, 0x01, 0 } }, /* 143 */ - { { 0xe0, 0x09, 0 }, { 0xe0, 0xF0, 0x09, 0 } }, /* 144 */ - { { 0 }, { 0 } }, /* 145 */ - { { 0xe0, 0x7E, 0 }, { 0xe0, 0xF0, 0x7E, 0 } }, /* 146 */ - { { 0xe0, 0x6C, 0 }, { 0xe0, 0xF0, 0x6C, 0 } }, /* 147 */ - { { 0xe0, 0x75, 0 }, { 0xe0, 0xF0, 0x75, 0 } }, /* 148 */ - { { 0xe0, 0x7D, 0 }, { 0xe0, 0xF0, 0x7D, 0 } }, /* 149 */ - { { 0 }, { 0 } }, /* 14a */ - { { 0xe0, 0x6B, 0 }, { 0xe0, 0xF0, 0x6B, 0 } }, /* 14b */ - { { 0xe0, 0x73, 0 }, { 0xe0, 0xF0, 0x73, 0 } }, /* 14c */ - { { 0xe0, 0x74, 0 }, { 0xe0, 0xF0, 0x74, 0 } }, /* 14d */ - { { 0xe0, 0x79, 0 }, { 0xe0, 0xF0, 0x79, 0 } }, /* 14e */ - { { 0xe0, 0x69, 0 }, { 0xe0, 0xF0, 0x69, 0 } }, /* 14f */ - { { 0xe0, 0x72, 0 }, { 0xe0, 0xF0, 0x72, 0 } }, /* 150 */ - { { 0xe0, 0x7A, 0 }, { 0xe0, 0xF0, 0x7A, 0 } }, /* 151 */ - { { 0xe0, 0x70, 0 }, { 0xe0, 0xF0, 0x70, 0 } }, /* 152 */ - { { 0xe0, 0x71, 0 }, { 0xe0, 0xF0, 0x71, 0 } }, /* 153 */ - { { 0 }, { 0 } }, /* 154 */ - { { 0xe0, 0x60, 0 }, { 0xe0, 0xF0, 0x60, 0 } }, /* 155 */ - { { 0 }, { 0 } }, /* 156 */ - { { 0xe0, 0x78, 0 }, { 0xe0, 0xF0, 0x78, 0 } }, /* 157 */ - { { 0xe0, 0x07, 0 }, { 0xe0, 0xF0, 0x07, 0 } }, /* 158 */ - { { 0xe0, 0x0F, 0 }, { 0xe0, 0xF0, 0x0F, 0 } }, /* 159 */ - { { 0xe0, 0x17, 0 }, { 0xe0, 0xF0, 0x17, 0 } }, /* 15a */ - { { 0xe0, 0x1F, 0 }, { 0xe0, 0xF0, 0x1F, 0 } }, /* 15b */ - { { 0xe0, 0x27, 0 }, { 0xe0, 0xF0, 0x27, 0 } }, /* 15c */ - { { 0xe0, 0x2F, 0 }, { 0xe0, 0xF0, 0x2F, 0 } }, /* 15d */ - { { 0xe0, 0x37, 0 }, { 0xe0, 0xF0, 0x37, 0 } }, /* 15e */ - { { 0xe0, 0x3F, 0 }, { 0xe0, 0xF0, 0x3F, 0 } }, /* 15f */ - { { 0 }, { 0 } }, /* 160 */ - { { 0xe0, 0x4F, 0 }, { 0xe0, 0xF0, 0x4F, 0 } }, /* 161 */ - { { 0xe0, 0x56, 0 }, { 0xe0, 0xF0, 0x56, 0 } }, /* 162 */ - { { 0xe0, 0x5E, 0 }, { 0xe0, 0xF0, 0x5E, 0 } }, /* 163 */ - { { 0xe0, 0x08, 0 }, { 0xe0, 0xF0, 0x08, 0 } }, /* 164 */ - { { 0xe0, 0x10, 0 }, { 0xe0, 0xF0, 0x10, 0 } }, /* 165 */ - { { 0xe0, 0x18, 0 }, { 0xe0, 0xF0, 0x18, 0 } }, /* 166 */ - { { 0xe0, 0x20, 0 }, { 0xe0, 0xF0, 0x20, 0 } }, /* 167 */ - { { 0xe0, 0x28, 0 }, { 0xe0, 0xF0, 0x28, 0 } }, /* 168 */ - { { 0xe0, 0x30, 0 }, { 0xe0, 0xF0, 0x30, 0 } }, /* 169 */ - { { 0xe0, 0x38, 0 }, { 0xe0, 0xF0, 0x38, 0 } }, /* 16a */ - { { 0xe0, 0x40, 0 }, { 0xe0, 0xF0, 0x40, 0 } }, /* 16b */ - { { 0xe0, 0x48, 0 }, { 0xe0, 0xF0, 0x48, 0 } }, /* 16c */ - { { 0xe0, 0x50, 0 }, { 0xe0, 0xF0, 0x50, 0 } }, /* 16d */ - { { 0xe0, 0x57, 0 }, { 0xe0, 0xF0, 0x57, 0 } }, /* 16e */ - { { 0 }, { 0 } }, /* 16f */ - { { 0xe0, 0x13, 0 }, { 0xe0, 0xF0, 0x13, 0 } }, /* 170 */ - { { 0xe0, 0x19, 0 }, { 0xe0, 0xF0, 0x19, 0 } }, /* 171 */ - { { 0xe0, 0x39, 0 }, { 0xe0, 0xF0, 0x39, 0 } }, /* 172 */ - { { 0xe0, 0x51, 0 }, { 0xe0, 0xF0, 0x51, 0 } }, /* 173 */ - { { 0xe0, 0x53, 0 }, { 0xe0, 0xF0, 0x53, 0 } }, /* 174 */ - { { 0xe0, 0x5C, 0 }, { 0xe0, 0xF0, 0x5C, 0 } }, /* 175 */ - { { 0 }, { 0 } }, /* 176 */ - { { 0xe0, 0x62, 0 }, { 0xe0, 0xF0, 0x62, 0 } }, /* 177 */ - { { 0xe0, 0x63, 0 }, { 0xe0, 0xF0, 0x63, 0 } }, /* 178 */ - { { 0xe0, 0x64, 0 }, { 0xe0, 0xF0, 0x64, 0 } }, /* 179 */ - { { 0xe0, 0x65, 0 }, { 0xe0, 0xF0, 0x65, 0 } }, /* 17a */ - { { 0xe0, 0x67, 0 }, { 0xe0, 0xF0, 0x67, 0 } }, /* 17b */ - { { 0xe0, 0x68, 0 }, { 0xe0, 0xF0, 0x68, 0 } }, /* 17c */ - { { 0xe0, 0x6A, 0 }, { 0xe0, 0xF0, 0x6A, 0 } }, /* 17d */ - { { 0xe0, 0x6D, 0 }, { 0xe0, 0xF0, 0x6D, 0 } }, /* 17e */ - { { 0xe0, 0x6E, 0 }, { 0xe0, 0xF0, 0x6E, 0 } }, /* 17f */ - { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, /* 181 */ - { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, /* 183 */ - { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, /* 185 */ - { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, /* 187 */ - { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, /* 189 */ - { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, /* 18b */ - { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, /* 18d */ - { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, /* 18f */ - { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, /* 191 */ - { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, /* 193 */ - { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, /* 195 */ - { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, /* 197 */ - { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, /* 199 */ - { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, /* 19b */ - { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, /* 19d */ - { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, /* 19f */ - { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, /* 1a1 */ - { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, /* 1a3 */ - { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, /* 1a5 */ - { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, /* 1a7 */ - { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, /* 1a9 */ - { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, /* 1ab */ - { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, /* 1ad */ - { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, /* 1af */ - { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, /* 1b1 */ - { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, /* 1b3 */ - { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, /* 1b5 */ - { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, /* 1b7 */ - { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, /* 1b9 */ - { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, /* 1bb */ - { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, /* 1bd */ - { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, /* 1bf */ - { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, /* 1c1 */ - { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, /* 1c3 */ - { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, /* 1c5 */ - { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, /* 1c7 */ - { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, /* 1c9 */ - { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, /* 1cb */ - { { 0 }, { 0 } }, /* 1cv */ - { { 0 }, { 0 } }, /* 1cd */ - { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, /* 1cf */ - { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, /* 1d1 */ - { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, /* 1d5 */ - { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, /* 1d7 */ - { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, /* 1d9 */ - { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, /* 1db */ - { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, /* 1dd */ - { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, /* 1df */ - { { 0 }, { 0 } }, /* 1e0 */ - { { 0xe0, 0xe1, 0 }, { 0xe0, 0xF0, 0xE1, 0 } }, /* 1e1 */ - { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, /* 1e3 */ - { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, /* 1e5 */ - { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, /* 1e7 */ - { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, /* 1e9 */ - { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, /* 1eb */ - { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, /* 1ed */ - { { 0xe0, 0xee, 0 }, { 0xe0, 0xF0, 0xEE, 0 } }, /* 1ee */ - { { 0 }, { 0 } }, /* 1ef */ - { { 0 }, { 0 } }, /* 1f0 */ - { { 0xe0, 0xf1, 0 }, { 0xe0, 0xF0, 0xF1, 0 } }, /* 1f1 */ - { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, /* 1f3 */ - { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, /* 1f5 */ - { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, /* 1f7 */ - { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, /* 1f9 */ - { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, /* 1fb */ - { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, /* 1fd */ - { { 0xe0, 0xfe, 0 }, { 0xe0, 0xF0, 0xFE, 0 } }, /* 1fe */ - { { 0xe0, 0xff, 0 }, { 0xe0, 0xF0, 0xFF, 0 } } /* 1ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x76, 0 }, .brk = { 0xF0, 0x76, 0 } }, /* 001 */ + { .mk = { 0x16, 0 }, .brk = { 0xF0, 0x16, 0 } }, /* 002 */ + { .mk = { 0x1E, 0 }, .brk = { 0xF0, 0x1E, 0 } }, /* 003 */ + { .mk = { 0x26, 0 }, .brk = { 0xF0, 0x26, 0 } }, /* 004 */ + { .mk = { 0x25, 0 }, .brk = { 0xF0, 0x25, 0 } }, /* 005 */ + { .mk = { 0x2E, 0 }, .brk = { 0xF0, 0x2E, 0 } }, /* 006 */ + { .mk = { 0x36, 0 }, .brk = { 0xF0, 0x36, 0 } }, /* 007 */ + { .mk = { 0x3D, 0 }, .brk = { 0xF0, 0x3D, 0 } }, /* 008 */ + { .mk = { 0x3E, 0 }, .brk = { 0xF0, 0x3E, 0 } }, /* 009 */ + { .mk = { 0x46, 0 }, .brk = { 0xF0, 0x46, 0 } }, /* 00a */ + { .mk = { 0x45, 0 }, .brk = { 0xF0, 0x45, 0 } }, /* 00b */ + { .mk = { 0x4E, 0 }, .brk = { 0xF0, 0x4E, 0 } }, /* 00c */ + { .mk = { 0x55, 0 }, .brk = { 0xF0, 0x55, 0 } }, /* 00d */ + { .mk = { 0x66, 0 }, .brk = { 0xF0, 0x66, 0 } }, /* 00e */ + { .mk = { 0x0D, 0 }, .brk = { 0xF0, 0x0D, 0 } }, /* 00f */ + { .mk = { 0x15, 0 }, .brk = { 0xF0, 0x15, 0 } }, /* 010 */ + { .mk = { 0x1D, 0 }, .brk = { 0xF0, 0x1D, 0 } }, /* 011 */ + { .mk = { 0x24, 0 }, .brk = { 0xF0, 0x24, 0 } }, /* 012 */ + { .mk = { 0x2D, 0 }, .brk = { 0xF0, 0x2D, 0 } }, /* 013 */ + { .mk = { 0x2C, 0 }, .brk = { 0xF0, 0x2C, 0 } }, /* 014 */ + { .mk = { 0x35, 0 }, .brk = { 0xF0, 0x35, 0 } }, /* 015 */ + { .mk = { 0x3C, 0 }, .brk = { 0xF0, 0x3C, 0 } }, /* 016 */ + { .mk = { 0x43, 0 }, .brk = { 0xF0, 0x43, 0 } }, /* 017 */ + { .mk = { 0x44, 0 }, .brk = { 0xF0, 0x44, 0 } }, /* 018 */ + { .mk = { 0x4D, 0 }, .brk = { 0xF0, 0x4D, 0 } }, /* 019 */ + { .mk = { 0x54, 0 }, .brk = { 0xF0, 0x54, 0 } }, /* 01a */ + { .mk = { 0x5B, 0 }, .brk = { 0xF0, 0x5B, 0 } }, /* 01b */ + { .mk = { 0x5A, 0 }, .brk = { 0xF0, 0x5A, 0 } }, /* 01c */ + { .mk = { 0x14, 0 }, .brk = { 0xF0, 0x14, 0 } }, /* 01d */ + { .mk = { 0x1C, 0 }, .brk = { 0xF0, 0x1C, 0 } }, /* 01e */ + { .mk = { 0x1B, 0 }, .brk = { 0xF0, 0x1B, 0 } }, /* 01f */ + { .mk = { 0x23, 0 }, .brk = { 0xF0, 0x23, 0 } }, /* 020 */ + { .mk = { 0x2B, 0 }, .brk = { 0xF0, 0x2B, 0 } }, /* 021 */ + { .mk = { 0x34, 0 }, .brk = { 0xF0, 0x34, 0 } }, /* 022 */ + { .mk = { 0x33, 0 }, .brk = { 0xF0, 0x33, 0 } }, /* 023 */ + { .mk = { 0x3B, 0 }, .brk = { 0xF0, 0x3B, 0 } }, /* 024 */ + { .mk = { 0x42, 0 }, .brk = { 0xF0, 0x42, 0 } }, /* 025 */ + { .mk = { 0x4B, 0 }, .brk = { 0xF0, 0x4B, 0 } }, /* 026 */ + { .mk = { 0x4C, 0 }, .brk = { 0xF0, 0x4C, 0 } }, /* 027 */ + { .mk = { 0x52, 0 }, .brk = { 0xF0, 0x52, 0 } }, /* 028 */ + { .mk = { 0x0E, 0 }, .brk = { 0xF0, 0x0E, 0 } }, /* 029 */ + { .mk = { 0x12, 0 }, .brk = { 0xF0, 0x12, 0 } }, /* 02a */ + { .mk = { 0x5D, 0 }, .brk = { 0xF0, 0x5D, 0 } }, /* 02b */ + { .mk = { 0x1A, 0 }, .brk = { 0xF0, 0x1A, 0 } }, /* 02c */ + { .mk = { 0x22, 0 }, .brk = { 0xF0, 0x22, 0 } }, /* 02d */ + { .mk = { 0x21, 0 }, .brk = { 0xF0, 0x21, 0 } }, /* 02e */ + { .mk = { 0x2A, 0 }, .brk = { 0xF0, 0x2A, 0 } }, /* 02f */ + { .mk = { 0x32, 0 }, .brk = { 0xF0, 0x32, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xF0, 0x31, 0 } }, /* 031 */ + { .mk = { 0x3A, 0 }, .brk = { 0xF0, 0x3A, 0 } }, /* 032 */ + { .mk = { 0x41, 0 }, .brk = { 0xF0, 0x41, 0 } }, /* 033 */ + { .mk = { 0x49, 0 }, .brk = { 0xF0, 0x49, 0 } }, /* 034 */ + { .mk = { 0x4A, 0 }, .brk = { 0xF0, 0x4A, 0 } }, /* 035 */ + { .mk = { 0x59, 0 }, .brk = { 0xF0, 0x59, 0 } }, /* 036 */ + { .mk = { 0x7C, 0 }, .brk = { 0xF0, 0x7C, 0 } }, /* 037 */ + { .mk = { 0x11, 0 }, .brk = { 0xF0, 0x11, 0 } }, /* 038 */ + { .mk = { 0x29, 0 }, .brk = { 0xF0, 0x29, 0 } }, /* 039 */ + { .mk = { 0x58, 0 }, .brk = { 0xF0, 0x58, 0 } }, /* 03a */ + { .mk = { 0x05, 0 }, .brk = { 0xF0, 0x05, 0 } }, /* 03b */ + { .mk = { 0x06, 0 }, .brk = { 0xF0, 0x06, 0 } }, /* 03c */ + { .mk = { 0x04, 0 }, .brk = { 0xF0, 0x04, 0 } }, /* 03d */ + { .mk = { 0x0C, 0 }, .brk = { 0xF0, 0x0C, 0 } }, /* 03e */ + { .mk = { 0x03, 0 }, .brk = { 0xF0, 0x03, 0 } }, /* 03f */ + { .mk = { 0x0B, 0 }, .brk = { 0xF0, 0x0B, 0 } }, /* 040 */ + { .mk = { 0x83, 0 }, .brk = { 0xF0, 0x83, 0 } }, /* 041 */ + { .mk = { 0x0A, 0 }, .brk = { 0xF0, 0x0A, 0 } }, /* 042 */ + { .mk = { 0x01, 0 }, .brk = { 0xF0, 0x01, 0 } }, /* 043 */ + { .mk = { 0x09, 0 }, .brk = { 0xF0, 0x09, 0 } }, /* 044 */ + { .mk = { 0x77, 0 }, .brk = { 0xF0, 0x77, 0 } }, /* 045 */ + { .mk = { 0x7E, 0 }, .brk = { 0xF0, 0x7E, 0 } }, /* 046 */ + { .mk = { 0x6C, 0 }, .brk = { 0xF0, 0x6C, 0 } }, /* 047 */ + { .mk = { 0x75, 0 }, .brk = { 0xF0, 0x75, 0 } }, /* 048 */ + { .mk = { 0x7D, 0 }, .brk = { 0xF0, 0x7D, 0 } }, /* 049 */ + { .mk = { 0x7B, 0 }, .brk = { 0xF0, 0x7B, 0 } }, /* 04a */ + { .mk = { 0x6B, 0 }, .brk = { 0xF0, 0x6B, 0 } }, /* 04b */ + { .mk = { 0x73, 0 }, .brk = { 0xF0, 0x73, 0 } }, /* 04c */ + { .mk = { 0x74, 0 }, .brk = { 0xF0, 0x74, 0 } }, /* 04d */ + { .mk = { 0x79, 0 }, .brk = { 0xF0, 0x79, 0 } }, /* 04e */ + { .mk = { 0x69, 0 }, .brk = { 0xF0, 0x69, 0 } }, /* 04f */ + { .mk = { 0x72, 0 }, .brk = { 0xF0, 0x72, 0 } }, /* 050 */ + { .mk = { 0x7A, 0 }, .brk = { 0xF0, 0x7A, 0 } }, /* 051 */ + { .mk = { 0x70, 0 }, .brk = { 0xF0, 0x70, 0 } }, /* 052 */ + { .mk = { 0x71, 0 }, .brk = { 0xF0, 0x71, 0 } }, /* 053 */ + { .mk = { 0x84, 0 }, .brk = { 0xF0, 0x84, 0 } }, /* 054 */ + { .mk = { 0x60, 0 }, .brk = { 0xF0, 0x60, 0 } }, /* 055 */ + { .mk = { 0x61, 0 }, .brk = { 0xF0, 0x61, 0 } }, /* 056 */ + { .mk = { 0x78, 0 }, .brk = { 0xF0, 0x78, 0 } }, /* 057 */ + { .mk = { 0x07, 0 }, .brk = { 0xF0, 0x07, 0 } }, /* 058 */ + { .mk = { 0x0F, 0 }, .brk = { 0xF0, 0x0F, 0 } }, /* 059 */ + { .mk = { 0x17, 0 }, .brk = { 0xF0, 0x17, 0 } }, /* 05a */ + { .mk = { 0x1F, 0 }, .brk = { 0xF0, 0x1F, 0 } }, /* 05b */ + { .mk = { 0x27, 0 }, .brk = { 0xF0, 0x27, 0 } }, /* 05c */ + { .mk = { 0x2F, 0 }, .brk = { 0xF0, 0x2F, 0 } }, /* 05d */ + { .mk = { 0x37, 0 }, .brk = { 0xF0, 0x37, 0 } }, /* 05e */ + { .mk = { 0x3F, 0 }, .brk = { 0xF0, 0x3F, 0 } }, /* 05f */ + { .mk = { 0x47, 0 }, .brk = { 0xF0, 0x47, 0 } }, /* 060 */ + { .mk = { 0x4F, 0 }, .brk = { 0xF0, 0x4F, 0 } }, /* 061 */ + { .mk = { 0x56, 0 }, .brk = { 0xF0, 0x56, 0 } }, /* 062 */ + { .mk = { 0x5E, 0 }, .brk = { 0xF0, 0x5E, 0 } }, /* 063 */ + { .mk = { 0x08, 0 }, .brk = { 0xF0, 0x08, 0 } }, /* 064 */ + { .mk = { 0x10, 0 }, .brk = { 0xF0, 0x10, 0 } }, /* 065 */ + { .mk = { 0x18, 0 }, .brk = { 0xF0, 0x18, 0 } }, /* 066 */ + { .mk = { 0x20, 0 }, .brk = { 0xF0, 0x20, 0 } }, /* 067 */ + { .mk = { 0x28, 0 }, .brk = { 0xF0, 0x28, 0 } }, /* 068 */ + { .mk = { 0x30, 0 }, .brk = { 0xF0, 0x30, 0 } }, /* 069 */ + { .mk = { 0x38, 0 }, .brk = { 0xF0, 0x38, 0 } }, /* 06a */ + { .mk = { 0x40, 0 }, .brk = { 0xF0, 0x40, 0 } }, /* 06b */ + { .mk = { 0x48, 0 }, .brk = { 0xF0, 0x48, 0 } }, /* 06c */ + { .mk = { 0x50, 0 }, .brk = { 0xF0, 0x50, 0 } }, /* 06d */ + { .mk = { 0x57, 0 }, .brk = { 0xF0, 0x57, 0 } }, /* 06e */ + { .mk = { 0x6F, 0 }, .brk = { 0xF0, 0x6F, 0 } }, /* 06f */ + { .mk = { 0x13, 0 }, .brk = { 0xF0, 0x13, 0 } }, /* 070 */ + { .mk = { 0x19, 0 }, .brk = { 0xF0, 0x19, 0 } }, /* 071 */ + { .mk = { 0x39, 0 }, .brk = { 0xF0, 0x39, 0 } }, /* 072 */ + { .mk = { 0x51, 0 }, .brk = { 0xF0, 0x51, 0 } }, /* 073 */ + { .mk = { 0x53, 0 }, .brk = { 0xF0, 0x53, 0 } }, /* 074 */ + { .mk = { 0x5C, 0 }, .brk = { 0xF0, 0x5C, 0 } }, /* 075 */ + { .mk = { 0x5F, 0 }, .brk = { 0xF0, 0x5F, 0 } }, /* 076 */ + { .mk = { 0x62, 0 }, .brk = { 0xF0, 0x62, 0 } }, /* 077 */ + { .mk = { 0x63, 0 }, .brk = { 0xF0, 0x63, 0 } }, /* 078 */ + { .mk = { 0x64, 0 }, .brk = { 0xF0, 0x64, 0 } }, /* 079 */ + { .mk = { 0x65, 0 }, .brk = { 0xF0, 0x65, 0 } }, /* 07a */ + { .mk = { 0x67, 0 }, .brk = { 0xF0, 0x67, 0 } }, /* 07b */ + { .mk = { 0x68, 0 }, .brk = { 0xF0, 0x68, 0 } }, /* 07c */ + { .mk = { 0x6A, 0 }, .brk = { 0xF0, 0x6A, 0 } }, /* 07d */ + { .mk = { 0x6D, 0 }, .brk = { 0xF0, 0x6D, 0 } }, /* 07e */ + { .mk = { 0x6E, 0 }, .brk = { 0xF0, 0x6E, 0 } }, /* 07f */ + { .mk = { 0x80, 0 }, .brk = { 0xf0, 0x80, 0 } }, /* 080 */ + { .mk = { 0x81, 0 }, .brk = { 0xf0, 0x81, 0 } }, /* 081 */ + { .mk = { 0x82, 0 }, .brk = { 0xf0, 0x82, 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0x85, 0 }, .brk = { 0xf0, 0x54, 0 } }, /* 085 */ + { .mk = { 0x86, 0 }, .brk = { 0xf0, 0x86, 0 } }, /* 086 */ + { .mk = { 0x87, 0 }, .brk = { 0xf0, 0x87, 0 } }, /* 087 */ + { .mk = { 0x88, 0 }, .brk = { 0xf0, 0x88, 0 } }, /* 088 */ + { .mk = { 0x89, 0 }, .brk = { 0xf0, 0x89, 0 } }, /* 089 */ + { .mk = { 0x8a, 0 }, .brk = { 0xf0, 0x8a, 0 } }, /* 08a */ + { .mk = { 0x8b, 0 }, .brk = { 0xf0, 0x8b, 0 } }, /* 08b */ + { .mk = { 0x8c, 0 }, .brk = { 0xf0, 0x8c, 0 } }, /* 08c */ + { .mk = { 0x8d, 0 }, .brk = { 0xf0, 0x8d, 0 } }, /* 08d */ + { .mk = { 0x8e, 0 }, .brk = { 0xf0, 0x8e, 0 } }, /* 08e */ + { .mk = { 0x8f, 0 }, .brk = { 0xf0, 0x8f, 0 } }, /* 08f */ + { .mk = { 0x90, 0 }, .brk = { 0xf0, 0x90, 0 } }, /* 090 */ + { .mk = { 0x91, 0 }, .brk = { 0xf0, 0x91, 0 } }, /* 091 */ + { .mk = { 0x92, 0 }, .brk = { 0xf0, 0x92, 0 } }, /* 092 */ + { .mk = { 0x93, 0 }, .brk = { 0xf0, 0x93, 0 } }, /* 093 */ + { .mk = { 0x94, 0 }, .brk = { 0xf0, 0x94, 0 } }, /* 094 */ + { .mk = { 0x95, 0 }, .brk = { 0xf0, 0x95, 0 } }, /* 095 */ + { .mk = { 0x96, 0 }, .brk = { 0xf0, 0x96, 0 } }, /* 096 */ + { .mk = { 0x97, 0 }, .brk = { 0xf0, 0x97, 0 } }, /* 097 */ + { .mk = { 0x98, 0 }, .brk = { 0xf0, 0x98, 0 } }, /* 098 */ + { .mk = { 0x99, 0 }, .brk = { 0xf0, 0x99, 0 } }, /* 099 */ + { .mk = { 0x9a, 0 }, .brk = { 0xf0, 0x9a, 0 } }, /* 09a */ + { .mk = { 0x9b, 0 }, .brk = { 0xf0, 0x9b, 0 } }, /* 09b */ + { .mk = { 0x9c, 0 }, .brk = { 0xf0, 0x9c, 0 } }, /* 09c */ + { .mk = { 0x9d, 0 }, .brk = { 0xf0, 0x9d, 0 } }, /* 09d */ + { .mk = { 0x9e, 0 }, .brk = { 0xf0, 0x9e, 0 } }, /* 09e */ + { .mk = { 0x9f, 0 }, .brk = { 0xf0, 0x9f, 0 } }, /* 09f */ + { .mk = { 0xa0, 0 }, .brk = { 0xf0, 0xa0, 0 } }, /* 0a0 */ + { .mk = { 0xa1, 0 }, .brk = { 0xf0, 0xa1, 0 } }, /* 0a1 */ + { .mk = { 0xa2, 0 }, .brk = { 0xf0, 0xa2, 0 } }, /* 0a2 */ + { .mk = { 0xa3, 0 }, .brk = { 0xf0, 0xa3, 0 } }, /* 0a3 */ + { .mk = { 0xa4, 0 }, .brk = { 0xf0, 0xa4, 0 } }, /* 0a4 */ + { .mk = { 0xa5, 0 }, .brk = { 0xf0, 0xa5, 0 } }, /* 0a5 */ + { .mk = { 0xa6, 0 }, .brk = { 0xf0, 0xa6, 0 } }, /* 0a6 */ + { .mk = { 0xa7, 0 }, .brk = { 0xf0, 0xa7, 0 } }, /* 0a7 */ + { .mk = { 0xa8, 0 }, .brk = { 0xf0, 0xa8, 0 } }, /* 0a8 */ + { .mk = { 0xa9, 0 }, .brk = { 0xf0, 0xa9, 0 } }, /* 0a9 */ + { .mk = { 0xaa, 0 }, .brk = { 0xf0, 0xaa, 0 } }, /* 0aa */ + { .mk = { 0xab, 0 }, .brk = { 0xf0, 0xab, 0 } }, /* 0ab */ + { .mk = { 0xac, 0 }, .brk = { 0xf0, 0xac, 0 } }, /* 0ac */ + { .mk = { 0xad, 0 }, .brk = { 0xf0, 0xad, 0 } }, /* 0ad */ + { .mk = { 0xae, 0 }, .brk = { 0xf0, 0xae, 0 } }, /* 0ae */ + { .mk = { 0xaf, 0 }, .brk = { 0xf0, 0xaf, 0 } }, /* 0af */ + { .mk = { 0xb0, 0 }, .brk = { 0xf0, 0xb0, 0 } }, /* 0b0 */ + { .mk = { 0xb1, 0 }, .brk = { 0xf0, 0xb1, 0 } }, /* 0b1 */ + { .mk = { 0xb2, 0 }, .brk = { 0xf0, 0xb2, 0 } }, /* 0b2 */ + { .mk = { 0xb3, 0 }, .brk = { 0xf0, 0xb3, 0 } }, /* 0b3 */ + { .mk = { 0xb4, 0 }, .brk = { 0xf0, 0xb4, 0 } }, /* 0b4 */ + { .mk = { 0xb5, 0 }, .brk = { 0xf0, 0xb5, 0 } }, /* 0b5 */ + { .mk = { 0xb6, 0 }, .brk = { 0xf0, 0xb6, 0 } }, /* 0b6 */ + { .mk = { 0xb7, 0 }, .brk = { 0xf0, 0xb7, 0 } }, /* 0b7 */ + { .mk = { 0xb8, 0 }, .brk = { 0xf0, 0xb8, 0 } }, /* 0b8 */ + { .mk = { 0xb9, 0 }, .brk = { 0xf0, 0xb9, 0 } }, /* 0b9 */ + { .mk = { 0xba, 0 }, .brk = { 0xf0, 0xba, 0 } }, /* 0ba */ + { .mk = { 0xbb, 0 }, .brk = { 0xf0, 0xbb, 0 } }, /* 0bb */ + { .mk = { 0xbc, 0 }, .brk = { 0xf0, 0xbc, 0 } }, /* 0bc */ + { .mk = { 0xbd, 0 }, .brk = { 0xf0, 0xbd, 0 } }, /* 0bd */ + { .mk = { 0xbe, 0 }, .brk = { 0xf0, 0xbe, 0 } }, /* 0be */ + { .mk = { 0xbf, 0 }, .brk = { 0xf0, 0xbf, 0 } }, /* 0bf */ + { .mk = { 0xc0, 0 }, .brk = { 0xf0, 0xc0, 0 } }, /* 0c0 */ + { .mk = { 0xc1, 0 }, .brk = { 0xf0, 0xc1, 0 } }, /* 0c1 */ + { .mk = { 0xc2, 0 }, .brk = { 0xf0, 0xc2, 0 } }, /* 0c2 */ + { .mk = { 0xc3, 0 }, .brk = { 0xf0, 0xc3, 0 } }, /* 0c3 */ + { .mk = { 0xc4, 0 }, .brk = { 0xf0, 0xc4, 0 } }, /* 0c4 */ + { .mk = { 0xc5, 0 }, .brk = { 0xf0, 0xc5, 0 } }, /* 0c5 */ + { .mk = { 0xc6, 0 }, .brk = { 0xf0, 0xc6, 0 } }, /* 0c6 */ + { .mk = { 0xc7, 0 }, .brk = { 0xf0, 0xc7, 0 } }, /* 0c7 */ + { .mk = { 0xc8, 0 }, .brk = { 0xf0, 0xc8, 0 } }, /* 0c8 */ + { .mk = { 0xc9, 0 }, .brk = { 0xf0, 0xc9, 0 } }, /* 0c9 */ + { .mk = { 0xca, 0 }, .brk = { 0xf0, 0xca, 0 } }, /* 0ca */ + { .mk = { 0xcb, 0 }, .brk = { 0xf0, 0xcb, 0 } }, /* 0cb */ + { .mk = { 0xcc, 0 }, .brk = { 0xf0, 0xcc, 0 } }, /* 0cc */ + { .mk = { 0xcd, 0 }, .brk = { 0xf0, 0xcd, 0 } }, /* 0cd */ + { .mk = { 0xce, 0 }, .brk = { 0xf0, 0xce, 0 } }, /* 0ce */ + { .mk = { 0xcf, 0 }, .brk = { 0xf0, 0xcf, 0 } }, /* 0cf */ + { .mk = { 0xd0, 0 }, .brk = { 0xf0, 0xd0, 0 } }, /* 0d0 */ + { .mk = { 0xd1, 0 }, .brk = { 0xf0, 0xd0, 0 } }, /* 0d1 */ + { .mk = { 0xd2, 0 }, .brk = { 0xf0, 0xd2, 0 } }, /* 0d2 */ + { .mk = { 0xd3, 0 }, .brk = { 0xf0, 0xd3, 0 } }, /* 0d3 */ + { .mk = { 0xd4, 0 }, .brk = { 0xf0, 0xd4, 0 } }, /* 0d4 */ + { .mk = { 0xd5, 0 }, .brk = { 0xf0, 0xd5, 0 } }, /* 0d5 */ + { .mk = { 0xd6, 0 }, .brk = { 0xf0, 0xd6, 0 } }, /* 0d6 */ + { .mk = { 0xd7, 0 }, .brk = { 0xf0, 0xd7, 0 } }, /* 0d7 */ + { .mk = { 0xd8, 0 }, .brk = { 0xf0, 0xd8, 0 } }, /* 0d8 */ + { .mk = { 0xd9, 0 }, .brk = { 0xf0, 0xd9, 0 } }, /* 0d9 */ + { .mk = { 0xda, 0 }, .brk = { 0xf0, 0xda, 0 } }, /* 0da */ + { .mk = { 0xdb, 0 }, .brk = { 0xf0, 0xdb, 0 } }, /* 0db */ + { .mk = { 0xdc, 0 }, .brk = { 0xf0, 0xdc, 0 } }, /* 0dc */ + { .mk = { 0xdd, 0 }, .brk = { 0xf0, 0xdd, 0 } }, /* 0dd */ + { .mk = { 0xde, 0 }, .brk = { 0xf0, 0xde, 0 } }, /* 0de */ + { .mk = { 0xdf, 0 }, .brk = { 0xf0, 0xdf, 0 } }, /* 0df */ + { .mk = { 0xe0, 0 }, .brk = { 0xf0, 0xe0, 0 } }, /* 0e0 */ + { .mk = { 0xe1, 0 }, .brk = { 0xf0, 0xe1, 0 } }, /* 0e1 */ + { .mk = { 0xe2, 0 }, .brk = { 0xf0, 0xe2, 0 } }, /* 0e2 */ + { .mk = { 0xe3, 0 }, .brk = { 0xf0, 0xe3, 0 } }, /* 0e3 */ + { .mk = { 0xe4, 0 }, .brk = { 0xf0, 0xe4, 0 } }, /* 0e4 */ + { .mk = { 0xe5, 0 }, .brk = { 0xf0, 0xe5, 0 } }, /* 0e5 */ + { .mk = { 0xe6, 0 }, .brk = { 0xf0, 0xe6, 0 } }, /* 0e6 */ + { .mk = { 0xe7, 0 }, .brk = { 0xf0, 0xe7, 0 } }, /* 0e7 */ + { .mk = { 0xe8, 0 }, .brk = { 0xf0, 0xe8, 0 } }, /* 0e8 */ + { .mk = { 0xe9, 0 }, .brk = { 0xf0, 0xe9, 0 } }, /* 0e9 */ + { .mk = { 0xea, 0 }, .brk = { 0xf0, 0xea, 0 } }, /* 0ea */ + { .mk = { 0xeb, 0 }, .brk = { 0xf0, 0xeb, 0 } }, /* 0eb */ + { .mk = { 0xec, 0 }, .brk = { 0xf0, 0xec, 0 } }, /* 0ec */ + { .mk = { 0xed, 0 }, .brk = { 0xf0, 0xed, 0 } }, /* 0ed */ + { .mk = { 0xee, 0 }, .brk = { 0xf0, 0xee, 0 } }, /* 0ee */ + { .mk = { 0xef, 0 }, .brk = { 0xf0, 0xef, 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0xf1, 0 }, .brk = { 0xf0, 0xf1, 0 } }, /* 0f1 */ + { .mk = { 0xf2, 0 }, .brk = { 0xf0, 0xf2, 0 } }, /* 0f2 */ + { .mk = { 0xf3, 0 }, .brk = { 0xf0, 0xf3, 0 } }, /* 0f3 */ + { .mk = { 0xf4, 0 }, .brk = { 0xf0, 0xf4, 0 } }, /* 0f4 */ + { .mk = { 0xf5, 0 }, .brk = { 0xf0, 0xf5, 0 } }, /* 0f5 */ + { .mk = { 0xf6, 0 }, .brk = { 0xf0, 0xf6, 0 } }, /* 0f6 */ + { .mk = { 0xf7, 0 }, .brk = { 0xf0, 0xf7, 0 } }, /* 0f7 */ + { .mk = { 0xf8, 0 }, .brk = { 0xf0, 0xf8, 0 } }, /* 0f8 */ + { .mk = { 0xf9, 0 }, .brk = { 0xf0, 0xf9, 0 } }, /* 0f9 */ + { .mk = { 0xfa, 0 }, .brk = { 0xf0, 0xfa, 0 } }, /* 0fa */ + { .mk = { 0xfb, 0 }, .brk = { 0xf0, 0xfb, 0 } }, /* 0fb */ + { .mk = { 0xfc, 0 }, .brk = { 0xf0, 0xfc, 0 } }, /* 0fc */ + { .mk = { 0xfd, 0 }, .brk = { 0xf0, 0xfd, 0 } }, /* 0fd */ + { .mk = { 0xfe, 0 }, .brk = { 0xf0, 0xfe, 0 } }, /* 0fe */ + { .mk = { 0xff, 0 }, .brk = { 0xf0, 0xff, 0 } }, /* 0ff */ + { .mk = {0xe1, 0x14, 0 }, .brk = { 0xe1, 0xf0, 0x14, 0 } }, /* 100 */ + { .mk = {0xe0, 0x76, 0 }, .brk = { 0xe0, 0xF0, 0x76, 0 } }, /* 101 */ + { .mk = {0xe0, 0x16, 0 }, .brk = { 0xe0, 0xF0, 0x16, 0 } }, /* 102 */ + { .mk = {0xe0, 0x1E, 0 }, .brk = { 0xe0, 0xF0, 0x1E, 0 } }, /* 103 */ + { .mk = {0xe0, 0x26, 0 }, .brk = { 0xe0, 0xF0, 0x26, 0 } }, /* 104 */ + { .mk = {0xe0, 0x25, 0 }, .brk = { 0xe0, 0xF0, 0x25, 0 } }, /* 105 */ + { .mk = {0xe0, 0x2E, 0 }, .brk = { 0xe0, 0xF0, 0x2E, 0 } }, /* 106 */ + { .mk = {0xe0, 0x36, 0 }, .brk = { 0xe0, 0xF0, 0x36, 0 } }, /* 107 */ + { .mk = {0xe0, 0x3D, 0 }, .brk = { 0xe0, 0xF0, 0x3D, 0 } }, /* 108 */ + { .mk = {0xe0, 0x3E, 0 }, .brk = { 0xe0, 0xF0, 0x3E, 0 } }, /* 109 */ + { .mk = {0xe0, 0x46, 0 }, .brk = { 0xe0, 0xF0, 0x46, 0 } }, /* 10a */ + { .mk = {0xe0, 0x45, 0 }, .brk = { 0xe0, 0xF0, 0x45, 0 } }, /* 10b */ + { .mk = {0xe0, 0x4E, 0 }, .brk = { 0xe0, 0xF0, 0x4E, 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = {0xe0, 0x66, 0 }, .brk = { 0xe0, 0xF0, 0x66, 0 } }, /* 10e */ + { .mk = {0xe0, 0x0D, 0 }, .brk = { 0xe0, 0xF0, 0x0D, 0 } }, /* 10f */ + { .mk = {0xe0, 0x15, 0 }, .brk = { 0xe0, 0xF0, 0x15, 0 } }, /* 110 */ + { .mk = {0xe0, 0x1D, 0 }, .brk = { 0xe0, 0xF0, 0x1D, 0 } }, /* 112 */ + { .mk = {0xe0, 0x24, 0 }, .brk = { 0xe0, 0xF0, 0x24, 0 } }, /* 113 */ + { .mk = {0xe0, 0x2D, 0 }, .brk = { 0xe0, 0xF0, 0x2D, 0 } }, /* 113 */ + { .mk = {0xe0, 0x2C, 0 }, .brk = { 0xe0, 0xF0, 0x2C, 0 } }, /* 114 */ + { .mk = {0xe0, 0x35, 0 }, .brk = { 0xe0, 0xF0, 0x35, 0 } }, /* 115 */ + { .mk = {0xe0, 0x3C, 0 }, .brk = { 0xe0, 0xF0, 0x3C, 0 } }, /* 116 */ + { .mk = {0xe0, 0x43, 0 }, .brk = { 0xe0, 0xF0, 0x43, 0 } }, /* 117 */ + { .mk = {0xe0, 0x44, 0 }, .brk = { 0xe0, 0xF0, 0x44, 0 } }, /* 118 */ + { .mk = {0xe0, 0x4D, 0 }, .brk = { 0xe0, 0xF0, 0x4D, 0 } }, /* 119 */ + { .mk = {0xe0, 0x54, 0 }, .brk = { 0xe0, 0xF0, 0x54, 0 } }, /* 11a */ + { .mk = {0xe0, 0x5B, 0 }, .brk = { 0xe0, 0xF0, 0x5B, 0 } }, /* 11b */ + { .mk = {0xe0, 0x5A, 0 }, .brk = { 0xe0, 0xF0, 0x5A, 0 } }, /* 11c */ + { .mk = {0xe0, 0x14, 0 }, .brk = { 0xe0, 0xF0, 0x14, 0 } }, /* 11d */ + { .mk = {0xe0, 0x1C, 0 }, .brk = { 0xe0, 0xF0, 0x1C, 0 } }, /* 11e */ + { .mk = {0xe0, 0x1B, 0 }, .brk = { 0xe0, 0xF0, 0x1B, 0 } }, /* 11f */ + { .mk = {0xe0, 0x23, 0 }, .brk = { 0xe0, 0xF0, 0x23, 0 } }, /* 120 */ + { .mk = {0xe0, 0x2B, 0 }, .brk = { 0xe0, 0xF0, 0x2B, 0 } }, /* 121 */ + { .mk = {0xe0, 0x34, 0 }, .brk = { 0xe0, 0xF0, 0x34, 0 } }, /* 122 */ + { .mk = {0xe0, 0x33, 0 }, .brk = { 0xe0, 0xF0, 0x33, 0 } }, /* 123 */ + { .mk = {0xe0, 0x3B, 0 }, .brk = { 0xe0, 0xF0, 0x3B, 0 } }, /* 124 */ + { .mk = {0xe0, 0x42, 0 }, .brk = { 0xe0, 0xF0, 0x42, 0 } }, /* 125 */ + { .mk = {0xe0, 0x4B, 0 }, .brk = { 0xe0, 0xF0, 0x4B, 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = {0xe0, 0x1A, 0 }, .brk = { 0xe0, 0xF0, 0x1A, 0 } }, /* 12c */ + { .mk = {0xe0, 0x22, 0 }, .brk = { 0xe0, 0xF0, 0x22, 0 } }, /* 12d */ + { .mk = {0xe0, 0x21, 0 }, .brk = { 0xe0, 0xF0, 0x21, 0 } }, /* 12e */ + { .mk = {0xe0, 0x2A, 0 }, .brk = { 0xe0, 0xF0, 0x2A, 0 } }, /* 12f */ + { .mk = {0xe0, 0x32, 0 }, .brk = { 0xe0, 0xF0, 0x32, 0 } }, /* 130 */ + { .mk = {0xe0, 0x31, 0 }, .brk = { 0xe0, 0xF0, 0x31, 0 } }, /* 131 */ + { .mk = {0xe0, 0x3A, 0 }, .brk = { 0xe0, 0xF0, 0x3A, 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = {0xe0, 0x49, 0 }, .brk = { 0xe0, 0xF0, 0x49, 0 } }, /* 134 */ + { .mk = {0xe0, 0x4A, 0 }, .brk = { 0xe0, 0xF0, 0x4A, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = {0xe0, 0x7C, 0 }, .brk = { 0xe0, 0xF0, 0x7C, 0 } }, /* 137 */ + { .mk = {0xe0, 0x11, 0 }, .brk = { 0xe0, 0xF0, 0x11, 0 } }, /* 138 */ + { .mk = { 0 }, .brk = { 0 } }, /* 139 */ + { .mk = {0xe0, 0x58, 0 }, .brk = { 0xe0, 0xF0, 0x58, 0 } }, /* 13a */ + { .mk = {0xe0, 0x05, 0 }, .brk = { 0xe0, 0xF0, 0x05, 0 } }, /* 13b */ + { .mk = {0xe0, 0x06, 0 }, .brk = { 0xe0, 0xF0, 0x06, 0 } }, /* 13c */ + { .mk = {0xe0, 0x04, 0 }, .brk = { 0xe0, 0xF0, 0x04, 0 } }, /* 13d */ + { .mk = {0xe0, 0x0C, 0 }, .brk = { 0xe0, 0xF0, 0x0C, 0 } }, /* 13e */ + { .mk = {0xe0, 0x03, 0 }, .brk = { 0xe0, 0xF0, 0x03, 0 } }, /* 13f */ + { .mk = {0xe0, 0x0B, 0 }, .brk = { 0xe0, 0xF0, 0x0B, 0 } }, /* 140 */ + { .mk = {0xe0, 0x02, 0 }, .brk = { 0xe0, 0xF0, 0x02, 0 } }, /* 141 */ + { .mk = {0xe0, 0x0A, 0 }, .brk = { 0xe0, 0xF0, 0x0A, 0 } }, /* 142 */ + { .mk = {0xe0, 0x01, 0 }, .brk = { 0xe0, 0xF0, 0x01, 0 } }, /* 143 */ + { .mk = {0xe0, 0x09, 0 }, .brk = { 0xe0, 0xF0, 0x09, 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = {0xe0, 0x7E, 0 }, .brk = { 0xe0, 0xF0, 0x7E, 0 } }, /* 146 */ + { .mk = {0xe0, 0x6C, 0 }, .brk = { 0xe0, 0xF0, 0x6C, 0 } }, /* 147 */ + { .mk = {0xe0, 0x75, 0 }, .brk = { 0xe0, 0xF0, 0x75, 0 } }, /* 148 */ + { .mk = {0xe0, 0x7D, 0 }, .brk = { 0xe0, 0xF0, 0x7D, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = {0xe0, 0x6B, 0 }, .brk = { 0xe0, 0xF0, 0x6B, 0 } }, /* 14b */ + { .mk = {0xe0, 0x73, 0 }, .brk = { 0xe0, 0xF0, 0x73, 0 } }, /* 14c */ + { .mk = {0xe0, 0x74, 0 }, .brk = { 0xe0, 0xF0, 0x74, 0 } }, /* 14d */ + { .mk = {0xe0, 0x79, 0 }, .brk = { 0xe0, 0xF0, 0x79, 0 } }, /* 14e */ + { .mk = {0xe0, 0x69, 0 }, .brk = { 0xe0, 0xF0, 0x69, 0 } }, /* 14f */ + { .mk = {0xe0, 0x72, 0 }, .brk = { 0xe0, 0xF0, 0x72, 0 } }, /* 150 */ + { .mk = {0xe0, 0x7A, 0 }, .brk = { 0xe0, 0xF0, 0x7A, 0 } }, /* 151 */ + { .mk = {0xe0, 0x70, 0 }, .brk = { 0xe0, 0xF0, 0x70, 0 } }, /* 152 */ + { .mk = {0xe0, 0x71, 0 }, .brk = { 0xe0, 0xF0, 0x71, 0 } }, /* 153 */ + { .mk = { 0 }, .brk = { 0 } }, /* 154 */ + { .mk = {0xe0, 0x60, 0 }, .brk = { 0xe0, 0xF0, 0x60, 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = {0xe0, 0x78, 0 }, .brk = { 0xe0, 0xF0, 0x78, 0 } }, /* 157 */ + { .mk = {0xe0, 0x07, 0 }, .brk = { 0xe0, 0xF0, 0x07, 0 } }, /* 158 */ + { .mk = {0xe0, 0x0F, 0 }, .brk = { 0xe0, 0xF0, 0x0F, 0 } }, /* 159 */ + { .mk = {0xe0, 0x17, 0 }, .brk = { 0xe0, 0xF0, 0x17, 0 } }, /* 15a */ + { .mk = {0xe0, 0x1F, 0 }, .brk = { 0xe0, 0xF0, 0x1F, 0 } }, /* 15b */ + { .mk = {0xe0, 0x27, 0 }, .brk = { 0xe0, 0xF0, 0x27, 0 } }, /* 15c */ + { .mk = {0xe0, 0x2F, 0 }, .brk = { 0xe0, 0xF0, 0x2F, 0 } }, /* 15d */ + { .mk = {0xe0, 0x37, 0 }, .brk = { 0xe0, 0xF0, 0x37, 0 } }, /* 15e */ + { .mk = {0xe0, 0x3F, 0 }, .brk = { 0xe0, 0xF0, 0x3F, 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = {0xe0, 0x4F, 0 }, .brk = { 0xe0, 0xF0, 0x4F, 0 } }, /* 161 */ + { .mk = {0xe0, 0x56, 0 }, .brk = { 0xe0, 0xF0, 0x56, 0 } }, /* 162 */ + { .mk = {0xe0, 0x5E, 0 }, .brk = { 0xe0, 0xF0, 0x5E, 0 } }, /* 163 */ + { .mk = {0xe0, 0x08, 0 }, .brk = { 0xe0, 0xF0, 0x08, 0 } }, /* 164 */ + { .mk = {0xe0, 0x10, 0 }, .brk = { 0xe0, 0xF0, 0x10, 0 } }, /* 165 */ + { .mk = {0xe0, 0x18, 0 }, .brk = { 0xe0, 0xF0, 0x18, 0 } }, /* 166 */ + { .mk = {0xe0, 0x20, 0 }, .brk = { 0xe0, 0xF0, 0x20, 0 } }, /* 167 */ + { .mk = {0xe0, 0x28, 0 }, .brk = { 0xe0, 0xF0, 0x28, 0 } }, /* 168 */ + { .mk = {0xe0, 0x30, 0 }, .brk = { 0xe0, 0xF0, 0x30, 0 } }, /* 169 */ + { .mk = {0xe0, 0x38, 0 }, .brk = { 0xe0, 0xF0, 0x38, 0 } }, /* 16a */ + { .mk = {0xe0, 0x40, 0 }, .brk = { 0xe0, 0xF0, 0x40, 0 } }, /* 16b */ + { .mk = {0xe0, 0x48, 0 }, .brk = { 0xe0, 0xF0, 0x48, 0 } }, /* 16c */ + { .mk = {0xe0, 0x50, 0 }, .brk = { 0xe0, 0xF0, 0x50, 0 } }, /* 16d */ + { .mk = {0xe0, 0x57, 0 }, .brk = { 0xe0, 0xF0, 0x57, 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = {0xe0, 0x13, 0 }, .brk = { 0xe0, 0xF0, 0x13, 0 } }, /* 170 */ + { .mk = {0xe0, 0x19, 0 }, .brk = { 0xe0, 0xF0, 0x19, 0 } }, /* 171 */ + { .mk = {0xe0, 0x39, 0 }, .brk = { 0xe0, 0xF0, 0x39, 0 } }, /* 172 */ + { .mk = {0xe0, 0x51, 0 }, .brk = { 0xe0, 0xF0, 0x51, 0 } }, /* 173 */ + { .mk = {0xe0, 0x53, 0 }, .brk = { 0xe0, 0xF0, 0x53, 0 } }, /* 174 */ + { .mk = {0xe0, 0x5C, 0 }, .brk = { 0xe0, 0xF0, 0x5C, 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = {0xe0, 0x62, 0 }, .brk = { 0xe0, 0xF0, 0x62, 0 } }, /* 177 */ + { .mk = {0xe0, 0x63, 0 }, .brk = { 0xe0, 0xF0, 0x63, 0 } }, /* 178 */ + { .mk = {0xe0, 0x64, 0 }, .brk = { 0xe0, 0xF0, 0x64, 0 } }, /* 179 */ + { .mk = {0xe0, 0x65, 0 }, .brk = { 0xe0, 0xF0, 0x65, 0 } }, /* 17a */ + { .mk = {0xe0, 0x67, 0 }, .brk = { 0xe0, 0xF0, 0x67, 0 } }, /* 17b */ + { .mk = {0xe0, 0x68, 0 }, .brk = { 0xe0, 0xF0, 0x68, 0 } }, /* 17c */ + { .mk = {0xe0, 0x6A, 0 }, .brk = { 0xe0, 0xF0, 0x6A, 0 } }, /* 17d */ + { .mk = {0xe0, 0x6D, 0 }, .brk = { 0xe0, 0xF0, 0x6D, 0 } }, /* 17e */ + { .mk = {0xe0, 0x6E, 0 }, .brk = { 0xe0, 0xF0, 0x6E, 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cv */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = {0xe0, 0xe1, 0 }, .brk = { 0xe0, 0xF0, 0xE1, 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = {0xe0, 0xee, 0 }, .brk = { 0xe0, 0xF0, 0xEE, 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = {0xe0, 0xf1, 0 }, .brk = { 0xe0, 0xF0, 0xF1, 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = {0xe0, 0xfe, 0 }, .brk = { 0xe0, 0xF0, 0xFE, 0 } }, /* 1fe */ + { .mk = {0xe0, 0xff, 0 }, .brk = { 0xe0, 0xF0, 0xFF, 0 } } /* 1ff */ // clang-format on }; static const scancode scancode_set3[512] = { // clang-format off - { { 0 }, { 0 } }, /* 000 */ - { { 0x08, 0 }, { 0xf0, 0x08, 0 } }, /* 001 */ - { { 0x16, 0 }, { 0xf0, 0x16, 0 } }, /* 002 */ - { { 0x1E, 0 }, { 0xf0, 0x1E, 0 } }, /* 003 */ - { { 0x26, 0 }, { 0xf0, 0x26, 0 } }, /* 004 */ - { { 0x25, 0 }, { 0xf0, 0x25, 0 } }, /* 005 */ - { { 0x2E, 0 }, { 0xf0, 0x2E, 0 } }, /* 006 */ - { { 0x36, 0 }, { 0xf0, 0x36, 0 } }, /* 007 */ - { { 0x3D, 0 }, { 0xf0, 0x3D, 0 } }, /* 008 */ - { { 0x3E, 0 }, { 0xf0, 0x3E, 0 } }, /* 009 */ - { { 0x46, 0 }, { 0xf0, 0x46, 0 } }, /* 00a */ - { { 0x45, 0 }, { 0xf0, 0x45, 0 } }, /* 00b */ - { { 0x4E, 0 }, { 0xf0, 0x4E, 0 } }, /* 00c */ - { { 0x55, 0 }, { 0xf0, 0x55, 0 } }, /* 00d */ - { { 0x66, 0 }, { 0xf0, 0x66, 0 } }, /* 00e */ - { { 0x0D, 0 }, { 0xf0, 0x0D, 0 } }, /* 00f */ - { { 0x15, 0 }, { 0xf0, 0x15, 0 } }, /* 010 */ - { { 0x1D, 0 }, { 0xf0, 0x1D, 0 } }, /* 011 */ - { { 0x24, 0 }, { 0xf0, 0x24, 0 } }, /* 012 */ - { { 0x2D, 0 }, { 0xf0, 0x2D, 0 } }, /* 013 */ - { { 0x2C, 0 }, { 0xf0, 0x2C, 0 } }, /* 014 */ - { { 0x35, 0 }, { 0xf0, 0x35, 0 } }, /* 015 */ - { { 0x3C, 0 }, { 0xf0, 0x3C, 0 } }, /* 016 */ - { { 0x43, 0 }, { 0xf0, 0x43, 0 } }, /* 017 */ - { { 0x44, 0 }, { 0xf0, 0x44, 0 } }, /* 018 */ - { { 0x4D, 0 }, { 0xf0, 0x4D, 0 } }, /* 019 */ - { { 0x54, 0 }, { 0xf0, 0x54, 0 } }, /* 01a */ - { { 0x5B, 0 }, { 0xf0, 0x5B, 0 } }, /* 01b */ - { { 0x5A, 0 }, { 0xf0, 0x5A, 0 } }, /* 01c */ - { { 0x11, 0 }, { 0xf0, 0x11, 0 } }, /* 01d */ - { { 0x1C, 0 }, { 0xf0, 0x1C, 0 } }, /* 01e */ - { { 0x1B, 0 }, { 0xf0, 0x1B, 0 } }, /* 01f */ - { { 0x23, 0 }, { 0xf0, 0x23, 0 } }, /* 020 */ - { { 0x2B, 0 }, { 0xf0, 0x2B, 0 } }, /* 021 */ - { { 0x34, 0 }, { 0xf0, 0x34, 0 } }, /* 022 */ - { { 0x33, 0 }, { 0xf0, 0x33, 0 } }, /* 023 */ - { { 0x3B, 0 }, { 0xf0, 0x3B, 0 } }, /* 024 */ - { { 0x42, 0 }, { 0xf0, 0x42, 0 } }, /* 025 */ - { { 0x4B, 0 }, { 0xf0, 0x4B, 0 } }, /* 026 */ - { { 0x4C, 0 }, { 0xf0, 0x4C, 0 } }, /* 027 */ - { { 0x52, 0 }, { 0xf0, 0x52, 0 } }, /* 028 */ - { { 0x0E, 0 }, { 0xf0, 0x0E, 0 } }, /* 029 */ - { { 0x12, 0 }, { 0xf0, 0x12, 0 } }, /* 02a */ - { { 0x5C, 0 }, { 0xf0, 0x5C, 0 } }, /* 02b */ - { { 0x1A, 0 }, { 0xf0, 0x1A, 0 } }, /* 02c */ - { { 0x22, 0 }, { 0xf0, 0x22, 0 } }, /* 02d */ - { { 0x21, 0 }, { 0xf0, 0x21, 0 } }, /* 02e */ - { { 0x2A, 0 }, { 0xf0, 0x2A, 0 } }, /* 02f */ - { { 0x32, 0 }, { 0xf0, 0x32, 0 } }, /* 030 */ - { { 0x31, 0 }, { 0xf0, 0x31, 0 } }, /* 031 */ - { { 0x3A, 0 }, { 0xf0, 0x3A, 0 } }, /* 032 */ - { { 0x41, 0 }, { 0xf0, 0x41, 0 } }, /* 033 */ - { { 0x49, 0 }, { 0xf0, 0x49, 0 } }, /* 034 */ - { { 0x4A, 0 }, { 0xf0, 0x4A, 0 } }, /* 035 */ - { { 0x59, 0 }, { 0xf0, 0x59, 0 } }, /* 036 */ - { { 0x7E, 0 }, { 0xf0, 0x7E, 0 } }, /* 037 */ - { { 0x19, 0 }, { 0xf0, 0x19, 0 } }, /* 038 */ - { { 0x29, 0 }, { 0xf0, 0x29, 0 } }, /* 039 */ - { { 0x14, 0 }, { 0xf0, 0x14, 0 } }, /* 03a */ - { { 0x07, 0 }, { 0xf0, 0x07, 0 } }, /* 03b */ - { { 0x0F, 0 }, { 0xf0, 0x0F, 0 } }, /* 03c */ - { { 0x17, 0 }, { 0xf0, 0x17, 0 } }, /* 03d */ - { { 0x1F, 0 }, { 0xf0, 0x1F, 0 } }, /* 03e */ - { { 0x27, 0 }, { 0xf0, 0x27, 0 } }, /* 03f */ - { { 0x2F, 0 }, { 0xf0, 0x2F, 0 } }, /* 040 */ - { { 0x37, 0 }, { 0xf0, 0x37, 0 } }, /* 041 */ - { { 0x3F, 0 }, { 0xf0, 0x3F, 0 } }, /* 042 */ - { { 0x47, 0 }, { 0xf0, 0x47, 0 } }, /* 043 */ - { { 0x4F, 0 }, { 0xf0, 0x4F, 0 } }, /* 044 */ - { { 0x76, 0 }, { 0xf0, 0x76, 0 } }, /* 045 */ - { { 0x5F, 0 }, { 0xf0, 0x5F, 0 } }, /* 046 */ - { { 0x6C, 0 }, { 0xf0, 0x6C, 0 } }, /* 047 */ - { { 0x75, 0 }, { 0xf0, 0x75, 0 } }, /* 048 */ - { { 0x7D, 0 }, { 0xf0, 0x7D, 0 } }, /* 049 */ - { { 0x84, 0 }, { 0xf0, 0x84, 0 } }, /* 04a */ - { { 0x6B, 0 }, { 0xf0, 0x6B, 0 } }, /* 04b */ - { { 0x73, 0 }, { 0xf0, 0x73, 0 } }, /* 04c */ - { { 0x74, 0 }, { 0xf0, 0x74, 0 } }, /* 04d */ - { { 0x7C, 0 }, { 0xf0, 0x7C, 0 } }, /* 04e */ - { { 0x69, 0 }, { 0xf0, 0x69, 0 } }, /* 04f */ - { { 0x72, 0 }, { 0xf0, 0x72, 0 } }, /* 050 */ - { { 0x7A, 0 }, { 0xf0, 0x7A, 0 } }, /* 051 */ - { { 0x70, 0 }, { 0xf0, 0x70, 0 } }, /* 052 */ - { { 0x71, 0 }, { 0xf0, 0x71, 0 } }, /* 053 */ - { { 0x57, 0 }, { 0xf0, 0x57, 0 } }, /* 054 */ - { { 0x60, 0 }, { 0xf0, 0x60, 0 } }, /* 055 */ - { { 0 }, { 0 } }, /* 056 */ - { { 0x56, 0 }, { 0xf0, 0x56, 0 } }, /* 057 */ - { { 0x5E, 0 }, { 0xf0, 0x5E, 0 } }, /* 058 */ - { { 0 }, { 0 } }, /* 059 */ - { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, /* 05b */ - { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, /* 05d */ - { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, /* 05f */ - { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, /* 061 */ - { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, /* 063 */ - { { 0 }, { 0 } }, /* 064 */ - { { 0x10, 0 }, { 0xf0, 0x10, 0 } }, /* 065 */ - { { 0x18, 0 }, { 0xf0, 0x18, 0 } }, /* 066 */ - { { 0x20, 0 }, { 0xf0, 0x20, 0 } }, /* 067 */ - { { 0x28, 0 }, { 0xf0, 0x28, 0 } }, /* 068 */ - { { 0x30, 0 }, { 0xf0, 0x30, 0 } }, /* 069 */ - { { 0x38, 0 }, { 0xf0, 0x38, 0 } }, /* 06a */ - { { 0x40, 0 }, { 0xf0, 0x40, 0 } }, /* 06b */ - { { 0x48, 0 }, { 0xf0, 0x48, 0 } }, /* 06c */ - { { 0x50, 0 }, { 0xf0, 0x50, 0 } }, /* 06d */ - { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, /* 06f */ - { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 070 */ - { { 0 }, { 0 } }, /* 071 */ - { { 0 }, { 0 } }, /* 072 */ - { { 0x51, 0 }, { 0xf0, 0x51, 0 } }, /* 073 */ - { { 0x53, 0 }, { 0xf0, 0x53, 0 } }, /* 074 */ - { { 0x5C, 0 }, { 0xf0, 0x5C, 0 } }, /* 075 */ - { { 0 }, { 0 } }, /* 076 */ - { { 0x62, 0 }, { 0xf0, 0x62, 0 } }, /* 077 */ - { { 0x63, 0 }, { 0xf0, 0x63, 0 } }, /* 078 */ - { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, /* 079 */ - { { 0 }, { 0 } }, /* 07a */ - { { 0x85, 0 }, { 0xf0, 0x85, 0 } }, /* 07b */ - { { 0x68, 0 }, { 0xf0, 0x68, 0 } }, /* 07c */ - { { 0x13, 0 }, { 0xf0, 0x13, 0 } }, /* 07d */ - { { 0 }, { 0 } }, /* 07e */ - { { 0 }, { 0 } }, /* 07f */ - { { 0x80, 0 }, { 0xf0, 0x80, 0 } }, /* 080 */ - { { 0x81, 0 }, { 0xf0, 0x81, 0 } }, /* 081 */ - { { 0x82, 0 }, { 0xf0, 0x82, 0 } }, /* 082 */ - { { 0 }, { 0 } }, /* 083 */ - { { 0 }, { 0 } }, /* 084 */ - { { 0x85, 0 }, { 0xf0, 0x54, 0 } }, /* 085 */ - { { 0x86, 0 }, { 0xf0, 0x86, 0 } }, /* 086 */ - { { 0x87, 0 }, { 0xf0, 0x87, 0 } }, /* 087 */ - { { 0x88, 0 }, { 0xf0, 0x88, 0 } }, /* 087 */ - { { 0x89, 0 }, { 0xf0, 0x89, 0 } }, /* 088 */ - { { 0x8a, 0 }, { 0xf0, 0x8a, 0 } }, /* 089 */ - { { 0x8b, 0 }, { 0xf0, 0x8b, 0 } }, /* 08b */ - { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, /* 08d */ - { { 0x8e, 0 }, { 0xf0, 0x8e, 0 } }, /* 08e */ - { { 0x8f, 0 }, { 0xf0, 0x8f, 0 } }, /* 08f */ - { { 0x90, 0 }, { 0xf0, 0x90, 0 } }, /* 090 */ - { { 0x91, 0 }, { 0xf0, 0x91, 0 } }, /* 091 */ - { { 0x92, 0 }, { 0xf0, 0x92, 0 } }, /* 092 */ - { { 0x93, 0 }, { 0xf0, 0x93, 0 } }, /* 093 */ - { { 0x94, 0 }, { 0xf0, 0x94, 0 } }, /* 094 */ - { { 0x95, 0 }, { 0xf0, 0x95, 0 } }, /* 095 */ - { { 0x96, 0 }, { 0xf0, 0x96, 0 } }, /* 096 */ - { { 0x97, 0 }, { 0xf0, 0x97, 0 } }, /* 097 */ - { { 0x98, 0 }, { 0xf0, 0x98, 0 } }, /* 098 */ - { { 0x99, 0 }, { 0xf0, 0x99, 0 } }, /* 099 */ - { { 0x9a, 0 }, { 0xf0, 0x9a, 0 } }, /* 09a */ - { { 0x9b, 0 }, { 0xf0, 0x9b, 0 } }, /* 09b */ - { { 0x9c, 0 }, { 0xf0, 0x9c, 0 } }, /* 09c */ - { { 0x9d, 0 }, { 0xf0, 0x9d, 0 } }, /* 09d */ - { { 0x9e, 0 }, { 0xf0, 0x9e, 0 } }, /* 09e */ - { { 0x9f, 0 }, { 0xf0, 0x9f, 0 } }, /* 09f */ - { { 0xa0, 0 }, { 0xf0, 0xa0, 0 } }, /* 0a0 */ - { { 0xa1, 0 }, { 0xf0, 0xa1, 0 } }, /* 0a1 */ - { { 0xa2, 0 }, { 0xf0, 0xa2, 0 } }, /* 0a2 */ - { { 0xa3, 0 }, { 0xf0, 0xa3, 0 } }, /* 0a3 */ - { { 0xa4, 0 }, { 0xf0, 0xa4, 0 } }, /* 0a4 */ - { { 0xa5, 0 }, { 0xf0, 0xa5, 0 } }, /* 0a5 */ - { { 0xa6, 0 }, { 0xf0, 0xa6, 0 } }, /* 0a6 */ - { { 0xa7, 0 }, { 0xf0, 0xa7, 0 } }, /* 0a7 */ - { { 0xa8, 0 }, { 0xf0, 0xa8, 0 } }, /* 0a8 */ - { { 0xa9, 0 }, { 0xf0, 0xa9, 0 } }, /* 0a9 */ - { { 0xaa, 0 }, { 0xf0, 0xaa, 0 } }, /* 0aa */ - { { 0xab, 0 }, { 0xf0, 0xab, 0 } }, /* 0ab */ - { { 0xac, 0 }, { 0xf0, 0xac, 0 } }, /* 0ac */ - { { 0xad, 0 }, { 0xf0, 0xad, 0 } }, /* 0ad */ - { { 0xae, 0 }, { 0xf0, 0xae, 0 } }, /* 0ae */ - { { 0xaf, 0 }, { 0xf0, 0xaf, 0 } }, /* 0af */ - { { 0xb0, 0 }, { 0xf0, 0xb0, 0 } }, /* 0b0 */ - { { 0xb1, 0 }, { 0xf0, 0xb1, 0 } }, /* 0b1 */ - { { 0xb2, 0 }, { 0xf0, 0xb2, 0 } }, /* 0b2 */ - { { 0xb3, 0 }, { 0xf0, 0xb3, 0 } }, /* 0b3 */ - { { 0xb4, 0 }, { 0xf0, 0xb4, 0 } }, /* 0b4 */ - { { 0xb5, 0 }, { 0xf0, 0xb5, 0 } }, /* 0b5 */ - { { 0xb6, 0 }, { 0xf0, 0xb6, 0 } }, /* 0b6 */ - { { 0xb7, 0 }, { 0xf0, 0xb7, 0 } }, /* 0b7 */ - { { 0xb8, 0 }, { 0xf0, 0xb8, 0 } }, /* 0b8 */ - { { 0xb9, 0 }, { 0xf0, 0xb9, 0 } }, /* 0b9 */ - { { 0xba, 0 }, { 0xf0, 0xba, 0 } }, /* 0ba */ - { { 0xbb, 0 }, { 0xf0, 0xbb, 0 } }, /* 0bb */ - { { 0xbc, 0 }, { 0xf0, 0xbc, 0 } }, /* 0bc */ - { { 0xbd, 0 }, { 0xf0, 0xbd, 0 } }, /* 0bd */ - { { 0xbe, 0 }, { 0xf0, 0xbe, 0 } }, /* 0be */ - { { 0xbf, 0 }, { 0xf0, 0xbf, 0 } }, /* 0bf */ - { { 0xc0, 0 }, { 0xf0, 0xc0, 0 } }, /* 0c0 */ - { { 0xc1, 0 }, { 0xf0, 0xc1, 0 } }, /* 0c1 */ - { { 0xc2, 0 }, { 0xf0, 0xc2, 0 } }, /* 0c2 */ - { { 0xc3, 0 }, { 0xf0, 0xc3, 0 } }, /* 0c3 */ - { { 0xc4, 0 }, { 0xf0, 0xc4, 0 } }, /* 0c4 */ - { { 0xc5, 0 }, { 0xf0, 0xc5, 0 } }, /* 0c5 */ - { { 0xc6, 0 }, { 0xf0, 0xc6, 0 } }, /* 0c6 */ - { { 0xc7, 0 }, { 0xf0, 0xc7, 0 } }, /* 0c7 */ - { { 0xc8, 0 }, { 0xf0, 0xc8, 0 } }, /* 0c8 */ - { { 0xc9, 0 }, { 0xf0, 0xc9, 0 } }, /* 0c9 */ - { { 0xca, 0 }, { 0xf0, 0xca, 0 } }, /* 0ca */ - { { 0xcb, 0 }, { 0xf0, 0xcb, 0 } }, /* 0cb */ - { { 0xcc, 0 }, { 0xf0, 0xcc, 0 } }, /* 0cc */ - { { 0xcd, 0 }, { 0xf0, 0xcd, 0 } }, /* 0cd */ - { { 0xce, 0 }, { 0xf0, 0xce, 0 } }, /* 0ce */ - { { 0xcf, 0 }, { 0xf0, 0xcf, 0 } }, /* 0cf */ - { { 0xd0, 0 }, { 0xf0, 0xd0, 0 } }, /* 0d0 */ - { { 0xd1, 0 }, { 0xf0, 0xd0, 0 } }, /* 0d1 */ - { { 0xd2, 0 }, { 0xf0, 0xd2, 0 } }, /* 0d2 */ - { { 0xd3, 0 }, { 0xf0, 0xd3, 0 } }, /* 0d3 */ - { { 0xd4, 0 }, { 0xf0, 0xd4, 0 } }, /* 0d4 */ - { { 0xd5, 0 }, { 0xf0, 0xd5, 0 } }, /* 0d5 */ - { { 0xd6, 0 }, { 0xf0, 0xd6, 0 } }, /* 0d6 */ - { { 0xd7, 0 }, { 0xf0, 0xd7, 0 } }, /* 0d7 */ - { { 0xd8, 0 }, { 0xf0, 0xd8, 0 } }, /* 0d8 */ - { { 0xd9, 0 }, { 0xf0, 0xd9, 0 } }, /* 0d9 */ - { { 0xda, 0 }, { 0xf0, 0xda, 0 } }, /* 0da */ - { { 0xdb, 0 }, { 0xf0, 0xdb, 0 } }, /* 0db */ - { { 0xdc, 0 }, { 0xf0, 0xdc, 0 } }, /* 0dc */ - { { 0xdd, 0 }, { 0xf0, 0xdd, 0 } }, /* 0dd */ - { { 0xde, 0 }, { 0xf0, 0xde, 0 } }, /* 0de */ - { { 0xdf, 0 }, { 0xf0, 0xdf, 0 } }, /* 0df */ - { { 0xe0, 0 }, { 0xf0, 0xe0, 0 } }, /* 0e0 */ - { { 0xe1, 0 }, { 0xf0, 0xe1, 0 } }, /* 0e1 */ - { { 0xe2, 0 }, { 0xf0, 0xe2, 0 } }, /* 0e2 */ - { { 0xe3, 0 }, { 0xf0, 0xe3, 0 } }, /* 0e3 */ - { { 0xe4, 0 }, { 0xf0, 0xe4, 0 } }, /* 0e4 */ - { { 0xe5, 0 }, { 0xf0, 0xe5, 0 } }, /* 0e5 */ - { { 0xe6, 0 }, { 0xf0, 0xe6, 0 } }, /* 0e6 */ - { { 0xe7, 0 }, { 0xf0, 0xe7, 0 } }, /* 0e7 */ - { { 0xe8, 0 }, { 0xf0, 0xe8, 0 } }, /* 0e7 */ - { { 0xe9, 0 }, { 0xf0, 0xe9, 0 } }, /* 0e8 */ - { { 0xea, 0 }, { 0xf0, 0xea, 0 } }, /* 0e9 */ - { { 0xeb, 0 }, { 0xf0, 0xeb, 0 } }, /* 0eb */ - { { 0xec, 0 }, { 0xf0, 0xec, 0 } }, /* 0ec */ - { { 0xed, 0 }, { 0xf0, 0xed, 0 } }, /* 0ed */ - { { 0xee, 0 }, { 0xf0, 0xee, 0 } }, /* 0ee */ - { { 0xef, 0 }, { 0xf0, 0xef, 0 } }, /* 0ef */ - { { 0 }, { 0 } }, /* 0f0 */ - { { 0xf1, 0 }, { 0xf0, 0xf1, 0 } }, /* 0f1 */ - { { 0xf2, 0 }, { 0xf0, 0xf2, 0 } }, /* 0f2 */ - { { 0xf3, 0 }, { 0xf0, 0xf3, 0 } }, /* 0f3 */ - { { 0xf4, 0 }, { 0xf0, 0xf4, 0 } }, /* 0f4 */ - { { 0xf5, 0 }, { 0xf0, 0xf5, 0 } }, /* 0f5 */ - { { 0xf6, 0 }, { 0xf0, 0xf6, 0 } }, /* 0f6 */ - { { 0xf7, 0 }, { 0xf0, 0xf7, 0 } }, /* 0f7 */ - { { 0xf8, 0 }, { 0xf0, 0xf8, 0 } }, /* 0f8 */ - { { 0xf9, 0 }, { 0xf0, 0xf9, 0 } }, /* 0f9 */ - { { 0xfa, 0 }, { 0xf0, 0xfa, 0 } }, /* 0fa */ - { { 0xfb, 0 }, { 0xf0, 0xfb, 0 } }, /* 0fb */ - { { 0xfc, 0 }, { 0xf0, 0xfc, 0 } }, /* 0fc */ - { { 0xfd, 0 }, { 0xf0, 0xfd, 0 } }, /* 0fd */ - { { 0xfe, 0 }, { 0xf0, 0xfe, 0 } }, /* 0fe */ - { { 0xff, 0 }, { 0xf0, 0xff, 0 } }, /* 0ff */ - { { 0x62, 0 }, { 0xF0, 0x62, 0 } }, /* 100 */ - { { 0xe0, 0x76, 0 }, { 0xe0, 0xF0, 0x76, 0 } }, /* 101 */ - { { 0xe0, 0x16, 0 }, { 0xe0, 0xF0, 0x16, 0 } }, /* 102 */ - { { 0xe0, 0x1E, 0 }, { 0xe0, 0xF0, 0x1E, 0 } }, /* 103 */ - { { 0xe0, 0x26, 0 }, { 0xe0, 0xF0, 0x26, 0 } }, /* 104 */ - { { 0xe0, 0x25, 0 }, { 0xe0, 0xF0, 0x25, 0 } }, /* 105 */ - { { 0xe0, 0x2E, 0 }, { 0xe0, 0xF0, 0x2E, 0 } }, /* 106 */ - { { 0xe0, 0x36, 0 }, { 0xe0, 0xF0, 0x36, 0 } }, /* 107 */ - { { 0xe0, 0x3D, 0 }, { 0xe0, 0xF0, 0x3D, 0 } }, /* 108 */ - { { 0xe0, 0x3E, 0 }, { 0xe0, 0xF0, 0x3E, 0 } }, /* 109 */ - { { 0xe0, 0x46, 0 }, { 0xe0, 0xF0, 0x46, 0 } }, /* 10a */ - { { 0xe0, 0x45, 0 }, { 0xe0, 0xF0, 0x45, 0 } }, /* 10b */ - { { 0xe0, 0x4E, 0 }, { 0xe0, 0xF0, 0x4E, 0 } }, /* 10c */ - { { 0 }, { 0 } }, /* 10d */ - { { 0xe0, 0x66, 0 }, { 0xe0, 0xF0, 0x66, 0 } }, /* 10e */ - { { 0xe0, 0x0D, 0 }, { 0xe0, 0xF0, 0x0D, 0 } }, /* 10f */ - { { 0xe0, 0x15, 0 }, { 0xe0, 0xF0, 0x15, 0 } }, /* 110 */ - { { 0xe0, 0x1D, 0 }, { 0xe0, 0xF0, 0x1D, 0 } }, /* 111 */ - { { 0xe0, 0x24, 0 }, { 0xe0, 0xF0, 0x24, 0 } }, /* 112 */ - { { 0xe0, 0x2D, 0 }, { 0xe0, 0xF0, 0x2D, 0 } }, /* 113 */ - { { 0xe0, 0x2C, 0 }, { 0xe0, 0xF0, 0x2C, 0 } }, /* 114 */ - { { 0xe0, 0x35, 0 }, { 0xe0, 0xF0, 0x35, 0 } }, /* 115 */ - { { 0xe0, 0x3C, 0 }, { 0xe0, 0xF0, 0x3C, 0 } }, /* 116 */ - { { 0xe0, 0x43, 0 }, { 0xe0, 0xF0, 0x43, 0 } }, /* 117 */ - { { 0xe0, 0x44, 0 }, { 0xe0, 0xF0, 0x44, 0 } }, /* 118 */ - { { 0xe0, 0x4D, 0 }, { 0xe0, 0xF0, 0x4D, 0 } }, /* 119 */ - { { 0xe0, 0x54, 0 }, { 0xe0, 0xF0, 0x54, 0 } }, /* 11a */ - { { 0xe0, 0x5B, 0 }, { 0xe0, 0xF0, 0x5B, 0 } }, /* 11b */ - { { 0x79, 0 }, { 0xf0, 0x79, 0 } }, /* 11c */ - { { 0x58, 0 }, { 0xf0, 0x58, 0 } }, /* 11d */ - { { 0xe0, 0x1C, 0 }, { 0xe0, 0xF0, 0x1C, 0 } }, /* 11e */ - { { 0xe0, 0x1B, 0 }, { 0xe0, 0xF0, 0x1B, 0 } }, /* 11f */ - { { 0xe0, 0x23, 0 }, { 0xe0, 0xF0, 0x23, 0 } }, /* 120 */ - { { 0xe0, 0x2B, 0 }, { 0xe0, 0xF0, 0x2B, 0 } }, /* 121 */ - { { 0xe0, 0x34, 0 }, { 0xe0, 0xF0, 0x34, 0 } }, /* 122 */ - { { 0xe0, 0x33, 0 }, { 0xe0, 0xF0, 0x33, 0 } }, /* 123 */ - { { 0xe0, 0x3B, 0 }, { 0xe0, 0xF0, 0x3B, 0 } }, /* 124 */ - { { 0xe0, 0x42, 0 }, { 0xe0, 0xF0, 0x42, 0 } }, /* 125 */ - { { 0xe0, 0x4B, 0 }, { 0xe0, 0xF0, 0x4B, 0 } }, /* 126 */ - { { 0 }, { 0 } }, /* 127 */ - { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, /* 129 */ - { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, /* 12b */ - { { 0xe0, 0x1A, 0 }, { 0xe0, 0xF0, 0x1A, 0 } }, /* 12c */ - { { 0xe0, 0x22, 0 }, { 0xe0, 0xF0, 0x22, 0 } }, /* 12d */ - { { 0xe0, 0x21, 0 }, { 0xe0, 0xF0, 0x21, 0 } }, /* 12e */ - { { 0xe0, 0x2A, 0 }, { 0xe0, 0xF0, 0x2A, 0 } }, /* 12f */ - { { 0xe0, 0x32, 0 }, { 0xe0, 0xF0, 0x32, 0 } }, /* 130 */ - { { 0xe0, 0x31, 0 }, { 0xe0, 0xF0, 0x31, 0 } }, /* 131 */ - { { 0xe0, 0x3A, 0 }, { 0xe0, 0xF0, 0x3A, 0 } }, /* 132 */ - { { 0 }, { 0 } }, /* 133 */ - { { 0xe0, 0x49, 0 }, { 0xe0, 0xF0, 0x49, 0 } }, /* 134 */ - { { 0x77, 0 }, { 0xf0, 0x77, 0 } }, /* 135 */ - { { 0 }, { 0 } }, /* 136 */ - { { 0x57, 0 }, { 0xf0, 0x57, 0 } }, /* 137 */ - { { 0x39, 0 }, { 0xf0, 0x39, 0 } }, /* 138 */ - { { 0 }, { 0 } }, /* 139 */ - { { 0xe0, 0x58, 0 }, { 0xe0, 0xF0, 0x58, 0 } }, /* 13a */ - { { 0xe0, 0x05, 0 }, { 0xe0, 0xF0, 0x05, 0 } }, /* 13b */ - { { 0xe0, 0x06, 0 }, { 0xe0, 0xF0, 0x06, 0 } }, /* 13c */ - { { 0xe0, 0x04, 0 }, { 0xe0, 0xF0, 0x04, 0 } }, /* 13d */ - { { 0xe0, 0x0C, 0 }, { 0xe0, 0xF0, 0x0C, 0 } }, /* 13e */ - { { 0xe0, 0x03, 0 }, { 0xe0, 0xF0, 0x03, 0 } }, /* 13f */ - { { 0xe0, 0x0B, 0 }, { 0xe0, 0xF0, 0x0B, 0 } }, /* 140 */ - { { 0xe0, 0x02, 0 }, { 0xe0, 0xF0, 0x02, 0 } }, /* 141 */ - { { 0xe0, 0x0A, 0 }, { 0xe0, 0xF0, 0x0A, 0 } }, /* 142 */ - { { 0xe0, 0x01, 0 }, { 0xe0, 0xF0, 0x01, 0 } }, /* 143 */ - { { 0xe0, 0x09, 0 }, { 0xe0, 0xF0, 0x09, 0 } }, /* 144 */ - { { 0 }, { 0 } }, /* 145 */ - { { 0xe0, 0x7E, 0 }, { 0xe0, 0xF0, 0x7E, 0 } }, /* 146 */ - { { 0x6E, 0 }, { 0xf0, 0x6E, 0 } }, /* 147 */ - { { 0x63, 0 }, { 0xf0, 0x63, 0 } }, /* 148 */ - { { 0x6F, 0 }, { 0xf0, 0x6F, 0 } }, /* 149 */ - { { 0 }, { 0 } }, /* 14a */ - { { 0x61, 0 }, { 0xf0, 0x61, 0 } }, /* 14b */ - { { 0xe0, 0x73, 0 }, { 0xe0, 0xF0, 0x73, 0 } }, /* 14c */ - { { 0x6A, 0 }, { 0xf0, 0x6A, 0 } }, /* 14d */ - { { 0xe0, 0x79, 0 }, { 0xe0, 0xF0, 0x79, 0 } }, /* 14e */ - { { 0x65, 0 }, { 0xf0, 0x65, 0 } }, /* 14f */ - { { 0x60, 0 }, { 0xf0, 0x60, 0 } }, /* 150 */ - { { 0x6D, 0 }, { 0xf0, 0x6D, 0 } }, /* 151 */ - { { 0x67, 0 }, { 0xf0, 0x67, 0 } }, /* 152 */ - { { 0x64, 0 }, { 0xf0, 0x64, 0 } }, /* 153 */ - { { 0xd4, 0 }, { 0xf0, 0xD4, 0 } }, /* 154 */ - { { 0xe0, 0x60, 0 }, { 0xe0, 0xF0, 0x60, 0 } }, /* 155 */ - { { 0 }, { 0 } }, /* 156 */ - { { 0xe0, 0x78, 0 }, { 0xe0, 0xF0, 0x78, 0 } }, /* 157 */ - { { 0xe0, 0x07, 0 }, { 0xe0, 0xF0, 0x07, 0 } }, /* 158 */ - { { 0xe0, 0x0F, 0 }, { 0xe0, 0xF0, 0x0F, 0 } }, /* 159 */ - { { 0xe0, 0x17, 0 }, { 0xe0, 0xF0, 0x17, 0 } }, /* 15a */ - { { 0x8B, 0 }, { 0xf0, 0x8B, 0 } }, /* 15b */ - { { 0x8C, 0 }, { 0xf0, 0x8C, 0 } }, /* 15c */ - { { 0x8D, 0 }, { 0xf0, 0x8D, 0 } }, /* 15d */ - { { 0 }, { 0 } }, /* 15e */ - { { 0x7F, 0 }, { 0xf0, 0x7F, 0 } }, /* 15f */ - { { 0 }, { 0 } }, /* 160 */ - { { 0xe0, 0x4F, 0 }, { 0xe0, 0xF0, 0x4F, 0 } }, /* 161 */ - { { 0xe0, 0x56, 0 }, { 0xe0, 0xF0, 0x56, 0 } }, /* 162 */ - { { 0 }, { 0 } }, /* 163 */ - { { 0xe0, 0x08, 0 }, { 0xe0, 0xF0, 0x08, 0 } }, /* 164 */ - { { 0xe0, 0x10, 0 }, { 0xe0, 0xF0, 0x10, 0 } }, /* 165 */ - { { 0xe0, 0x18, 0 }, { 0xe0, 0xF0, 0x18, 0 } }, /* 166 */ - { { 0xe0, 0x20, 0 }, { 0xe0, 0xF0, 0x20, 0 } }, /* 167 */ - { { 0xe0, 0x28, 0 }, { 0xe0, 0xF0, 0x28, 0 } }, /* 168 */ - { { 0xe0, 0x30, 0 }, { 0xe0, 0xF0, 0x30, 0 } }, /* 169 */ - { { 0xe0, 0x38, 0 }, { 0xe0, 0xF0, 0x38, 0 } }, /* 16a */ - { { 0xe0, 0x40, 0 }, { 0xe0, 0xF0, 0x40, 0 } }, /* 16b */ - { { 0xe0, 0x48, 0 }, { 0xe0, 0xF0, 0x48, 0 } }, /* 16c */ - { { 0xe0, 0x50, 0 }, { 0xe0, 0xF0, 0x50, 0 } }, /* 16d */ - { { 0xe0, 0x57, 0 }, { 0xe0, 0xF0, 0x57, 0 } }, /* 16e */ - { { 0 }, { 0 } }, /* 16f */ - { { 0xe0, 0x13, 0 }, { 0xe0, 0xF0, 0x13, 0 } }, /* 170 */ - { { 0xe0, 0x19, 0 }, { 0xe0, 0xF0, 0x19, 0 } }, /* 171 */ - { { 0xe0, 0x39, 0 }, { 0xe0, 0xF0, 0x39, 0 } }, /* 172 */ - { { 0xe0, 0x51, 0 }, { 0xe0, 0xF0, 0x51, 0 } }, /* 173 */ - { { 0xe0, 0x53, 0 }, { 0xe0, 0xF0, 0x53, 0 } }, /* 174 */ - { { 0xe0, 0x5C, 0 }, { 0xe0, 0xF0, 0x5C, 0 } }, /* 175 */ - { { 0 }, { 0 } }, /* 176 */ - { { 0xe0, 0x62, 0 }, { 0xe0, 0xF0, 0x62, 0 } }, /* 177 */ - { { 0xe0, 0x63, 0 }, { 0xe0, 0xF0, 0x63, 0 } }, /* 178 */ - { { 0xe0, 0x64, 0 }, { 0xe0, 0xF0, 0x64, 0 } }, /* 179 */ - { { 0xe0, 0x65, 0 }, { 0xe0, 0xF0, 0x65, 0 } }, /* 17a */ - { { 0xe0, 0x67, 0 }, { 0xe0, 0xF0, 0x67, 0 } }, /* 17b */ - { { 0xe0, 0x68, 0 }, { 0xe0, 0xF0, 0x68, 0 } }, /* 17c */ - { { 0xe0, 0x6A, 0 }, { 0xe0, 0xF0, 0x6A, 0 } }, /* 17d */ - { { 0xe0, 0x6D, 0 }, { 0xe0, 0xF0, 0x6D, 0 } }, /* 17e */ - { { 0xe0, 0x6E, 0 }, { 0xe0, 0xF0, 0x6E, 0 } }, /* 17f */ - { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, /* 181 */ - { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, /* 183 */ - { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, /* 185 */ - { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, /* 187 */ - { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, /* 189 */ - { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, /* 18b */ - { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, /* 18d */ - { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, /* 18f */ - { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, /* 191 */ - { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, /* 193 */ - { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, /* 195 */ - { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, /* 197 */ - { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, /* 199 */ - { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, /* 19b */ - { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, /* 19d */ - { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, /* 19f */ - { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, /* 1a1 */ - { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, /* 1a3 */ - { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, /* 1a5 */ - { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, /* 1a7 */ - { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, /* 1a9 */ - { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, /* 1ab */ - { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, /* 1ad */ - { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, /* 1af */ - { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, /* 1b1 */ - { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, /* 1b3 */ - { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, /* 1b5 */ - { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, /* 1b7 */ - { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, /* 1b9 */ - { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, /* 1bb */ - { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, /* 1bd */ - { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, /* 1bf */ - { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, /* 1c1 */ - { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, /* 1c3 */ - { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, /* 1c5 */ - { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, /* 1c7 */ - { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, /* 1c9 */ - { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, /* 1cb */ - { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, /* 1cd */ - { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, /* 1cf */ - { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, /* 1d1 */ - { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, /* 1d5 */ - { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, /* 1d7 */ - { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, /* 1d9 */ - { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, /* 1db */ - { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, /* 1dd */ - { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, /* 1df */ - { { 0 }, { 0 } }, /* 1e0 */ - { { 0xe0, 0xe1, 0 }, { 0xe0, 0xF0, 0xE1, 0 } }, /* 1e1 */ - { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, /* 1e3 */ - { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, /* 1e5 */ - { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, /* 1e7 */ - { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, /* 1e9 */ - { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, /* 1eb */ - { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, /* 1ed */ - { { 0xe0, 0xee, 0 }, { 0xe0, 0xF0, 0xEE, 0 } }, /* 1ee */ - { { 0 }, { 0 } }, /* 1ef */ - { { 0 }, { 0 } }, /* 1f0 */ - { { 0xe0, 0xf1, 0 }, { 0xe0, 0xF0, 0xF1, 0 } }, /* 1f1 */ - { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, /* 1f3 */ - { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, /* 1f5 */ - { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, /* 1f7 */ - { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, /* 1f9 */ - { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, /* 1fb */ - { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, /* 1fd */ - { { 0xe0, 0xfe, 0 }, { 0xe0, 0xF0, 0xFE, 0 } }, /* 1fe */ - { { 0xe0, 0xff, 0 }, { 0xe0, 0xF0, 0xFF, 0 } } /* 1ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x08, 0 }, .brk = { 0xf0, 0x08, 0 } }, /* 001 */ + { .mk = { 0x16, 0 }, .brk = { 0xf0, 0x16, 0 } }, /* 002 */ + { .mk = { 0x1E, 0 }, .brk = { 0xf0, 0x1E, 0 } }, /* 003 */ + { .mk = { 0x26, 0 }, .brk = { 0xf0, 0x26, 0 } }, /* 004 */ + { .mk = { 0x25, 0 }, .brk = { 0xf0, 0x25, 0 } }, /* 005 */ + { .mk = { 0x2E, 0 }, .brk = { 0xf0, 0x2E, 0 } }, /* 006 */ + { .mk = { 0x36, 0 }, .brk = { 0xf0, 0x36, 0 } }, /* 007 */ + { .mk = { 0x3D, 0 }, .brk = { 0xf0, 0x3D, 0 } }, /* 008 */ + { .mk = { 0x3E, 0 }, .brk = { 0xf0, 0x3E, 0 } }, /* 009 */ + { .mk = { 0x46, 0 }, .brk = { 0xf0, 0x46, 0 } }, /* 00a */ + { .mk = { 0x45, 0 }, .brk = { 0xf0, 0x45, 0 } }, /* 00b */ + { .mk = { 0x4E, 0 }, .brk = { 0xf0, 0x4E, 0 } }, /* 00c */ + { .mk = { 0x55, 0 }, .brk = { 0xf0, 0x55, 0 } }, /* 00d */ + { .mk = { 0x66, 0 }, .brk = { 0xf0, 0x66, 0 } }, /* 00e */ + { .mk = { 0x0D, 0 }, .brk = { 0xf0, 0x0D, 0 } }, /* 00f */ + { .mk = { 0x15, 0 }, .brk = { 0xf0, 0x15, 0 } }, /* 010 */ + { .mk = { 0x1D, 0 }, .brk = { 0xf0, 0x1D, 0 } }, /* 011 */ + { .mk = { 0x24, 0 }, .brk = { 0xf0, 0x24, 0 } }, /* 012 */ + { .mk = { 0x2D, 0 }, .brk = { 0xf0, 0x2D, 0 } }, /* 013 */ + { .mk = { 0x2C, 0 }, .brk = { 0xf0, 0x2C, 0 } }, /* 014 */ + { .mk = { 0x35, 0 }, .brk = { 0xf0, 0x35, 0 } }, /* 015 */ + { .mk = { 0x3C, 0 }, .brk = { 0xf0, 0x3C, 0 } }, /* 016 */ + { .mk = { 0x43, 0 }, .brk = { 0xf0, 0x43, 0 } }, /* 017 */ + { .mk = { 0x44, 0 }, .brk = { 0xf0, 0x44, 0 } }, /* 018 */ + { .mk = { 0x4D, 0 }, .brk = { 0xf0, 0x4D, 0 } }, /* 019 */ + { .mk = { 0x54, 0 }, .brk = { 0xf0, 0x54, 0 } }, /* 01a */ + { .mk = { 0x5B, 0 }, .brk = { 0xf0, 0x5B, 0 } }, /* 01b */ + { .mk = { 0x5A, 0 }, .brk = { 0xf0, 0x5A, 0 } }, /* 01c */ + { .mk = { 0x11, 0 }, .brk = { 0xf0, 0x11, 0 } }, /* 01d */ + { .mk = { 0x1C, 0 }, .brk = { 0xf0, 0x1C, 0 } }, /* 01e */ + { .mk = { 0x1B, 0 }, .brk = { 0xf0, 0x1B, 0 } }, /* 01f */ + { .mk = { 0x23, 0 }, .brk = { 0xf0, 0x23, 0 } }, /* 020 */ + { .mk = { 0x2B, 0 }, .brk = { 0xf0, 0x2B, 0 } }, /* 021 */ + { .mk = { 0x34, 0 }, .brk = { 0xf0, 0x34, 0 } }, /* 022 */ + { .mk = { 0x33, 0 }, .brk = { 0xf0, 0x33, 0 } }, /* 023 */ + { .mk = { 0x3B, 0 }, .brk = { 0xf0, 0x3B, 0 } }, /* 024 */ + { .mk = { 0x42, 0 }, .brk = { 0xf0, 0x42, 0 } }, /* 025 */ + { .mk = { 0x4B, 0 }, .brk = { 0xf0, 0x4B, 0 } }, /* 026 */ + { .mk = { 0x4C, 0 }, .brk = { 0xf0, 0x4C, 0 } }, /* 027 */ + { .mk = { 0x52, 0 }, .brk = { 0xf0, 0x52, 0 } }, /* 028 */ + { .mk = { 0x0E, 0 }, .brk = { 0xf0, 0x0E, 0 } }, /* 029 */ + { .mk = { 0x12, 0 }, .brk = { 0xf0, 0x12, 0 } }, /* 02a */ + { .mk = { 0x5C, 0 }, .brk = { 0xf0, 0x5C, 0 } }, /* 02b */ + { .mk = { 0x1A, 0 }, .brk = { 0xf0, 0x1A, 0 } }, /* 02c */ + { .mk = { 0x22, 0 }, .brk = { 0xf0, 0x22, 0 } }, /* 02d */ + { .mk = { 0x21, 0 }, .brk = { 0xf0, 0x21, 0 } }, /* 02e */ + { .mk = { 0x2A, 0 }, .brk = { 0xf0, 0x2A, 0 } }, /* 02f */ + { .mk = { 0x32, 0 }, .brk = { 0xf0, 0x32, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xf0, 0x31, 0 } }, /* 031 */ + { .mk = { 0x3A, 0 }, .brk = { 0xf0, 0x3A, 0 } }, /* 032 */ + { .mk = { 0x41, 0 }, .brk = { 0xf0, 0x41, 0 } }, /* 033 */ + { .mk = { 0x49, 0 }, .brk = { 0xf0, 0x49, 0 } }, /* 034 */ + { .mk = { 0x4A, 0 }, .brk = { 0xf0, 0x4A, 0 } }, /* 035 */ + { .mk = { 0x59, 0 }, .brk = { 0xf0, 0x59, 0 } }, /* 036 */ + { .mk = { 0x7E, 0 }, .brk = { 0xf0, 0x7E, 0 } }, /* 037 */ + { .mk = { 0x19, 0 }, .brk = { 0xf0, 0x19, 0 } }, /* 038 */ + { .mk = { 0x29, 0 }, .brk = { 0xf0, 0x29, 0 } }, /* 039 */ + { .mk = { 0x14, 0 }, .brk = { 0xf0, 0x14, 0 } }, /* 03a */ + { .mk = { 0x07, 0 }, .brk = { 0xf0, 0x07, 0 } }, /* 03b */ + { .mk = { 0x0F, 0 }, .brk = { 0xf0, 0x0F, 0 } }, /* 03c */ + { .mk = { 0x17, 0 }, .brk = { 0xf0, 0x17, 0 } }, /* 03d */ + { .mk = { 0x1F, 0 }, .brk = { 0xf0, 0x1F, 0 } }, /* 03e */ + { .mk = { 0x27, 0 }, .brk = { 0xf0, 0x27, 0 } }, /* 03f */ + { .mk = { 0x2F, 0 }, .brk = { 0xf0, 0x2F, 0 } }, /* 040 */ + { .mk = { 0x37, 0 }, .brk = { 0xf0, 0x37, 0 } }, /* 041 */ + { .mk = { 0x3F, 0 }, .brk = { 0xf0, 0x3F, 0 } }, /* 042 */ + { .mk = { 0x47, 0 }, .brk = { 0xf0, 0x47, 0 } }, /* 043 */ + { .mk = { 0x4F, 0 }, .brk = { 0xf0, 0x4F, 0 } }, /* 044 */ + { .mk = { 0x76, 0 }, .brk = { 0xf0, 0x76, 0 } }, /* 045 */ + { .mk = { 0x5F, 0 }, .brk = { 0xf0, 0x5F, 0 } }, /* 046 */ + { .mk = { 0x6C, 0 }, .brk = { 0xf0, 0x6C, 0 } }, /* 047 */ + { .mk = { 0x75, 0 }, .brk = { 0xf0, 0x75, 0 } }, /* 048 */ + { .mk = { 0x7D, 0 }, .brk = { 0xf0, 0x7D, 0 } }, /* 049 */ + { .mk = { 0x84, 0 }, .brk = { 0xf0, 0x84, 0 } }, /* 04a */ + { .mk = { 0x6B, 0 }, .brk = { 0xf0, 0x6B, 0 } }, /* 04b */ + { .mk = { 0x73, 0 }, .brk = { 0xf0, 0x73, 0 } }, /* 04c */ + { .mk = { 0x74, 0 }, .brk = { 0xf0, 0x74, 0 } }, /* 04d */ + { .mk = { 0x7C, 0 }, .brk = { 0xf0, 0x7C, 0 } }, /* 04e */ + { .mk = { 0x69, 0 }, .brk = { 0xf0, 0x69, 0 } }, /* 04f */ + { .mk = { 0x72, 0 }, .brk = { 0xf0, 0x72, 0 } }, /* 050 */ + { .mk = { 0x7A, 0 }, .brk = { 0xf0, 0x7A, 0 } }, /* 051 */ + { .mk = { 0x70, 0 }, .brk = { 0xf0, 0x70, 0 } }, /* 052 */ + { .mk = { 0x71, 0 }, .brk = { 0xf0, 0x71, 0 } }, /* 053 */ + { .mk = { 0x57, 0 }, .brk = { 0xf0, 0x57, 0 } }, /* 054 */ + { .mk = { 0x60, 0 }, .brk = { 0xf0, 0x60, 0 } }, /* 055 */ + { .mk = { 0 }, .brk = { 0 } }, /* 056 */ + { .mk = { 0x56, 0 }, .brk = { 0xf0, 0x56, 0 } }, /* 057 */ + { .mk = { 0x5E, 0 }, .brk = { 0xf0, 0x5E, 0 } }, /* 058 */ + { .mk = { 0 }, .brk = { 0 } }, /* 059 */ + { .mk = { 0 }, .brk = { 0 } }, /* 05a */ + { .mk = { 0 }, .brk = { 0 } }, /* 05b */ + { .mk = { 0 }, .brk = { 0 } }, /* 05c */ + { .mk = { 0 }, .brk = { 0 } }, /* 05d */ + { .mk = { 0 }, .brk = { 0 } }, /* 05e */ + { .mk = { 0 }, .brk = { 0 } }, /* 05f */ + { .mk = { 0 }, .brk = { 0 } }, /* 060 */ + { .mk = { 0 }, .brk = { 0 } }, /* 061 */ + { .mk = { 0 }, .brk = { 0 } }, /* 062 */ + { .mk = { 0 }, .brk = { 0 } }, /* 063 */ + { .mk = { 0 }, .brk = { 0 } }, /* 064 */ + { .mk = { 0x10, 0 }, .brk = { 0xf0, 0x10, 0 } }, /* 065 */ + { .mk = { 0x18, 0 }, .brk = { 0xf0, 0x18, 0 } }, /* 066 */ + { .mk = { 0x20, 0 }, .brk = { 0xf0, 0x20, 0 } }, /* 067 */ + { .mk = { 0x28, 0 }, .brk = { 0xf0, 0x28, 0 } }, /* 068 */ + { .mk = { 0x30, 0 }, .brk = { 0xf0, 0x30, 0 } }, /* 069 */ + { .mk = { 0x38, 0 }, .brk = { 0xf0, 0x38, 0 } }, /* 06a */ + { .mk = { 0x40, 0 }, .brk = { 0xf0, 0x40, 0 } }, /* 06b */ + { .mk = { 0x48, 0 }, .brk = { 0xf0, 0x48, 0 } }, /* 06c */ + { .mk = { 0x50, 0 }, .brk = { 0xf0, 0x50, 0 } }, /* 06d */ + { .mk = { 0 }, .brk = { 0 } }, /* 06e */ + { .mk = { 0 }, .brk = { 0 } }, /* 06f */ + { .mk = { 0x87, 0 }, .brk = { 0xf0, 0x87, 0 } }, /* 070 */ + { .mk = { 0 }, .brk = { 0 } }, /* 071 */ + { .mk = { 0 }, .brk = { 0 } }, /* 072 */ + { .mk = { 0x51, 0 }, .brk = { 0xf0, 0x51, 0 } }, /* 073 */ + { .mk = { 0x53, 0 }, .brk = { 0xf0, 0x53, 0 } }, /* 074 */ + { .mk = { 0x5C, 0 }, .brk = { 0xf0, 0x5C, 0 } }, /* 075 */ + { .mk = { 0 }, .brk = { 0 } }, /* 076 */ + { .mk = { 0x62, 0 }, .brk = { 0xf0, 0x62, 0 } }, /* 077 */ + { .mk = { 0x63, 0 }, .brk = { 0xf0, 0x63, 0 } }, /* 078 */ + { .mk = { 0x86, 0 }, .brk = { 0xf0, 0x86, 0 } }, /* 079 */ + { .mk = { 0 }, .brk = { 0 } }, /* 07a */ + { .mk = { 0x85, 0 }, .brk = { 0xf0, 0x85, 0 } }, /* 07b */ + { .mk = { 0x68, 0 }, .brk = { 0xf0, 0x68, 0 } }, /* 07c */ + { .mk = { 0x13, 0 }, .brk = { 0xf0, 0x13, 0 } }, /* 07d */ + { .mk = { 0 }, .brk = { 0 } }, /* 07e */ + { .mk = { 0 }, .brk = { 0 } }, /* 07f */ + { .mk = { 0x80, 0 }, .brk = { 0xf0, 0x80, 0 } }, /* 080 */ + { .mk = { 0x81, 0 }, .brk = { 0xf0, 0x81, 0 } }, /* 081 */ + { .mk = { 0x82, 0 }, .brk = { 0xf0, 0x82, 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0x85, 0 }, .brk = { 0xf0, 0x54, 0 } }, /* 085 */ + { .mk = { 0x86, 0 }, .brk = { 0xf0, 0x86, 0 } }, /* 086 */ + { .mk = { 0x87, 0 }, .brk = { 0xf0, 0x87, 0 } }, /* 087 */ + { .mk = { 0x88, 0 }, .brk = { 0xf0, 0x88, 0 } }, /* 087 */ + { .mk = { 0x89, 0 }, .brk = { 0xf0, 0x89, 0 } }, /* 088 */ + { .mk = { 0x8a, 0 }, .brk = { 0xf0, 0x8a, 0 } }, /* 089 */ + { .mk = { 0x8b, 0 }, .brk = { 0xf0, 0x8b, 0 } }, /* 08b */ + { .mk = { 0 }, .brk = { 0 } }, /* 08c */ + { .mk = { 0 }, .brk = { 0 } }, /* 08d */ + { .mk = { 0x8e, 0 }, .brk = { 0xf0, 0x8e, 0 } }, /* 08e */ + { .mk = { 0x8f, 0 }, .brk = { 0xf0, 0x8f, 0 } }, /* 08f */ + { .mk = { 0x90, 0 }, .brk = { 0xf0, 0x90, 0 } }, /* 090 */ + { .mk = { 0x91, 0 }, .brk = { 0xf0, 0x91, 0 } }, /* 091 */ + { .mk = { 0x92, 0 }, .brk = { 0xf0, 0x92, 0 } }, /* 092 */ + { .mk = { 0x93, 0 }, .brk = { 0xf0, 0x93, 0 } }, /* 093 */ + { .mk = { 0x94, 0 }, .brk = { 0xf0, 0x94, 0 } }, /* 094 */ + { .mk = { 0x95, 0 }, .brk = { 0xf0, 0x95, 0 } }, /* 095 */ + { .mk = { 0x96, 0 }, .brk = { 0xf0, 0x96, 0 } }, /* 096 */ + { .mk = { 0x97, 0 }, .brk = { 0xf0, 0x97, 0 } }, /* 097 */ + { .mk = { 0x98, 0 }, .brk = { 0xf0, 0x98, 0 } }, /* 098 */ + { .mk = { 0x99, 0 }, .brk = { 0xf0, 0x99, 0 } }, /* 099 */ + { .mk = { 0x9a, 0 }, .brk = { 0xf0, 0x9a, 0 } }, /* 09a */ + { .mk = { 0x9b, 0 }, .brk = { 0xf0, 0x9b, 0 } }, /* 09b */ + { .mk = { 0x9c, 0 }, .brk = { 0xf0, 0x9c, 0 } }, /* 09c */ + { .mk = { 0x9d, 0 }, .brk = { 0xf0, 0x9d, 0 } }, /* 09d */ + { .mk = { 0x9e, 0 }, .brk = { 0xf0, 0x9e, 0 } }, /* 09e */ + { .mk = { 0x9f, 0 }, .brk = { 0xf0, 0x9f, 0 } }, /* 09f */ + { .mk = { 0xa0, 0 }, .brk = { 0xf0, 0xa0, 0 } }, /* 0a0 */ + { .mk = { 0xa1, 0 }, .brk = { 0xf0, 0xa1, 0 } }, /* 0a1 */ + { .mk = { 0xa2, 0 }, .brk = { 0xf0, 0xa2, 0 } }, /* 0a2 */ + { .mk = { 0xa3, 0 }, .brk = { 0xf0, 0xa3, 0 } }, /* 0a3 */ + { .mk = { 0xa4, 0 }, .brk = { 0xf0, 0xa4, 0 } }, /* 0a4 */ + { .mk = { 0xa5, 0 }, .brk = { 0xf0, 0xa5, 0 } }, /* 0a5 */ + { .mk = { 0xa6, 0 }, .brk = { 0xf0, 0xa6, 0 } }, /* 0a6 */ + { .mk = { 0xa7, 0 }, .brk = { 0xf0, 0xa7, 0 } }, /* 0a7 */ + { .mk = { 0xa8, 0 }, .brk = { 0xf0, 0xa8, 0 } }, /* 0a8 */ + { .mk = { 0xa9, 0 }, .brk = { 0xf0, 0xa9, 0 } }, /* 0a9 */ + { .mk = { 0xaa, 0 }, .brk = { 0xf0, 0xaa, 0 } }, /* 0aa */ + { .mk = { 0xab, 0 }, .brk = { 0xf0, 0xab, 0 } }, /* 0ab */ + { .mk = { 0xac, 0 }, .brk = { 0xf0, 0xac, 0 } }, /* 0ac */ + { .mk = { 0xad, 0 }, .brk = { 0xf0, 0xad, 0 } }, /* 0ad */ + { .mk = { 0xae, 0 }, .brk = { 0xf0, 0xae, 0 } }, /* 0ae */ + { .mk = { 0xaf, 0 }, .brk = { 0xf0, 0xaf, 0 } }, /* 0af */ + { .mk = { 0xb0, 0 }, .brk = { 0xf0, 0xb0, 0 } }, /* 0b0 */ + { .mk = { 0xb1, 0 }, .brk = { 0xf0, 0xb1, 0 } }, /* 0b1 */ + { .mk = { 0xb2, 0 }, .brk = { 0xf0, 0xb2, 0 } }, /* 0b2 */ + { .mk = { 0xb3, 0 }, .brk = { 0xf0, 0xb3, 0 } }, /* 0b3 */ + { .mk = { 0xb4, 0 }, .brk = { 0xf0, 0xb4, 0 } }, /* 0b4 */ + { .mk = { 0xb5, 0 }, .brk = { 0xf0, 0xb5, 0 } }, /* 0b5 */ + { .mk = { 0xb6, 0 }, .brk = { 0xf0, 0xb6, 0 } }, /* 0b6 */ + { .mk = { 0xb7, 0 }, .brk = { 0xf0, 0xb7, 0 } }, /* 0b7 */ + { .mk = { 0xb8, 0 }, .brk = { 0xf0, 0xb8, 0 } }, /* 0b8 */ + { .mk = { 0xb9, 0 }, .brk = { 0xf0, 0xb9, 0 } }, /* 0b9 */ + { .mk = { 0xba, 0 }, .brk = { 0xf0, 0xba, 0 } }, /* 0ba */ + { .mk = { 0xbb, 0 }, .brk = { 0xf0, 0xbb, 0 } }, /* 0bb */ + { .mk = { 0xbc, 0 }, .brk = { 0xf0, 0xbc, 0 } }, /* 0bc */ + { .mk = { 0xbd, 0 }, .brk = { 0xf0, 0xbd, 0 } }, /* 0bd */ + { .mk = { 0xbe, 0 }, .brk = { 0xf0, 0xbe, 0 } }, /* 0be */ + { .mk = { 0xbf, 0 }, .brk = { 0xf0, 0xbf, 0 } }, /* 0bf */ + { .mk = { 0xc0, 0 }, .brk = { 0xf0, 0xc0, 0 } }, /* 0c0 */ + { .mk = { 0xc1, 0 }, .brk = { 0xf0, 0xc1, 0 } }, /* 0c1 */ + { .mk = { 0xc2, 0 }, .brk = { 0xf0, 0xc2, 0 } }, /* 0c2 */ + { .mk = { 0xc3, 0 }, .brk = { 0xf0, 0xc3, 0 } }, /* 0c3 */ + { .mk = { 0xc4, 0 }, .brk = { 0xf0, 0xc4, 0 } }, /* 0c4 */ + { .mk = { 0xc5, 0 }, .brk = { 0xf0, 0xc5, 0 } }, /* 0c5 */ + { .mk = { 0xc6, 0 }, .brk = { 0xf0, 0xc6, 0 } }, /* 0c6 */ + { .mk = { 0xc7, 0 }, .brk = { 0xf0, 0xc7, 0 } }, /* 0c7 */ + { .mk = { 0xc8, 0 }, .brk = { 0xf0, 0xc8, 0 } }, /* 0c8 */ + { .mk = { 0xc9, 0 }, .brk = { 0xf0, 0xc9, 0 } }, /* 0c9 */ + { .mk = { 0xca, 0 }, .brk = { 0xf0, 0xca, 0 } }, /* 0ca */ + { .mk = { 0xcb, 0 }, .brk = { 0xf0, 0xcb, 0 } }, /* 0cb */ + { .mk = { 0xcc, 0 }, .brk = { 0xf0, 0xcc, 0 } }, /* 0cc */ + { .mk = { 0xcd, 0 }, .brk = { 0xf0, 0xcd, 0 } }, /* 0cd */ + { .mk = { 0xce, 0 }, .brk = { 0xf0, 0xce, 0 } }, /* 0ce */ + { .mk = { 0xcf, 0 }, .brk = { 0xf0, 0xcf, 0 } }, /* 0cf */ + { .mk = { 0xd0, 0 }, .brk = { 0xf0, 0xd0, 0 } }, /* 0d0 */ + { .mk = { 0xd1, 0 }, .brk = { 0xf0, 0xd0, 0 } }, /* 0d1 */ + { .mk = { 0xd2, 0 }, .brk = { 0xf0, 0xd2, 0 } }, /* 0d2 */ + { .mk = { 0xd3, 0 }, .brk = { 0xf0, 0xd3, 0 } }, /* 0d3 */ + { .mk = { 0xd4, 0 }, .brk = { 0xf0, 0xd4, 0 } }, /* 0d4 */ + { .mk = { 0xd5, 0 }, .brk = { 0xf0, 0xd5, 0 } }, /* 0d5 */ + { .mk = { 0xd6, 0 }, .brk = { 0xf0, 0xd6, 0 } }, /* 0d6 */ + { .mk = { 0xd7, 0 }, .brk = { 0xf0, 0xd7, 0 } }, /* 0d7 */ + { .mk = { 0xd8, 0 }, .brk = { 0xf0, 0xd8, 0 } }, /* 0d8 */ + { .mk = { 0xd9, 0 }, .brk = { 0xf0, 0xd9, 0 } }, /* 0d9 */ + { .mk = { 0xda, 0 }, .brk = { 0xf0, 0xda, 0 } }, /* 0da */ + { .mk = { 0xdb, 0 }, .brk = { 0xf0, 0xdb, 0 } }, /* 0db */ + { .mk = { 0xdc, 0 }, .brk = { 0xf0, 0xdc, 0 } }, /* 0dc */ + { .mk = { 0xdd, 0 }, .brk = { 0xf0, 0xdd, 0 } }, /* 0dd */ + { .mk = { 0xde, 0 }, .brk = { 0xf0, 0xde, 0 } }, /* 0de */ + { .mk = { 0xdf, 0 }, .brk = { 0xf0, 0xdf, 0 } }, /* 0df */ + { .mk = { 0xe0, 0 }, .brk = { 0xf0, 0xe0, 0 } }, /* 0e0 */ + { .mk = { 0xe1, 0 }, .brk = { 0xf0, 0xe1, 0 } }, /* 0e1 */ + { .mk = { 0xe2, 0 }, .brk = { 0xf0, 0xe2, 0 } }, /* 0e2 */ + { .mk = { 0xe3, 0 }, .brk = { 0xf0, 0xe3, 0 } }, /* 0e3 */ + { .mk = { 0xe4, 0 }, .brk = { 0xf0, 0xe4, 0 } }, /* 0e4 */ + { .mk = { 0xe5, 0 }, .brk = { 0xf0, 0xe5, 0 } }, /* 0e5 */ + { .mk = { 0xe6, 0 }, .brk = { 0xf0, 0xe6, 0 } }, /* 0e6 */ + { .mk = { 0xe7, 0 }, .brk = { 0xf0, 0xe7, 0 } }, /* 0e7 */ + { .mk = { 0xe8, 0 }, .brk = { 0xf0, 0xe8, 0 } }, /* 0e7 */ + { .mk = { 0xe9, 0 }, .brk = { 0xf0, 0xe9, 0 } }, /* 0e8 */ + { .mk = { 0xea, 0 }, .brk = { 0xf0, 0xea, 0 } }, /* 0e9 */ + { .mk = { 0xeb, 0 }, .brk = { 0xf0, 0xeb, 0 } }, /* 0eb */ + { .mk = { 0xec, 0 }, .brk = { 0xf0, 0xec, 0 } }, /* 0ec */ + { .mk = { 0xed, 0 }, .brk = { 0xf0, 0xed, 0 } }, /* 0ed */ + { .mk = { 0xee, 0 }, .brk = { 0xf0, 0xee, 0 } }, /* 0ee */ + { .mk = { 0xef, 0 }, .brk = { 0xf0, 0xef, 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0xf1, 0 }, .brk = { 0xf0, 0xf1, 0 } }, /* 0f1 */ + { .mk = { 0xf2, 0 }, .brk = { 0xf0, 0xf2, 0 } }, /* 0f2 */ + { .mk = { 0xf3, 0 }, .brk = { 0xf0, 0xf3, 0 } }, /* 0f3 */ + { .mk = { 0xf4, 0 }, .brk = { 0xf0, 0xf4, 0 } }, /* 0f4 */ + { .mk = { 0xf5, 0 }, .brk = { 0xf0, 0xf5, 0 } }, /* 0f5 */ + { .mk = { 0xf6, 0 }, .brk = { 0xf0, 0xf6, 0 } }, /* 0f6 */ + { .mk = { 0xf7, 0 }, .brk = { 0xf0, 0xf7, 0 } }, /* 0f7 */ + { .mk = { 0xf8, 0 }, .brk = { 0xf0, 0xf8, 0 } }, /* 0f8 */ + { .mk = { 0xf9, 0 }, .brk = { 0xf0, 0xf9, 0 } }, /* 0f9 */ + { .mk = { 0xfa, 0 }, .brk = { 0xf0, 0xfa, 0 } }, /* 0fa */ + { .mk = { 0xfb, 0 }, .brk = { 0xf0, 0xfb, 0 } }, /* 0fb */ + { .mk = { 0xfc, 0 }, .brk = { 0xf0, 0xfc, 0 } }, /* 0fc */ + { .mk = { 0xfd, 0 }, .brk = { 0xf0, 0xfd, 0 } }, /* 0fd */ + { .mk = { 0xfe, 0 }, .brk = { 0xf0, 0xfe, 0 } }, /* 0fe */ + { .mk = { 0xff, 0 }, .brk = { 0xf0, 0xff, 0 } }, /* 0ff */ + { .mk = { 0x62, 0 }, .brk = { 0xF0, 0x62, 0 } }, /* 100 */ + { .mk = {0xe0, 0x76, 0 }, .brk = { 0xe0, 0xF0, 0x76, 0 } }, /* 101 */ + { .mk = {0xe0, 0x16, 0 }, .brk = { 0xe0, 0xF0, 0x16, 0 } }, /* 102 */ + { .mk = {0xe0, 0x1E, 0 }, .brk = { 0xe0, 0xF0, 0x1E, 0 } }, /* 103 */ + { .mk = {0xe0, 0x26, 0 }, .brk = { 0xe0, 0xF0, 0x26, 0 } }, /* 104 */ + { .mk = {0xe0, 0x25, 0 }, .brk = { 0xe0, 0xF0, 0x25, 0 } }, /* 105 */ + { .mk = {0xe0, 0x2E, 0 }, .brk = { 0xe0, 0xF0, 0x2E, 0 } }, /* 106 */ + { .mk = {0xe0, 0x36, 0 }, .brk = { 0xe0, 0xF0, 0x36, 0 } }, /* 107 */ + { .mk = {0xe0, 0x3D, 0 }, .brk = { 0xe0, 0xF0, 0x3D, 0 } }, /* 108 */ + { .mk = {0xe0, 0x3E, 0 }, .brk = { 0xe0, 0xF0, 0x3E, 0 } }, /* 109 */ + { .mk = {0xe0, 0x46, 0 }, .brk = { 0xe0, 0xF0, 0x46, 0 } }, /* 10a */ + { .mk = {0xe0, 0x45, 0 }, .brk = { 0xe0, 0xF0, 0x45, 0 } }, /* 10b */ + { .mk = {0xe0, 0x4E, 0 }, .brk = { 0xe0, 0xF0, 0x4E, 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = {0xe0, 0x66, 0 }, .brk = { 0xe0, 0xF0, 0x66, 0 } }, /* 10e */ + { .mk = {0xe0, 0x0D, 0 }, .brk = { 0xe0, 0xF0, 0x0D, 0 } }, /* 10f */ + { .mk = {0xe0, 0x15, 0 }, .brk = { 0xe0, 0xF0, 0x15, 0 } }, /* 110 */ + { .mk = {0xe0, 0x1D, 0 }, .brk = { 0xe0, 0xF0, 0x1D, 0 } }, /* 111 */ + { .mk = {0xe0, 0x24, 0 }, .brk = { 0xe0, 0xF0, 0x24, 0 } }, /* 112 */ + { .mk = {0xe0, 0x2D, 0 }, .brk = { 0xe0, 0xF0, 0x2D, 0 } }, /* 113 */ + { .mk = {0xe0, 0x2C, 0 }, .brk = { 0xe0, 0xF0, 0x2C, 0 } }, /* 114 */ + { .mk = {0xe0, 0x35, 0 }, .brk = { 0xe0, 0xF0, 0x35, 0 } }, /* 115 */ + { .mk = {0xe0, 0x3C, 0 }, .brk = { 0xe0, 0xF0, 0x3C, 0 } }, /* 116 */ + { .mk = {0xe0, 0x43, 0 }, .brk = { 0xe0, 0xF0, 0x43, 0 } }, /* 117 */ + { .mk = {0xe0, 0x44, 0 }, .brk = { 0xe0, 0xF0, 0x44, 0 } }, /* 118 */ + { .mk = {0xe0, 0x4D, 0 }, .brk = { 0xe0, 0xF0, 0x4D, 0 } }, /* 119 */ + { .mk = {0xe0, 0x54, 0 }, .brk = { 0xe0, 0xF0, 0x54, 0 } }, /* 11a */ + { .mk = {0xe0, 0x5B, 0 }, .brk = { 0xe0, 0xF0, 0x5B, 0 } }, /* 11b */ + { .mk = { 0x79, 0 }, .brk = { 0xf0, 0x79, 0 } }, /* 11c */ + { .mk = { 0x58, 0 }, .brk = { 0xf0, 0x58, 0 } }, /* 11d */ + { .mk = {0xe0, 0x1C, 0 }, .brk = { 0xe0, 0xF0, 0x1C, 0 } }, /* 11e */ + { .mk = {0xe0, 0x1B, 0 }, .brk = { 0xe0, 0xF0, 0x1B, 0 } }, /* 11f */ + { .mk = {0xe0, 0x23, 0 }, .brk = { 0xe0, 0xF0, 0x23, 0 } }, /* 120 */ + { .mk = {0xe0, 0x2B, 0 }, .brk = { 0xe0, 0xF0, 0x2B, 0 } }, /* 121 */ + { .mk = {0xe0, 0x34, 0 }, .brk = { 0xe0, 0xF0, 0x34, 0 } }, /* 122 */ + { .mk = {0xe0, 0x33, 0 }, .brk = { 0xe0, 0xF0, 0x33, 0 } }, /* 123 */ + { .mk = {0xe0, 0x3B, 0 }, .brk = { 0xe0, 0xF0, 0x3B, 0 } }, /* 124 */ + { .mk = {0xe0, 0x42, 0 }, .brk = { 0xe0, 0xF0, 0x42, 0 } }, /* 125 */ + { .mk = {0xe0, 0x4B, 0 }, .brk = { 0xe0, 0xF0, 0x4B, 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = {0xe0, 0x1A, 0 }, .brk = { 0xe0, 0xF0, 0x1A, 0 } }, /* 12c */ + { .mk = {0xe0, 0x22, 0 }, .brk = { 0xe0, 0xF0, 0x22, 0 } }, /* 12d */ + { .mk = {0xe0, 0x21, 0 }, .brk = { 0xe0, 0xF0, 0x21, 0 } }, /* 12e */ + { .mk = {0xe0, 0x2A, 0 }, .brk = { 0xe0, 0xF0, 0x2A, 0 } }, /* 12f */ + { .mk = {0xe0, 0x32, 0 }, .brk = { 0xe0, 0xF0, 0x32, 0 } }, /* 130 */ + { .mk = {0xe0, 0x31, 0 }, .brk = { 0xe0, 0xF0, 0x31, 0 } }, /* 131 */ + { .mk = {0xe0, 0x3A, 0 }, .brk = { 0xe0, 0xF0, 0x3A, 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = {0xe0, 0x49, 0 }, .brk = { 0xe0, 0xF0, 0x49, 0 } }, /* 134 */ + { .mk = { 0x77, 0 }, .brk = { 0xf0, 0x77, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = { 0x57, 0 }, .brk = { 0xf0, 0x57, 0 } }, /* 137 */ + { .mk = { 0x39, 0 }, .brk = { 0xf0, 0x39, 0 } }, /* 138 */ + { .mk = { 0 }, .brk = { 0 } }, /* 139 */ + { .mk = {0xe0, 0x58, 0 }, .brk = { 0xe0, 0xF0, 0x58, 0 } }, /* 13a */ + { .mk = {0xe0, 0x05, 0 }, .brk = { 0xe0, 0xF0, 0x05, 0 } }, /* 13b */ + { .mk = {0xe0, 0x06, 0 }, .brk = { 0xe0, 0xF0, 0x06, 0 } }, /* 13c */ + { .mk = {0xe0, 0x04, 0 }, .brk = { 0xe0, 0xF0, 0x04, 0 } }, /* 13d */ + { .mk = {0xe0, 0x0C, 0 }, .brk = { 0xe0, 0xF0, 0x0C, 0 } }, /* 13e */ + { .mk = {0xe0, 0x03, 0 }, .brk = { 0xe0, 0xF0, 0x03, 0 } }, /* 13f */ + { .mk = {0xe0, 0x0B, 0 }, .brk = { 0xe0, 0xF0, 0x0B, 0 } }, /* 140 */ + { .mk = {0xe0, 0x02, 0 }, .brk = { 0xe0, 0xF0, 0x02, 0 } }, /* 141 */ + { .mk = {0xe0, 0x0A, 0 }, .brk = { 0xe0, 0xF0, 0x0A, 0 } }, /* 142 */ + { .mk = {0xe0, 0x01, 0 }, .brk = { 0xe0, 0xF0, 0x01, 0 } }, /* 143 */ + { .mk = {0xe0, 0x09, 0 }, .brk = { 0xe0, 0xF0, 0x09, 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = {0xe0, 0x7E, 0 }, .brk = { 0xe0, 0xF0, 0x7E, 0 } }, /* 146 */ + { .mk = { 0x6E, 0 }, .brk = { 0xf0, 0x6E, 0 } }, /* 147 */ + { .mk = { 0x63, 0 }, .brk = { 0xf0, 0x63, 0 } }, /* 148 */ + { .mk = { 0x6F, 0 }, .brk = { 0xf0, 0x6F, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = { 0x61, 0 }, .brk = { 0xf0, 0x61, 0 } }, /* 14b */ + { .mk = {0xe0, 0x73, 0 }, .brk = { 0xe0, 0xF0, 0x73, 0 } }, /* 14c */ + { .mk = { 0x6A, 0 }, .brk = { 0xf0, 0x6A, 0 } }, /* 14d */ + { .mk = {0xe0, 0x79, 0 }, .brk = { 0xe0, 0xF0, 0x79, 0 } }, /* 14e */ + { .mk = { 0x65, 0 }, .brk = { 0xf0, 0x65, 0 } }, /* 14f */ + { .mk = { 0x60, 0 }, .brk = { 0xf0, 0x60, 0 } }, /* 150 */ + { .mk = { 0x6D, 0 }, .brk = { 0xf0, 0x6D, 0 } }, /* 151 */ + { .mk = { 0x67, 0 }, .brk = { 0xf0, 0x67, 0 } }, /* 152 */ + { .mk = { 0x64, 0 }, .brk = { 0xf0, 0x64, 0 } }, /* 153 */ + { .mk = { 0xd4, 0 }, .brk = { 0xf0, 0xD4, 0 } }, /* 154 */ + { .mk = {0xe0, 0x60, 0 }, .brk = { 0xe0, 0xF0, 0x60, 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = {0xe0, 0x78, 0 }, .brk = { 0xe0, 0xF0, 0x78, 0 } }, /* 157 */ + { .mk = {0xe0, 0x07, 0 }, .brk = { 0xe0, 0xF0, 0x07, 0 } }, /* 158 */ + { .mk = {0xe0, 0x0F, 0 }, .brk = { 0xe0, 0xF0, 0x0F, 0 } }, /* 159 */ + { .mk = {0xe0, 0x17, 0 }, .brk = { 0xe0, 0xF0, 0x17, 0 } }, /* 15a */ + { .mk = { 0x8B, 0 }, .brk = { 0xf0, 0x8B, 0 } }, /* 15b */ + { .mk = { 0x8C, 0 }, .brk = { 0xf0, 0x8C, 0 } }, /* 15c */ + { .mk = { 0x8D, 0 }, .brk = { 0xf0, 0x8D, 0 } }, /* 15d */ + { .mk = { 0 }, .brk = { 0 } }, /* 15e */ + { .mk = { 0x7F, 0 }, .brk = { 0xf0, 0x7F, 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = {0xe0, 0x4F, 0 }, .brk = { 0xe0, 0xF0, 0x4F, 0 } }, /* 161 */ + { .mk = {0xe0, 0x56, 0 }, .brk = { 0xe0, 0xF0, 0x56, 0 } }, /* 162 */ + { .mk = { 0 }, .brk = { 0 } }, /* 163 */ + { .mk = {0xe0, 0x08, 0 }, .brk = { 0xe0, 0xF0, 0x08, 0 } }, /* 164 */ + { .mk = {0xe0, 0x10, 0 }, .brk = { 0xe0, 0xF0, 0x10, 0 } }, /* 165 */ + { .mk = {0xe0, 0x18, 0 }, .brk = { 0xe0, 0xF0, 0x18, 0 } }, /* 166 */ + { .mk = {0xe0, 0x20, 0 }, .brk = { 0xe0, 0xF0, 0x20, 0 } }, /* 167 */ + { .mk = {0xe0, 0x28, 0 }, .brk = { 0xe0, 0xF0, 0x28, 0 } }, /* 168 */ + { .mk = {0xe0, 0x30, 0 }, .brk = { 0xe0, 0xF0, 0x30, 0 } }, /* 169 */ + { .mk = {0xe0, 0x38, 0 }, .brk = { 0xe0, 0xF0, 0x38, 0 } }, /* 16a */ + { .mk = {0xe0, 0x40, 0 }, .brk = { 0xe0, 0xF0, 0x40, 0 } }, /* 16b */ + { .mk = {0xe0, 0x48, 0 }, .brk = { 0xe0, 0xF0, 0x48, 0 } }, /* 16c */ + { .mk = {0xe0, 0x50, 0 }, .brk = { 0xe0, 0xF0, 0x50, 0 } }, /* 16d */ + { .mk = {0xe0, 0x57, 0 }, .brk = { 0xe0, 0xF0, 0x57, 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = {0xe0, 0x13, 0 }, .brk = { 0xe0, 0xF0, 0x13, 0 } }, /* 170 */ + { .mk = {0xe0, 0x19, 0 }, .brk = { 0xe0, 0xF0, 0x19, 0 } }, /* 171 */ + { .mk = {0xe0, 0x39, 0 }, .brk = { 0xe0, 0xF0, 0x39, 0 } }, /* 172 */ + { .mk = {0xe0, 0x51, 0 }, .brk = { 0xe0, 0xF0, 0x51, 0 } }, /* 173 */ + { .mk = {0xe0, 0x53, 0 }, .brk = { 0xe0, 0xF0, 0x53, 0 } }, /* 174 */ + { .mk = {0xe0, 0x5C, 0 }, .brk = { 0xe0, 0xF0, 0x5C, 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = {0xe0, 0x62, 0 }, .brk = { 0xe0, 0xF0, 0x62, 0 } }, /* 177 */ + { .mk = {0xe0, 0x63, 0 }, .brk = { 0xe0, 0xF0, 0x63, 0 } }, /* 178 */ + { .mk = {0xe0, 0x64, 0 }, .brk = { 0xe0, 0xF0, 0x64, 0 } }, /* 179 */ + { .mk = {0xe0, 0x65, 0 }, .brk = { 0xe0, 0xF0, 0x65, 0 } }, /* 17a */ + { .mk = {0xe0, 0x67, 0 }, .brk = { 0xe0, 0xF0, 0x67, 0 } }, /* 17b */ + { .mk = {0xe0, 0x68, 0 }, .brk = { 0xe0, 0xF0, 0x68, 0 } }, /* 17c */ + { .mk = {0xe0, 0x6A, 0 }, .brk = { 0xe0, 0xF0, 0x6A, 0 } }, /* 17d */ + { .mk = {0xe0, 0x6D, 0 }, .brk = { 0xe0, 0xF0, 0x6D, 0 } }, /* 17e */ + { .mk = {0xe0, 0x6E, 0 }, .brk = { 0xe0, 0xF0, 0x6E, 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = {0xe0, 0xe1, 0 }, .brk = { 0xe0, 0xF0, 0xE1, 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = {0xe0, 0xee, 0 }, .brk = { 0xe0, 0xF0, 0xEE, 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = {0xe0, 0xf1, 0 }, .brk = { 0xe0, 0xF0, 0xF1, 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = {0xe0, 0xfe, 0 }, .brk = { 0xe0, 0xF0, 0xFE, 0 } }, /* 1fe */ + { .mk = {0xe0, 0xff, 0 }, .brk = { 0xe0, 0xF0, 0xFF, 0 } } /* 1ff */ // clang-format on }; diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index ea2564aa9..63882222e 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -90,518 +90,518 @@ typedef struct xtkbd_t { /*XT keyboard has no escape scancodes, and no scancodes beyond 53*/ const scancode scancode_xt[512] = { // clang-format off - { { 0 }, { 0 } }, /* 000 */ - { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ - { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ - { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ - { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ - { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ - { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ - { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ - { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ - { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ - { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ - { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ - { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ - { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ - { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ - { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ - { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ - { { 0x12, 0 }, { 0x92, 0 } }, /* 012 */ - { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ - { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ - { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ - { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ - { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ - { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ - { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ - { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ - { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ - { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ - { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ - { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ - { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ - { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ - { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ - { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ - { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ - { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ - { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ - { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ - { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ - { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ - { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ - { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ - { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ - { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ - { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ - { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ - { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ - { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ - { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ - { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ - { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ - { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ - { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ - { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ - { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ - { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ - { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ - { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ - { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ - { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ - { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ - { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ - { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ - { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ - { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ - { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ - { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ - { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ - { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ - { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ - { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ - { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ - { { 0 }, { 0 } }, /* 054 */ - { { 0 }, { 0 } }, /* 055 */ - { { 0 }, { 0 } }, /* 056 */ - { { 0 }, { 0 } }, /* 057 */ - { { 0 }, { 0 } }, /* 058 */ - { { 0 }, { 0 } }, /* 059 */ - { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, /* 05b */ - { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, /* 05d */ - { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, /* 05f */ - { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, /* 061 */ - { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, /* 063 */ - { { 0 }, { 0 } }, /* 064 */ - { { 0 }, { 0 } }, /* 065 */ - { { 0 }, { 0 } }, /* 066 */ - { { 0 }, { 0 } }, /* 067 */ - { { 0 }, { 0 } }, /* 068 */ - { { 0 }, { 0 } }, /* 069 */ - { { 0 }, { 0 } }, /* 06a */ - { { 0 }, { 0 } }, /* 06b */ - { { 0 }, { 0 } }, /* 06c */ - { { 0 }, { 0 } }, /* 06d */ - { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, /* 06f */ - { { 0 }, { 0 } }, /* 070 */ - { { 0 }, { 0 } }, /* 071 */ - { { 0 }, { 0 } }, /* 072 */ - { { 0 }, { 0 } }, /* 073 */ - { { 0 }, { 0 } }, /* 074 */ - { { 0 }, { 0 } }, /* 075 */ - { { 0 }, { 0 } }, /* 076 */ - { { 0 }, { 0 } }, /* 077 */ - { { 0 }, { 0 } }, /* 078 */ - { { 0 }, { 0 } }, /* 079 */ - { { 0 }, { 0 } }, /* 07a */ - { { 0 }, { 0 } }, /* 07b */ - { { 0 }, { 0 } }, /* 07c */ - { { 0 }, { 0 } }, /* 07d */ - { { 0 }, { 0 } }, /* 07e */ - { { 0 }, { 0 } }, /* 07f */ - { { 0 }, { 0 } }, /* 080 */ - { { 0 }, { 0 } }, /* 081 */ - { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, /* 083 */ - { { 0 }, { 0 } }, /* 084 */ - { { 0 }, { 0 } }, /* 085 */ - { { 0 }, { 0 } }, /* 086 */ - { { 0 }, { 0 } }, /* 087 */ - { { 0 }, { 0 } }, /* 088 */ - { { 0 }, { 0 } }, /* 089 */ - { { 0 }, { 0 } }, /* 08a */ - { { 0 }, { 0 } }, /* 08b */ - { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, /* 08d */ - { { 0 }, { 0 } }, /* 08e */ - { { 0 }, { 0 } }, /* 08f */ - { { 0 }, { 0 } }, /* 090 */ - { { 0 }, { 0 } }, /* 091 */ - { { 0 }, { 0 } }, /* 092 */ - { { 0 }, { 0 } }, /* 093 */ - { { 0 }, { 0 } }, /* 094 */ - { { 0 }, { 0 } }, /* 095 */ - { { 0 }, { 0 } }, /* 096 */ - { { 0 }, { 0 } }, /* 097 */ - { { 0 }, { 0 } }, /* 098 */ - { { 0 }, { 0 } }, /* 099 */ - { { 0 }, { 0 } }, /* 09a */ - { { 0 }, { 0 } }, /* 09b */ - { { 0 }, { 0 } }, /* 09c */ - { { 0 }, { 0 } }, /* 09d */ - { { 0 }, { 0 } }, /* 09e */ - { { 0 }, { 0 } }, /* 09f */ - { { 0 }, { 0 } }, /* 0a0 */ - { { 0 }, { 0 } }, /* 0a1 */ - { { 0 }, { 0 } }, /* 0a2 */ - { { 0 }, { 0 } }, /* 0a3 */ - { { 0 }, { 0 } }, /* 0a4 */ - { { 0 }, { 0 } }, /* 0a5 */ - { { 0 }, { 0 } }, /* 0a6 */ - { { 0 }, { 0 } }, /* 0a7 */ - { { 0 }, { 0 } }, /* 0a8 */ - { { 0 }, { 0 } }, /* 0a9 */ - { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, /* 0ab */ - { { 0 }, { 0 } }, /* 0ac */ - { { 0 }, { 0 } }, /* 0ad */ - { { 0 }, { 0 } }, /* 0ae */ - { { 0 }, { 0 } }, /* 0af */ - { { 0 }, { 0 } }, /* 0b0 */ - { { 0 }, { 0 } }, /* 0b1 */ - { { 0 }, { 0 } }, /* 0b2 */ - { { 0 }, { 0 } }, /* 0b3 */ - { { 0 }, { 0 } }, /* 0b4 */ - { { 0 }, { 0 } }, /* 0b5 */ - { { 0 }, { 0 } }, /* 0b6 */ - { { 0 }, { 0 } }, /* 0b7 */ - { { 0 }, { 0 } }, /* 0b8 */ - { { 0 }, { 0 } }, /* 0b9 */ - { { 0 }, { 0 } }, /* 0ba */ - { { 0 }, { 0 } }, /* 0bb */ - { { 0 }, { 0 } }, /* 0bc */ - { { 0 }, { 0 } }, /* 0bd */ - { { 0 }, { 0 } }, /* 0be */ - { { 0 }, { 0 } }, /* 0bf */ - { { 0 }, { 0 } }, /* 0c0 */ - { { 0 }, { 0 } }, /* 0c1 */ - { { 0 }, { 0 } }, /* 0c2 */ - { { 0 }, { 0 } }, /* 0c3 */ - { { 0 }, { 0 } }, /* 0c4 */ - { { 0 }, { 0 } }, /* 0c5 */ - { { 0 }, { 0 } }, /* 0c6 */ - { { 0 }, { 0 } }, /* 0c7 */ - { { 0 }, { 0 } }, /* 0c8 */ - { { 0 }, { 0 } }, /* 0c9 */ - { { 0 }, { 0 } }, /* 0ca */ - { { 0 }, { 0 } }, /* 0cb */ - { { 0 }, { 0 } }, /* 0cc */ - { { 0 }, { 0 } }, /* 0cd */ - { { 0 }, { 0 } }, /* 0ce */ - { { 0 }, { 0 } }, /* 0cf */ - { { 0 }, { 0 } }, /* 0d0 */ - { { 0 }, { 0 } }, /* 0d1 */ - { { 0 }, { 0 } }, /* 0d2 */ - { { 0 }, { 0 } }, /* 0d3 */ - { { 0 }, { 0 } }, /* 0d4 */ - { { 0 }, { 0 } }, /* 0d5 */ - { { 0 }, { 0 } }, /* 0d6 */ - { { 0 }, { 0 } }, /* 0d7 */ - { { 0 }, { 0 } }, /* 0d8 */ - { { 0 }, { 0 } }, /* 0d9 */ - { { 0 }, { 0 } }, /* 0da */ - { { 0 }, { 0 } }, /* 0db */ - { { 0 }, { 0 } }, /* 0dc */ - { { 0 }, { 0 } }, /* 0dd */ - { { 0 }, { 0 } }, /* 0de */ - { { 0 }, { 0 } }, /* 0df */ - { { 0 }, { 0 } }, /* 0e0 */ - { { 0 }, { 0 } }, /* 0e1 */ - { { 0 }, { 0 } }, /* 0e2 */ - { { 0 }, { 0 } }, /* 0e3 */ - { { 0 }, { 0 } }, /* 0e4 */ - { { 0 }, { 0 } }, /* 0e5 */ - { { 0 }, { 0 } }, /* 0e6 */ - { { 0 }, { 0 } }, /* 0e7 */ - { { 0 }, { 0 } }, /* 0e8 */ - { { 0 }, { 0 } }, /* 0e9 */ - { { 0 }, { 0 } }, /* 0ea */ - { { 0 }, { 0 } }, /* 0eb */ - { { 0 }, { 0 } }, /* 0ec */ - { { 0 }, { 0 } }, /* 0ed */ - { { 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, /* 0ef */ - { { 0 }, { 0 } }, /* 0f0 */ - { { 0 }, { 0 } }, /* 0f1 */ - { { 0 }, { 0 } }, /* 0f2 */ - { { 0 }, { 0 } }, /* 0f3 */ - { { 0 }, { 0 } }, /* 0f4 */ - { { 0 }, { 0 } }, /* 0f5 */ - { { 0 }, { 0 } }, /* 0f6 */ - { { 0 }, { 0 } }, /* 0f7 */ - { { 0 }, { 0 } }, /* 0f8 */ - { { 0 }, { 0 } }, /* 0f9 */ - { { 0 }, { 0 } }, /* 0fa */ - { { 0 }, { 0 } }, /* 0fb */ - { { 0 }, { 0 } }, /* 0fc */ - { { 0 }, { 0 } }, /* 0fd */ - { { 0 }, { 0 } }, /* 0fe */ - { { 0 }, { 0 } }, /* 0ff */ - { { 0 }, { 0 } }, /* 100 */ - { { 0 }, { 0 } }, /* 101 */ - { { 0 }, { 0 } }, /* 102 */ - { { 0 }, { 0 } }, /* 103 */ - { { 0 }, { 0 } }, /* 104 */ - { { 0 }, { 0 } }, /* 105 */ - { { 0 }, { 0 } }, /* 106 */ - { { 0 }, { 0 } }, /* 107 */ - { { 0 }, { 0 } }, /* 108 */ - { { 0 }, { 0 } }, /* 109 */ - { { 0 }, { 0 } }, /* 10a */ - { { 0 }, { 0 } }, /* 10b */ - { { 0 }, { 0 } }, /* 10c */ - { { 0 }, { 0 } }, /* 10d */ - { { 0 }, { 0 } }, /* 10e */ - { { 0 }, { 0 } }, /* 10f */ - { { 0 }, { 0 } }, /* 110 */ - { { 0 }, { 0 } }, /* 111 */ - { { 0 }, { 0 } }, /* 112 */ - { { 0 }, { 0 } }, /* 113 */ - { { 0 }, { 0 } }, /* 114 */ - { { 0 }, { 0 } }, /* 115 */ - { { 0 }, { 0 } }, /* 116 */ - { { 0 }, { 0 } }, /* 117 */ - { { 0 }, { 0 } }, /* 118 */ - { { 0 }, { 0 } }, /* 119 */ - { { 0 }, { 0 } }, /* 11a */ - { { 0 }, { 0 } }, /* 11b */ - { { 0x1c, 0 }, { 0x9c, 0 } }, /* 11c */ - { { 0x1d, 0 }, { 0x9d, 0 } }, /* 11d */ - { { 0 }, { 0 } }, /* 11e */ - { { 0 }, { 0 } }, /* 11f */ - { { 0 }, { 0 } }, /* 120 */ - { { 0 }, { 0 } }, /* 121 */ - { { 0 }, { 0 } }, /* 122 */ - { { 0 }, { 0 } }, /* 123 */ - { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, /* 125 */ - { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, /* 127 */ - { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, /* 129 */ - { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, /* 12b */ - { { 0 }, { 0 } }, /* 12c */ - { { 0 }, { 0 } }, /* 12d */ - { { 0 }, { 0 } }, /* 12e */ - { { 0 }, { 0 } }, /* 12f */ - { { 0 }, { 0 } }, /* 130 */ - { { 0 }, { 0 } }, /* 131 */ - { { 0 }, { 0 } }, /* 132 */ - { { 0 }, { 0 } }, /* 133 */ - { { 0 }, { 0 } }, /* 134 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 135 */ - { { 0 }, { 0 } }, /* 136 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 137 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 138 */ - { { 0 }, { 0 } }, /* 139 */ - { { 0 }, { 0 } }, /* 13a */ - { { 0 }, { 0 } }, /* 13b */ - { { 0 }, { 0 } }, /* 13c */ - { { 0 }, { 0 } }, /* 13d */ - { { 0 }, { 0 } }, /* 13e */ - { { 0 }, { 0 } }, /* 13f */ - { { 0 }, { 0 } }, /* 140 */ - { { 0 }, { 0 } }, /* 141 */ - { { 0 }, { 0 } }, /* 142 */ - { { 0 }, { 0 } }, /* 143 */ - { { 0 }, { 0 } }, /* 144 */ - { { 0 }, { 0 } }, /* 145 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 146 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 147 */ - { { 0x48, 0 }, { 0xc8, 0 } }, /* 148 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 149 */ - { { 0 }, { 0 } }, /* 14a */ - { { 0x4b, 0 }, { 0xcb, 0 } }, /* 14b */ - { { 0 }, { 0 } }, /* 14c */ - { { 0x4d, 0 }, { 0xcd, 0 } }, /* 14d */ - { { 0 }, { 0 } }, /* 14e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14f */ - { { 0x50, 0 }, { 0xd0, 0 } }, /* 150 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 151 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 152 */ - { { 0x53, 0 }, { 0xd3, 0 } }, /* 153 */ - { { 0 }, { 0 } }, /* 154 */ - { { 0 }, { 0 } }, /* 155 */ - { { 0 }, { 0 } }, /* 156 */ - { { 0 }, { 0 } }, /* 157 */ - { { 0 }, { 0 } }, /* 158 */ - { { 0 }, { 0 } }, /* 159 */ - { { 0 }, { 0 } }, /* 15a */ - { { 0 }, { 0 } }, /* 15b */ - { { 0 }, { 0 } }, /* 15c */ - { { 0 }, { 0 } }, /* 15d */ - { { 0 }, { 0 } }, /* 15e */ - { { 0 }, { 0 } }, /* 15f */ - { { 0 }, { 0 } }, /* 160 */ - { { 0 }, { 0 } }, /* 161 */ - { { 0 }, { 0 } }, /* 162 */ - { { 0 }, { 0 } }, /* 163 */ - { { 0 }, { 0 } }, /* 164 */ - { { 0 }, { 0 } }, /* 165 */ - { { 0 }, { 0 } }, /* 166 */ - { { 0 }, { 0 } }, /* 167 */ - { { 0 }, { 0 } }, /* 168 */ - { { 0 }, { 0 } }, /* 169 */ - { { 0 }, { 0 } }, /* 16a */ - { { 0 }, { 0 } }, /* 16b */ - { { 0 }, { 0 } }, /* 16c */ - { { 0 }, { 0 } }, /* 16d */ - { { 0 }, { 0 } }, /* 16e */ - { { 0 }, { 0 } }, /* 16f */ - { { 0 }, { 0 } }, /* 170 */ - { { 0 }, { 0 } }, /* 171 */ - { { 0 }, { 0 } }, /* 172 */ - { { 0 }, { 0 } }, /* 173 */ - { { 0 }, { 0 } }, /* 174 */ - { { 0 }, { 0 } }, /* 175 */ - { { 0 }, { 0 } }, /* 176 */ - { { 0 }, { 0 } }, /* 177 */ - { { 0 }, { 0 } }, /* 178 */ - { { 0 }, { 0 } }, /* 179 */ - { { 0 }, { 0 } }, /* 17a */ - { { 0 }, { 0 } }, /* 17b */ - { { 0 }, { 0 } }, /* 17c */ - { { 0 }, { 0 } }, /* 17d */ - { { 0 }, { 0 } }, /* 17e */ - { { 0 }, { 0 } }, /* 17f */ - { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, /* 181 */ - { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, /* 183 */ - { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, /* 185 */ - { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, /* 187 */ - { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, /* 189 */ - { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, /* 18b */ - { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, /* 18d */ - { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, /* 18f */ - { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, /* 191 */ - { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, /* 193 */ - { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, /* 195 */ - { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, /* 197 */ - { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, /* 199 */ - { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, /* 19b */ - { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, /* 19d */ - { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, /* 19f */ - { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, /* 1a1 */ - { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, /* 1a3 */ - { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, /* 1a5 */ - { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, /* 1a7 */ - { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, /* 1a9 */ - { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, /* 1ab */ - { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, /* 1ad */ - { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, /* 1af */ - { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, /* 1b1 */ - { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, /* 1b3 */ - { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, /* 1b5 */ - { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, /* 1b7 */ - { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, /* 1b9 */ - { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, /* 1bb */ - { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, /* 1bd */ - { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, /* 1bf */ - { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, /* 1c1 */ - { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, /* 1c3 */ - { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, /* 1c5 */ - { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, /* 1c7 */ - { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, /* 1c9 */ - { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, /* 1cb */ - { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, /* 1cd */ - { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, /* 1cf */ - { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, /* 1d1 */ - { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, /* 1d5 */ - { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, /* 1d7 */ - { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, /* 1d9 */ - { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, /* 1db */ - { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, /* 1dd */ - { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, /* 1df */ - { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, /* 1e1 */ - { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, /* 1e3 */ - { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, /* 1e5 */ - { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, /* 1e7 */ - { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, /* 1e9 */ - { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, /* 1eb */ - { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, /* 1ed */ - { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, /* 1ef */ - { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, /* 1f1 */ - { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, /* 1f3 */ - { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, /* 1f5 */ - { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, /* 1f7 */ - { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, /* 1f9 */ - { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, /* 1fb */ - { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, /* 1fd */ - { { 0 }, { 0 } }, /* 1fe */ - { { 0 }, { 0 } } /* 1ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x01, 0 }, .brk = { 0x81, 0 } }, /* 001 */ + { .mk = { 0x02, 0 }, .brk = { 0x82, 0 } }, /* 002 */ + { .mk = { 0x03, 0 }, .brk = { 0x83, 0 } }, /* 003 */ + { .mk = { 0x04, 0 }, .brk = { 0x84, 0 } }, /* 004 */ + { .mk = { 0x05, 0 }, .brk = { 0x85, 0 } }, /* 005 */ + { .mk = { 0x06, 0 }, .brk = { 0x86, 0 } }, /* 006 */ + { .mk = { 0x07, 0 }, .brk = { 0x87, 0 } }, /* 007 */ + { .mk = { 0x08, 0 }, .brk = { 0x88, 0 } }, /* 008 */ + { .mk = { 0x09, 0 }, .brk = { 0x89, 0 } }, /* 009 */ + { .mk = { 0x0a, 0 }, .brk = { 0x8a, 0 } }, /* 00a */ + { .mk = { 0x0b, 0 }, .brk = { 0x8b, 0 } }, /* 00b */ + { .mk = { 0x0c, 0 }, .brk = { 0x8c, 0 } }, /* 00c */ + { .mk = { 0x0d, 0 }, .brk = { 0x8d, 0 } }, /* 00d */ + { .mk = { 0x0e, 0 }, .brk = { 0x8e, 0 } }, /* 00e */ + { .mk = { 0x0f, 0 }, .brk = { 0x8f, 0 } }, /* 00f */ + { .mk = { 0x10, 0 }, .brk = { 0x90, 0 } }, /* 010 */ + { .mk = { 0x11, 0 }, .brk = { 0x91, 0 } }, /* 011 */ + { .mk = { 0x12, 0 }, .brk = { 0x92, 0 } }, /* 012 */ + { .mk = { 0x13, 0 }, .brk = { 0x93, 0 } }, /* 013 */ + { .mk = { 0x14, 0 }, .brk = { 0x94, 0 } }, /* 014 */ + { .mk = { 0x15, 0 }, .brk = { 0x95, 0 } }, /* 015 */ + { .mk = { 0x16, 0 }, .brk = { 0x96, 0 } }, /* 016 */ + { .mk = { 0x17, 0 }, .brk = { 0x97, 0 } }, /* 017 */ + { .mk = { 0x18, 0 }, .brk = { 0x98, 0 } }, /* 018 */ + { .mk = { 0x19, 0 }, .brk = { 0x99, 0 } }, /* 019 */ + { .mk = { 0x1a, 0 }, .brk = { 0x9a, 0 } }, /* 01a */ + { .mk = { 0x1b, 0 }, .brk = { 0x9b, 0 } }, /* 01b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 01c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 01d */ + { .mk = { 0x1e, 0 }, .brk = { 0x9e, 0 } }, /* 01e */ + { .mk = { 0x1f, 0 }, .brk = { 0x9f, 0 } }, /* 01f */ + { .mk = { 0x20, 0 }, .brk = { 0xa0, 0 } }, /* 020 */ + { .mk = { 0x21, 0 }, .brk = { 0xa1, 0 } }, /* 021 */ + { .mk = { 0x22, 0 }, .brk = { 0xa2, 0 } }, /* 022 */ + { .mk = { 0x23, 0 }, .brk = { 0xa3, 0 } }, /* 023 */ + { .mk = { 0x24, 0 }, .brk = { 0xa4, 0 } }, /* 024 */ + { .mk = { 0x25, 0 }, .brk = { 0xa5, 0 } }, /* 025 */ + { .mk = { 0x26, 0 }, .brk = { 0xa6, 0 } }, /* 026 */ + { .mk = { 0x27, 0 }, .brk = { 0xa7, 0 } }, /* 027 */ + { .mk = { 0x28, 0 }, .brk = { 0xa8, 0 } }, /* 028 */ + { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 029 */ + { .mk = { 0x2a, 0 }, .brk = { 0xaa, 0 } }, /* 02a */ + { .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 02b */ + { .mk = { 0x2c, 0 }, .brk = { 0xac, 0 } }, /* 02c */ + { .mk = { 0x2d, 0 }, .brk = { 0xad, 0 } }, /* 02d */ + { .mk = { 0x2e, 0 }, .brk = { 0xae, 0 } }, /* 02e */ + { .mk = { 0x2f, 0 }, .brk = { 0xaf, 0 } }, /* 02f */ + { .mk = { 0x30, 0 }, .brk = { 0xb0, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 031 */ + { .mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 032 */ + { .mk = { 0x33, 0 }, .brk = { 0xb3, 0 } }, /* 033 */ + { .mk = { 0x34, 0 }, .brk = { 0xb4, 0 } }, /* 034 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 035 */ + { .mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 036 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 037 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 038 */ + { .mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 039 */ + { .mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 03a */ + { .mk = { 0x3b, 0 }, .brk = { 0xbb, 0 } }, /* 03b */ + { .mk = { 0x3c, 0 }, .brk = { 0xbc, 0 } }, /* 03c */ + { .mk = { 0x3d, 0 }, .brk = { 0xbd, 0 } }, /* 03d */ + { .mk = { 0x3e, 0 }, .brk = { 0xbe, 0 } }, /* 03e */ + { .mk = { 0x3f, 0 }, .brk = { 0xbf, 0 } }, /* 03f */ + { .mk = { 0x40, 0 }, .brk = { 0xc0, 0 } }, /* 040 */ + { .mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 041 */ + { .mk = { 0x42, 0 }, .brk = { 0xc2, 0 } }, /* 042 */ + { .mk = { 0x43, 0 }, .brk = { 0xc3, 0 } }, /* 043 */ + { .mk = { 0x44, 0 }, .brk = { 0xc4, 0 } }, /* 044 */ + { .mk = { 0x45, 0 }, .brk = { 0xc5, 0 } }, /* 045 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 046 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 047 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 048 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 049 */ + { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 04a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 04b */ + { .mk = { 0x4c, 0 }, .brk = { 0xcc, 0 } }, /* 04c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 04d */ + { .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 04e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 04f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 050 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 053 */ + { .mk = { 0 }, .brk = { 0 } }, /* 054 */ + { .mk = { 0 }, .brk = { 0 } }, /* 055 */ + { .mk = { 0 }, .brk = { 0 } }, /* 056 */ + { .mk = { 0 }, .brk = { 0 } }, /* 057 */ + { .mk = { 0 }, .brk = { 0 } }, /* 058 */ + { .mk = { 0 }, .brk = { 0 } }, /* 059 */ + { .mk = { 0 }, .brk = { 0 } }, /* 05a */ + { .mk = { 0 }, .brk = { 0 } }, /* 05b */ + { .mk = { 0 }, .brk = { 0 } }, /* 05c */ + { .mk = { 0 }, .brk = { 0 } }, /* 05d */ + { .mk = { 0 }, .brk = { 0 } }, /* 05e */ + { .mk = { 0 }, .brk = { 0 } }, /* 05f */ + { .mk = { 0 }, .brk = { 0 } }, /* 060 */ + { .mk = { 0 }, .brk = { 0 } }, /* 061 */ + { .mk = { 0 }, .brk = { 0 } }, /* 062 */ + { .mk = { 0 }, .brk = { 0 } }, /* 063 */ + { .mk = { 0 }, .brk = { 0 } }, /* 064 */ + { .mk = { 0 }, .brk = { 0 } }, /* 065 */ + { .mk = { 0 }, .brk = { 0 } }, /* 066 */ + { .mk = { 0 }, .brk = { 0 } }, /* 067 */ + { .mk = { 0 }, .brk = { 0 } }, /* 068 */ + { .mk = { 0 }, .brk = { 0 } }, /* 069 */ + { .mk = { 0 }, .brk = { 0 } }, /* 06a */ + { .mk = { 0 }, .brk = { 0 } }, /* 06b */ + { .mk = { 0 }, .brk = { 0 } }, /* 06c */ + { .mk = { 0 }, .brk = { 0 } }, /* 06d */ + { .mk = { 0 }, .brk = { 0 } }, /* 06e */ + { .mk = { 0 }, .brk = { 0 } }, /* 06f */ + { .mk = { 0 }, .brk = { 0 } }, /* 070 */ + { .mk = { 0 }, .brk = { 0 } }, /* 071 */ + { .mk = { 0 }, .brk = { 0 } }, /* 072 */ + { .mk = { 0 }, .brk = { 0 } }, /* 073 */ + { .mk = { 0 }, .brk = { 0 } }, /* 074 */ + { .mk = { 0 }, .brk = { 0 } }, /* 075 */ + { .mk = { 0 }, .brk = { 0 } }, /* 076 */ + { .mk = { 0 }, .brk = { 0 } }, /* 077 */ + { .mk = { 0 }, .brk = { 0 } }, /* 078 */ + { .mk = { 0 }, .brk = { 0 } }, /* 079 */ + { .mk = { 0 }, .brk = { 0 } }, /* 07a */ + { .mk = { 0 }, .brk = { 0 } }, /* 07b */ + { .mk = { 0 }, .brk = { 0 } }, /* 07c */ + { .mk = { 0 }, .brk = { 0 } }, /* 07d */ + { .mk = { 0 }, .brk = { 0 } }, /* 07e */ + { .mk = { 0 }, .brk = { 0 } }, /* 07f */ + { .mk = { 0 }, .brk = { 0 } }, /* 080 */ + { .mk = { 0 }, .brk = { 0 } }, /* 081 */ + { .mk = { 0 }, .brk = { 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0 }, .brk = { 0 } }, /* 085 */ + { .mk = { 0 }, .brk = { 0 } }, /* 086 */ + { .mk = { 0 }, .brk = { 0 } }, /* 087 */ + { .mk = { 0 }, .brk = { 0 } }, /* 088 */ + { .mk = { 0 }, .brk = { 0 } }, /* 089 */ + { .mk = { 0 }, .brk = { 0 } }, /* 08a */ + { .mk = { 0 }, .brk = { 0 } }, /* 08b */ + { .mk = { 0 }, .brk = { 0 } }, /* 08c */ + { .mk = { 0 }, .brk = { 0 } }, /* 08d */ + { .mk = { 0 }, .brk = { 0 } }, /* 08e */ + { .mk = { 0 }, .brk = { 0 } }, /* 08f */ + { .mk = { 0 }, .brk = { 0 } }, /* 090 */ + { .mk = { 0 }, .brk = { 0 } }, /* 091 */ + { .mk = { 0 }, .brk = { 0 } }, /* 092 */ + { .mk = { 0 }, .brk = { 0 } }, /* 093 */ + { .mk = { 0 }, .brk = { 0 } }, /* 094 */ + { .mk = { 0 }, .brk = { 0 } }, /* 095 */ + { .mk = { 0 }, .brk = { 0 } }, /* 096 */ + { .mk = { 0 }, .brk = { 0 } }, /* 097 */ + { .mk = { 0 }, .brk = { 0 } }, /* 098 */ + { .mk = { 0 }, .brk = { 0 } }, /* 099 */ + { .mk = { 0 }, .brk = { 0 } }, /* 09a */ + { .mk = { 0 }, .brk = { 0 } }, /* 09b */ + { .mk = { 0 }, .brk = { 0 } }, /* 09c */ + { .mk = { 0 }, .brk = { 0 } }, /* 09d */ + { .mk = { 0 }, .brk = { 0 } }, /* 09e */ + { .mk = { 0 }, .brk = { 0 } }, /* 09f */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 0af */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0be */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0da */ + { .mk = { 0 }, .brk = { 0 } }, /* 0db */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0de */ + { .mk = { 0 }, .brk = { 0 } }, /* 0df */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 0eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fe */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 100 */ + { .mk = { 0 }, .brk = { 0 } }, /* 101 */ + { .mk = { 0 }, .brk = { 0 } }, /* 102 */ + { .mk = { 0 }, .brk = { 0 } }, /* 103 */ + { .mk = { 0 }, .brk = { 0 } }, /* 104 */ + { .mk = { 0 }, .brk = { 0 } }, /* 105 */ + { .mk = { 0 }, .brk = { 0 } }, /* 106 */ + { .mk = { 0 }, .brk = { 0 } }, /* 107 */ + { .mk = { 0 }, .brk = { 0 } }, /* 108 */ + { .mk = { 0 }, .brk = { 0 } }, /* 109 */ + { .mk = { 0 }, .brk = { 0 } }, /* 10a */ + { .mk = { 0 }, .brk = { 0 } }, /* 10b */ + { .mk = { 0 }, .brk = { 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = { 0 }, .brk = { 0 } }, /* 10e */ + { .mk = { 0 }, .brk = { 0 } }, /* 10f */ + { .mk = { 0 }, .brk = { 0 } }, /* 110 */ + { .mk = { 0 }, .brk = { 0 } }, /* 111 */ + { .mk = { 0 }, .brk = { 0 } }, /* 112 */ + { .mk = { 0 }, .brk = { 0 } }, /* 113 */ + { .mk = { 0 }, .brk = { 0 } }, /* 114 */ + { .mk = { 0 }, .brk = { 0 } }, /* 115 */ + { .mk = { 0 }, .brk = { 0 } }, /* 116 */ + { .mk = { 0 }, .brk = { 0 } }, /* 117 */ + { .mk = { 0 }, .brk = { 0 } }, /* 118 */ + { .mk = { 0 }, .brk = { 0 } }, /* 119 */ + { .mk = { 0 }, .brk = { 0 } }, /* 11a */ + { .mk = { 0 }, .brk = { 0 } }, /* 11b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 11c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 11d */ + { .mk = { 0 }, .brk = { 0 } }, /* 11e */ + { .mk = { 0 }, .brk = { 0 } }, /* 11f */ + { .mk = { 0 }, .brk = { 0 } }, /* 120 */ + { .mk = { 0 }, .brk = { 0 } }, /* 121 */ + { .mk = { 0 }, .brk = { 0 } }, /* 122 */ + { .mk = { 0 }, .brk = { 0 } }, /* 123 */ + { .mk = { 0 }, .brk = { 0 } }, /* 124 */ + { .mk = { 0 }, .brk = { 0 } }, /* 125 */ + { .mk = { 0 }, .brk = { 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = { 0 }, .brk = { 0 } }, /* 12c */ + { .mk = { 0 }, .brk = { 0 } }, /* 12d */ + { .mk = { 0 }, .brk = { 0 } }, /* 12e */ + { .mk = { 0 }, .brk = { 0 } }, /* 12f */ + { .mk = { 0 }, .brk = { 0 } }, /* 130 */ + { .mk = { 0 }, .brk = { 0 } }, /* 131 */ + { .mk = { 0 }, .brk = { 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = { 0 }, .brk = { 0 } }, /* 134 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 137 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 138 */ + { .mk = { 0 }, .brk = { 0 } }, /* 139 */ + { .mk = { 0 }, .brk = { 0 } }, /* 13a */ + { .mk = { 0 }, .brk = { 0 } }, /* 13b */ + { .mk = { 0 }, .brk = { 0 } }, /* 13c */ + { .mk = { 0 }, .brk = { 0 } }, /* 13d */ + { .mk = { 0 }, .brk = { 0 } }, /* 13e */ + { .mk = { 0 }, .brk = { 0 } }, /* 13f */ + { .mk = { 0 }, .brk = { 0 } }, /* 140 */ + { .mk = { 0 }, .brk = { 0 } }, /* 141 */ + { .mk = { 0 }, .brk = { 0 } }, /* 142 */ + { .mk = { 0 }, .brk = { 0 } }, /* 143 */ + { .mk = { 0 }, .brk = { 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 146 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 147 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 148 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 14b */ + { .mk = { 0 }, .brk = { 0 } }, /* 14c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 14d */ + { .mk = { 0 }, .brk = { 0 } }, /* 14e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 14f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 150 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 151 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 152 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 153 */ + { .mk = { 0 }, .brk = { 0 } }, /* 154 */ + { .mk = { 0 }, .brk = { 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = { 0 }, .brk = { 0 } }, /* 157 */ + { .mk = { 0 }, .brk = { 0 } }, /* 158 */ + { .mk = { 0 }, .brk = { 0 } }, /* 159 */ + { .mk = { 0 }, .brk = { 0 } }, /* 15a */ + { .mk = { 0 }, .brk = { 0 } }, /* 15b */ + { .mk = { 0 }, .brk = { 0 } }, /* 15c */ + { .mk = { 0 }, .brk = { 0 } }, /* 15d */ + { .mk = { 0 }, .brk = { 0 } }, /* 15e */ + { .mk = { 0 }, .brk = { 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = { 0 }, .brk = { 0 } }, /* 161 */ + { .mk = { 0 }, .brk = { 0 } }, /* 162 */ + { .mk = { 0 }, .brk = { 0 } }, /* 163 */ + { .mk = { 0 }, .brk = { 0 } }, /* 164 */ + { .mk = { 0 }, .brk = { 0 } }, /* 165 */ + { .mk = { 0 }, .brk = { 0 } }, /* 166 */ + { .mk = { 0 }, .brk = { 0 } }, /* 167 */ + { .mk = { 0 }, .brk = { 0 } }, /* 168 */ + { .mk = { 0 }, .brk = { 0 } }, /* 169 */ + { .mk = { 0 }, .brk = { 0 } }, /* 16a */ + { .mk = { 0 }, .brk = { 0 } }, /* 16b */ + { .mk = { 0 }, .brk = { 0 } }, /* 16c */ + { .mk = { 0 }, .brk = { 0 } }, /* 16d */ + { .mk = { 0 }, .brk = { 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = { 0 }, .brk = { 0 } }, /* 170 */ + { .mk = { 0 }, .brk = { 0 } }, /* 171 */ + { .mk = { 0 }, .brk = { 0 } }, /* 172 */ + { .mk = { 0 }, .brk = { 0 } }, /* 173 */ + { .mk = { 0 }, .brk = { 0 } }, /* 174 */ + { .mk = { 0 }, .brk = { 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = { 0 }, .brk = { 0 } }, /* 177 */ + { .mk = { 0 }, .brk = { 0 } }, /* 178 */ + { .mk = { 0 }, .brk = { 0 } }, /* 179 */ + { .mk = { 0 }, .brk = { 0 } }, /* 17a */ + { .mk = { 0 }, .brk = { 0 } }, /* 17b */ + { .mk = { 0 }, .brk = { 0 } }, /* 17c */ + { .mk = { 0 }, .brk = { 0 } }, /* 17d */ + { .mk = { 0 }, .brk = { 0 } }, /* 17e */ + { .mk = { 0 }, .brk = { 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fe */ + { .mk = { 0 }, .brk = { 0 } } /* 1ff */ // clang-format on }; diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index a00e7d8e8..530362b89 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -2350,518 +2350,518 @@ ams_read(uint16_t port, void *priv) static const scancode scancode_pc200[512] = { // clang-format off - { { 0 }, { 0 } }, /* 000 */ - { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ - { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ - { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ - { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ - { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ - { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ - { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ - { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ - { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ - { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ - { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ - { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ - { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ - { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ - { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ - { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ - { { 0x12, 0 }, { 0x92, 0 } }, /* 012 */ - { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ - { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ - { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ - { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ - { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ - { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ - { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ - { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ - { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ - { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ - { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ - { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ - { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ - { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ - { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ - { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ - { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ - { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ - { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ - { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ - { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ - { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ - { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ - { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ - { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ - { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ - { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ - { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ - { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ - { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ - { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ - { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ - { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ - { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ - { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ - { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ - { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ - { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ - { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ - { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ - { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ - { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ - { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ - { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ - { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ - { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ - { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ - { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ - { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ - { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ - { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ - { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ - { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ - { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ - { { 0x54, 0 }, { 0xd4, 0 } }, /* 054 */ - { { 0x55, 0 }, { 0xd5, 0 } }, /* 055 */ - { { 0x56, 0 }, { 0xd6, 0 } }, /* 056 */ - { { 0x57, 0 }, { 0xd7, 0 } }, /* 057 */ - { { 0x58, 0 }, { 0xd8, 0 } }, /* 058 */ - { { 0x59, 0 }, { 0xd9, 0 } }, /* 059 */ - { { 0x5a, 0 }, { 0xda, 0 } }, /* 05a */ - { { 0x5b, 0 }, { 0xdb, 0 } }, /* 05b */ - { { 0x5c, 0 }, { 0xdc, 0 } }, /* 05c */ - { { 0x5d, 0 }, { 0xdd, 0 } }, /* 05d */ - { { 0x5e, 0 }, { 0xde, 0 } }, /* 05e */ - { { 0x5f, 0 }, { 0xdf, 0 } }, /* 05f */ - { { 0x60, 0 }, { 0xe0, 0 } }, /* 060 */ - { { 0x61, 0 }, { 0xe1, 0 } }, /* 061 */ - { { 0x62, 0 }, { 0xe2, 0 } }, /* 062 */ - { { 0x63, 0 }, { 0xe3, 0 } }, /* 063 */ - { { 0x64, 0 }, { 0xe4, 0 } }, /* 064 */ - { { 0x65, 0 }, { 0xe5, 0 } }, /* 065 */ - { { 0x66, 0 }, { 0xe6, 0 } }, /* 066 */ - { { 0x67, 0 }, { 0xe7, 0 } }, /* 067 */ - { { 0x68, 0 }, { 0xe8, 0 } }, /* 068 */ - { { 0x69, 0 }, { 0xe9, 0 } }, /* 069 */ - { { 0x6a, 0 }, { 0xea, 0 } }, /* 06a */ - { { 0x6b, 0 }, { 0xeb, 0 } }, /* 06b */ - { { 0x6c, 0 }, { 0xec, 0 } }, /* 06c */ - { { 0x6d, 0 }, { 0xed, 0 } }, /* 06d */ - { { 0x6e, 0 }, { 0xee, 0 } }, /* 06e */ - { { 0x6f, 0 }, { 0xef, 0 } }, /* 06f */ - { { 0x70, 0 }, { 0xf0, 0 } }, /* 070 */ - { { 0x71, 0 }, { 0xf1, 0 } }, /* 071 */ - { { 0x72, 0 }, { 0xf2, 0 } }, /* 072 */ - { { 0x73, 0 }, { 0xf3, 0 } }, /* 073 */ - { { 0x74, 0 }, { 0xf4, 0 } }, /* 074 */ - { { 0x75, 0 }, { 0xf5, 0 } }, /* 075 */ - { { 0x76, 0 }, { 0xf6, 0 } }, /* 076 */ - { { 0x77, 0 }, { 0xf7, 0 } }, /* 077 */ - { { 0x78, 0 }, { 0xf8, 0 } }, /* 078 */ - { { 0x79, 0 }, { 0xf9, 0 } }, /* 079 */ - { { 0x7a, 0 }, { 0xfa, 0 } }, /* 07a */ - { { 0x7b, 0 }, { 0xfb, 0 } }, /* 07b */ - { { 0x7c, 0 }, { 0xfc, 0 } }, /* 07c */ - { { 0x7d, 0 }, { 0xfd, 0 } }, /* 07d */ - { { 0x7e, 0 }, { 0xfe, 0 } }, /* 07e */ - { { 0x7f, 0 }, { 0xff, 0 } }, /* 07f */ - { { 0x80, 0 }, { 0 } }, /* 080 */ - { { 0x81, 0 }, { 0 } }, /* 081 */ - { { 0x82, 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, /* 083 */ - { { 0 }, { 0 } }, /* 084 */ - { { 0x85, 0 }, { 0 } }, /* 085 */ - { { 0x86, 0 }, { 0 } }, /* 086 */ - { { 0x87, 0 }, { 0 } }, /* 087 */ - { { 0x88, 0 }, { 0 } }, /* 088 */ - { { 0x89, 0 }, { 0 } }, /* 089 */ - { { 0x8a, 0 }, { 0 } }, /* 08a */ - { { 0x8b, 0 }, { 0 } }, /* 08b */ - { { 0x8c, 0 }, { 0 } }, /* 08c */ - { { 0x8d, 0 }, { 0 } }, /* 08d */ - { { 0x8e, 0 }, { 0 } }, /* 08e */ - { { 0x8f, 0 }, { 0 } }, /* 08f */ - { { 0x90, 0 }, { 0 } }, /* 090 */ - { { 0x91, 0 }, { 0 } }, /* 091 */ - { { 0x92, 0 }, { 0 } }, /* 092 */ - { { 0x93, 0 }, { 0 } }, /* 093 */ - { { 0x94, 0 }, { 0 } }, /* 094 */ - { { 0x95, 0 }, { 0 } }, /* 095 */ - { { 0x96, 0 }, { 0 } }, /* 096 */ - { { 0x97, 0 }, { 0 } }, /* 097 */ - { { 0x98, 0 }, { 0 } }, /* 098 */ - { { 0x99, 0 }, { 0 } }, /* 099 */ - { { 0x9a, 0 }, { 0 } }, /* 09a */ - { { 0x9b, 0 }, { 0 } }, /* 09b */ - { { 0x9c, 0 }, { 0 } }, /* 09c */ - { { 0x9d, 0 }, { 0 } }, /* 09d */ - { { 0x9e, 0 }, { 0 } }, /* 09e */ - { { 0x9f, 0 }, { 0 } }, /* 09f */ - { { 0xa0, 0 }, { 0 } }, /* 0a0 */ - { { 0xa1, 0 }, { 0 } }, /* 0a1 */ - { { 0xa2, 0 }, { 0 } }, /* 0a2 */ - { { 0xa3, 0 }, { 0 } }, /* 0a3 */ - { { 0xa4, 0 }, { 0 } }, /* 0a4 */ - { { 0xa5, 0 }, { 0 } }, /* 0a5 */ - { { 0xa6, 0 }, { 0 } }, /* 0a6 */ - { { 0xa7, 0 }, { 0 } }, /* 0a7 */ - { { 0xa8, 0 }, { 0 } }, /* 0a8 */ - { { 0xa9, 0 }, { 0 } }, /* 0a9 */ - { { 0xaa, 0 }, { 0 } }, /* 0aa */ - { { 0xab, 0 }, { 0 } }, /* 0ab */ - { { 0xac, 0 }, { 0 } }, /* 0ac */ - { { 0xad, 0 }, { 0 } }, /* 0ad */ - { { 0xae, 0 }, { 0 } }, /* 0ae */ - { { 0xaf, 0 }, { 0 } }, /* 0af */ - { { 0xb0, 0 }, { 0 } }, /* 0b0 */ - { { 0xb1, 0 }, { 0 } }, /* 0b1 */ - { { 0xb2, 0 }, { 0 } }, /* 0b2 */ - { { 0xb3, 0 }, { 0 } }, /* 0b3 */ - { { 0xb4, 0 }, { 0 } }, /* 0b4 */ - { { 0xb5, 0 }, { 0 } }, /* 0b5 */ - { { 0xb6, 0 }, { 0 } }, /* 0b6 */ - { { 0xb7, 0 }, { 0 } }, /* 0b7 */ - { { 0xb8, 0 }, { 0 } }, /* 0b8 */ - { { 0xb9, 0 }, { 0 } }, /* 0b9 */ - { { 0xba, 0 }, { 0 } }, /* 0ba */ - { { 0xbb, 0 }, { 0 } }, /* 0bb */ - { { 0xbc, 0 }, { 0 } }, /* 0bc */ - { { 0xbd, 0 }, { 0 } }, /* 0bd */ - { { 0xbe, 0 }, { 0 } }, /* 0be */ - { { 0xbf, 0 }, { 0 } }, /* 0bf */ - { { 0xc0, 0 }, { 0 } }, /* 0c0 */ - { { 0xc1, 0 }, { 0 } }, /* 0c1 */ - { { 0xc2, 0 }, { 0 } }, /* 0c2 */ - { { 0xc3, 0 }, { 0 } }, /* 0c3 */ - { { 0xc4, 0 }, { 0 } }, /* 0c4 */ - { { 0xc5, 0 }, { 0 } }, /* 0c5 */ - { { 0xc6, 0 }, { 0 } }, /* 0c6 */ - { { 0xc7, 0 }, { 0 } }, /* 0c7 */ - { { 0xc8, 0 }, { 0 } }, /* 0c8 */ - { { 0xc9, 0 }, { 0 } }, /* 0c9 */ - { { 0xca, 0 }, { 0 } }, /* 0ca */ - { { 0xcb, 0 }, { 0 } }, /* 0cb */ - { { 0xcc, 0 }, { 0 } }, /* 0cc */ - { { 0xcd, 0 }, { 0 } }, /* 0cd */ - { { 0xce, 0 }, { 0 } }, /* 0ce */ - { { 0xcf, 0 }, { 0 } }, /* 0cf */ - { { 0xd0, 0 }, { 0 } }, /* 0d0 */ - { { 0xd1, 0 }, { 0 } }, /* 0d1 */ - { { 0xd2, 0 }, { 0 } }, /* 0d2 */ - { { 0xd3, 0 }, { 0 } }, /* 0d3 */ - { { 0xd4, 0 }, { 0 } }, /* 0d4 */ - { { 0xd5, 0 }, { 0 } }, /* 0d5 */ - { { 0xd6, 0 }, { 0 } }, /* 0d6 */ - { { 0xd7, 0 }, { 0 } }, /* 0d7 */ - { { 0xd8, 0 }, { 0 } }, /* 0d8 */ - { { 0xd9, 0 }, { 0 } }, /* 0d9 */ - { { 0xda, 0 }, { 0 } }, /* 0da */ - { { 0xdb, 0 }, { 0 } }, /* 0db */ - { { 0xdc, 0 }, { 0 } }, /* 0dc */ - { { 0xdd, 0 }, { 0 } }, /* 0dd */ - { { 0xde, 0 }, { 0 } }, /* 0de */ - { { 0xdf, 0 }, { 0 } }, /* 0df */ - { { 0xe0, 0 }, { 0 } }, /* 0e0 */ - { { 0xe1, 0 }, { 0 } }, /* 0e1 */ - { { 0xe2, 0 }, { 0 } }, /* 0e2 */ - { { 0xe3, 0 }, { 0 } }, /* 0e3 */ - { { 0xe4, 0 }, { 0 } }, /* 0e4 */ - { { 0xe5, 0 }, { 0 } }, /* 0e5 */ - { { 0xe6, 0 }, { 0 } }, /* 0e6 */ - { { 0xe7, 0 }, { 0 } }, /* 0e7 */ - { { 0xe8, 0 }, { 0 } }, /* 0e8 */ - { { 0xe9, 0 }, { 0 } }, /* 0e9 */ - { { 0xea, 0 }, { 0 } }, /* 0ea */ - { { 0xeb, 0 }, { 0 } }, /* 0eb */ - { { 0xec, 0 }, { 0 } }, /* 0ec */ - { { 0xed, 0 }, { 0 } }, /* 0ed */ - { { 0xee, 0 }, { 0 } }, /* 0ee */ - { { 0xef, 0 }, { 0 } }, /* 0ef */ - { { 0 }, { 0 } }, /* 0f0 */ - { { 0xf1, 0 }, { 0 } }, /* 0f1 */ - { { 0xf2, 0 }, { 0 } }, /* 0f2 */ - { { 0xf3, 0 }, { 0 } }, /* 0f3 */ - { { 0xf4, 0 }, { 0 } }, /* 0f4 */ - { { 0xf5, 0 }, { 0 } }, /* 0f5 */ - { { 0xf6, 0 }, { 0 } }, /* 0f6 */ - { { 0xf7, 0 }, { 0 } }, /* 0f7 */ - { { 0xf8, 0 }, { 0 } }, /* 0f8 */ - { { 0xf9, 0 }, { 0 } }, /* 0f9 */ - { { 0xfa, 0 }, { 0 } }, /* 0fa */ - { { 0xfb, 0 }, { 0 } }, /* 0fb */ - { { 0xfc, 0 }, { 0 } }, /* 0fc */ - { { 0xfd, 0 }, { 0 } }, /* 0fd */ - { { 0xfe, 0 }, { 0 } }, /* 0fe */ - { { 0xff, 0 }, { 0 } }, /* 0ff */ - { { 0xe1, 0x1d, 0 }, { 0xe1, 0x9d, 0 } }, /* 100 */ - { { 0xe0, 0x01, 0 }, { 0xe0, 0x81, 0 } }, /* 101 */ - { { 0xe0, 0x02, 0 }, { 0xe0, 0x82, 0 } }, /* 102 */ - { { 0xe0, 0x03, 0 }, { 0xe0, 0x83, 0 } }, /* 103 */ - { { 0xe0, 0x04, 0 }, { 0xe0, 0x84, 0 } }, /* 104 */ - { { 0xe0, 0x05, 0 }, { 0xe0, 0x85, 0 } }, /* 105 */ - { { 0xe0, 0x06, 0 }, { 0xe0, 0x86, 0 } }, /* 106 */ - { { 0xe0, 0x07, 0 }, { 0xe0, 0x87, 0 } }, /* 107 */ - { { 0xe0, 0x08, 0 }, { 0xe0, 0x88, 0 } }, /* 108 */ - { { 0xe0, 0x09, 0 }, { 0xe0, 0x89, 0 } }, /* 109 */ - { { 0xe0, 0x0a, 0 }, { 0xe0, 0x8a, 0 } }, /* 10a */ - { { 0xe0, 0x0b, 0 }, { 0xe0, 0x8b, 0 } }, /* 10b */ - { { 0xe0, 0x0c, 0 }, { 0xe0, 0x8c, 0 } }, /* 10c */ - { { 0 }, { 0 } }, /* 10d */ - { { 0xe0, 0x0e, 0 }, { 0xe0, 0x8e, 0 } }, /* 10e */ - { { 0xe0, 0x0f, 0 }, { 0xe0, 0x8f, 0 } }, /* 10f */ - { { 0xe0, 0x10, 0 }, { 0xe0, 0x90, 0 } }, /* 110 */ - { { 0xe0, 0x11, 0 }, { 0xe0, 0x91, 0 } }, /* 111 */ - { { 0xe0, 0x12, 0 }, { 0xe0, 0x92, 0 } }, /* 112 */ - { { 0xe0, 0x13, 0 }, { 0xe0, 0x93, 0 } }, /* 113 */ - { { 0xe0, 0x14, 0 }, { 0xe0, 0x94, 0 } }, /* 114 */ - { { 0xe0, 0x15, 0 }, { 0xe0, 0x95, 0 } }, /* 115 */ - { { 0xe0, 0x16, 0 }, { 0xe0, 0x96, 0 } }, /* 116 */ - { { 0xe0, 0x17, 0 }, { 0xe0, 0x97, 0 } }, /* 117 */ - { { 0xe0, 0x18, 0 }, { 0xe0, 0x98, 0 } }, /* 118 */ - { { 0xe0, 0x19, 0 }, { 0xe0, 0x99, 0 } }, /* 119 */ - { { 0xe0, 0x1a, 0 }, { 0xe0, 0x9a, 0 } }, /* 11a */ - { { 0xe0, 0x1b, 0 }, { 0xe0, 0x9b, 0 } }, /* 11b */ - { { 0xe0, 0x1c, 0 }, { 0xe0, 0x9c, 0 } }, /* 11c */ - { { 0xe0, 0x1d, 0 }, { 0xe0, 0x9d, 0 } }, /* 11d */ - { { 0xe0, 0x1e, 0 }, { 0xe0, 0x9e, 0 } }, /* 11e */ - { { 0xe0, 0x1f, 0 }, { 0xe0, 0x9f, 0 } }, /* 11f */ - { { 0xe0, 0x20, 0 }, { 0xe0, 0xa0, 0 } }, /* 120 */ - { { 0xe0, 0x21, 0 }, { 0xe0, 0xa1, 0 } }, /* 121 */ - { { 0xe0, 0x22, 0 }, { 0xe0, 0xa2, 0 } }, /* 122 */ - { { 0xe0, 0x23, 0 }, { 0xe0, 0xa3, 0 } }, /* 123 */ - { { 0xe0, 0x24, 0 }, { 0xe0, 0xa4, 0 } }, /* 124 */ - { { 0xe0, 0x25, 0 }, { 0xe0, 0xa5, 0 } }, /* 125 */ - { { 0xe0, 0x26, 0 }, { 0xe0, 0xa6, 0 } }, /* 126 */ - { { 0 }, { 0 } }, /* 127 */ - { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, /* 129 */ - { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, /* 12b */ - { { 0xe0, 0x2c, 0 }, { 0xe0, 0xac, 0 } }, /* 12c */ - { { 0xe0, 0x2d, 0 }, { 0xe0, 0xad, 0 } }, /* 12d */ - { { 0xe0, 0x2e, 0 }, { 0xe0, 0xae, 0 } }, /* 12e */ - { { 0xe0, 0x2f, 0 }, { 0xe0, 0xaf, 0 } }, /* 12f */ - { { 0xe0, 0x30, 0 }, { 0xe0, 0xb0, 0 } }, /* 130 */ - { { 0xe0, 0x31, 0 }, { 0xe0, 0xb1, 0 } }, /* 131 */ - { { 0xe0, 0x32, 0 }, { 0xe0, 0xb2, 0 } }, /* 132 */ - { { 0 }, { 0 } }, /* 133 */ - { { 0xe0, 0x34, 0 }, { 0xe0, 0xb4, 0 } }, /* 134 */ - { { 0xe0, 0x35, 0 }, { 0xe0, 0xb5, 0 } }, /* 135 */ - { { 0 }, { 0 } }, /* 136 */ - { { 0xe0, 0x37, 0 }, { 0xe0, 0xb7, 0 } }, /* 137 */ - { { 0xe0, 0x38, 0 }, { 0xe0, 0xb8, 0 } }, /* 138 */ - { { 0 }, { 0 } }, /* 139 */ - { { 0xe0, 0x3a, 0 }, { 0xe0, 0xba, 0 } }, /* 13a */ - { { 0xe0, 0x3b, 0 }, { 0xe0, 0xbb, 0 } }, /* 13b */ - { { 0xe0, 0x3c, 0 }, { 0xe0, 0xbc, 0 } }, /* 13c */ - { { 0xe0, 0x3d, 0 }, { 0xe0, 0xbd, 0 } }, /* 13d */ - { { 0xe0, 0x3e, 0 }, { 0xe0, 0xbe, 0 } }, /* 13e */ - { { 0xe0, 0x3f, 0 }, { 0xe0, 0xbf, 0 } }, /* 13f */ - { { 0xe0, 0x40, 0 }, { 0xe0, 0xc0, 0 } }, /* 140 */ - { { 0xe0, 0x41, 0 }, { 0xe0, 0xc1, 0 } }, /* 141 */ - { { 0xe0, 0x42, 0 }, { 0xe0, 0xc2, 0 } }, /* 142 */ - { { 0xe0, 0x43, 0 }, { 0xe0, 0xc3, 0 } }, /* 143 */ - { { 0xe0, 0x44, 0 }, { 0xe0, 0xc4, 0 } }, /* 144 */ - { { 0 }, { 0 } }, /* 145 */ - { { 0xe0, 0x46, 0 }, { 0xe0, 0xc6, 0 } }, /* 146 */ - { { 0xe0, 0x47, 0 }, { 0xe0, 0xc7, 0 } }, /* 147 */ - { { 0xe0, 0x48, 0 }, { 0xe0, 0xc8, 0 } }, /* 148 */ - { { 0xe0, 0x49, 0 }, { 0xe0, 0xc9, 0 } }, /* 149 */ - { { 0 }, { 0 } }, /* 14a */ - { { 0xe0, 0x4b, 0 }, { 0xe0, 0xcb, 0 } }, /* 14b */ - { { 0xe0, 0x4c, 0 }, { 0xe0, 0xcc, 0 } }, /* 14c */ - { { 0xe0, 0x4d, 0 }, { 0xe0, 0xcd, 0 } }, /* 14d */ - { { 0xe0, 0x4e, 0 }, { 0xe0, 0xce, 0 } }, /* 14e */ - { { 0xe0, 0x4f, 0 }, { 0xe0, 0xcf, 0 } }, /* 14f */ - { { 0xe0, 0x50, 0 }, { 0xe0, 0xd0, 0 } }, /* 150 */ - { { 0xe0, 0x51, 0 }, { 0xe0, 0xd1, 0 } }, /* 151 */ - { { 0xe0, 0x52, 0 }, { 0xe0, 0xd2, 0 } }, /* 152 */ - { { 0xe0, 0x53, 0 }, { 0xe0, 0xd3, 0 } }, /* 153 */ - { { 0 }, { 0 } }, /* 154 */ - { { 0xe0, 0x55, 0 }, { 0xe0, 0xd5, 0 } }, /* 155 */ - { { 0 }, { 0 } }, /* 156 */ - { { 0xe0, 0x57, 0 }, { 0xe0, 0xd7, 0 } }, /* 157 */ - { { 0xe0, 0x58, 0 }, { 0xe0, 0xd8, 0 } }, /* 158 */ - { { 0xe0, 0x59, 0 }, { 0xe0, 0xd9, 0 } }, /* 159 */ - { { 0xe0, 0x5a, 0 }, { 0xe0, 0xaa, 0 } }, /* 15a */ - { { 0xe0, 0x5b, 0 }, { 0xe0, 0xdb, 0 } }, /* 15b */ - { { 0xe0, 0x5c, 0 }, { 0xe0, 0xdc, 0 } }, /* 15c */ - { { 0xe0, 0x5d, 0 }, { 0xe0, 0xdd, 0 } }, /* 15d */ - { { 0xe0, 0x5e, 0 }, { 0xe0, 0xee, 0 } }, /* 15e */ - { { 0xe0, 0x5f, 0 }, { 0xe0, 0xdf, 0 } }, /* 15f */ - { { 0 }, { 0 } }, /* 160 */ - { { 0xe0, 0x61, 0 }, { 0xe0, 0xe1, 0 } }, /* 161 */ - { { 0xe0, 0x62, 0 }, { 0xe0, 0xe2, 0 } }, /* 162 */ - { { 0xe0, 0x63, 0 }, { 0xe0, 0xe3, 0 } }, /* 163 */ - { { 0xe0, 0x64, 0 }, { 0xe0, 0xe4, 0 } }, /* 164 */ - { { 0xe0, 0x65, 0 }, { 0xe0, 0xe5, 0 } }, /* 165 */ - { { 0xe0, 0x66, 0 }, { 0xe0, 0xe6, 0 } }, /* 166 */ - { { 0xe0, 0x67, 0 }, { 0xe0, 0xe7, 0 } }, /* 167 */ - { { 0xe0, 0x68, 0 }, { 0xe0, 0xe8, 0 } }, /* 168 */ - { { 0xe0, 0x69, 0 }, { 0xe0, 0xe9, 0 } }, /* 169 */ - { { 0xe0, 0x6a, 0 }, { 0xe0, 0xea, 0 } }, /* 16a */ - { { 0xe0, 0x6b, 0 }, { 0xe0, 0xeb, 0 } }, /* 16b */ - { { 0xe0, 0x6c, 0 }, { 0xe0, 0xec, 0 } }, /* 16c */ - { { 0xe0, 0x6d, 0 }, { 0xe0, 0xed, 0 } }, /* 16d */ - { { 0xe0, 0x6e, 0 }, { 0xe0, 0xee, 0 } }, /* 16e */ - { { 0 }, { 0 } }, /* 16f */ - { { 0xe0, 0x70, 0 }, { 0xe0, 0xf0, 0 } }, /* 170 */ - { { 0xe0, 0x71, 0 }, { 0xe0, 0xf1, 0 } }, /* 171 */ - { { 0xe0, 0x72, 0 }, { 0xe0, 0xf2, 0 } }, /* 172 */ - { { 0xe0, 0x73, 0 }, { 0xe0, 0xf3, 0 } }, /* 173 */ - { { 0xe0, 0x74, 0 }, { 0xe0, 0xf4, 0 } }, /* 174 */ - { { 0xe0, 0x75, 0 }, { 0xe0, 0xf5, 0 } }, /* 175 */ - { { 0 }, { 0 } }, /* 176 */ - { { 0xe0, 0x77, 0 }, { 0xe0, 0xf7, 0 } }, /* 177 */ - { { 0xe0, 0x78, 0 }, { 0xe0, 0xf8, 0 } }, /* 178 */ - { { 0xe0, 0x79, 0 }, { 0xe0, 0xf9, 0 } }, /* 179 */ - { { 0xe0, 0x7a, 0 }, { 0xe0, 0xfa, 0 } }, /* 17a */ - { { 0xe0, 0x7b, 0 }, { 0xe0, 0xfb, 0 } }, /* 17b */ - { { 0xe0, 0x7c, 0 }, { 0xe0, 0xfc, 0 } }, /* 17c */ - { { 0xe0, 0x7d, 0 }, { 0xe0, 0xfd, 0 } }, /* 17d */ - { { 0xe0, 0x7e, 0 }, { 0xe0, 0xfe, 0 } }, /* 17e */ - { { 0xe0, 0x7f, 0 }, { 0xe0, 0xff, 0 } }, /* 17f */ - { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, /* 181 */ - { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, /* 183 */ - { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, /* 185 */ - { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, /* 187 */ - { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, /* 189 */ - { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, /* 18b */ - { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, /* 18d */ - { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, /* 18f */ - { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, /* 191 */ - { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, /* 193 */ - { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, /* 195 */ - { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, /* 197 */ - { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, /* 199 */ - { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, /* 19b */ - { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, /* 19d */ - { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, /* 19f */ - { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, /* 1a1 */ - { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, /* 1a3 */ - { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, /* 1a5 */ - { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, /* 1a7 */ - { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, /* 1a9 */ - { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, /* 1ab */ - { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, /* 1ad */ - { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, /* 1af */ - { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, /* 1b1 */ - { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, /* 1b3 */ - { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, /* 1b5 */ - { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, /* 1b7 */ - { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, /* 1b9 */ - { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, /* 1bb */ - { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, /* 1bd */ - { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, /* 1bf */ - { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, /* 1c1 */ - { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, /* 1c3 */ - { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, /* 1c5 */ - { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, /* 1c7 */ - { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, /* 1c9 */ - { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, /* 1cb */ - { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, /* 1cd */ - { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, /* 1cf */ - { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, /* 1d1 */ - { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, /* 1d5 */ - { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, /* 1d7 */ - { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, /* 1d9 */ - { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, /* 1db */ - { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, /* 1dd */ - { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, /* 1df */ - { { 0 }, { 0 } }, /* 1e0 */ - { { 0xe0, 0xe1, 0 }, { 0 } }, /* 1e1 */ - { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, /* 1e3 */ - { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, /* 1e5 */ - { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, /* 1e7 */ - { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, /* 1e9 */ - { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, /* 1eb */ - { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, /* 1ed */ - { { 0xe0, 0xee, 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, /* 1ef */ - { { 0 }, { 0 } }, /* 1f0 */ - { { 0xe0, 0xf1, 0 }, { 0 } }, /* 1f1 */ - { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, /* 1f3 */ - { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, /* 1f5 */ - { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, /* 1f7 */ - { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, /* 1f9 */ - { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, /* 1fb */ - { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, /* 1fd */ - { { 0xe0, 0xfe, 0 }, { 0 } }, /* 1fe */ - { { 0xe0, 0xff, 0 }, { 0 } } /* 1ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x01, 0 }, .brk = { 0x81, 0 } }, /* 001 */ + { .mk = { 0x02, 0 }, .brk = { 0x82, 0 } }, /* 002 */ + { .mk = { 0x03, 0 }, .brk = { 0x83, 0 } }, /* 003 */ + { .mk = { 0x04, 0 }, .brk = { 0x84, 0 } }, /* 004 */ + { .mk = { 0x05, 0 }, .brk = { 0x85, 0 } }, /* 005 */ + { .mk = { 0x06, 0 }, .brk = { 0x86, 0 } }, /* 006 */ + { .mk = { 0x07, 0 }, .brk = { 0x87, 0 } }, /* 007 */ + { .mk = { 0x08, 0 }, .brk = { 0x88, 0 } }, /* 008 */ + { .mk = { 0x09, 0 }, .brk = { 0x89, 0 } }, /* 009 */ + { .mk = { 0x0a, 0 }, .brk = { 0x8a, 0 } }, /* 00a */ + { .mk = { 0x0b, 0 }, .brk = { 0x8b, 0 } }, /* 00b */ + { .mk = { 0x0c, 0 }, .brk = { 0x8c, 0 } }, /* 00c */ + { .mk = { 0x0d, 0 }, .brk = { 0x8d, 0 } }, /* 00d */ + { .mk = { 0x0e, 0 }, .brk = { 0x8e, 0 } }, /* 00e */ + { .mk = { 0x0f, 0 }, .brk = { 0x8f, 0 } }, /* 00f */ + { .mk = { 0x10, 0 }, .brk = { 0x90, 0 } }, /* 010 */ + { .mk = { 0x11, 0 }, .brk = { 0x91, 0 } }, /* 011 */ + { .mk = { 0x12, 0 }, .brk = { 0x92, 0 } }, /* 012 */ + { .mk = { 0x13, 0 }, .brk = { 0x93, 0 } }, /* 013 */ + { .mk = { 0x14, 0 }, .brk = { 0x94, 0 } }, /* 014 */ + { .mk = { 0x15, 0 }, .brk = { 0x95, 0 } }, /* 015 */ + { .mk = { 0x16, 0 }, .brk = { 0x96, 0 } }, /* 016 */ + { .mk = { 0x17, 0 }, .brk = { 0x97, 0 } }, /* 017 */ + { .mk = { 0x18, 0 }, .brk = { 0x98, 0 } }, /* 018 */ + { .mk = { 0x19, 0 }, .brk = { 0x99, 0 } }, /* 019 */ + { .mk = { 0x1a, 0 }, .brk = { 0x9a, 0 } }, /* 01a */ + { .mk = { 0x1b, 0 }, .brk = { 0x9b, 0 } }, /* 01b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 01c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 01d */ + { .mk = { 0x1e, 0 }, .brk = { 0x9e, 0 } }, /* 01e */ + { .mk = { 0x1f, 0 }, .brk = { 0x9f, 0 } }, /* 01f */ + { .mk = { 0x20, 0 }, .brk = { 0xa0, 0 } }, /* 020 */ + { .mk = { 0x21, 0 }, .brk = { 0xa1, 0 } }, /* 021 */ + { .mk = { 0x22, 0 }, .brk = { 0xa2, 0 } }, /* 022 */ + { .mk = { 0x23, 0 }, .brk = { 0xa3, 0 } }, /* 023 */ + { .mk = { 0x24, 0 }, .brk = { 0xa4, 0 } }, /* 024 */ + { .mk = { 0x25, 0 }, .brk = { 0xa5, 0 } }, /* 025 */ + { .mk = { 0x26, 0 }, .brk = { 0xa6, 0 } }, /* 026 */ + { .mk = { 0x27, 0 }, .brk = { 0xa7, 0 } }, /* 027 */ + { .mk = { 0x28, 0 }, .brk = { 0xa8, 0 } }, /* 028 */ + { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 029 */ + { .mk = { 0x2a, 0 }, .brk = { 0xaa, 0 } }, /* 02a */ + { .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 02b */ + { .mk = { 0x2c, 0 }, .brk = { 0xac, 0 } }, /* 02c */ + { .mk = { 0x2d, 0 }, .brk = { 0xad, 0 } }, /* 02d */ + { .mk = { 0x2e, 0 }, .brk = { 0xae, 0 } }, /* 02e */ + { .mk = { 0x2f, 0 }, .brk = { 0xaf, 0 } }, /* 02f */ + { .mk = { 0x30, 0 }, .brk = { 0xb0, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 031 */ + { .mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 032 */ + { .mk = { 0x33, 0 }, .brk = { 0xb3, 0 } }, /* 033 */ + { .mk = { 0x34, 0 }, .brk = { 0xb4, 0 } }, /* 034 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 035 */ + { .mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 036 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 037 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 038 */ + { .mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 039 */ + { .mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 03a */ + { .mk = { 0x3b, 0 }, .brk = { 0xbb, 0 } }, /* 03b */ + { .mk = { 0x3c, 0 }, .brk = { 0xbc, 0 } }, /* 03c */ + { .mk = { 0x3d, 0 }, .brk = { 0xbd, 0 } }, /* 03d */ + { .mk = { 0x3e, 0 }, .brk = { 0xbe, 0 } }, /* 03e */ + { .mk = { 0x3f, 0 }, .brk = { 0xbf, 0 } }, /* 03f */ + { .mk = { 0x40, 0 }, .brk = { 0xc0, 0 } }, /* 040 */ + { .mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 041 */ + { .mk = { 0x42, 0 }, .brk = { 0xc2, 0 } }, /* 042 */ + { .mk = { 0x43, 0 }, .brk = { 0xc3, 0 } }, /* 043 */ + { .mk = { 0x44, 0 }, .brk = { 0xc4, 0 } }, /* 044 */ + { .mk = { 0x45, 0 }, .brk = { 0xc5, 0 } }, /* 045 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 046 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 047 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 048 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 049 */ + { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 04a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 04b */ + { .mk = { 0x4c, 0 }, .brk = { 0xcc, 0 } }, /* 04c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 04d */ + { .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 04e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 04f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 050 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 053 */ + { .mk = { 0x54, 0 }, .brk = { 0xd4, 0 } }, /* 054 */ + { .mk = { 0x55, 0 }, .brk = { 0xd5, 0 } }, /* 055 */ + { .mk = { 0x56, 0 }, .brk = { 0xd6, 0 } }, /* 056 */ + { .mk = { 0x57, 0 }, .brk = { 0xd7, 0 } }, /* 057 */ + { .mk = { 0x58, 0 }, .brk = { 0xd8, 0 } }, /* 058 */ + { .mk = { 0x59, 0 }, .brk = { 0xd9, 0 } }, /* 059 */ + { .mk = { 0x5a, 0 }, .brk = { 0xda, 0 } }, /* 05a */ + { .mk = { 0x5b, 0 }, .brk = { 0xdb, 0 } }, /* 05b */ + { .mk = { 0x5c, 0 }, .brk = { 0xdc, 0 } }, /* 05c */ + { .mk = { 0x5d, 0 }, .brk = { 0xdd, 0 } }, /* 05d */ + { .mk = { 0x5e, 0 }, .brk = { 0xde, 0 } }, /* 05e */ + { .mk = { 0x5f, 0 }, .brk = { 0xdf, 0 } }, /* 05f */ + { .mk = { 0x60, 0 }, .brk = { 0xe0, 0 } }, /* 060 */ + { .mk = { 0x61, 0 }, .brk = { 0xe1, 0 } }, /* 061 */ + { .mk = { 0x62, 0 }, .brk = { 0xe2, 0 } }, /* 062 */ + { .mk = { 0x63, 0 }, .brk = { 0xe3, 0 } }, /* 063 */ + { .mk = { 0x64, 0 }, .brk = { 0xe4, 0 } }, /* 064 */ + { .mk = { 0x65, 0 }, .brk = { 0xe5, 0 } }, /* 065 */ + { .mk = { 0x66, 0 }, .brk = { 0xe6, 0 } }, /* 066 */ + { .mk = { 0x67, 0 }, .brk = { 0xe7, 0 } }, /* 067 */ + { .mk = { 0x68, 0 }, .brk = { 0xe8, 0 } }, /* 068 */ + { .mk = { 0x69, 0 }, .brk = { 0xe9, 0 } }, /* 069 */ + { .mk = { 0x6a, 0 }, .brk = { 0xea, 0 } }, /* 06a */ + { .mk = { 0x6b, 0 }, .brk = { 0xeb, 0 } }, /* 06b */ + { .mk = { 0x6c, 0 }, .brk = { 0xec, 0 } }, /* 06c */ + { .mk = { 0x6d, 0 }, .brk = { 0xed, 0 } }, /* 06d */ + { .mk = { 0x6e, 0 }, .brk = { 0xee, 0 } }, /* 06e */ + { .mk = { 0x6f, 0 }, .brk = { 0xef, 0 } }, /* 06f */ + { .mk = { 0x70, 0 }, .brk = { 0xf0, 0 } }, /* 070 */ + { .mk = { 0x71, 0 }, .brk = { 0xf1, 0 } }, /* 071 */ + { .mk = { 0x72, 0 }, .brk = { 0xf2, 0 } }, /* 072 */ + { .mk = { 0x73, 0 }, .brk = { 0xf3, 0 } }, /* 073 */ + { .mk = { 0x74, 0 }, .brk = { 0xf4, 0 } }, /* 074 */ + { .mk = { 0x75, 0 }, .brk = { 0xf5, 0 } }, /* 075 */ + { .mk = { 0x76, 0 }, .brk = { 0xf6, 0 } }, /* 076 */ + { .mk = { 0x77, 0 }, .brk = { 0xf7, 0 } }, /* 077 */ + { .mk = { 0x78, 0 }, .brk = { 0xf8, 0 } }, /* 078 */ + { .mk = { 0x79, 0 }, .brk = { 0xf9, 0 } }, /* 079 */ + { .mk = { 0x7a, 0 }, .brk = { 0xfa, 0 } }, /* 07a */ + { .mk = { 0x7b, 0 }, .brk = { 0xfb, 0 } }, /* 07b */ + { .mk = { 0x7c, 0 }, .brk = { 0xfc, 0 } }, /* 07c */ + { .mk = { 0x7d, 0 }, .brk = { 0xfd, 0 } }, /* 07d */ + { .mk = { 0x7e, 0 }, .brk = { 0xfe, 0 } }, /* 07e */ + { .mk = { 0x7f, 0 }, .brk = { 0xff, 0 } }, /* 07f */ + { .mk = { 0x80, 0 }, .brk = { 0 } }, /* 080 */ + { .mk = { 0x81, 0 }, .brk = { 0 } }, /* 081 */ + { .mk = { 0x82, 0 }, .brk = { 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0x85, 0 }, .brk = { 0 } }, /* 085 */ + { .mk = { 0x86, 0 }, .brk = { 0 } }, /* 086 */ + { .mk = { 0x87, 0 }, .brk = { 0 } }, /* 087 */ + { .mk = { 0x88, 0 }, .brk = { 0 } }, /* 088 */ + { .mk = { 0x89, 0 }, .brk = { 0 } }, /* 089 */ + { .mk = { 0x8a, 0 }, .brk = { 0 } }, /* 08a */ + { .mk = { 0x8b, 0 }, .brk = { 0 } }, /* 08b */ + { .mk = { 0x8c, 0 }, .brk = { 0 } }, /* 08c */ + { .mk = { 0x8d, 0 }, .brk = { 0 } }, /* 08d */ + { .mk = { 0x8e, 0 }, .brk = { 0 } }, /* 08e */ + { .mk = { 0x8f, 0 }, .brk = { 0 } }, /* 08f */ + { .mk = { 0x90, 0 }, .brk = { 0 } }, /* 090 */ + { .mk = { 0x91, 0 }, .brk = { 0 } }, /* 091 */ + { .mk = { 0x92, 0 }, .brk = { 0 } }, /* 092 */ + { .mk = { 0x93, 0 }, .brk = { 0 } }, /* 093 */ + { .mk = { 0x94, 0 }, .brk = { 0 } }, /* 094 */ + { .mk = { 0x95, 0 }, .brk = { 0 } }, /* 095 */ + { .mk = { 0x96, 0 }, .brk = { 0 } }, /* 096 */ + { .mk = { 0x97, 0 }, .brk = { 0 } }, /* 097 */ + { .mk = { 0x98, 0 }, .brk = { 0 } }, /* 098 */ + { .mk = { 0x99, 0 }, .brk = { 0 } }, /* 099 */ + { .mk = { 0x9a, 0 }, .brk = { 0 } }, /* 09a */ + { .mk = { 0x9b, 0 }, .brk = { 0 } }, /* 09b */ + { .mk = { 0x9c, 0 }, .brk = { 0 } }, /* 09c */ + { .mk = { 0x9d, 0 }, .brk = { 0 } }, /* 09d */ + { .mk = { 0x9e, 0 }, .brk = { 0 } }, /* 09e */ + { .mk = { 0x9f, 0 }, .brk = { 0 } }, /* 09f */ + { .mk = { 0xa0, 0 }, .brk = { 0 } }, /* 0a0 */ + { .mk = { 0xa1, 0 }, .brk = { 0 } }, /* 0a1 */ + { .mk = { 0xa2, 0 }, .brk = { 0 } }, /* 0a2 */ + { .mk = { 0xa3, 0 }, .brk = { 0 } }, /* 0a3 */ + { .mk = { 0xa4, 0 }, .brk = { 0 } }, /* 0a4 */ + { .mk = { 0xa5, 0 }, .brk = { 0 } }, /* 0a5 */ + { .mk = { 0xa6, 0 }, .brk = { 0 } }, /* 0a6 */ + { .mk = { 0xa7, 0 }, .brk = { 0 } }, /* 0a7 */ + { .mk = { 0xa8, 0 }, .brk = { 0 } }, /* 0a8 */ + { .mk = { 0xa9, 0 }, .brk = { 0 } }, /* 0a9 */ + { .mk = { 0xaa, 0 }, .brk = { 0 } }, /* 0aa */ + { .mk = { 0xab, 0 }, .brk = { 0 } }, /* 0ab */ + { .mk = { 0xac, 0 }, .brk = { 0 } }, /* 0ac */ + { .mk = { 0xad, 0 }, .brk = { 0 } }, /* 0ad */ + { .mk = { 0xae, 0 }, .brk = { 0 } }, /* 0ae */ + { .mk = { 0xaf, 0 }, .brk = { 0 } }, /* 0af */ + { .mk = { 0xb0, 0 }, .brk = { 0 } }, /* 0b0 */ + { .mk = { 0xb1, 0 }, .brk = { 0 } }, /* 0b1 */ + { .mk = { 0xb2, 0 }, .brk = { 0 } }, /* 0b2 */ + { .mk = { 0xb3, 0 }, .brk = { 0 } }, /* 0b3 */ + { .mk = { 0xb4, 0 }, .brk = { 0 } }, /* 0b4 */ + { .mk = { 0xb5, 0 }, .brk = { 0 } }, /* 0b5 */ + { .mk = { 0xb6, 0 }, .brk = { 0 } }, /* 0b6 */ + { .mk = { 0xb7, 0 }, .brk = { 0 } }, /* 0b7 */ + { .mk = { 0xb8, 0 }, .brk = { 0 } }, /* 0b8 */ + { .mk = { 0xb9, 0 }, .brk = { 0 } }, /* 0b9 */ + { .mk = { 0xba, 0 }, .brk = { 0 } }, /* 0ba */ + { .mk = { 0xbb, 0 }, .brk = { 0 } }, /* 0bb */ + { .mk = { 0xbc, 0 }, .brk = { 0 } }, /* 0bc */ + { .mk = { 0xbd, 0 }, .brk = { 0 } }, /* 0bd */ + { .mk = { 0xbe, 0 }, .brk = { 0 } }, /* 0be */ + { .mk = { 0xbf, 0 }, .brk = { 0 } }, /* 0bf */ + { .mk = { 0xc0, 0 }, .brk = { 0 } }, /* 0c0 */ + { .mk = { 0xc1, 0 }, .brk = { 0 } }, /* 0c1 */ + { .mk = { 0xc2, 0 }, .brk = { 0 } }, /* 0c2 */ + { .mk = { 0xc3, 0 }, .brk = { 0 } }, /* 0c3 */ + { .mk = { 0xc4, 0 }, .brk = { 0 } }, /* 0c4 */ + { .mk = { 0xc5, 0 }, .brk = { 0 } }, /* 0c5 */ + { .mk = { 0xc6, 0 }, .brk = { 0 } }, /* 0c6 */ + { .mk = { 0xc7, 0 }, .brk = { 0 } }, /* 0c7 */ + { .mk = { 0xc8, 0 }, .brk = { 0 } }, /* 0c8 */ + { .mk = { 0xc9, 0 }, .brk = { 0 } }, /* 0c9 */ + { .mk = { 0xca, 0 }, .brk = { 0 } }, /* 0ca */ + { .mk = { 0xcb, 0 }, .brk = { 0 } }, /* 0cb */ + { .mk = { 0xcc, 0 }, .brk = { 0 } }, /* 0cc */ + { .mk = { 0xcd, 0 }, .brk = { 0 } }, /* 0cd */ + { .mk = { 0xce, 0 }, .brk = { 0 } }, /* 0ce */ + { .mk = { 0xcf, 0 }, .brk = { 0 } }, /* 0cf */ + { .mk = { 0xd0, 0 }, .brk = { 0 } }, /* 0d0 */ + { .mk = { 0xd1, 0 }, .brk = { 0 } }, /* 0d1 */ + { .mk = { 0xd2, 0 }, .brk = { 0 } }, /* 0d2 */ + { .mk = { 0xd3, 0 }, .brk = { 0 } }, /* 0d3 */ + { .mk = { 0xd4, 0 }, .brk = { 0 } }, /* 0d4 */ + { .mk = { 0xd5, 0 }, .brk = { 0 } }, /* 0d5 */ + { .mk = { 0xd6, 0 }, .brk = { 0 } }, /* 0d6 */ + { .mk = { 0xd7, 0 }, .brk = { 0 } }, /* 0d7 */ + { .mk = { 0xd8, 0 }, .brk = { 0 } }, /* 0d8 */ + { .mk = { 0xd9, 0 }, .brk = { 0 } }, /* 0d9 */ + { .mk = { 0xda, 0 }, .brk = { 0 } }, /* 0da */ + { .mk = { 0xdb, 0 }, .brk = { 0 } }, /* 0db */ + { .mk = { 0xdc, 0 }, .brk = { 0 } }, /* 0dc */ + { .mk = { 0xdd, 0 }, .brk = { 0 } }, /* 0dd */ + { .mk = { 0xde, 0 }, .brk = { 0 } }, /* 0de */ + { .mk = { 0xdf, 0 }, .brk = { 0 } }, /* 0df */ + { .mk = { 0xe0, 0 }, .brk = { 0 } }, /* 0e0 */ + { .mk = { 0xe1, 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0xe2, 0 }, .brk = { 0 } }, /* 0e2 */ + { .mk = { 0xe3, 0 }, .brk = { 0 } }, /* 0e3 */ + { .mk = { 0xe4, 0 }, .brk = { 0 } }, /* 0e4 */ + { .mk = { 0xe5, 0 }, .brk = { 0 } }, /* 0e5 */ + { .mk = { 0xe6, 0 }, .brk = { 0 } }, /* 0e6 */ + { .mk = { 0xe7, 0 }, .brk = { 0 } }, /* 0e7 */ + { .mk = { 0xe8, 0 }, .brk = { 0 } }, /* 0e8 */ + { .mk = { 0xe9, 0 }, .brk = { 0 } }, /* 0e9 */ + { .mk = { 0xea, 0 }, .brk = { 0 } }, /* 0ea */ + { .mk = { 0xeb, 0 }, .brk = { 0 } }, /* 0eb */ + { .mk = { 0xec, 0 }, .brk = { 0 } }, /* 0ec */ + { .mk = { 0xed, 0 }, .brk = { 0 } }, /* 0ed */ + { .mk = { 0xee, 0 }, .brk = { 0 } }, /* 0ee */ + { .mk = { 0xef, 0 }, .brk = { 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0xf1, 0 }, .brk = { 0 } }, /* 0f1 */ + { .mk = { 0xf2, 0 }, .brk = { 0 } }, /* 0f2 */ + { .mk = { 0xf3, 0 }, .brk = { 0 } }, /* 0f3 */ + { .mk = { 0xf4, 0 }, .brk = { 0 } }, /* 0f4 */ + { .mk = { 0xf5, 0 }, .brk = { 0 } }, /* 0f5 */ + { .mk = { 0xf6, 0 }, .brk = { 0 } }, /* 0f6 */ + { .mk = { 0xf7, 0 }, .brk = { 0 } }, /* 0f7 */ + { .mk = { 0xf8, 0 }, .brk = { 0 } }, /* 0f8 */ + { .mk = { 0xf9, 0 }, .brk = { 0 } }, /* 0f9 */ + { .mk = { 0xfa, 0 }, .brk = { 0 } }, /* 0fa */ + { .mk = { 0xfb, 0 }, .brk = { 0 } }, /* 0fb */ + { .mk = { 0xfc, 0 }, .brk = { 0 } }, /* 0fc */ + { .mk = { 0xfd, 0 }, .brk = { 0 } }, /* 0fd */ + { .mk = { 0xfe, 0 }, .brk = { 0 } }, /* 0fe */ + { .mk = { 0xff, 0 }, .brk = { 0 } }, /* 0ff */ + { .mk = {0xe1, 0x1d, 0 }, .brk = { 0xe1, 0x9d, 0 } }, /* 100 */ + { .mk = {0xe0, 0x01, 0 }, .brk = { 0xe0, 0x81, 0 } }, /* 101 */ + { .mk = {0xe0, 0x02, 0 }, .brk = { 0xe0, 0x82, 0 } }, /* 102 */ + { .mk = {0xe0, 0x03, 0 }, .brk = { 0xe0, 0x83, 0 } }, /* 103 */ + { .mk = {0xe0, 0x04, 0 }, .brk = { 0xe0, 0x84, 0 } }, /* 104 */ + { .mk = {0xe0, 0x05, 0 }, .brk = { 0xe0, 0x85, 0 } }, /* 105 */ + { .mk = {0xe0, 0x06, 0 }, .brk = { 0xe0, 0x86, 0 } }, /* 106 */ + { .mk = {0xe0, 0x07, 0 }, .brk = { 0xe0, 0x87, 0 } }, /* 107 */ + { .mk = {0xe0, 0x08, 0 }, .brk = { 0xe0, 0x88, 0 } }, /* 108 */ + { .mk = {0xe0, 0x09, 0 }, .brk = { 0xe0, 0x89, 0 } }, /* 109 */ + { .mk = {0xe0, 0x0a, 0 }, .brk = { 0xe0, 0x8a, 0 } }, /* 10a */ + { .mk = {0xe0, 0x0b, 0 }, .brk = { 0xe0, 0x8b, 0 } }, /* 10b */ + { .mk = {0xe0, 0x0c, 0 }, .brk = { 0xe0, 0x8c, 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = {0xe0, 0x0e, 0 }, .brk = { 0xe0, 0x8e, 0 } }, /* 10e */ + { .mk = {0xe0, 0x0f, 0 }, .brk = { 0xe0, 0x8f, 0 } }, /* 10f */ + { .mk = {0xe0, 0x10, 0 }, .brk = { 0xe0, 0x90, 0 } }, /* 110 */ + { .mk = {0xe0, 0x11, 0 }, .brk = { 0xe0, 0x91, 0 } }, /* 111 */ + { .mk = {0xe0, 0x12, 0 }, .brk = { 0xe0, 0x92, 0 } }, /* 112 */ + { .mk = {0xe0, 0x13, 0 }, .brk = { 0xe0, 0x93, 0 } }, /* 113 */ + { .mk = {0xe0, 0x14, 0 }, .brk = { 0xe0, 0x94, 0 } }, /* 114 */ + { .mk = {0xe0, 0x15, 0 }, .brk = { 0xe0, 0x95, 0 } }, /* 115 */ + { .mk = {0xe0, 0x16, 0 }, .brk = { 0xe0, 0x96, 0 } }, /* 116 */ + { .mk = {0xe0, 0x17, 0 }, .brk = { 0xe0, 0x97, 0 } }, /* 117 */ + { .mk = {0xe0, 0x18, 0 }, .brk = { 0xe0, 0x98, 0 } }, /* 118 */ + { .mk = {0xe0, 0x19, 0 }, .brk = { 0xe0, 0x99, 0 } }, /* 119 */ + { .mk = {0xe0, 0x1a, 0 }, .brk = { 0xe0, 0x9a, 0 } }, /* 11a */ + { .mk = {0xe0, 0x1b, 0 }, .brk = { 0xe0, 0x9b, 0 } }, /* 11b */ + { .mk = {0xe0, 0x1c, 0 }, .brk = { 0xe0, 0x9c, 0 } }, /* 11c */ + { .mk = {0xe0, 0x1d, 0 }, .brk = { 0xe0, 0x9d, 0 } }, /* 11d */ + { .mk = {0xe0, 0x1e, 0 }, .brk = { 0xe0, 0x9e, 0 } }, /* 11e */ + { .mk = {0xe0, 0x1f, 0 }, .brk = { 0xe0, 0x9f, 0 } }, /* 11f */ + { .mk = {0xe0, 0x20, 0 }, .brk = { 0xe0, 0xa0, 0 } }, /* 120 */ + { .mk = {0xe0, 0x21, 0 }, .brk = { 0xe0, 0xa1, 0 } }, /* 121 */ + { .mk = {0xe0, 0x22, 0 }, .brk = { 0xe0, 0xa2, 0 } }, /* 122 */ + { .mk = {0xe0, 0x23, 0 }, .brk = { 0xe0, 0xa3, 0 } }, /* 123 */ + { .mk = {0xe0, 0x24, 0 }, .brk = { 0xe0, 0xa4, 0 } }, /* 124 */ + { .mk = {0xe0, 0x25, 0 }, .brk = { 0xe0, 0xa5, 0 } }, /* 125 */ + { .mk = {0xe0, 0x26, 0 }, .brk = { 0xe0, 0xa6, 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = {0xe0, 0x2c, 0 }, .brk = { 0xe0, 0xac, 0 } }, /* 12c */ + { .mk = {0xe0, 0x2d, 0 }, .brk = { 0xe0, 0xad, 0 } }, /* 12d */ + { .mk = {0xe0, 0x2e, 0 }, .brk = { 0xe0, 0xae, 0 } }, /* 12e */ + { .mk = {0xe0, 0x2f, 0 }, .brk = { 0xe0, 0xaf, 0 } }, /* 12f */ + { .mk = {0xe0, 0x30, 0 }, .brk = { 0xe0, 0xb0, 0 } }, /* 130 */ + { .mk = {0xe0, 0x31, 0 }, .brk = { 0xe0, 0xb1, 0 } }, /* 131 */ + { .mk = {0xe0, 0x32, 0 }, .brk = { 0xe0, 0xb2, 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = {0xe0, 0x34, 0 }, .brk = { 0xe0, 0xb4, 0 } }, /* 134 */ + { .mk = {0xe0, 0x35, 0 }, .brk = { 0xe0, 0xb5, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = {0xe0, 0x37, 0 }, .brk = { 0xe0, 0xb7, 0 } }, /* 137 */ + { .mk = {0xe0, 0x38, 0 }, .brk = { 0xe0, 0xb8, 0 } }, /* 138 */ + { .mk = { 0 }, .brk = { 0 } }, /* 139 */ + { .mk = {0xe0, 0x3a, 0 }, .brk = { 0xe0, 0xba, 0 } }, /* 13a */ + { .mk = {0xe0, 0x3b, 0 }, .brk = { 0xe0, 0xbb, 0 } }, /* 13b */ + { .mk = {0xe0, 0x3c, 0 }, .brk = { 0xe0, 0xbc, 0 } }, /* 13c */ + { .mk = {0xe0, 0x3d, 0 }, .brk = { 0xe0, 0xbd, 0 } }, /* 13d */ + { .mk = {0xe0, 0x3e, 0 }, .brk = { 0xe0, 0xbe, 0 } }, /* 13e */ + { .mk = {0xe0, 0x3f, 0 }, .brk = { 0xe0, 0xbf, 0 } }, /* 13f */ + { .mk = {0xe0, 0x40, 0 }, .brk = { 0xe0, 0xc0, 0 } }, /* 140 */ + { .mk = {0xe0, 0x41, 0 }, .brk = { 0xe0, 0xc1, 0 } }, /* 141 */ + { .mk = {0xe0, 0x42, 0 }, .brk = { 0xe0, 0xc2, 0 } }, /* 142 */ + { .mk = {0xe0, 0x43, 0 }, .brk = { 0xe0, 0xc3, 0 } }, /* 143 */ + { .mk = {0xe0, 0x44, 0 }, .brk = { 0xe0, 0xc4, 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = {0xe0, 0x46, 0 }, .brk = { 0xe0, 0xc6, 0 } }, /* 146 */ + { .mk = {0xe0, 0x47, 0 }, .brk = { 0xe0, 0xc7, 0 } }, /* 147 */ + { .mk = {0xe0, 0x48, 0 }, .brk = { 0xe0, 0xc8, 0 } }, /* 148 */ + { .mk = {0xe0, 0x49, 0 }, .brk = { 0xe0, 0xc9, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = {0xe0, 0x4b, 0 }, .brk = { 0xe0, 0xcb, 0 } }, /* 14b */ + { .mk = {0xe0, 0x4c, 0 }, .brk = { 0xe0, 0xcc, 0 } }, /* 14c */ + { .mk = {0xe0, 0x4d, 0 }, .brk = { 0xe0, 0xcd, 0 } }, /* 14d */ + { .mk = {0xe0, 0x4e, 0 }, .brk = { 0xe0, 0xce, 0 } }, /* 14e */ + { .mk = {0xe0, 0x4f, 0 }, .brk = { 0xe0, 0xcf, 0 } }, /* 14f */ + { .mk = {0xe0, 0x50, 0 }, .brk = { 0xe0, 0xd0, 0 } }, /* 150 */ + { .mk = {0xe0, 0x51, 0 }, .brk = { 0xe0, 0xd1, 0 } }, /* 151 */ + { .mk = {0xe0, 0x52, 0 }, .brk = { 0xe0, 0xd2, 0 } }, /* 152 */ + { .mk = {0xe0, 0x53, 0 }, .brk = { 0xe0, 0xd3, 0 } }, /* 153 */ + { .mk = { 0 }, .brk = { 0 } }, /* 154 */ + { .mk = {0xe0, 0x55, 0 }, .brk = { 0xe0, 0xd5, 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = {0xe0, 0x57, 0 }, .brk = { 0xe0, 0xd7, 0 } }, /* 157 */ + { .mk = {0xe0, 0x58, 0 }, .brk = { 0xe0, 0xd8, 0 } }, /* 158 */ + { .mk = {0xe0, 0x59, 0 }, .brk = { 0xe0, 0xd9, 0 } }, /* 159 */ + { .mk = {0xe0, 0x5a, 0 }, .brk = { 0xe0, 0xaa, 0 } }, /* 15a */ + { .mk = {0xe0, 0x5b, 0 }, .brk = { 0xe0, 0xdb, 0 } }, /* 15b */ + { .mk = {0xe0, 0x5c, 0 }, .brk = { 0xe0, 0xdc, 0 } }, /* 15c */ + { .mk = {0xe0, 0x5d, 0 }, .brk = { 0xe0, 0xdd, 0 } }, /* 15d */ + { .mk = {0xe0, 0x5e, 0 }, .brk = { 0xe0, 0xee, 0 } }, /* 15e */ + { .mk = {0xe0, 0x5f, 0 }, .brk = { 0xe0, 0xdf, 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = {0xe0, 0x61, 0 }, .brk = { 0xe0, 0xe1, 0 } }, /* 161 */ + { .mk = {0xe0, 0x62, 0 }, .brk = { 0xe0, 0xe2, 0 } }, /* 162 */ + { .mk = {0xe0, 0x63, 0 }, .brk = { 0xe0, 0xe3, 0 } }, /* 163 */ + { .mk = {0xe0, 0x64, 0 }, .brk = { 0xe0, 0xe4, 0 } }, /* 164 */ + { .mk = {0xe0, 0x65, 0 }, .brk = { 0xe0, 0xe5, 0 } }, /* 165 */ + { .mk = {0xe0, 0x66, 0 }, .brk = { 0xe0, 0xe6, 0 } }, /* 166 */ + { .mk = {0xe0, 0x67, 0 }, .brk = { 0xe0, 0xe7, 0 } }, /* 167 */ + { .mk = {0xe0, 0x68, 0 }, .brk = { 0xe0, 0xe8, 0 } }, /* 168 */ + { .mk = {0xe0, 0x69, 0 }, .brk = { 0xe0, 0xe9, 0 } }, /* 169 */ + { .mk = {0xe0, 0x6a, 0 }, .brk = { 0xe0, 0xea, 0 } }, /* 16a */ + { .mk = {0xe0, 0x6b, 0 }, .brk = { 0xe0, 0xeb, 0 } }, /* 16b */ + { .mk = {0xe0, 0x6c, 0 }, .brk = { 0xe0, 0xec, 0 } }, /* 16c */ + { .mk = {0xe0, 0x6d, 0 }, .brk = { 0xe0, 0xed, 0 } }, /* 16d */ + { .mk = {0xe0, 0x6e, 0 }, .brk = { 0xe0, 0xee, 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = {0xe0, 0x70, 0 }, .brk = { 0xe0, 0xf0, 0 } }, /* 170 */ + { .mk = {0xe0, 0x71, 0 }, .brk = { 0xe0, 0xf1, 0 } }, /* 171 */ + { .mk = {0xe0, 0x72, 0 }, .brk = { 0xe0, 0xf2, 0 } }, /* 172 */ + { .mk = {0xe0, 0x73, 0 }, .brk = { 0xe0, 0xf3, 0 } }, /* 173 */ + { .mk = {0xe0, 0x74, 0 }, .brk = { 0xe0, 0xf4, 0 } }, /* 174 */ + { .mk = {0xe0, 0x75, 0 }, .brk = { 0xe0, 0xf5, 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = {0xe0, 0x77, 0 }, .brk = { 0xe0, 0xf7, 0 } }, /* 177 */ + { .mk = {0xe0, 0x78, 0 }, .brk = { 0xe0, 0xf8, 0 } }, /* 178 */ + { .mk = {0xe0, 0x79, 0 }, .brk = { 0xe0, 0xf9, 0 } }, /* 179 */ + { .mk = {0xe0, 0x7a, 0 }, .brk = { 0xe0, 0xfa, 0 } }, /* 17a */ + { .mk = {0xe0, 0x7b, 0 }, .brk = { 0xe0, 0xfb, 0 } }, /* 17b */ + { .mk = {0xe0, 0x7c, 0 }, .brk = { 0xe0, 0xfc, 0 } }, /* 17c */ + { .mk = {0xe0, 0x7d, 0 }, .brk = { 0xe0, 0xfd, 0 } }, /* 17d */ + { .mk = {0xe0, 0x7e, 0 }, .brk = { 0xe0, 0xfe, 0 } }, /* 17e */ + { .mk = {0xe0, 0x7f, 0 }, .brk = { 0xe0, 0xff, 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = {0xe0, 0xe1, 0 }, .brk = { 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = {0xe0, 0xee, 0 }, .brk = { 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = {0xe0, 0xf1, 0 }, .brk = { 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = {0xe0, 0xfe, 0 }, .brk = { 0 } }, /* 1fe */ + { .mk = {0xe0, 0xff, 0 }, .brk = { 0 } } /* 1ff */ // clang-format on }; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 593b673e2..437ac7d54 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -138,518 +138,518 @@ static video_timings_t timing_dram = { VIDEO_BUS, 0, 0, 0, 0, 0, 0 }; /*No addit static const scancode scancode_tandy[512] = { // clang-format off - { { 0 }, { 0 } }, /* 000 */ - { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ - { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ - { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ - { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ - { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ - { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ - { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ - { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ - { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ - { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ - { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ - { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ - { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ - { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ - { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ - { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ - { { 0x12, 0 }, { 0x92, 0 } }, /* 013 */ - { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ - { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ - { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ - { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ - { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ - { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ - { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ - { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ - { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ - { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ - { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ - { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ - { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ - { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ - { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ - { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ - { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ - { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ - { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ - { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ - { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ - { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ - { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ - { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ - { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ - { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ - { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ - { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ - { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ - { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ - { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ - { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ - { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ - { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ - { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ - { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ - { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ - { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ - { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ - { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ - { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ - { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ - { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ - { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ - { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ - { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ - { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ - { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ - { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ - { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ - { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ - { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ - { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ - { { 0x56, 0 }, { 0xd6, 0 } }, /* 053 */ - { { 0 }, { 0 } }, /* 054 */ - { { 0 }, { 0 } }, /* 055 */ - { { 0 }, { 0 } }, /* 056 */ - { { 0 }, { 0 } }, /* 057 */ - { { 0 }, { 0 } }, /* 058 */ - { { 0 }, { 0 } }, /* 059 */ - { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, /* 05b */ - { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, /* 05d */ - { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, /* 05f */ - { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, /* 061 */ - { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, /* 063 */ - { { 0 }, { 0 } }, /* 064 */ - { { 0 }, { 0 } }, /* 065 */ - { { 0 }, { 0 } }, /* 066 */ - { { 0 }, { 0 } }, /* 067 */ - { { 0 }, { 0 } }, /* 068 */ - { { 0 }, { 0 } }, /* 069 */ - { { 0 }, { 0 } }, /* 06a */ - { { 0 }, { 0 } }, /* 06b */ - { { 0 }, { 0 } }, /* 06c */ - { { 0 }, { 0 } }, /* 06d */ - { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, /* 06f */ - { { 0 }, { 0 } }, /* 070 */ - { { 0 }, { 0 } }, /* 071 */ - { { 0 }, { 0 } }, /* 072 */ - { { 0 }, { 0 } }, /* 073 */ - { { 0 }, { 0 } }, /* 074 */ - { { 0 }, { 0 } }, /* 075 */ - { { 0 }, { 0 } }, /* 076 */ - { { 0 }, { 0 } }, /* 077 */ - { { 0 }, { 0 } }, /* 078 */ - { { 0 }, { 0 } }, /* 079 */ - { { 0 }, { 0 } }, /* 07a */ - { { 0 }, { 0 } }, /* 07b */ - { { 0 }, { 0 } }, /* 07c */ - { { 0 }, { 0 } }, /* 07d */ - { { 0 }, { 0 } }, /* 07e */ - { { 0 }, { 0 } }, /* 07f */ - { { 0 }, { 0 } }, /* 080 */ - { { 0 }, { 0 } }, /* 081 */ - { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, /* 083 */ - { { 0 }, { 0 } }, /* 084 */ - { { 0 }, { 0 } }, /* 085 */ - { { 0 }, { 0 } }, /* 086 */ - { { 0 }, { 0 } }, /* 087 */ - { { 0 }, { 0 } }, /* 088 */ - { { 0 }, { 0 } }, /* 089 */ - { { 0 }, { 0 } }, /* 08a */ - { { 0 }, { 0 } }, /* 08b */ - { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, /* 08d */ - { { 0 }, { 0 } }, /* 08e */ - { { 0 }, { 0 } }, /* 08f */ - { { 0 }, { 0 } }, /* 090 */ - { { 0 }, { 0 } }, /* 091 */ - { { 0 }, { 0 } }, /* 092 */ - { { 0 }, { 0 } }, /* 093 */ - { { 0 }, { 0 } }, /* 094 */ - { { 0 }, { 0 } }, /* 095 */ - { { 0 }, { 0 } }, /* 096 */ - { { 0 }, { 0 } }, /* 097 */ - { { 0 }, { 0 } }, /* 098 */ - { { 0 }, { 0 } }, /* 099 */ - { { 0 }, { 0 } }, /* 09a */ - { { 0 }, { 0 } }, /* 09b */ - { { 0 }, { 0 } }, /* 09c */ - { { 0 }, { 0 } }, /* 09d */ - { { 0 }, { 0 } }, /* 09e */ - { { 0 }, { 0 } }, /* 09f */ - { { 0 }, { 0 } }, /* 0a0 */ - { { 0 }, { 0 } }, /* 0a1 */ - { { 0 }, { 0 } }, /* 0a2 */ - { { 0 }, { 0 } }, /* 0a3 */ - { { 0 }, { 0 } }, /* 0a4 */ - { { 0 }, { 0 } }, /* 0a5 */ - { { 0 }, { 0 } }, /* 0a6 */ - { { 0 }, { 0 } }, /* 0a7 */ - { { 0 }, { 0 } }, /* 0a8 */ - { { 0 }, { 0 } }, /* 0a9 */ - { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, /* 0ab */ - { { 0 }, { 0 } }, /* 0ac */ - { { 0 }, { 0 } }, /* 0ad */ - { { 0 }, { 0 } }, /* 0ae */ - { { 0 }, { 0 } }, /* 0af */ - { { 0 }, { 0 } }, /* 0b0 */ - { { 0 }, { 0 } }, /* 0b1 */ - { { 0 }, { 0 } }, /* 0b2 */ - { { 0 }, { 0 } }, /* 0b3 */ - { { 0 }, { 0 } }, /* 0b4 */ - { { 0 }, { 0 } }, /* 0b5 */ - { { 0 }, { 0 } }, /* 0b6 */ - { { 0 }, { 0 } }, /* 0b7 */ - { { 0 }, { 0 } }, /* 0b8 */ - { { 0 }, { 0 } }, /* 0b9 */ - { { 0 }, { 0 } }, /* 0ba */ - { { 0 }, { 0 } }, /* 0bb */ - { { 0 }, { 0 } }, /* 0bc */ - { { 0 }, { 0 } }, /* 0bd */ - { { 0 }, { 0 } }, /* 0be */ - { { 0 }, { 0 } }, /* 0bf */ - { { 0 }, { 0 } }, /* 0c0 */ - { { 0 }, { 0 } }, /* 0c1 */ - { { 0 }, { 0 } }, /* 0c2 */ - { { 0 }, { 0 } }, /* 0c3 */ - { { 0 }, { 0 } }, /* 0c4 */ - { { 0 }, { 0 } }, /* 0c5 */ - { { 0 }, { 0 } }, /* 0c6 */ - { { 0 }, { 0 } }, /* 0c7 */ - { { 0 }, { 0 } }, /* 0c8 */ - { { 0 }, { 0 } }, /* 0c9 */ - { { 0 }, { 0 } }, /* 0ca */ - { { 0 }, { 0 } }, /* 0cb */ - { { 0 }, { 0 } }, /* 0cc */ - { { 0 }, { 0 } }, /* 0cd */ - { { 0 }, { 0 } }, /* 0ce */ - { { 0 }, { 0 } }, /* 0cf */ - { { 0 }, { 0 } }, /* 0d0 */ - { { 0 }, { 0 } }, /* 0d1 */ - { { 0 }, { 0 } }, /* 0d2 */ - { { 0 }, { 0 } }, /* 0d3 */ - { { 0 }, { 0 } }, /* 0d4 */ - { { 0 }, { 0 } }, /* 0d5 */ - { { 0 }, { 0 } }, /* 0d6 */ - { { 0 }, { 0 } }, /* 0d7 */ - { { 0 }, { 0 } }, /* 0d8 */ - { { 0 }, { 0 } }, /* 0d9 */ - { { 0 }, { 0 } }, /* 0da */ - { { 0 }, { 0 } }, /* 0db */ - { { 0 }, { 0 } }, /* 0dc */ - { { 0 }, { 0 } }, /* 0dd */ - { { 0 }, { 0 } }, /* 0de */ - { { 0 }, { 0 } }, /* 0df */ - { { 0 }, { 0 } }, /* 0e0 */ - { { 0 }, { 0 } }, /* 0e1 */ - { { 0 }, { 0 } }, /* 0e2 */ - { { 0 }, { 0 } }, /* 0e3 */ - { { 0 }, { 0 } }, /* 0e4 */ - { { 0 }, { 0 } }, /* 0e5 */ - { { 0 }, { 0 } }, /* 0e6 */ - { { 0 }, { 0 } }, /* 0e7 */ - { { 0 }, { 0 } }, /* 0e8 */ - { { 0 }, { 0 } }, /* 0e9 */ - { { 0 }, { 0 } }, /* 0ea */ - { { 0 }, { 0 } }, /* 0eb */ - { { 0 }, { 0 } }, /* 0ec */ - { { 0 }, { 0 } }, /* 0ed */ - { { 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, /* 0ef */ - { { 0 }, { 0 } }, /* 0f0 */ - { { 0 }, { 0 } }, /* 0f1 */ - { { 0 }, { 0 } }, /* 0f2 */ - { { 0 }, { 0 } }, /* 0f3 */ - { { 0 }, { 0 } }, /* 0f4 */ - { { 0 }, { 0 } }, /* 0f5 */ - { { 0 }, { 0 } }, /* 0f6 */ - { { 0 }, { 0 } }, /* 0f7 */ - { { 0 }, { 0 } }, /* 0f8 */ - { { 0 }, { 0 } }, /* 0f9 */ - { { 0 }, { 0 } }, /* 0fa */ - { { 0 }, { 0 } }, /* 0fb */ - { { 0 }, { 0 } }, /* 0fc */ - { { 0 }, { 0 } }, /* 0fd */ - { { 0 }, { 0 } }, /* 0fe */ - { { 0 }, { 0 } }, /* 0ff */ - { { 0 }, { 0 } }, /* 100 */ - { { 0 }, { 0 } }, /* 101 */ - { { 0 }, { 0 } }, /* 102 */ - { { 0 }, { 0 } }, /* 103 */ - { { 0 }, { 0 } }, /* 104 */ - { { 0 }, { 0 } }, /* 105 */ - { { 0 }, { 0 } }, /* 106 */ - { { 0 }, { 0 } }, /* 107 */ - { { 0 }, { 0 } }, /* 108 */ - { { 0 }, { 0 } }, /* 109 */ - { { 0 }, { 0 } }, /* 10a */ - { { 0 }, { 0 } }, /* 10b */ - { { 0 }, { 0 } }, /* 10c */ - { { 0 }, { 0 } }, /* 10d */ - { { 0 }, { 0 } }, /* 10e */ - { { 0 }, { 0 } }, /* 10f */ - { { 0 }, { 0 } }, /* 110 */ - { { 0 }, { 0 } }, /* 111 */ - { { 0 }, { 0 } }, /* 112 */ - { { 0 }, { 0 } }, /* 113 */ - { { 0 }, { 0 } }, /* 114 */ - { { 0 }, { 0 } }, /* 115 */ - { { 0 }, { 0 } }, /* 116 */ - { { 0 }, { 0 } }, /* 117 */ - { { 0 }, { 0 } }, /* 118 */ - { { 0 }, { 0 } }, /* 119 */ - { { 0 }, { 0 } }, /* 11a */ - { { 0 }, { 0 } }, /* 11b */ - { { 0x57, 0 }, { 0xd7, 0 } }, /* 11c */ - { { 0 }, { 0 } }, /* 11d */ - { { 0 }, { 0 } }, /* 11e */ - { { 0 }, { 0 } }, /* 11f */ - { { 0 }, { 0 } }, /* 120 */ - { { 0 }, { 0 } }, /* 121 */ - { { 0 }, { 0 } }, /* 122 */ - { { 0 }, { 0 } }, /* 123 */ - { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, /* 125 */ - { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, /* 127 */ - { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, /* 129 */ - { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, /* 12b */ - { { 0 }, { 0 } }, /* 12c */ - { { 0 }, { 0 } }, /* 12d */ - { { 0 }, { 0 } }, /* 12e */ - { { 0 }, { 0 } }, /* 12f */ - { { 0 }, { 0 } }, /* 130 */ - { { 0 }, { 0 } }, /* 131 */ - { { 0 }, { 0 } }, /* 132 */ - { { 0 }, { 0 } }, /* 133 */ - { { 0 }, { 0 } }, /* 134 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 135 */ - { { 0 }, { 0 } }, /* 136 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 137 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 138 */ - { { 0 }, { 0 } }, /* 139 */ - { { 0 }, { 0 } }, /* 13a */ - { { 0 }, { 0 } }, /* 13b */ - { { 0 }, { 0 } }, /* 13c */ - { { 0 }, { 0 } }, /* 13d */ - { { 0 }, { 0 } }, /* 13e */ - { { 0 }, { 0 } }, /* 13f */ - { { 0 }, { 0 } }, /* 140 */ - { { 0 }, { 0 } }, /* 141 */ - { { 0 }, { 0 } }, /* 142 */ - { { 0 }, { 0 } }, /* 143 */ - { { 0 }, { 0 } }, /* 144 */ - { { 0 }, { 0 } }, /* 145 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 146 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 147 */ - { { 0x29, 0 }, { 0xa9, 0 } }, /* 148 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 149 */ - { { 0 }, { 0 } }, /* 14a */ - { { 0x2b, 0 }, { 0xab, 0 } }, /* 14b */ - { { 0 }, { 0 } }, /* 14c */ - { { 0x4e, 0 }, { 0xce, 0 } }, /* 14d */ - { { 0 }, { 0 } }, /* 14e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14f */ - { { 0x4a, 0 }, { 0xca, 0 } }, /* 150 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 151 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 152 */ - { { 0x53, 0 }, { 0xd3, 0 } }, /* 153 */ - { { 0 }, { 0 } }, /* 154 */ - { { 0 }, { 0 } }, /* 155 */ - { { 0 }, { 0 } }, /* 156 */ - { { 0 }, { 0 } }, /* 157 */ - { { 0 }, { 0 } }, /* 158 */ - { { 0 }, { 0 } }, /* 159 */ - { { 0 }, { 0 } }, /* 15a */ - { { 0 }, { 0 } }, /* 15b */ - { { 0 }, { 0 } }, /* 15c */ - { { 0 }, { 0 } }, /* 15d */ - { { 0 }, { 0 } }, /* 15e */ - { { 0 }, { 0 } }, /* 15f */ - { { 0 }, { 0 } }, /* 160 */ - { { 0 }, { 0 } }, /* 161 */ - { { 0 }, { 0 } }, /* 162 */ - { { 0 }, { 0 } }, /* 163 */ - { { 0 }, { 0 } }, /* 164 */ - { { 0 }, { 0 } }, /* 165 */ - { { 0 }, { 0 } }, /* 166 */ - { { 0 }, { 0 } }, /* 167 */ - { { 0 }, { 0 } }, /* 168 */ - { { 0 }, { 0 } }, /* 169 */ - { { 0 }, { 0 } }, /* 16a */ - { { 0 }, { 0 } }, /* 16b */ - { { 0 }, { 0 } }, /* 16c */ - { { 0 }, { 0 } }, /* 16d */ - { { 0 }, { 0 } }, /* 16e */ - { { 0 }, { 0 } }, /* 16f */ - { { 0 }, { 0 } }, /* 170 */ - { { 0 }, { 0 } }, /* 171 */ - { { 0 }, { 0 } }, /* 172 */ - { { 0 }, { 0 } }, /* 173 */ - { { 0 }, { 0 } }, /* 174 */ - { { 0 }, { 0 } }, /* 175 */ - { { 0 }, { 0 } }, /* 176 */ - { { 0 }, { 0 } }, /* 177 */ - { { 0 }, { 0 } }, /* 178 */ - { { 0 }, { 0 } }, /* 179 */ - { { 0 }, { 0 } }, /* 17a */ - { { 0 }, { 0 } }, /* 17b */ - { { 0 }, { 0 } }, /* 17c */ - { { 0 }, { 0 } }, /* 17d */ - { { 0 }, { 0 } }, /* 17e */ - { { 0 }, { 0 } }, /* 17f */ - { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, /* 181 */ - { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, /* 183 */ - { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, /* 185 */ - { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, /* 187 */ - { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, /* 189 */ - { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, /* 18b */ - { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, /* 18d */ - { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, /* 18f */ - { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, /* 191 */ - { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, /* 193 */ - { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, /* 195 */ - { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, /* 197 */ - { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, /* 199 */ - { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, /* 19b */ - { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, /* 19d */ - { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, /* 19f */ - { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, /* 1a1 */ - { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, /* 1a3 */ - { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, /* 1a5 */ - { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, /* 1a7 */ - { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, /* 1a9 */ - { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, /* 1ab */ - { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, /* 1ad */ - { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, /* 1af */ - { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, /* 1b1 */ - { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, /* 1b3 */ - { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, /* 1b5 */ - { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, /* 1b7 */ - { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, /* 1b9 */ - { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, /* 1bb */ - { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, /* 1bd */ - { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, /* 1bf */ - { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, /* 1c1 */ - { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, /* 1c3 */ - { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, /* 1c5 */ - { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, /* 1c7 */ - { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, /* 1c9 */ - { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, /* 1cb */ - { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, /* 1cd */ - { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, /* 1cf */ - { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, /* 1d1 */ - { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, /* 1d5 */ - { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, /* 1d7 */ - { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, /* 1d9 */ - { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, /* 1db */ - { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, /* 1dd */ - { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, /* 1df */ - { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, /* 1e1 */ - { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, /* 1e3 */ - { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, /* 1e5 */ - { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, /* 1e7 */ - { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, /* 1e9 */ - { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, /* 1eb */ - { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, /* 1ed */ - { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, /* 1ef */ - { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, /* 1f1 */ - { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, /* 1f3 */ - { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, /* 1f5 */ - { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, /* 1f7 */ - { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, /* 1f9 */ - { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, /* 1fb */ - { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, /* 1fd */ - { { 0 }, { 0 } }, /* 1fe */ - { { 0 }, { 0 } } /* 1ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x01, 0 }, .brk = { 0x81, 0 } }, /* 001 */ + { .mk = { 0x02, 0 }, .brk = { 0x82, 0 } }, /* 002 */ + { .mk = { 0x03, 0 }, .brk = { 0x83, 0 } }, /* 003 */ + { .mk = { 0x04, 0 }, .brk = { 0x84, 0 } }, /* 004 */ + { .mk = { 0x05, 0 }, .brk = { 0x85, 0 } }, /* 005 */ + { .mk = { 0x06, 0 }, .brk = { 0x86, 0 } }, /* 006 */ + { .mk = { 0x07, 0 }, .brk = { 0x87, 0 } }, /* 007 */ + { .mk = { 0x08, 0 }, .brk = { 0x88, 0 } }, /* 008 */ + { .mk = { 0x09, 0 }, .brk = { 0x89, 0 } }, /* 009 */ + { .mk = { 0x0a, 0 }, .brk = { 0x8a, 0 } }, /* 00a */ + { .mk = { 0x0b, 0 }, .brk = { 0x8b, 0 } }, /* 00b */ + { .mk = { 0x0c, 0 }, .brk = { 0x8c, 0 } }, /* 00c */ + { .mk = { 0x0d, 0 }, .brk = { 0x8d, 0 } }, /* 00d */ + { .mk = { 0x0e, 0 }, .brk = { 0x8e, 0 } }, /* 00e */ + { .mk = { 0x0f, 0 }, .brk = { 0x8f, 0 } }, /* 00f */ + { .mk = { 0x10, 0 }, .brk = { 0x90, 0 } }, /* 010 */ + { .mk = { 0x11, 0 }, .brk = { 0x91, 0 } }, /* 011 */ + { .mk = { 0x12, 0 }, .brk = { 0x92, 0 } }, /* 013 */ + { .mk = { 0x13, 0 }, .brk = { 0x93, 0 } }, /* 013 */ + { .mk = { 0x14, 0 }, .brk = { 0x94, 0 } }, /* 014 */ + { .mk = { 0x15, 0 }, .brk = { 0x95, 0 } }, /* 015 */ + { .mk = { 0x16, 0 }, .brk = { 0x96, 0 } }, /* 016 */ + { .mk = { 0x17, 0 }, .brk = { 0x97, 0 } }, /* 017 */ + { .mk = { 0x18, 0 }, .brk = { 0x98, 0 } }, /* 018 */ + { .mk = { 0x19, 0 }, .brk = { 0x99, 0 } }, /* 019 */ + { .mk = { 0x1a, 0 }, .brk = { 0x9a, 0 } }, /* 01a */ + { .mk = { 0x1b, 0 }, .brk = { 0x9b, 0 } }, /* 01b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 01c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 01d */ + { .mk = { 0x1e, 0 }, .brk = { 0x9e, 0 } }, /* 01e */ + { .mk = { 0x1f, 0 }, .brk = { 0x9f, 0 } }, /* 01f */ + { .mk = { 0x20, 0 }, .brk = { 0xa0, 0 } }, /* 020 */ + { .mk = { 0x21, 0 }, .brk = { 0xa1, 0 } }, /* 021 */ + { .mk = { 0x22, 0 }, .brk = { 0xa2, 0 } }, /* 022 */ + { .mk = { 0x23, 0 }, .brk = { 0xa3, 0 } }, /* 023 */ + { .mk = { 0x24, 0 }, .brk = { 0xa4, 0 } }, /* 024 */ + { .mk = { 0x25, 0 }, .brk = { 0xa5, 0 } }, /* 025 */ + { .mk = { 0x26, 0 }, .brk = { 0xa6, 0 } }, /* 026 */ + { .mk = { 0x27, 0 }, .brk = { 0xa7, 0 } }, /* 027 */ + { .mk = { 0x28, 0 }, .brk = { 0xa8, 0 } }, /* 028 */ + { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 029 */ + { .mk = { 0x2a, 0 }, .brk = { 0xaa, 0 } }, /* 02a */ + { .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 02b */ + { .mk = { 0x2c, 0 }, .brk = { 0xac, 0 } }, /* 02c */ + { .mk = { 0x2d, 0 }, .brk = { 0xad, 0 } }, /* 02d */ + { .mk = { 0x2e, 0 }, .brk = { 0xae, 0 } }, /* 02e */ + { .mk = { 0x2f, 0 }, .brk = { 0xaf, 0 } }, /* 02f */ + { .mk = { 0x30, 0 }, .brk = { 0xb0, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 031 */ + { .mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 032 */ + { .mk = { 0x33, 0 }, .brk = { 0xb3, 0 } }, /* 033 */ + { .mk = { 0x34, 0 }, .brk = { 0xb4, 0 } }, /* 034 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 035 */ + { .mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 036 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 037 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 038 */ + { .mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 039 */ + { .mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 03a */ + { .mk = { 0x3b, 0 }, .brk = { 0xbb, 0 } }, /* 03b */ + { .mk = { 0x3c, 0 }, .brk = { 0xbc, 0 } }, /* 03c */ + { .mk = { 0x3d, 0 }, .brk = { 0xbd, 0 } }, /* 03d */ + { .mk = { 0x3e, 0 }, .brk = { 0xbe, 0 } }, /* 03e */ + { .mk = { 0x3f, 0 }, .brk = { 0xbf, 0 } }, /* 03f */ + { .mk = { 0x40, 0 }, .brk = { 0xc0, 0 } }, /* 040 */ + { .mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 041 */ + { .mk = { 0x42, 0 }, .brk = { 0xc2, 0 } }, /* 042 */ + { .mk = { 0x43, 0 }, .brk = { 0xc3, 0 } }, /* 043 */ + { .mk = { 0x44, 0 }, .brk = { 0xc4, 0 } }, /* 044 */ + { .mk = { 0x45, 0 }, .brk = { 0xc5, 0 } }, /* 045 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 046 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 047 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 048 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 049 */ + { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 04a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 04b */ + { .mk = { 0x4c, 0 }, .brk = { 0xcc, 0 } }, /* 04c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 04d */ + { .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 04e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 04f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 050 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */ + { .mk = { 0x56, 0 }, .brk = { 0xd6, 0 } }, /* 053 */ + { .mk = { 0 }, .brk = { 0 } }, /* 054 */ + { .mk = { 0 }, .brk = { 0 } }, /* 055 */ + { .mk = { 0 }, .brk = { 0 } }, /* 056 */ + { .mk = { 0 }, .brk = { 0 } }, /* 057 */ + { .mk = { 0 }, .brk = { 0 } }, /* 058 */ + { .mk = { 0 }, .brk = { 0 } }, /* 059 */ + { .mk = { 0 }, .brk = { 0 } }, /* 05a */ + { .mk = { 0 }, .brk = { 0 } }, /* 05b */ + { .mk = { 0 }, .brk = { 0 } }, /* 05c */ + { .mk = { 0 }, .brk = { 0 } }, /* 05d */ + { .mk = { 0 }, .brk = { 0 } }, /* 05e */ + { .mk = { 0 }, .brk = { 0 } }, /* 05f */ + { .mk = { 0 }, .brk = { 0 } }, /* 060 */ + { .mk = { 0 }, .brk = { 0 } }, /* 061 */ + { .mk = { 0 }, .brk = { 0 } }, /* 062 */ + { .mk = { 0 }, .brk = { 0 } }, /* 063 */ + { .mk = { 0 }, .brk = { 0 } }, /* 064 */ + { .mk = { 0 }, .brk = { 0 } }, /* 065 */ + { .mk = { 0 }, .brk = { 0 } }, /* 066 */ + { .mk = { 0 }, .brk = { 0 } }, /* 067 */ + { .mk = { 0 }, .brk = { 0 } }, /* 068 */ + { .mk = { 0 }, .brk = { 0 } }, /* 069 */ + { .mk = { 0 }, .brk = { 0 } }, /* 06a */ + { .mk = { 0 }, .brk = { 0 } }, /* 06b */ + { .mk = { 0 }, .brk = { 0 } }, /* 06c */ + { .mk = { 0 }, .brk = { 0 } }, /* 06d */ + { .mk = { 0 }, .brk = { 0 } }, /* 06e */ + { .mk = { 0 }, .brk = { 0 } }, /* 06f */ + { .mk = { 0 }, .brk = { 0 } }, /* 070 */ + { .mk = { 0 }, .brk = { 0 } }, /* 071 */ + { .mk = { 0 }, .brk = { 0 } }, /* 072 */ + { .mk = { 0 }, .brk = { 0 } }, /* 073 */ + { .mk = { 0 }, .brk = { 0 } }, /* 074 */ + { .mk = { 0 }, .brk = { 0 } }, /* 075 */ + { .mk = { 0 }, .brk = { 0 } }, /* 076 */ + { .mk = { 0 }, .brk = { 0 } }, /* 077 */ + { .mk = { 0 }, .brk = { 0 } }, /* 078 */ + { .mk = { 0 }, .brk = { 0 } }, /* 079 */ + { .mk = { 0 }, .brk = { 0 } }, /* 07a */ + { .mk = { 0 }, .brk = { 0 } }, /* 07b */ + { .mk = { 0 }, .brk = { 0 } }, /* 07c */ + { .mk = { 0 }, .brk = { 0 } }, /* 07d */ + { .mk = { 0 }, .brk = { 0 } }, /* 07e */ + { .mk = { 0 }, .brk = { 0 } }, /* 07f */ + { .mk = { 0 }, .brk = { 0 } }, /* 080 */ + { .mk = { 0 }, .brk = { 0 } }, /* 081 */ + { .mk = { 0 }, .brk = { 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0 }, .brk = { 0 } }, /* 085 */ + { .mk = { 0 }, .brk = { 0 } }, /* 086 */ + { .mk = { 0 }, .brk = { 0 } }, /* 087 */ + { .mk = { 0 }, .brk = { 0 } }, /* 088 */ + { .mk = { 0 }, .brk = { 0 } }, /* 089 */ + { .mk = { 0 }, .brk = { 0 } }, /* 08a */ + { .mk = { 0 }, .brk = { 0 } }, /* 08b */ + { .mk = { 0 }, .brk = { 0 } }, /* 08c */ + { .mk = { 0 }, .brk = { 0 } }, /* 08d */ + { .mk = { 0 }, .brk = { 0 } }, /* 08e */ + { .mk = { 0 }, .brk = { 0 } }, /* 08f */ + { .mk = { 0 }, .brk = { 0 } }, /* 090 */ + { .mk = { 0 }, .brk = { 0 } }, /* 091 */ + { .mk = { 0 }, .brk = { 0 } }, /* 092 */ + { .mk = { 0 }, .brk = { 0 } }, /* 093 */ + { .mk = { 0 }, .brk = { 0 } }, /* 094 */ + { .mk = { 0 }, .brk = { 0 } }, /* 095 */ + { .mk = { 0 }, .brk = { 0 } }, /* 096 */ + { .mk = { 0 }, .brk = { 0 } }, /* 097 */ + { .mk = { 0 }, .brk = { 0 } }, /* 098 */ + { .mk = { 0 }, .brk = { 0 } }, /* 099 */ + { .mk = { 0 }, .brk = { 0 } }, /* 09a */ + { .mk = { 0 }, .brk = { 0 } }, /* 09b */ + { .mk = { 0 }, .brk = { 0 } }, /* 09c */ + { .mk = { 0 }, .brk = { 0 } }, /* 09d */ + { .mk = { 0 }, .brk = { 0 } }, /* 09e */ + { .mk = { 0 }, .brk = { 0 } }, /* 09f */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 0af */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0be */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0da */ + { .mk = { 0 }, .brk = { 0 } }, /* 0db */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0de */ + { .mk = { 0 }, .brk = { 0 } }, /* 0df */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 0eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fe */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 100 */ + { .mk = { 0 }, .brk = { 0 } }, /* 101 */ + { .mk = { 0 }, .brk = { 0 } }, /* 102 */ + { .mk = { 0 }, .brk = { 0 } }, /* 103 */ + { .mk = { 0 }, .brk = { 0 } }, /* 104 */ + { .mk = { 0 }, .brk = { 0 } }, /* 105 */ + { .mk = { 0 }, .brk = { 0 } }, /* 106 */ + { .mk = { 0 }, .brk = { 0 } }, /* 107 */ + { .mk = { 0 }, .brk = { 0 } }, /* 108 */ + { .mk = { 0 }, .brk = { 0 } }, /* 109 */ + { .mk = { 0 }, .brk = { 0 } }, /* 10a */ + { .mk = { 0 }, .brk = { 0 } }, /* 10b */ + { .mk = { 0 }, .brk = { 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = { 0 }, .brk = { 0 } }, /* 10e */ + { .mk = { 0 }, .brk = { 0 } }, /* 10f */ + { .mk = { 0 }, .brk = { 0 } }, /* 110 */ + { .mk = { 0 }, .brk = { 0 } }, /* 111 */ + { .mk = { 0 }, .brk = { 0 } }, /* 112 */ + { .mk = { 0 }, .brk = { 0 } }, /* 113 */ + { .mk = { 0 }, .brk = { 0 } }, /* 114 */ + { .mk = { 0 }, .brk = { 0 } }, /* 115 */ + { .mk = { 0 }, .brk = { 0 } }, /* 116 */ + { .mk = { 0 }, .brk = { 0 } }, /* 117 */ + { .mk = { 0 }, .brk = { 0 } }, /* 118 */ + { .mk = { 0 }, .brk = { 0 } }, /* 119 */ + { .mk = { 0 }, .brk = { 0 } }, /* 11a */ + { .mk = { 0 }, .brk = { 0 } }, /* 11b */ + { .mk = { 0x57, 0 }, .brk = { 0xd7, 0 } }, /* 11c */ + { .mk = { 0 }, .brk = { 0 } }, /* 11d */ + { .mk = { 0 }, .brk = { 0 } }, /* 11e */ + { .mk = { 0 }, .brk = { 0 } }, /* 11f */ + { .mk = { 0 }, .brk = { 0 } }, /* 120 */ + { .mk = { 0 }, .brk = { 0 } }, /* 121 */ + { .mk = { 0 }, .brk = { 0 } }, /* 122 */ + { .mk = { 0 }, .brk = { 0 } }, /* 123 */ + { .mk = { 0 }, .brk = { 0 } }, /* 124 */ + { .mk = { 0 }, .brk = { 0 } }, /* 125 */ + { .mk = { 0 }, .brk = { 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = { 0 }, .brk = { 0 } }, /* 12c */ + { .mk = { 0 }, .brk = { 0 } }, /* 12d */ + { .mk = { 0 }, .brk = { 0 } }, /* 12e */ + { .mk = { 0 }, .brk = { 0 } }, /* 12f */ + { .mk = { 0 }, .brk = { 0 } }, /* 130 */ + { .mk = { 0 }, .brk = { 0 } }, /* 131 */ + { .mk = { 0 }, .brk = { 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = { 0 }, .brk = { 0 } }, /* 134 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 137 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 138 */ + { .mk = { 0 }, .brk = { 0 } }, /* 139 */ + { .mk = { 0 }, .brk = { 0 } }, /* 13a */ + { .mk = { 0 }, .brk = { 0 } }, /* 13b */ + { .mk = { 0 }, .brk = { 0 } }, /* 13c */ + { .mk = { 0 }, .brk = { 0 } }, /* 13d */ + { .mk = { 0 }, .brk = { 0 } }, /* 13e */ + { .mk = { 0 }, .brk = { 0 } }, /* 13f */ + { .mk = { 0 }, .brk = { 0 } }, /* 140 */ + { .mk = { 0 }, .brk = { 0 } }, /* 141 */ + { .mk = { 0 }, .brk = { 0 } }, /* 142 */ + { .mk = { 0 }, .brk = { 0 } }, /* 143 */ + { .mk = { 0 }, .brk = { 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 146 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 147 */ + { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 148 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 14b */ + { .mk = { 0 }, .brk = { 0 } }, /* 14c */ + { .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 14d */ + { .mk = { 0 }, .brk = { 0 } }, /* 14e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 14f */ + { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 150 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 151 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 152 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 153 */ + { .mk = { 0 }, .brk = { 0 } }, /* 154 */ + { .mk = { 0 }, .brk = { 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = { 0 }, .brk = { 0 } }, /* 157 */ + { .mk = { 0 }, .brk = { 0 } }, /* 158 */ + { .mk = { 0 }, .brk = { 0 } }, /* 159 */ + { .mk = { 0 }, .brk = { 0 } }, /* 15a */ + { .mk = { 0 }, .brk = { 0 } }, /* 15b */ + { .mk = { 0 }, .brk = { 0 } }, /* 15c */ + { .mk = { 0 }, .brk = { 0 } }, /* 15d */ + { .mk = { 0 }, .brk = { 0 } }, /* 15e */ + { .mk = { 0 }, .brk = { 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = { 0 }, .brk = { 0 } }, /* 161 */ + { .mk = { 0 }, .brk = { 0 } }, /* 162 */ + { .mk = { 0 }, .brk = { 0 } }, /* 163 */ + { .mk = { 0 }, .brk = { 0 } }, /* 164 */ + { .mk = { 0 }, .brk = { 0 } }, /* 165 */ + { .mk = { 0 }, .brk = { 0 } }, /* 166 */ + { .mk = { 0 }, .brk = { 0 } }, /* 167 */ + { .mk = { 0 }, .brk = { 0 } }, /* 168 */ + { .mk = { 0 }, .brk = { 0 } }, /* 169 */ + { .mk = { 0 }, .brk = { 0 } }, /* 16a */ + { .mk = { 0 }, .brk = { 0 } }, /* 16b */ + { .mk = { 0 }, .brk = { 0 } }, /* 16c */ + { .mk = { 0 }, .brk = { 0 } }, /* 16d */ + { .mk = { 0 }, .brk = { 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = { 0 }, .brk = { 0 } }, /* 170 */ + { .mk = { 0 }, .brk = { 0 } }, /* 171 */ + { .mk = { 0 }, .brk = { 0 } }, /* 172 */ + { .mk = { 0 }, .brk = { 0 } }, /* 173 */ + { .mk = { 0 }, .brk = { 0 } }, /* 174 */ + { .mk = { 0 }, .brk = { 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = { 0 }, .brk = { 0 } }, /* 177 */ + { .mk = { 0 }, .brk = { 0 } }, /* 178 */ + { .mk = { 0 }, .brk = { 0 } }, /* 179 */ + { .mk = { 0 }, .brk = { 0 } }, /* 17a */ + { .mk = { 0 }, .brk = { 0 } }, /* 17b */ + { .mk = { 0 }, .brk = { 0 } }, /* 17c */ + { .mk = { 0 }, .brk = { 0 } }, /* 17d */ + { .mk = { 0 }, .brk = { 0 } }, /* 17e */ + { .mk = { 0 }, .brk = { 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fe */ + { .mk = { 0 }, .brk = { 0 } } /* 1ff */ // clang-format on }; static uint8_t crtcmask[32] = { diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index b6bcbf3ca..172880361 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -846,518 +846,518 @@ ms_poll(void *priv) */ const scancode scancode_olivetti_m24_deluxe[512] = { // clang-format off - { { 0 }, { 0 } }, /* 000 */ - { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ - { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ - { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ - { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ - { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ - { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ - { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ - { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ - { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ - { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ - { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ - { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ - { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ - { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ - { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ - { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ - { { 0x12, 0 }, { 0x92, 0 } }, /* 013 */ - { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ - { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ - { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ - { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ - { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ - { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ - { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ - { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ - { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ - { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ - { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ - { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ - { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ - { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ - { { 0x22, 0 }, { 0xa2, 0 } }, /* 022 */ - { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ - { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ - { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ - { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ - { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ - { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ - { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ - { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ - { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ - { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ - { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ - { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ - { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ - { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ - { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ - { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ - { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ - { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ - { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ - { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ - { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ - { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ - { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ - { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ - { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ - { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ - { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ - { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ - { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ - { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ - { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ - { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ - { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ - { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ - { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ - { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ - { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ - { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ - { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ - { { 0 }, { 0 } }, /* 054 */ - { { 0 }, { 0 } }, /* 055 */ - { { 0x5e, 0 }, { 0xde, 0 } }, /* 056 */ - { { 0x60, 0 }, { 0xe0, 0 } }, /* 057 */ - { { 0x61, 0 }, { 0xe1, 0 } }, /* 058 */ - { { 0 }, { 0 } }, /* 059 */ - { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, /* 05b */ - { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, /* 05d */ - { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, /* 05f */ - { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, /* 061 */ - { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, /* 063 */ - { { 0 }, { 0 } }, /* 064 */ - { { 0 }, { 0 } }, /* 065 */ - { { 0 }, { 0 } }, /* 066 */ - { { 0 }, { 0 } }, /* 067 */ - { { 0 }, { 0 } }, /* 068 */ - { { 0 }, { 0 } }, /* 069 */ - { { 0 }, { 0 } }, /* 06a */ - { { 0 }, { 0 } }, /* 06b */ - { { 0 }, { 0 } }, /* 06c */ - { { 0 }, { 0 } }, /* 06d */ - { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, /* 06f */ - { { 0 }, { 0 } }, /* 070 */ - { { 0 }, { 0 } }, /* 071 */ - { { 0 }, { 0 } }, /* 072 */ - { { 0 }, { 0 } }, /* 073 */ - { { 0 }, { 0 } }, /* 074 */ - { { 0 }, { 0 } }, /* 075 */ - { { 0 }, { 0 } }, /* 076 */ - { { 0 }, { 0 } }, /* 077 */ - { { 0 }, { 0 } }, /* 078 */ - { { 0 }, { 0 } }, /* 079 */ - { { 0 }, { 0 } }, /* 07a */ - { { 0 }, { 0 } }, /* 07b */ - { { 0 }, { 0 } }, /* 07c */ - { { 0 }, { 0 } }, /* 07d */ - { { 0 }, { 0 } }, /* 07e */ - { { 0 }, { 0 } }, /* 07f */ - { { 0 }, { 0 } }, /* 080 */ - { { 0 }, { 0 } }, /* 081 */ - { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, /* 083 */ - { { 0 }, { 0 } }, /* 084 */ - { { 0 }, { 0 } }, /* 085 */ - { { 0 }, { 0 } }, /* 086 */ - { { 0 }, { 0 } }, /* 087 */ - { { 0 }, { 0 } }, /* 088 */ - { { 0 }, { 0 } }, /* 089 */ - { { 0 }, { 0 } }, /* 08a */ - { { 0 }, { 0 } }, /* 08b */ - { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, /* 08d */ - { { 0 }, { 0 } }, /* 08e */ - { { 0 }, { 0 } }, /* 08f */ - { { 0 }, { 0 } }, /* 090 */ - { { 0 }, { 0 } }, /* 091 */ - { { 0 }, { 0 } }, /* 092 */ - { { 0 }, { 0 } }, /* 093 */ - { { 0 }, { 0 } }, /* 094 */ - { { 0 }, { 0 } }, /* 095 */ - { { 0 }, { 0 } }, /* 096 */ - { { 0 }, { 0 } }, /* 097 */ - { { 0 }, { 0 } }, /* 098 */ - { { 0 }, { 0 } }, /* 099 */ - { { 0 }, { 0 } }, /* 09a */ - { { 0 }, { 0 } }, /* 09b */ - { { 0 }, { 0 } }, /* 09c */ - { { 0 }, { 0 } }, /* 09d */ - { { 0 }, { 0 } }, /* 09e */ - { { 0 }, { 0 } }, /* 09f */ - { { 0 }, { 0 } }, /* 0a0 */ - { { 0 }, { 0 } }, /* 0a1 */ - { { 0 }, { 0 } }, /* 0a2 */ - { { 0 }, { 0 } }, /* 0a3 */ - { { 0 }, { 0 } }, /* 0a4 */ - { { 0 }, { 0 } }, /* 0a5 */ - { { 0 }, { 0 } }, /* 0a6 */ - { { 0 }, { 0 } }, /* 0a7 */ - { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, /* 0a9 */ - { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, /* 0ab */ - { { 0 }, { 0 } }, /* 0ac */ - { { 0 }, { 0 } }, /* 0ad */ - { { 0 }, { 0 } }, /* 0ae */ - { { 0 }, { 0 } }, /* 0af */ - { { 0 }, { 0 } }, /* 0b0 */ - { { 0 }, { 0 } }, /* 0b1 */ - { { 0 }, { 0 } }, /* 0b2 */ - { { 0 }, { 0 } }, /* 0b3 */ - { { 0 }, { 0 } }, /* 0b4 */ - { { 0 }, { 0 } }, /* 0b5 */ - { { 0 }, { 0 } }, /* 0b6 */ - { { 0 }, { 0 } }, /* 0b7 */ - { { 0 }, { 0 } }, /* 0b8 */ - { { 0 }, { 0 } }, /* 0b9 */ - { { 0 }, { 0 } }, /* 0ba */ - { { 0 }, { 0 } }, /* 0bb */ - { { 0 }, { 0 } }, /* 0bc */ - { { 0 }, { 0 } }, /* 0bd */ - { { 0 }, { 0 } }, /* 0be */ - { { 0 }, { 0 } }, /* 0bf */ - { { 0 }, { 0 } }, /* 0c0 */ - { { 0 }, { 0 } }, /* 0c1 */ - { { 0 }, { 0 } }, /* 0c2 */ - { { 0 }, { 0 } }, /* 0c3 */ - { { 0 }, { 0 } }, /* 0c4 */ - { { 0 }, { 0 } }, /* 0c5 */ - { { 0 }, { 0 } }, /* 0c6 */ - { { 0 }, { 0 } }, /* 0c7 */ - { { 0 }, { 0 } }, /* 0c8 */ - { { 0 }, { 0 } }, /* 0c9 */ - { { 0 }, { 0 } }, /* 0ca */ - { { 0 }, { 0 } }, /* 0cb */ - { { 0 }, { 0 } }, /* 0cc */ - { { 0 }, { 0 } }, /* 0cd */ - { { 0 }, { 0 } }, /* 0ce */ - { { 0 }, { 0 } }, /* 0cf */ - { { 0 }, { 0 } }, /* 0d0 */ - { { 0 }, { 0 } }, /* 0d1 */ - { { 0 }, { 0 } }, /* 0d2 */ - { { 0 }, { 0 } }, /* 0d3 */ - { { 0 }, { 0 } }, /* 0d4 */ - { { 0 }, { 0 } }, /* 0d5 */ - { { 0 }, { 0 } }, /* 0d6 */ - { { 0 }, { 0 } }, /* 0d7 */ - { { 0 }, { 0 } }, /* 0d8 */ - { { 0 }, { 0 } }, /* 0d9 */ - { { 0 }, { 0 } }, /* 0da */ - { { 0 }, { 0 } }, /* 0db */ - { { 0 }, { 0 } }, /* 0dc */ - { { 0 }, { 0 } }, /* 0dd */ - { { 0 }, { 0 } }, /* 0de */ - { { 0 }, { 0 } }, /* 0df */ - { { 0 }, { 0 } }, /* 0e0 */ - { { 0 }, { 0 } }, /* 0e1 */ - { { 0 }, { 0 } }, /* 0e2 */ - { { 0 }, { 0 } }, /* 0e3 */ - { { 0 }, { 0 } }, /* 0e4 */ - { { 0 }, { 0 } }, /* 0e5 */ - { { 0 }, { 0 } }, /* 0e6 */ - { { 0 }, { 0 } }, /* 0e7 */ - { { 0 }, { 0 } }, /* 0e8 */ - { { 0 }, { 0 } }, /* 0e9 */ - { { 0 }, { 0 } }, /* 0ea */ - { { 0 }, { 0 } }, /* 0eb */ - { { 0 }, { 0 } }, /* 0ec */ - { { 0 }, { 0 } }, /* 0ed */ - { { 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, /* 0ef */ - { { 0 }, { 0 } }, /* 0f0 */ - { { 0 }, { 0 } }, /* 0f1 */ - { { 0 }, { 0 } }, /* 0f2 */ - { { 0 }, { 0 } }, /* 0f3 */ - { { 0 }, { 0 } }, /* 0f4 */ - { { 0 }, { 0 } }, /* 0f5 */ - { { 0 }, { 0 } }, /* 0f6 */ - { { 0 }, { 0 } }, /* 0f7 */ - { { 0 }, { 0 } }, /* 0f8 */ - { { 0 }, { 0 } }, /* 0f9 */ - { { 0 }, { 0 } }, /* 0fa */ - { { 0 }, { 0 } }, /* 0fb */ - { { 0 }, { 0 } }, /* 0fc */ - { { 0 }, { 0 } }, /* 0fd */ - { { 0 }, { 0 } }, /* 0fe */ - { { 0 }, { 0 } }, /* 0ff */ - { { 0 }, { 0 } }, /* 100 */ - { { 0 }, { 0 } }, /* 101 */ - { { 0 }, { 0 } }, /* 102 */ - { { 0 }, { 0 } }, /* 103 */ - { { 0 }, { 0 } }, /* 104 */ - { { 0 }, { 0 } }, /* 105 */ - { { 0 }, { 0 } }, /* 106 */ - { { 0 }, { 0 } }, /* 107 */ - { { 0 }, { 0 } }, /* 108 */ - { { 0 }, { 0 } }, /* 109 */ - { { 0 }, { 0 } }, /* 10a */ - { { 0 }, { 0 } }, /* 10b */ - { { 0 }, { 0 } }, /* 10c */ - { { 0 }, { 0 } }, /* 10d */ - { { 0 }, { 0 } }, /* 10e */ - { { 0 }, { 0 } }, /* 10f */ - { { 0 }, { 0 } }, /* 110 */ - { { 0 }, { 0 } }, /* 111 */ - { { 0 }, { 0 } }, /* 112 */ - { { 0 }, { 0 } }, /* 113 */ - { { 0 }, { 0 } }, /* 114 */ - { { 0 }, { 0 } }, /* 115 */ - { { 0 }, { 0 } }, /* 116 */ - { { 0 }, { 0 } }, /* 117 */ - { { 0 }, { 0 } }, /* 118 */ - { { 0 }, { 0 } }, /* 119 */ - { { 0 }, { 0 } }, /* 11a */ - { { 0 }, { 0 } }, /* 11b */ - { { 0x57, 0 }, { 0xd7, 0 } }, /* 11c */ - { { 0 }, { 0 } }, /* 11d */ - { { 0 }, { 0 } }, /* 11e */ - { { 0 }, { 0 } }, /* 11f */ - { { 0 }, { 0 } }, /* 120 */ - { { 0 }, { 0 } }, /* 121 */ - { { 0 }, { 0 } }, /* 122 */ - { { 0 }, { 0 } }, /* 123 */ - { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, /* 125 */ - { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, /* 127 */ - { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, /* 129 */ - { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, /* 12b */ - { { 0 }, { 0 } }, /* 12c */ - { { 0 }, { 0 } }, /* 12d */ - { { 0 }, { 0 } }, /* 12e */ - { { 0 }, { 0 } }, /* 12f */ - { { 0 }, { 0 } }, /* 130 */ - { { 0 }, { 0 } }, /* 131 */ - { { 0 }, { 0 } }, /* 132 */ - { { 0 }, { 0 } }, /* 133 */ - { { 0 }, { 0 } }, /* 134 */ - { { 0x5f, 0 }, { 0xdf, 0 } }, /* 135 */ - { { 0 }, { 0 } }, /* 136 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 137 */ - { { 0x66, 0 }, { 0xe6, 0 } }, /* 138 */ - { { 0x55, 0 }, { 0xd5, 0 } }, /* 139 */ - { { 0 }, { 0 } }, /* 13a */ - { { 0 }, { 0 } }, /* 13b */ - { { 0 }, { 0 } }, /* 13c */ - { { 0 }, { 0 } }, /* 13d */ - { { 0 }, { 0 } }, /* 13e */ - { { 0 }, { 0 } }, /* 13f */ - { { 0 }, { 0 } }, /* 140 */ - { { 0 }, { 0 } }, /* 141 */ - { { 0 }, { 0 } }, /* 142 */ - { { 0 }, { 0 } }, /* 143 */ - { { 0 }, { 0 } }, /* 144 */ - { { 0 }, { 0 } }, /* 145 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 146 */ - { { 0x63, 0 }, { 0xe3, 0 } }, /* 147 */ - { { 0x5b, 0 }, { 0xdb, 0 } }, /* 148 */ - { { 0x5c, 0 }, { 0xdc, 0 } }, /* 149 */ - { { 0 }, { 0 } }, /* 14a */ - { { 0x58, 0 }, { 0xd8, 0 } }, /* 14b */ - { { 0 }, { 0 } }, /* 14c */ - { { 0x5a, 0 }, { 0xda, 0 } }, /* 14d */ - { { 0 }, { 0 } }, /* 14e */ - { { 0x65, 0 }, { 0xe5, 0 } }, /* 14f */ - { { 0x59, 0 }, { 0xd9, 0 } }, /* 150 */ - { { 0x5d, 0 }, { 0xdd, 0 } }, /* 151 */ - { { 0x62, 0 }, { 0xe2, 0 } }, /* 152 */ - { { 0x64, 0 }, { 0xe4, 0 } }, /* 153 */ - { { 0 }, { 0 } }, /* 154 */ - { { 0 }, { 0 } }, /* 155 */ - { { 0 }, { 0 } }, /* 156 */ - { { 0 }, { 0 } }, /* 157 */ - { { 0 }, { 0 } }, /* 158 */ - { { 0 }, { 0 } }, /* 159 */ - { { 0 }, { 0 } }, /* 15a */ - { { 0x54, 0 }, { 0xd4, 0 } }, /* 15b */ - { { 0x67, 0 }, { 0xe7, 0 } }, /* 15c */ - { { 0x56, 0 }, { 0xd6, 0 } }, /* 15d */ - { { 0 }, { 0 } }, /* 15e */ - { { 0 }, { 0 } }, /* 15f */ - { { 0 }, { 0 } }, /* 160 */ - { { 0 }, { 0 } }, /* 161 */ - { { 0 }, { 0 } }, /* 162 */ - { { 0 }, { 0 } }, /* 163 */ - { { 0 }, { 0 } }, /* 164 */ - { { 0 }, { 0 } }, /* 165 */ - { { 0 }, { 0 } }, /* 166 */ - { { 0 }, { 0 } }, /* 167 */ - { { 0 }, { 0 } }, /* 168 */ - { { 0 }, { 0 } }, /* 169 */ - { { 0 }, { 0 } }, /* 16a */ - { { 0 }, { 0 } }, /* 16b */ - { { 0 }, { 0 } }, /* 16c */ - { { 0 }, { 0 } }, /* 16d */ - { { 0 }, { 0 } }, /* 16e */ - { { 0 }, { 0 } }, /* 16f */ - { { 0 }, { 0 } }, /* 170 */ - { { 0 }, { 0 } }, /* 171 */ - { { 0 }, { 0 } }, /* 172 */ - { { 0 }, { 0 } }, /* 173 */ - { { 0 }, { 0 } }, /* 174 */ - { { 0 }, { 0 } }, /* 175 */ - { { 0 }, { 0 } }, /* 176 */ - { { 0 }, { 0 } }, /* 177 */ - { { 0 }, { 0 } }, /* 178 */ - { { 0 }, { 0 } }, /* 179 */ - { { 0 }, { 0 } }, /* 17a */ - { { 0 }, { 0 } }, /* 17b */ - { { 0 }, { 0 } }, /* 17c */ - { { 0 }, { 0 } }, /* 17d */ - { { 0 }, { 0 } }, /* 17e */ - { { 0 }, { 0 } }, /* 17f */ - { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, /* 181 */ - { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, /* 183 */ - { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, /* 185 */ - { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, /* 187 */ - { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, /* 189 */ - { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, /* 18b */ - { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, /* 18d */ - { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, /* 18f */ - { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, /* 191 */ - { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, /* 193 */ - { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, /* 195 */ - { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, /* 197 */ - { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, /* 199 */ - { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, /* 19b */ - { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, /* 19d */ - { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, /* 19f */ - { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, /* 1a1 */ - { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, /* 1a3 */ - { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, /* 1a5 */ - { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, /* 1a7 */ - { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, /* 1a9 */ - { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, /* 1ab */ - { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, /* 1ad */ - { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, /* 1af */ - { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, /* 1b1 */ - { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, /* 1b3 */ - { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, /* 1b5 */ - { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, /* 1b7 */ - { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, /* 1b9 */ - { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, /* 1bb */ - { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, /* 1bd */ - { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, /* 1bf */ - { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, /* 1c1 */ - { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, /* 1c3 */ - { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, /* 1c5 */ - { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, /* 1c7 */ - { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, /* 1c9 */ - { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, /* 1cb */ - { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, /* 1cd */ - { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, /* 1cf */ - { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, /* 1d1 */ - { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, /* 1d5 */ - { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, /* 1d7 */ - { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, /* 1d9 */ - { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, /* 1db */ - { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, /* 1dd */ - { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, /* 1df */ - { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, /* 1e1 */ - { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, /* 1e3 */ - { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, /* 1e5 */ - { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, /* 1e7 */ - { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, /* 1e9 */ - { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, /* 1eb */ - { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, /* 1ed */ - { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, /* 1ef */ - { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, /* 1f1 */ - { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, /* 1f3 */ - { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, /* 1f5 */ - { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, /* 1f7 */ - { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, /* 1f9 */ - { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, /* 1fb */ - { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, /* 1fd */ - { { 0 }, { 0 } }, /* 1fe */ - { { 0 }, { 0 } } /* 1ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x01, 0 }, .brk = { 0x81, 0 } }, /* 001 */ + { .mk = { 0x02, 0 }, .brk = { 0x82, 0 } }, /* 002 */ + { .mk = { 0x03, 0 }, .brk = { 0x83, 0 } }, /* 003 */ + { .mk = { 0x04, 0 }, .brk = { 0x84, 0 } }, /* 004 */ + { .mk = { 0x05, 0 }, .brk = { 0x85, 0 } }, /* 005 */ + { .mk = { 0x06, 0 }, .brk = { 0x86, 0 } }, /* 006 */ + { .mk = { 0x07, 0 }, .brk = { 0x87, 0 } }, /* 007 */ + { .mk = { 0x08, 0 }, .brk = { 0x88, 0 } }, /* 008 */ + { .mk = { 0x09, 0 }, .brk = { 0x89, 0 } }, /* 009 */ + { .mk = { 0x0a, 0 }, .brk = { 0x8a, 0 } }, /* 00a */ + { .mk = { 0x0b, 0 }, .brk = { 0x8b, 0 } }, /* 00b */ + { .mk = { 0x0c, 0 }, .brk = { 0x8c, 0 } }, /* 00c */ + { .mk = { 0x0d, 0 }, .brk = { 0x8d, 0 } }, /* 00d */ + { .mk = { 0x0e, 0 }, .brk = { 0x8e, 0 } }, /* 00e */ + { .mk = { 0x0f, 0 }, .brk = { 0x8f, 0 } }, /* 00f */ + { .mk = { 0x10, 0 }, .brk = { 0x90, 0 } }, /* 010 */ + { .mk = { 0x11, 0 }, .brk = { 0x91, 0 } }, /* 011 */ + { .mk = { 0x12, 0 }, .brk = { 0x92, 0 } }, /* 013 */ + { .mk = { 0x13, 0 }, .brk = { 0x93, 0 } }, /* 013 */ + { .mk = { 0x14, 0 }, .brk = { 0x94, 0 } }, /* 014 */ + { .mk = { 0x15, 0 }, .brk = { 0x95, 0 } }, /* 015 */ + { .mk = { 0x16, 0 }, .brk = { 0x96, 0 } }, /* 016 */ + { .mk = { 0x17, 0 }, .brk = { 0x97, 0 } }, /* 017 */ + { .mk = { 0x18, 0 }, .brk = { 0x98, 0 } }, /* 018 */ + { .mk = { 0x19, 0 }, .brk = { 0x99, 0 } }, /* 019 */ + { .mk = { 0x1a, 0 }, .brk = { 0x9a, 0 } }, /* 01a */ + { .mk = { 0x1b, 0 }, .brk = { 0x9b, 0 } }, /* 01b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 01c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 01d */ + { .mk = { 0x1e, 0 }, .brk = { 0x9e, 0 } }, /* 01e */ + { .mk = { 0x1f, 0 }, .brk = { 0x9f, 0 } }, /* 01f */ + { .mk = { 0x20, 0 }, .brk = { 0xa0, 0 } }, /* 020 */ + { .mk = { 0x21, 0 }, .brk = { 0xa1, 0 } }, /* 021 */ + { .mk = { 0x22, 0 }, .brk = { 0xa2, 0 } }, /* 022 */ + { .mk = { 0x23, 0 }, .brk = { 0xa3, 0 } }, /* 023 */ + { .mk = { 0x24, 0 }, .brk = { 0xa4, 0 } }, /* 024 */ + { .mk = { 0x25, 0 }, .brk = { 0xa5, 0 } }, /* 025 */ + { .mk = { 0x26, 0 }, .brk = { 0xa6, 0 } }, /* 026 */ + { .mk = { 0x27, 0 }, .brk = { 0xa7, 0 } }, /* 027 */ + { .mk = { 0x28, 0 }, .brk = { 0xa8, 0 } }, /* 028 */ + { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 029 */ + { .mk = { 0x2a, 0 }, .brk = { 0xaa, 0 } }, /* 02a */ + { .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 02b */ + { .mk = { 0x2c, 0 }, .brk = { 0xac, 0 } }, /* 02c */ + { .mk = { 0x2d, 0 }, .brk = { 0xad, 0 } }, /* 02d */ + { .mk = { 0x2e, 0 }, .brk = { 0xae, 0 } }, /* 02e */ + { .mk = { 0x2f, 0 }, .brk = { 0xaf, 0 } }, /* 02f */ + { .mk = { 0x30, 0 }, .brk = { 0xb0, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 031 */ + { .mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 032 */ + { .mk = { 0x33, 0 }, .brk = { 0xb3, 0 } }, /* 033 */ + { .mk = { 0x34, 0 }, .brk = { 0xb4, 0 } }, /* 034 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 035 */ + { .mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 036 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 037 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 038 */ + { .mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 039 */ + { .mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 03a */ + { .mk = { 0x3b, 0 }, .brk = { 0xbb, 0 } }, /* 03b */ + { .mk = { 0x3c, 0 }, .brk = { 0xbc, 0 } }, /* 03c */ + { .mk = { 0x3d, 0 }, .brk = { 0xbd, 0 } }, /* 03d */ + { .mk = { 0x3e, 0 }, .brk = { 0xbe, 0 } }, /* 03e */ + { .mk = { 0x3f, 0 }, .brk = { 0xbf, 0 } }, /* 03f */ + { .mk = { 0x40, 0 }, .brk = { 0xc0, 0 } }, /* 040 */ + { .mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 041 */ + { .mk = { 0x42, 0 }, .brk = { 0xc2, 0 } }, /* 042 */ + { .mk = { 0x43, 0 }, .brk = { 0xc3, 0 } }, /* 043 */ + { .mk = { 0x44, 0 }, .brk = { 0xc4, 0 } }, /* 044 */ + { .mk = { 0x45, 0 }, .brk = { 0xc5, 0 } }, /* 045 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 046 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 047 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 048 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 049 */ + { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 04a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 04b */ + { .mk = { 0x4c, 0 }, .brk = { 0xcc, 0 } }, /* 04c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 04d */ + { .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 04e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 04f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 050 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 053 */ + { .mk = { 0 }, .brk = { 0 } }, /* 054 */ + { .mk = { 0 }, .brk = { 0 } }, /* 055 */ + { .mk = { 0x5e, 0 }, .brk = { 0xde, 0 } }, /* 056 */ + { .mk = { 0x60, 0 }, .brk = { 0xe0, 0 } }, /* 057 */ + { .mk = { 0x61, 0 }, .brk = { 0xe1, 0 } }, /* 058 */ + { .mk = { 0 }, .brk = { 0 } }, /* 059 */ + { .mk = { 0 }, .brk = { 0 } }, /* 05a */ + { .mk = { 0 }, .brk = { 0 } }, /* 05b */ + { .mk = { 0 }, .brk = { 0 } }, /* 05c */ + { .mk = { 0 }, .brk = { 0 } }, /* 05d */ + { .mk = { 0 }, .brk = { 0 } }, /* 05e */ + { .mk = { 0 }, .brk = { 0 } }, /* 05f */ + { .mk = { 0 }, .brk = { 0 } }, /* 060 */ + { .mk = { 0 }, .brk = { 0 } }, /* 061 */ + { .mk = { 0 }, .brk = { 0 } }, /* 062 */ + { .mk = { 0 }, .brk = { 0 } }, /* 063 */ + { .mk = { 0 }, .brk = { 0 } }, /* 064 */ + { .mk = { 0 }, .brk = { 0 } }, /* 065 */ + { .mk = { 0 }, .brk = { 0 } }, /* 066 */ + { .mk = { 0 }, .brk = { 0 } }, /* 067 */ + { .mk = { 0 }, .brk = { 0 } }, /* 068 */ + { .mk = { 0 }, .brk = { 0 } }, /* 069 */ + { .mk = { 0 }, .brk = { 0 } }, /* 06a */ + { .mk = { 0 }, .brk = { 0 } }, /* 06b */ + { .mk = { 0 }, .brk = { 0 } }, /* 06c */ + { .mk = { 0 }, .brk = { 0 } }, /* 06d */ + { .mk = { 0 }, .brk = { 0 } }, /* 06e */ + { .mk = { 0 }, .brk = { 0 } }, /* 06f */ + { .mk = { 0 }, .brk = { 0 } }, /* 070 */ + { .mk = { 0 }, .brk = { 0 } }, /* 071 */ + { .mk = { 0 }, .brk = { 0 } }, /* 072 */ + { .mk = { 0 }, .brk = { 0 } }, /* 073 */ + { .mk = { 0 }, .brk = { 0 } }, /* 074 */ + { .mk = { 0 }, .brk = { 0 } }, /* 075 */ + { .mk = { 0 }, .brk = { 0 } }, /* 076 */ + { .mk = { 0 }, .brk = { 0 } }, /* 077 */ + { .mk = { 0 }, .brk = { 0 } }, /* 078 */ + { .mk = { 0 }, .brk = { 0 } }, /* 079 */ + { .mk = { 0 }, .brk = { 0 } }, /* 07a */ + { .mk = { 0 }, .brk = { 0 } }, /* 07b */ + { .mk = { 0 }, .brk = { 0 } }, /* 07c */ + { .mk = { 0 }, .brk = { 0 } }, /* 07d */ + { .mk = { 0 }, .brk = { 0 } }, /* 07e */ + { .mk = { 0 }, .brk = { 0 } }, /* 07f */ + { .mk = { 0 }, .brk = { 0 } }, /* 080 */ + { .mk = { 0 }, .brk = { 0 } }, /* 081 */ + { .mk = { 0 }, .brk = { 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0 }, .brk = { 0 } }, /* 085 */ + { .mk = { 0 }, .brk = { 0 } }, /* 086 */ + { .mk = { 0 }, .brk = { 0 } }, /* 087 */ + { .mk = { 0 }, .brk = { 0 } }, /* 088 */ + { .mk = { 0 }, .brk = { 0 } }, /* 089 */ + { .mk = { 0 }, .brk = { 0 } }, /* 08a */ + { .mk = { 0 }, .brk = { 0 } }, /* 08b */ + { .mk = { 0 }, .brk = { 0 } }, /* 08c */ + { .mk = { 0 }, .brk = { 0 } }, /* 08d */ + { .mk = { 0 }, .brk = { 0 } }, /* 08e */ + { .mk = { 0 }, .brk = { 0 } }, /* 08f */ + { .mk = { 0 }, .brk = { 0 } }, /* 090 */ + { .mk = { 0 }, .brk = { 0 } }, /* 091 */ + { .mk = { 0 }, .brk = { 0 } }, /* 092 */ + { .mk = { 0 }, .brk = { 0 } }, /* 093 */ + { .mk = { 0 }, .brk = { 0 } }, /* 094 */ + { .mk = { 0 }, .brk = { 0 } }, /* 095 */ + { .mk = { 0 }, .brk = { 0 } }, /* 096 */ + { .mk = { 0 }, .brk = { 0 } }, /* 097 */ + { .mk = { 0 }, .brk = { 0 } }, /* 098 */ + { .mk = { 0 }, .brk = { 0 } }, /* 099 */ + { .mk = { 0 }, .brk = { 0 } }, /* 09a */ + { .mk = { 0 }, .brk = { 0 } }, /* 09b */ + { .mk = { 0 }, .brk = { 0 } }, /* 09c */ + { .mk = { 0 }, .brk = { 0 } }, /* 09d */ + { .mk = { 0 }, .brk = { 0 } }, /* 09e */ + { .mk = { 0 }, .brk = { 0 } }, /* 09f */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 0af */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0be */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0da */ + { .mk = { 0 }, .brk = { 0 } }, /* 0db */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0de */ + { .mk = { 0 }, .brk = { 0 } }, /* 0df */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 0eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fe */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 100 */ + { .mk = { 0 }, .brk = { 0 } }, /* 101 */ + { .mk = { 0 }, .brk = { 0 } }, /* 102 */ + { .mk = { 0 }, .brk = { 0 } }, /* 103 */ + { .mk = { 0 }, .brk = { 0 } }, /* 104 */ + { .mk = { 0 }, .brk = { 0 } }, /* 105 */ + { .mk = { 0 }, .brk = { 0 } }, /* 106 */ + { .mk = { 0 }, .brk = { 0 } }, /* 107 */ + { .mk = { 0 }, .brk = { 0 } }, /* 108 */ + { .mk = { 0 }, .brk = { 0 } }, /* 109 */ + { .mk = { 0 }, .brk = { 0 } }, /* 10a */ + { .mk = { 0 }, .brk = { 0 } }, /* 10b */ + { .mk = { 0 }, .brk = { 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = { 0 }, .brk = { 0 } }, /* 10e */ + { .mk = { 0 }, .brk = { 0 } }, /* 10f */ + { .mk = { 0 }, .brk = { 0 } }, /* 110 */ + { .mk = { 0 }, .brk = { 0 } }, /* 111 */ + { .mk = { 0 }, .brk = { 0 } }, /* 112 */ + { .mk = { 0 }, .brk = { 0 } }, /* 113 */ + { .mk = { 0 }, .brk = { 0 } }, /* 114 */ + { .mk = { 0 }, .brk = { 0 } }, /* 115 */ + { .mk = { 0 }, .brk = { 0 } }, /* 116 */ + { .mk = { 0 }, .brk = { 0 } }, /* 117 */ + { .mk = { 0 }, .brk = { 0 } }, /* 118 */ + { .mk = { 0 }, .brk = { 0 } }, /* 119 */ + { .mk = { 0 }, .brk = { 0 } }, /* 11a */ + { .mk = { 0 }, .brk = { 0 } }, /* 11b */ + { .mk = { 0x57, 0 }, .brk = { 0xd7, 0 } }, /* 11c */ + { .mk = { 0 }, .brk = { 0 } }, /* 11d */ + { .mk = { 0 }, .brk = { 0 } }, /* 11e */ + { .mk = { 0 }, .brk = { 0 } }, /* 11f */ + { .mk = { 0 }, .brk = { 0 } }, /* 120 */ + { .mk = { 0 }, .brk = { 0 } }, /* 121 */ + { .mk = { 0 }, .brk = { 0 } }, /* 122 */ + { .mk = { 0 }, .brk = { 0 } }, /* 123 */ + { .mk = { 0 }, .brk = { 0 } }, /* 124 */ + { .mk = { 0 }, .brk = { 0 } }, /* 125 */ + { .mk = { 0 }, .brk = { 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = { 0 }, .brk = { 0 } }, /* 12c */ + { .mk = { 0 }, .brk = { 0 } }, /* 12d */ + { .mk = { 0 }, .brk = { 0 } }, /* 12e */ + { .mk = { 0 }, .brk = { 0 } }, /* 12f */ + { .mk = { 0 }, .brk = { 0 } }, /* 130 */ + { .mk = { 0 }, .brk = { 0 } }, /* 131 */ + { .mk = { 0 }, .brk = { 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = { 0 }, .brk = { 0 } }, /* 134 */ + { .mk = { 0x5f, 0 }, .brk = { 0xdf, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 137 */ + { .mk = { 0x66, 0 }, .brk = { 0xe6, 0 } }, /* 138 */ + { .mk = { 0x55, 0 }, .brk = { 0xd5, 0 } }, /* 139 */ + { .mk = { 0 }, .brk = { 0 } }, /* 13a */ + { .mk = { 0 }, .brk = { 0 } }, /* 13b */ + { .mk = { 0 }, .brk = { 0 } }, /* 13c */ + { .mk = { 0 }, .brk = { 0 } }, /* 13d */ + { .mk = { 0 }, .brk = { 0 } }, /* 13e */ + { .mk = { 0 }, .brk = { 0 } }, /* 13f */ + { .mk = { 0 }, .brk = { 0 } }, /* 140 */ + { .mk = { 0 }, .brk = { 0 } }, /* 141 */ + { .mk = { 0 }, .brk = { 0 } }, /* 142 */ + { .mk = { 0 }, .brk = { 0 } }, /* 143 */ + { .mk = { 0 }, .brk = { 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 146 */ + { .mk = { 0x63, 0 }, .brk = { 0xe3, 0 } }, /* 147 */ + { .mk = { 0x5b, 0 }, .brk = { 0xdb, 0 } }, /* 148 */ + { .mk = { 0x5c, 0 }, .brk = { 0xdc, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = { 0x58, 0 }, .brk = { 0xd8, 0 } }, /* 14b */ + { .mk = { 0 }, .brk = { 0 } }, /* 14c */ + { .mk = { 0x5a, 0 }, .brk = { 0xda, 0 } }, /* 14d */ + { .mk = { 0 }, .brk = { 0 } }, /* 14e */ + { .mk = { 0x65, 0 }, .brk = { 0xe5, 0 } }, /* 14f */ + { .mk = { 0x59, 0 }, .brk = { 0xd9, 0 } }, /* 150 */ + { .mk = { 0x5d, 0 }, .brk = { 0xdd, 0 } }, /* 151 */ + { .mk = { 0x62, 0 }, .brk = { 0xe2, 0 } }, /* 152 */ + { .mk = { 0x64, 0 }, .brk = { 0xe4, 0 } }, /* 153 */ + { .mk = { 0 }, .brk = { 0 } }, /* 154 */ + { .mk = { 0 }, .brk = { 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = { 0 }, .brk = { 0 } }, /* 157 */ + { .mk = { 0 }, .brk = { 0 } }, /* 158 */ + { .mk = { 0 }, .brk = { 0 } }, /* 159 */ + { .mk = { 0 }, .brk = { 0 } }, /* 15a */ + { .mk = { 0x54, 0 }, .brk = { 0xd4, 0 } }, /* 15b */ + { .mk = { 0x67, 0 }, .brk = { 0xe7, 0 } }, /* 15c */ + { .mk = { 0x56, 0 }, .brk = { 0xd6, 0 } }, /* 15d */ + { .mk = { 0 }, .brk = { 0 } }, /* 15e */ + { .mk = { 0 }, .brk = { 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = { 0 }, .brk = { 0 } }, /* 161 */ + { .mk = { 0 }, .brk = { 0 } }, /* 162 */ + { .mk = { 0 }, .brk = { 0 } }, /* 163 */ + { .mk = { 0 }, .brk = { 0 } }, /* 164 */ + { .mk = { 0 }, .brk = { 0 } }, /* 165 */ + { .mk = { 0 }, .brk = { 0 } }, /* 166 */ + { .mk = { 0 }, .brk = { 0 } }, /* 167 */ + { .mk = { 0 }, .brk = { 0 } }, /* 168 */ + { .mk = { 0 }, .brk = { 0 } }, /* 169 */ + { .mk = { 0 }, .brk = { 0 } }, /* 16a */ + { .mk = { 0 }, .brk = { 0 } }, /* 16b */ + { .mk = { 0 }, .brk = { 0 } }, /* 16c */ + { .mk = { 0 }, .brk = { 0 } }, /* 16d */ + { .mk = { 0 }, .brk = { 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = { 0 }, .brk = { 0 } }, /* 170 */ + { .mk = { 0 }, .brk = { 0 } }, /* 171 */ + { .mk = { 0 }, .brk = { 0 } }, /* 172 */ + { .mk = { 0 }, .brk = { 0 } }, /* 173 */ + { .mk = { 0 }, .brk = { 0 } }, /* 174 */ + { .mk = { 0 }, .brk = { 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = { 0 }, .brk = { 0 } }, /* 177 */ + { .mk = { 0 }, .brk = { 0 } }, /* 178 */ + { .mk = { 0 }, .brk = { 0 } }, /* 179 */ + { .mk = { 0 }, .brk = { 0 } }, /* 17a */ + { .mk = { 0 }, .brk = { 0 } }, /* 17b */ + { .mk = { 0 }, .brk = { 0 } }, /* 17c */ + { .mk = { 0 }, .brk = { 0 } }, /* 17d */ + { .mk = { 0 }, .brk = { 0 } }, /* 17e */ + { .mk = { 0 }, .brk = { 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fe */ + { .mk = { 0 }, .brk = { 0 } } /* 1ff */ // clang-format on }; @@ -1369,518 +1369,518 @@ const scancode scancode_olivetti_m24_deluxe[512] = { */ const scancode scancode_olivetti_m240[512] = { // clang-format off - { { 0 }, { 0 } }, /* 000 */ - { { 0x01, 0 }, { 0x81, 0 } }, /* 001 */ - { { 0x02, 0 }, { 0x82, 0 } }, /* 002 */ - { { 0x03, 0 }, { 0x83, 0 } }, /* 003 */ - { { 0x04, 0 }, { 0x84, 0 } }, /* 004 */ - { { 0x05, 0 }, { 0x85, 0 } }, /* 005 */ - { { 0x06, 0 }, { 0x86, 0 } }, /* 006 */ - { { 0x07, 0 }, { 0x87, 0 } }, /* 007 */ - { { 0x08, 0 }, { 0x88, 0 } }, /* 008 */ - { { 0x09, 0 }, { 0x89, 0 } }, /* 009 */ - { { 0x0a, 0 }, { 0x8a, 0 } }, /* 00a */ - { { 0x0b, 0 }, { 0x8b, 0 } }, /* 00b */ - { { 0x0c, 0 }, { 0x8c, 0 } }, /* 00c */ - { { 0x0d, 0 }, { 0x8d, 0 } }, /* 00d */ - { { 0x0e, 0 }, { 0x8e, 0 } }, /* 00e */ - { { 0x0f, 0 }, { 0x8f, 0 } }, /* 00f */ - { { 0x10, 0 }, { 0x90, 0 } }, /* 010 */ - { { 0x11, 0 }, { 0x91, 0 } }, /* 011 */ - { { 0x12, 0 }, { 0x92, 0 } }, /* 012 */ - { { 0x13, 0 }, { 0x93, 0 } }, /* 013 */ - { { 0x14, 0 }, { 0x94, 0 } }, /* 014 */ - { { 0x15, 0 }, { 0x95, 0 } }, /* 015 */ - { { 0x16, 0 }, { 0x96, 0 } }, /* 016 */ - { { 0x17, 0 }, { 0x97, 0 } }, /* 017 */ - { { 0x18, 0 }, { 0x98, 0 } }, /* 018 */ - { { 0x19, 0 }, { 0x99, 0 } }, /* 019 */ - { { 0x1a, 0 }, { 0x9a, 0 } }, /* 01a */ - { { 0x1b, 0 }, { 0x9b, 0 } }, /* 01b */ - { { 0x1c, 0 }, { 0x9c, 0 } }, /* 01c */ - { { 0x1d, 0 }, { 0x9d, 0 } }, /* 01d */ - { { 0x1e, 0 }, { 0x9e, 0 } }, /* 01e */ - { { 0x1f, 0 }, { 0x9f, 0 } }, /* 01f */ - { { 0x20, 0 }, { 0xa0, 0 } }, /* 020 */ - { { 0x21, 0 }, { 0xa1, 0 } }, /* 021 */ - { { 0x22, 0 }, { 0xa2, 0 } }, /* 023 */ - { { 0x23, 0 }, { 0xa3, 0 } }, /* 023 */ - { { 0x24, 0 }, { 0xa4, 0 } }, /* 024 */ - { { 0x25, 0 }, { 0xa5, 0 } }, /* 025 */ - { { 0x26, 0 }, { 0xa6, 0 } }, /* 026 */ - { { 0x27, 0 }, { 0xa7, 0 } }, /* 027 */ - { { 0x28, 0 }, { 0xa8, 0 } }, /* 028 */ - { { 0x29, 0 }, { 0xa9, 0 } }, /* 029 */ - { { 0x2a, 0 }, { 0xaa, 0 } }, /* 02a */ - { { 0x2b, 0 }, { 0xab, 0 } }, /* 02b */ - { { 0x2c, 0 }, { 0xac, 0 } }, /* 02c */ - { { 0x2d, 0 }, { 0xad, 0 } }, /* 02d */ - { { 0x2e, 0 }, { 0xae, 0 } }, /* 02e */ - { { 0x2f, 0 }, { 0xaf, 0 } }, /* 02f */ - { { 0x30, 0 }, { 0xb0, 0 } }, /* 030 */ - { { 0x31, 0 }, { 0xb1, 0 } }, /* 031 */ - { { 0x32, 0 }, { 0xb2, 0 } }, /* 032 */ - { { 0x33, 0 }, { 0xb3, 0 } }, /* 033 */ - { { 0x34, 0 }, { 0xb4, 0 } }, /* 034 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 035 */ - { { 0x36, 0 }, { 0xb6, 0 } }, /* 036 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 037 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 038 */ - { { 0x39, 0 }, { 0xb9, 0 } }, /* 039 */ - { { 0x3a, 0 }, { 0xba, 0 } }, /* 03a */ - { { 0x3b, 0 }, { 0xbb, 0 } }, /* 03b */ - { { 0x3c, 0 }, { 0xbc, 0 } }, /* 03c */ - { { 0x3d, 0 }, { 0xbd, 0 } }, /* 03d */ - { { 0x3e, 0 }, { 0xbe, 0 } }, /* 03e */ - { { 0x3f, 0 }, { 0xbf, 0 } }, /* 03f */ - { { 0x40, 0 }, { 0xc0, 0 } }, /* 040 */ - { { 0x41, 0 }, { 0xc1, 0 } }, /* 041 */ - { { 0x42, 0 }, { 0xc2, 0 } }, /* 042 */ - { { 0x43, 0 }, { 0xc3, 0 } }, /* 043 */ - { { 0x44, 0 }, { 0xc4, 0 } }, /* 044 */ - { { 0x45, 0 }, { 0xc5, 0 } }, /* 045 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 046 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 047 */ - { { 0x48, 0 }, { 0xc8, 0 } }, /* 048 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 049 */ - { { 0x4a, 0 }, { 0xca, 0 } }, /* 04a */ - { { 0x4b, 0 }, { 0xcb, 0 } }, /* 04b */ - { { 0x4c, 0 }, { 0xcc, 0 } }, /* 04c */ - { { 0x4d, 0 }, { 0xcd, 0 } }, /* 04d */ - { { 0x4e, 0 }, { 0xce, 0 } }, /* 04e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 04f */ - { { 0x50, 0 }, { 0xd0, 0 } }, /* 050 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 051 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 052 */ - { { 0x53, 0 }, { 0xd3, 0 } }, /* 053 */ - { { 0 }, { 0 } }, /* 054 */ - { { 0 }, { 0 } }, /* 055 */ - { { 0 }, { 0 } }, /* 056 */ - { { 0 }, { 0 } }, /* 057 */ - { { 0 }, { 0 } }, /* 058 */ - { { 0 }, { 0 } }, /* 059 */ - { { 0 }, { 0 } }, /* 05a */ - { { 0 }, { 0 } }, /* 05b */ - { { 0 }, { 0 } }, /* 05c */ - { { 0 }, { 0 } }, /* 05d */ - { { 0 }, { 0 } }, /* 05e */ - { { 0 }, { 0 } }, /* 05f */ - { { 0 }, { 0 } }, /* 060 */ - { { 0 }, { 0 } }, /* 061 */ - { { 0 }, { 0 } }, /* 062 */ - { { 0 }, { 0 } }, /* 063 */ - { { 0 }, { 0 } }, /* 064 */ - { { 0 }, { 0 } }, /* 065 */ - { { 0 }, { 0 } }, /* 066 */ - { { 0 }, { 0 } }, /* 067 */ - { { 0 }, { 0 } }, /* 068 */ - { { 0 }, { 0 } }, /* 069 */ - { { 0 }, { 0 } }, /* 06a */ - { { 0 }, { 0 } }, /* 06b */ - { { 0 }, { 0 } }, /* 06c */ - { { 0 }, { 0 } }, /* 06d */ - { { 0 }, { 0 } }, /* 06e */ - { { 0 }, { 0 } }, /* 06f */ - { { 0 }, { 0 } }, /* 070 */ - { { 0 }, { 0 } }, /* 071 */ - { { 0 }, { 0 } }, /* 072 */ - { { 0 }, { 0 } }, /* 073 */ - { { 0 }, { 0 } }, /* 074 */ - { { 0 }, { 0 } }, /* 075 */ - { { 0 }, { 0 } }, /* 076 */ - { { 0 }, { 0 } }, /* 077 */ - { { 0 }, { 0 } }, /* 078 */ - { { 0 }, { 0 } }, /* 079 */ - { { 0 }, { 0 } }, /* 07a */ - { { 0 }, { 0 } }, /* 07b */ - { { 0 }, { 0 } }, /* 07c */ - { { 0 }, { 0 } }, /* 07d */ - { { 0 }, { 0 } }, /* 07e */ - { { 0 }, { 0 } }, /* 07f */ - { { 0 }, { 0 } }, /* 080 */ - { { 0 }, { 0 } }, /* 081 */ - { { 0 }, { 0 } }, /* 082 */ - { { 0 }, { 0 } }, /* 083 */ - { { 0 }, { 0 } }, /* 084 */ - { { 0 }, { 0 } }, /* 085 */ - { { 0 }, { 0 } }, /* 086 */ - { { 0 }, { 0 } }, /* 087 */ - { { 0 }, { 0 } }, /* 088 */ - { { 0 }, { 0 } }, /* 089 */ - { { 0 }, { 0 } }, /* 08a */ - { { 0 }, { 0 } }, /* 08b */ - { { 0 }, { 0 } }, /* 08c */ - { { 0 }, { 0 } }, /* 08d */ - { { 0 }, { 0 } }, /* 08e */ - { { 0 }, { 0 } }, /* 08f */ - { { 0 }, { 0 } }, /* 090 */ - { { 0 }, { 0 } }, /* 091 */ - { { 0 }, { 0 } }, /* 092 */ - { { 0 }, { 0 } }, /* 093 */ - { { 0 }, { 0 } }, /* 094 */ - { { 0 }, { 0 } }, /* 095 */ - { { 0 }, { 0 } }, /* 096 */ - { { 0 }, { 0 } }, /* 097 */ - { { 0 }, { 0 } }, /* 098 */ - { { 0 }, { 0 } }, /* 099 */ - { { 0 }, { 0 } }, /* 09a */ - { { 0 }, { 0 } }, /* 09b */ - { { 0 }, { 0 } }, /* 09c */ - { { 0 }, { 0 } }, /* 09d */ - { { 0 }, { 0 } }, /* 09e */ - { { 0 }, { 0 } }, /* 09f */ - { { 0 }, { 0 } }, /* 0a0 */ - { { 0 }, { 0 } }, /* 0a1 */ - { { 0 }, { 0 } }, /* 0a2 */ - { { 0 }, { 0 } }, /* 0a3 */ - { { 0 }, { 0 } }, /* 0a4 */ - { { 0 }, { 0 } }, /* 0a5 */ - { { 0 }, { 0 } }, /* 0a6 */ - { { 0 }, { 0 } }, /* 0a7 */ - { { 0 }, { 0 } }, /* 0a8 */ - { { 0 }, { 0 } }, /* 0a9 */ - { { 0 }, { 0 } }, /* 0aa */ - { { 0 }, { 0 } }, /* 0ab */ - { { 0 }, { 0 } }, /* 0ac */ - { { 0 }, { 0 } }, /* 0ad */ - { { 0 }, { 0 } }, /* 0ae */ - { { 0 }, { 0 } }, /* 0af */ - { { 0 }, { 0 } }, /* 0b0 */ - { { 0 }, { 0 } }, /* 0b1 */ - { { 0 }, { 0 } }, /* 0b2 */ - { { 0 }, { 0 } }, /* 0b3 */ - { { 0 }, { 0 } }, /* 0b4 */ - { { 0 }, { 0 } }, /* 0b5 */ - { { 0 }, { 0 } }, /* 0b6 */ - { { 0 }, { 0 } }, /* 0b7 */ - { { 0 }, { 0 } }, /* 0b8 */ - { { 0 }, { 0 } }, /* 0b9 */ - { { 0 }, { 0 } }, /* 0ba */ - { { 0 }, { 0 } }, /* 0bb */ - { { 0 }, { 0 } }, /* 0bc */ - { { 0 }, { 0 } }, /* 0bd */ - { { 0 }, { 0 } }, /* 0be */ - { { 0 }, { 0 } }, /* 0bf */ - { { 0 }, { 0 } }, /* 0c0 */ - { { 0 }, { 0 } }, /* 0c1 */ - { { 0 }, { 0 } }, /* 0c2 */ - { { 0 }, { 0 } }, /* 0c3 */ - { { 0 }, { 0 } }, /* 0c4 */ - { { 0 }, { 0 } }, /* 0c5 */ - { { 0 }, { 0 } }, /* 0c6 */ - { { 0 }, { 0 } }, /* 0c7 */ - { { 0 }, { 0 } }, /* 0c8 */ - { { 0 }, { 0 } }, /* 0c9 */ - { { 0 }, { 0 } }, /* 0ca */ - { { 0 }, { 0 } }, /* 0cb */ - { { 0 }, { 0 } }, /* 0cc */ - { { 0 }, { 0 } }, /* 0cd */ - { { 0 }, { 0 } }, /* 0ce */ - { { 0 }, { 0 } }, /* 0cf */ - { { 0 }, { 0 } }, /* 0d0 */ - { { 0 }, { 0 } }, /* 0d1 */ - { { 0 }, { 0 } }, /* 0d2 */ - { { 0 }, { 0 } }, /* 0d3 */ - { { 0 }, { 0 } }, /* 0d4 */ - { { 0 }, { 0 } }, /* 0d5 */ - { { 0 }, { 0 } }, /* 0d6 */ - { { 0 }, { 0 } }, /* 0d7 */ - { { 0 }, { 0 } }, /* 0d8 */ - { { 0 }, { 0 } }, /* 0d9 */ - { { 0 }, { 0 } }, /* 0da */ - { { 0 }, { 0 } }, /* 0db */ - { { 0 }, { 0 } }, /* 0dc */ - { { 0 }, { 0 } }, /* 0dd */ - { { 0 }, { 0 } }, /* 0de */ - { { 0 }, { 0 } }, /* 0df */ - { { 0 }, { 0 } }, /* 0e0 */ - { { 0 }, { 0 } }, /* 0e1 */ - { { 0 }, { 0 } }, /* 0e2 */ - { { 0 }, { 0 } }, /* 0e3 */ - { { 0 }, { 0 } }, /* 0e4 */ - { { 0 }, { 0 } }, /* 0e5 */ - { { 0 }, { 0 } }, /* 0e6 */ - { { 0 }, { 0 } }, /* 0e7 */ - { { 0 }, { 0 } }, /* 0e8 */ - { { 0 }, { 0 } }, /* 0e9 */ - { { 0 }, { 0 } }, /* 0ea */ - { { 0 }, { 0 } }, /* 0eb */ - { { 0 }, { 0 } }, /* 0ec */ - { { 0 }, { 0 } }, /* 0ed */ - { { 0 }, { 0 } }, /* 0ee */ - { { 0 }, { 0 } }, /* 0ef */ - { { 0 }, { 0 } }, /* 0f0 */ - { { 0 }, { 0 } }, /* 0f1 */ - { { 0 }, { 0 } }, /* 0f2 */ - { { 0 }, { 0 } }, /* 0f3 */ - { { 0 }, { 0 } }, /* 0f4 */ - { { 0 }, { 0 } }, /* 0f5 */ - { { 0 }, { 0 } }, /* 0f6 */ - { { 0 }, { 0 } }, /* 0f7 */ - { { 0 }, { 0 } }, /* 0f8 */ - { { 0 }, { 0 } }, /* 0f9 */ - { { 0 }, { 0 } }, /* 0fa */ - { { 0 }, { 0 } }, /* 0fb */ - { { 0 }, { 0 } }, /* 0fc */ - { { 0 }, { 0 } }, /* 0fd */ - { { 0 }, { 0 } }, /* 0fe */ - { { 0 }, { 0 } }, /* 0ff */ - { { 0 }, { 0 } }, /* 100 */ - { { 0 }, { 0 } }, /* 101 */ - { { 0 }, { 0 } }, /* 102 */ - { { 0 }, { 0 } }, /* 103 */ - { { 0 }, { 0 } }, /* 104 */ - { { 0 }, { 0 } }, /* 105 */ - { { 0 }, { 0 } }, /* 106 */ - { { 0 }, { 0 } }, /* 107 */ - { { 0 }, { 0 } }, /* 108 */ - { { 0 }, { 0 } }, /* 109 */ - { { 0 }, { 0 } }, /* 10a */ - { { 0 }, { 0 } }, /* 10b */ - { { 0 }, { 0 } }, /* 10c */ - { { 0 }, { 0 } }, /* 10d */ - { { 0 }, { 0 } }, /* 10e */ - { { 0 }, { 0 } }, /* 10f */ - { { 0 }, { 0 } }, /* 110 */ - { { 0 }, { 0 } }, /* 111 */ - { { 0 }, { 0 } }, /* 112 */ - { { 0 }, { 0 } }, /* 113 */ - { { 0 }, { 0 } }, /* 114 */ - { { 0 }, { 0 } }, /* 115 */ - { { 0 }, { 0 } }, /* 116 */ - { { 0 }, { 0 } }, /* 117 */ - { { 0 }, { 0 } }, /* 118 */ - { { 0 }, { 0 } }, /* 119 */ - { { 0 }, { 0 } }, /* 11a */ - { { 0 }, { 0 } }, /* 11b */ - { { 0x1c, 0 }, { 0x9c, 0 } }, /* 11c */ - { { 0x1d, 0 }, { 0x9d, 0 } }, /* 11d */ - { { 0 }, { 0 } }, /* 11e */ - { { 0 }, { 0 } }, /* 11f */ - { { 0 }, { 0 } }, /* 120 */ - { { 0 }, { 0 } }, /* 121 */ - { { 0 }, { 0 } }, /* 122 */ - { { 0 }, { 0 } }, /* 123 */ - { { 0 }, { 0 } }, /* 124 */ - { { 0 }, { 0 } }, /* 125 */ - { { 0 }, { 0 } }, /* 126 */ - { { 0 }, { 0 } }, /* 127 */ - { { 0 }, { 0 } }, /* 128 */ - { { 0 }, { 0 } }, /* 129 */ - { { 0 }, { 0 } }, /* 12a */ - { { 0 }, { 0 } }, /* 12b */ - { { 0 }, { 0 } }, /* 12c */ - { { 0 }, { 0 } }, /* 12d */ - { { 0 }, { 0 } }, /* 12e */ - { { 0 }, { 0 } }, /* 12f */ - { { 0 }, { 0 } }, /* 130 */ - { { 0 }, { 0 } }, /* 131 */ - { { 0 }, { 0 } }, /* 132 */ - { { 0 }, { 0 } }, /* 133 */ - { { 0 }, { 0 } }, /* 134 */ - { { 0x35, 0 }, { 0xb5, 0 } }, /* 135 */ - { { 0 }, { 0 } }, /* 136 */ - { { 0x37, 0 }, { 0xb7, 0 } }, /* 137 */ - { { 0x38, 0 }, { 0xb8, 0 } }, /* 138 */ - { { 0 }, { 0 } }, /* 139 */ - { { 0 }, { 0 } }, /* 13a */ - { { 0 }, { 0 } }, /* 13b */ - { { 0 }, { 0 } }, /* 13c */ - { { 0 }, { 0 } }, /* 13d */ - { { 0 }, { 0 } }, /* 13e */ - { { 0 }, { 0 } }, /* 13f */ - { { 0 }, { 0 } }, /* 140 */ - { { 0 }, { 0 } }, /* 141 */ - { { 0 }, { 0 } }, /* 142 */ - { { 0 }, { 0 } }, /* 143 */ - { { 0 }, { 0 } }, /* 144 */ - { { 0 }, { 0 } }, /* 145 */ - { { 0x46, 0 }, { 0xc6, 0 } }, /* 146 */ - { { 0x47, 0 }, { 0xc7, 0 } }, /* 147 */ - { { 0x48, 0 }, { 0xc8, 0 } }, /* 148 */ - { { 0x49, 0 }, { 0xc9, 0 } }, /* 149 */ - { { 0 }, { 0 } }, /* 14a */ - { { 0x4b, 0 }, { 0xcb, 0 } }, /* 14b */ - { { 0 }, { 0 } }, /* 14c */ - { { 0x4d, 0 }, { 0xcd, 0 } }, /* 14d */ - { { 0 }, { 0 } }, /* 14e */ - { { 0x4f, 0 }, { 0xcf, 0 } }, /* 14f */ - { { 0x50, 0 }, { 0xd0, 0 } }, /* 150 */ - { { 0x51, 0 }, { 0xd1, 0 } }, /* 151 */ - { { 0x52, 0 }, { 0xd2, 0 } }, /* 152 */ - { { 0x53, 0 }, { 0xd3, 0 } }, /* 153 */ - { { 0 }, { 0 } }, /* 154 */ - { { 0 }, { 0 } }, /* 155 */ - { { 0 }, { 0 } }, /* 156 */ - { { 0 }, { 0 } }, /* 157 */ - { { 0 }, { 0 } }, /* 158 */ - { { 0 }, { 0 } }, /* 159 */ - { { 0 }, { 0 } }, /* 15a */ - { { 0 }, { 0 } }, /* 15b */ - { { 0 }, { 0 } }, /* 15c */ - { { 0x54, 0 }, { 0xd4, 0 } }, /* 15d */ - { { 0x56, 0 }, { 0xd6, 0 } }, /* 15e */ - { { 0x5c, 0 }, { 0xdc, 0 } }, /* 15f */ - { { 0 }, { 0 } }, /* 160 */ - { { 0 }, { 0 } }, /* 161 */ - { { 0 }, { 0 } }, /* 162 */ - { { 0 }, { 0 } }, /* 163 */ - { { 0 }, { 0 } }, /* 164 */ - { { 0 }, { 0 } }, /* 165 */ - { { 0 }, { 0 } }, /* 166 */ - { { 0 }, { 0 } }, /* 167 */ - { { 0 }, { 0 } }, /* 168 */ - { { 0 }, { 0 } }, /* 169 */ - { { 0 }, { 0 } }, /* 16a */ - { { 0 }, { 0 } }, /* 16b */ - { { 0 }, { 0 } }, /* 16c */ - { { 0 }, { 0 } }, /* 16d */ - { { 0 }, { 0 } }, /* 16e */ - { { 0 }, { 0 } }, /* 16f */ - { { 0 }, { 0 } }, /* 170 */ - { { 0 }, { 0 } }, /* 171 */ - { { 0 }, { 0 } }, /* 172 */ - { { 0 }, { 0 } }, /* 173 */ - { { 0 }, { 0 } }, /* 174 */ - { { 0 }, { 0 } }, /* 175 */ - { { 0 }, { 0 } }, /* 176 */ - { { 0 }, { 0 } }, /* 177 */ - { { 0 }, { 0 } }, /* 178 */ - { { 0 }, { 0 } }, /* 179 */ - { { 0 }, { 0 } }, /* 17a */ - { { 0 }, { 0 } }, /* 17b */ - { { 0 }, { 0 } }, /* 17c */ - { { 0 }, { 0 } }, /* 17d */ - { { 0 }, { 0 } }, /* 17e */ - { { 0 }, { 0 } }, /* 17f */ - { { 0 }, { 0 } }, /* 180 */ - { { 0 }, { 0 } }, /* 181 */ - { { 0 }, { 0 } }, /* 182 */ - { { 0 }, { 0 } }, /* 183 */ - { { 0 }, { 0 } }, /* 184 */ - { { 0 }, { 0 } }, /* 185 */ - { { 0 }, { 0 } }, /* 186 */ - { { 0 }, { 0 } }, /* 187 */ - { { 0 }, { 0 } }, /* 188 */ - { { 0 }, { 0 } }, /* 189 */ - { { 0 }, { 0 } }, /* 18a */ - { { 0 }, { 0 } }, /* 18b */ - { { 0 }, { 0 } }, /* 18c */ - { { 0 }, { 0 } }, /* 18d */ - { { 0 }, { 0 } }, /* 18e */ - { { 0 }, { 0 } }, /* 18f */ - { { 0 }, { 0 } }, /* 190 */ - { { 0 }, { 0 } }, /* 191 */ - { { 0 }, { 0 } }, /* 192 */ - { { 0 }, { 0 } }, /* 193 */ - { { 0 }, { 0 } }, /* 194 */ - { { 0 }, { 0 } }, /* 195 */ - { { 0 }, { 0 } }, /* 196 */ - { { 0 }, { 0 } }, /* 197 */ - { { 0 }, { 0 } }, /* 198 */ - { { 0 }, { 0 } }, /* 199 */ - { { 0 }, { 0 } }, /* 19a */ - { { 0 }, { 0 } }, /* 19b */ - { { 0 }, { 0 } }, /* 19c */ - { { 0 }, { 0 } }, /* 19d */ - { { 0 }, { 0 } }, /* 19e */ - { { 0 }, { 0 } }, /* 19f */ - { { 0 }, { 0 } }, /* 1a0 */ - { { 0 }, { 0 } }, /* 1a1 */ - { { 0 }, { 0 } }, /* 1a2 */ - { { 0 }, { 0 } }, /* 1a3 */ - { { 0 }, { 0 } }, /* 1a4 */ - { { 0 }, { 0 } }, /* 1a5 */ - { { 0 }, { 0 } }, /* 1a6 */ - { { 0 }, { 0 } }, /* 1a7 */ - { { 0 }, { 0 } }, /* 1a8 */ - { { 0 }, { 0 } }, /* 1a9 */ - { { 0 }, { 0 } }, /* 1aa */ - { { 0 }, { 0 } }, /* 1ab */ - { { 0 }, { 0 } }, /* 1ac */ - { { 0 }, { 0 } }, /* 1ad */ - { { 0 }, { 0 } }, /* 1ae */ - { { 0 }, { 0 } }, /* 1af */ - { { 0 }, { 0 } }, /* 1b0 */ - { { 0 }, { 0 } }, /* 1b1 */ - { { 0 }, { 0 } }, /* 1b2 */ - { { 0 }, { 0 } }, /* 1b3 */ - { { 0 }, { 0 } }, /* 1b4 */ - { { 0 }, { 0 } }, /* 1b5 */ - { { 0 }, { 0 } }, /* 1b6 */ - { { 0 }, { 0 } }, /* 1b7 */ - { { 0 }, { 0 } }, /* 1b8 */ - { { 0 }, { 0 } }, /* 1b9 */ - { { 0 }, { 0 } }, /* 1ba */ - { { 0 }, { 0 } }, /* 1bb */ - { { 0 }, { 0 } }, /* 1bc */ - { { 0 }, { 0 } }, /* 1bd */ - { { 0 }, { 0 } }, /* 1be */ - { { 0 }, { 0 } }, /* 1bf */ - { { 0 }, { 0 } }, /* 1c0 */ - { { 0 }, { 0 } }, /* 1c1 */ - { { 0 }, { 0 } }, /* 1c2 */ - { { 0 }, { 0 } }, /* 1c3 */ - { { 0 }, { 0 } }, /* 1c4 */ - { { 0 }, { 0 } }, /* 1c5 */ - { { 0 }, { 0 } }, /* 1c6 */ - { { 0 }, { 0 } }, /* 1c7 */ - { { 0 }, { 0 } }, /* 1c8 */ - { { 0 }, { 0 } }, /* 1c9 */ - { { 0 }, { 0 } }, /* 1ca */ - { { 0 }, { 0 } }, /* 1cb */ - { { 0 }, { 0 } }, /* 1cc */ - { { 0 }, { 0 } }, /* 1cd */ - { { 0 }, { 0 } }, /* 1ce */ - { { 0 }, { 0 } }, /* 1cf */ - { { 0 }, { 0 } }, /* 1d0 */ - { { 0 }, { 0 } }, /* 1d1 */ - { { 0 }, { 0 } }, /* 1d2 */ - { { 0 }, { 0 } }, /* 1d3 */ - { { 0 }, { 0 } }, /* 1d4 */ - { { 0 }, { 0 } }, /* 1d5 */ - { { 0 }, { 0 } }, /* 1d6 */ - { { 0 }, { 0 } }, /* 1d7 */ - { { 0 }, { 0 } }, /* 1d8 */ - { { 0 }, { 0 } }, /* 1d9 */ - { { 0 }, { 0 } }, /* 1da */ - { { 0 }, { 0 } }, /* 1db */ - { { 0 }, { 0 } }, /* 1dc */ - { { 0 }, { 0 } }, /* 1dd */ - { { 0 }, { 0 } }, /* 1de */ - { { 0 }, { 0 } }, /* 1df */ - { { 0 }, { 0 } }, /* 1e0 */ - { { 0 }, { 0 } }, /* 1e1 */ - { { 0 }, { 0 } }, /* 1e2 */ - { { 0 }, { 0 } }, /* 1e3 */ - { { 0 }, { 0 } }, /* 1e4 */ - { { 0 }, { 0 } }, /* 1e5 */ - { { 0 }, { 0 } }, /* 1e6 */ - { { 0 }, { 0 } }, /* 1e7 */ - { { 0 }, { 0 } }, /* 1e8 */ - { { 0 }, { 0 } }, /* 1e9 */ - { { 0 }, { 0 } }, /* 1ea */ - { { 0 }, { 0 } }, /* 1eb */ - { { 0 }, { 0 } }, /* 1ec */ - { { 0 }, { 0 } }, /* 1ed */ - { { 0 }, { 0 } }, /* 1ee */ - { { 0 }, { 0 } }, /* 1ef */ - { { 0 }, { 0 } }, /* 1f0 */ - { { 0 }, { 0 } }, /* 1f1 */ - { { 0 }, { 0 } }, /* 1f2 */ - { { 0 }, { 0 } }, /* 1f3 */ - { { 0 }, { 0 } }, /* 1f4 */ - { { 0 }, { 0 } }, /* 1f5 */ - { { 0 }, { 0 } }, /* 1f6 */ - { { 0 }, { 0 } }, /* 1f7 */ - { { 0 }, { 0 } }, /* 1f8 */ - { { 0 }, { 0 } }, /* 1f9 */ - { { 0 }, { 0 } }, /* 1fa */ - { { 0 }, { 0 } }, /* 1fb */ - { { 0 }, { 0 } }, /* 1fc */ - { { 0 }, { 0 } }, /* 1fd */ - { { 0 }, { 0 } }, /* 1fe */ - { { 0 }, { 0 } } /* 1ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x01, 0 }, .brk = { 0x81, 0 } }, /* 001 */ + { .mk = { 0x02, 0 }, .brk = { 0x82, 0 } }, /* 002 */ + { .mk = { 0x03, 0 }, .brk = { 0x83, 0 } }, /* 003 */ + { .mk = { 0x04, 0 }, .brk = { 0x84, 0 } }, /* 004 */ + { .mk = { 0x05, 0 }, .brk = { 0x85, 0 } }, /* 005 */ + { .mk = { 0x06, 0 }, .brk = { 0x86, 0 } }, /* 006 */ + { .mk = { 0x07, 0 }, .brk = { 0x87, 0 } }, /* 007 */ + { .mk = { 0x08, 0 }, .brk = { 0x88, 0 } }, /* 008 */ + { .mk = { 0x09, 0 }, .brk = { 0x89, 0 } }, /* 009 */ + { .mk = { 0x0a, 0 }, .brk = { 0x8a, 0 } }, /* 00a */ + { .mk = { 0x0b, 0 }, .brk = { 0x8b, 0 } }, /* 00b */ + { .mk = { 0x0c, 0 }, .brk = { 0x8c, 0 } }, /* 00c */ + { .mk = { 0x0d, 0 }, .brk = { 0x8d, 0 } }, /* 00d */ + { .mk = { 0x0e, 0 }, .brk = { 0x8e, 0 } }, /* 00e */ + { .mk = { 0x0f, 0 }, .brk = { 0x8f, 0 } }, /* 00f */ + { .mk = { 0x10, 0 }, .brk = { 0x90, 0 } }, /* 010 */ + { .mk = { 0x11, 0 }, .brk = { 0x91, 0 } }, /* 011 */ + { .mk = { 0x12, 0 }, .brk = { 0x92, 0 } }, /* 012 */ + { .mk = { 0x13, 0 }, .brk = { 0x93, 0 } }, /* 013 */ + { .mk = { 0x14, 0 }, .brk = { 0x94, 0 } }, /* 014 */ + { .mk = { 0x15, 0 }, .brk = { 0x95, 0 } }, /* 015 */ + { .mk = { 0x16, 0 }, .brk = { 0x96, 0 } }, /* 016 */ + { .mk = { 0x17, 0 }, .brk = { 0x97, 0 } }, /* 017 */ + { .mk = { 0x18, 0 }, .brk = { 0x98, 0 } }, /* 018 */ + { .mk = { 0x19, 0 }, .brk = { 0x99, 0 } }, /* 019 */ + { .mk = { 0x1a, 0 }, .brk = { 0x9a, 0 } }, /* 01a */ + { .mk = { 0x1b, 0 }, .brk = { 0x9b, 0 } }, /* 01b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 01c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 01d */ + { .mk = { 0x1e, 0 }, .brk = { 0x9e, 0 } }, /* 01e */ + { .mk = { 0x1f, 0 }, .brk = { 0x9f, 0 } }, /* 01f */ + { .mk = { 0x20, 0 }, .brk = { 0xa0, 0 } }, /* 020 */ + { .mk = { 0x21, 0 }, .brk = { 0xa1, 0 } }, /* 021 */ + { .mk = { 0x22, 0 }, .brk = { 0xa2, 0 } }, /* 023 */ + { .mk = { 0x23, 0 }, .brk = { 0xa3, 0 } }, /* 023 */ + { .mk = { 0x24, 0 }, .brk = { 0xa4, 0 } }, /* 024 */ + { .mk = { 0x25, 0 }, .brk = { 0xa5, 0 } }, /* 025 */ + { .mk = { 0x26, 0 }, .brk = { 0xa6, 0 } }, /* 026 */ + { .mk = { 0x27, 0 }, .brk = { 0xa7, 0 } }, /* 027 */ + { .mk = { 0x28, 0 }, .brk = { 0xa8, 0 } }, /* 028 */ + { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 029 */ + { .mk = { 0x2a, 0 }, .brk = { 0xaa, 0 } }, /* 02a */ + { .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 02b */ + { .mk = { 0x2c, 0 }, .brk = { 0xac, 0 } }, /* 02c */ + { .mk = { 0x2d, 0 }, .brk = { 0xad, 0 } }, /* 02d */ + { .mk = { 0x2e, 0 }, .brk = { 0xae, 0 } }, /* 02e */ + { .mk = { 0x2f, 0 }, .brk = { 0xaf, 0 } }, /* 02f */ + { .mk = { 0x30, 0 }, .brk = { 0xb0, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 031 */ + { .mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 032 */ + { .mk = { 0x33, 0 }, .brk = { 0xb3, 0 } }, /* 033 */ + { .mk = { 0x34, 0 }, .brk = { 0xb4, 0 } }, /* 034 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 035 */ + { .mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 036 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 037 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 038 */ + { .mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 039 */ + { .mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 03a */ + { .mk = { 0x3b, 0 }, .brk = { 0xbb, 0 } }, /* 03b */ + { .mk = { 0x3c, 0 }, .brk = { 0xbc, 0 } }, /* 03c */ + { .mk = { 0x3d, 0 }, .brk = { 0xbd, 0 } }, /* 03d */ + { .mk = { 0x3e, 0 }, .brk = { 0xbe, 0 } }, /* 03e */ + { .mk = { 0x3f, 0 }, .brk = { 0xbf, 0 } }, /* 03f */ + { .mk = { 0x40, 0 }, .brk = { 0xc0, 0 } }, /* 040 */ + { .mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 041 */ + { .mk = { 0x42, 0 }, .brk = { 0xc2, 0 } }, /* 042 */ + { .mk = { 0x43, 0 }, .brk = { 0xc3, 0 } }, /* 043 */ + { .mk = { 0x44, 0 }, .brk = { 0xc4, 0 } }, /* 044 */ + { .mk = { 0x45, 0 }, .brk = { 0xc5, 0 } }, /* 045 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 046 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 047 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 048 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 049 */ + { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 04a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 04b */ + { .mk = { 0x4c, 0 }, .brk = { 0xcc, 0 } }, /* 04c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 04d */ + { .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 04e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 04f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 050 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 053 */ + { .mk = { 0 }, .brk = { 0 } }, /* 054 */ + { .mk = { 0 }, .brk = { 0 } }, /* 055 */ + { .mk = { 0 }, .brk = { 0 } }, /* 056 */ + { .mk = { 0 }, .brk = { 0 } }, /* 057 */ + { .mk = { 0 }, .brk = { 0 } }, /* 058 */ + { .mk = { 0 }, .brk = { 0 } }, /* 059 */ + { .mk = { 0 }, .brk = { 0 } }, /* 05a */ + { .mk = { 0 }, .brk = { 0 } }, /* 05b */ + { .mk = { 0 }, .brk = { 0 } }, /* 05c */ + { .mk = { 0 }, .brk = { 0 } }, /* 05d */ + { .mk = { 0 }, .brk = { 0 } }, /* 05e */ + { .mk = { 0 }, .brk = { 0 } }, /* 05f */ + { .mk = { 0 }, .brk = { 0 } }, /* 060 */ + { .mk = { 0 }, .brk = { 0 } }, /* 061 */ + { .mk = { 0 }, .brk = { 0 } }, /* 062 */ + { .mk = { 0 }, .brk = { 0 } }, /* 063 */ + { .mk = { 0 }, .brk = { 0 } }, /* 064 */ + { .mk = { 0 }, .brk = { 0 } }, /* 065 */ + { .mk = { 0 }, .brk = { 0 } }, /* 066 */ + { .mk = { 0 }, .brk = { 0 } }, /* 067 */ + { .mk = { 0 }, .brk = { 0 } }, /* 068 */ + { .mk = { 0 }, .brk = { 0 } }, /* 069 */ + { .mk = { 0 }, .brk = { 0 } }, /* 06a */ + { .mk = { 0 }, .brk = { 0 } }, /* 06b */ + { .mk = { 0 }, .brk = { 0 } }, /* 06c */ + { .mk = { 0 }, .brk = { 0 } }, /* 06d */ + { .mk = { 0 }, .brk = { 0 } }, /* 06e */ + { .mk = { 0 }, .brk = { 0 } }, /* 06f */ + { .mk = { 0 }, .brk = { 0 } }, /* 070 */ + { .mk = { 0 }, .brk = { 0 } }, /* 071 */ + { .mk = { 0 }, .brk = { 0 } }, /* 072 */ + { .mk = { 0 }, .brk = { 0 } }, /* 073 */ + { .mk = { 0 }, .brk = { 0 } }, /* 074 */ + { .mk = { 0 }, .brk = { 0 } }, /* 075 */ + { .mk = { 0 }, .brk = { 0 } }, /* 076 */ + { .mk = { 0 }, .brk = { 0 } }, /* 077 */ + { .mk = { 0 }, .brk = { 0 } }, /* 078 */ + { .mk = { 0 }, .brk = { 0 } }, /* 079 */ + { .mk = { 0 }, .brk = { 0 } }, /* 07a */ + { .mk = { 0 }, .brk = { 0 } }, /* 07b */ + { .mk = { 0 }, .brk = { 0 } }, /* 07c */ + { .mk = { 0 }, .brk = { 0 } }, /* 07d */ + { .mk = { 0 }, .brk = { 0 } }, /* 07e */ + { .mk = { 0 }, .brk = { 0 } }, /* 07f */ + { .mk = { 0 }, .brk = { 0 } }, /* 080 */ + { .mk = { 0 }, .brk = { 0 } }, /* 081 */ + { .mk = { 0 }, .brk = { 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0 }, .brk = { 0 } }, /* 085 */ + { .mk = { 0 }, .brk = { 0 } }, /* 086 */ + { .mk = { 0 }, .brk = { 0 } }, /* 087 */ + { .mk = { 0 }, .brk = { 0 } }, /* 088 */ + { .mk = { 0 }, .brk = { 0 } }, /* 089 */ + { .mk = { 0 }, .brk = { 0 } }, /* 08a */ + { .mk = { 0 }, .brk = { 0 } }, /* 08b */ + { .mk = { 0 }, .brk = { 0 } }, /* 08c */ + { .mk = { 0 }, .brk = { 0 } }, /* 08d */ + { .mk = { 0 }, .brk = { 0 } }, /* 08e */ + { .mk = { 0 }, .brk = { 0 } }, /* 08f */ + { .mk = { 0 }, .brk = { 0 } }, /* 090 */ + { .mk = { 0 }, .brk = { 0 } }, /* 091 */ + { .mk = { 0 }, .brk = { 0 } }, /* 092 */ + { .mk = { 0 }, .brk = { 0 } }, /* 093 */ + { .mk = { 0 }, .brk = { 0 } }, /* 094 */ + { .mk = { 0 }, .brk = { 0 } }, /* 095 */ + { .mk = { 0 }, .brk = { 0 } }, /* 096 */ + { .mk = { 0 }, .brk = { 0 } }, /* 097 */ + { .mk = { 0 }, .brk = { 0 } }, /* 098 */ + { .mk = { 0 }, .brk = { 0 } }, /* 099 */ + { .mk = { 0 }, .brk = { 0 } }, /* 09a */ + { .mk = { 0 }, .brk = { 0 } }, /* 09b */ + { .mk = { 0 }, .brk = { 0 } }, /* 09c */ + { .mk = { 0 }, .brk = { 0 } }, /* 09d */ + { .mk = { 0 }, .brk = { 0 } }, /* 09e */ + { .mk = { 0 }, .brk = { 0 } }, /* 09f */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 0af */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0be */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0da */ + { .mk = { 0 }, .brk = { 0 } }, /* 0db */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0de */ + { .mk = { 0 }, .brk = { 0 } }, /* 0df */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 0eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fe */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 100 */ + { .mk = { 0 }, .brk = { 0 } }, /* 101 */ + { .mk = { 0 }, .brk = { 0 } }, /* 102 */ + { .mk = { 0 }, .brk = { 0 } }, /* 103 */ + { .mk = { 0 }, .brk = { 0 } }, /* 104 */ + { .mk = { 0 }, .brk = { 0 } }, /* 105 */ + { .mk = { 0 }, .brk = { 0 } }, /* 106 */ + { .mk = { 0 }, .brk = { 0 } }, /* 107 */ + { .mk = { 0 }, .brk = { 0 } }, /* 108 */ + { .mk = { 0 }, .brk = { 0 } }, /* 109 */ + { .mk = { 0 }, .brk = { 0 } }, /* 10a */ + { .mk = { 0 }, .brk = { 0 } }, /* 10b */ + { .mk = { 0 }, .brk = { 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = { 0 }, .brk = { 0 } }, /* 10e */ + { .mk = { 0 }, .brk = { 0 } }, /* 10f */ + { .mk = { 0 }, .brk = { 0 } }, /* 110 */ + { .mk = { 0 }, .brk = { 0 } }, /* 111 */ + { .mk = { 0 }, .brk = { 0 } }, /* 112 */ + { .mk = { 0 }, .brk = { 0 } }, /* 113 */ + { .mk = { 0 }, .brk = { 0 } }, /* 114 */ + { .mk = { 0 }, .brk = { 0 } }, /* 115 */ + { .mk = { 0 }, .brk = { 0 } }, /* 116 */ + { .mk = { 0 }, .brk = { 0 } }, /* 117 */ + { .mk = { 0 }, .brk = { 0 } }, /* 118 */ + { .mk = { 0 }, .brk = { 0 } }, /* 119 */ + { .mk = { 0 }, .brk = { 0 } }, /* 11a */ + { .mk = { 0 }, .brk = { 0 } }, /* 11b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 11c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 11d */ + { .mk = { 0 }, .brk = { 0 } }, /* 11e */ + { .mk = { 0 }, .brk = { 0 } }, /* 11f */ + { .mk = { 0 }, .brk = { 0 } }, /* 120 */ + { .mk = { 0 }, .brk = { 0 } }, /* 121 */ + { .mk = { 0 }, .brk = { 0 } }, /* 122 */ + { .mk = { 0 }, .brk = { 0 } }, /* 123 */ + { .mk = { 0 }, .brk = { 0 } }, /* 124 */ + { .mk = { 0 }, .brk = { 0 } }, /* 125 */ + { .mk = { 0 }, .brk = { 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = { 0 }, .brk = { 0 } }, /* 12c */ + { .mk = { 0 }, .brk = { 0 } }, /* 12d */ + { .mk = { 0 }, .brk = { 0 } }, /* 12e */ + { .mk = { 0 }, .brk = { 0 } }, /* 12f */ + { .mk = { 0 }, .brk = { 0 } }, /* 130 */ + { .mk = { 0 }, .brk = { 0 } }, /* 131 */ + { .mk = { 0 }, .brk = { 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = { 0 }, .brk = { 0 } }, /* 134 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 137 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 138 */ + { .mk = { 0 }, .brk = { 0 } }, /* 139 */ + { .mk = { 0 }, .brk = { 0 } }, /* 13a */ + { .mk = { 0 }, .brk = { 0 } }, /* 13b */ + { .mk = { 0 }, .brk = { 0 } }, /* 13c */ + { .mk = { 0 }, .brk = { 0 } }, /* 13d */ + { .mk = { 0 }, .brk = { 0 } }, /* 13e */ + { .mk = { 0 }, .brk = { 0 } }, /* 13f */ + { .mk = { 0 }, .brk = { 0 } }, /* 140 */ + { .mk = { 0 }, .brk = { 0 } }, /* 141 */ + { .mk = { 0 }, .brk = { 0 } }, /* 142 */ + { .mk = { 0 }, .brk = { 0 } }, /* 143 */ + { .mk = { 0 }, .brk = { 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 146 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 147 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 148 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 14b */ + { .mk = { 0 }, .brk = { 0 } }, /* 14c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 14d */ + { .mk = { 0 }, .brk = { 0 } }, /* 14e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 14f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 150 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 151 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 152 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 153 */ + { .mk = { 0 }, .brk = { 0 } }, /* 154 */ + { .mk = { 0 }, .brk = { 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = { 0 }, .brk = { 0 } }, /* 157 */ + { .mk = { 0 }, .brk = { 0 } }, /* 158 */ + { .mk = { 0 }, .brk = { 0 } }, /* 159 */ + { .mk = { 0 }, .brk = { 0 } }, /* 15a */ + { .mk = { 0 }, .brk = { 0 } }, /* 15b */ + { .mk = { 0 }, .brk = { 0 } }, /* 15c */ + { .mk = { 0x54, 0 }, .brk = { 0xd4, 0 } }, /* 15d */ + { .mk = { 0x56, 0 }, .brk = { 0xd6, 0 } }, /* 15e */ + { .mk = { 0x5c, 0 }, .brk = { 0xdc, 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = { 0 }, .brk = { 0 } }, /* 161 */ + { .mk = { 0 }, .brk = { 0 } }, /* 162 */ + { .mk = { 0 }, .brk = { 0 } }, /* 163 */ + { .mk = { 0 }, .brk = { 0 } }, /* 164 */ + { .mk = { 0 }, .brk = { 0 } }, /* 165 */ + { .mk = { 0 }, .brk = { 0 } }, /* 166 */ + { .mk = { 0 }, .brk = { 0 } }, /* 167 */ + { .mk = { 0 }, .brk = { 0 } }, /* 168 */ + { .mk = { 0 }, .brk = { 0 } }, /* 169 */ + { .mk = { 0 }, .brk = { 0 } }, /* 16a */ + { .mk = { 0 }, .brk = { 0 } }, /* 16b */ + { .mk = { 0 }, .brk = { 0 } }, /* 16c */ + { .mk = { 0 }, .brk = { 0 } }, /* 16d */ + { .mk = { 0 }, .brk = { 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = { 0 }, .brk = { 0 } }, /* 170 */ + { .mk = { 0 }, .brk = { 0 } }, /* 171 */ + { .mk = { 0 }, .brk = { 0 } }, /* 172 */ + { .mk = { 0 }, .brk = { 0 } }, /* 173 */ + { .mk = { 0 }, .brk = { 0 } }, /* 174 */ + { .mk = { 0 }, .brk = { 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = { 0 }, .brk = { 0 } }, /* 177 */ + { .mk = { 0 }, .brk = { 0 } }, /* 178 */ + { .mk = { 0 }, .brk = { 0 } }, /* 179 */ + { .mk = { 0 }, .brk = { 0 } }, /* 17a */ + { .mk = { 0 }, .brk = { 0 } }, /* 17b */ + { .mk = { 0 }, .brk = { 0 } }, /* 17c */ + { .mk = { 0 }, .brk = { 0 } }, /* 17d */ + { .mk = { 0 }, .brk = { 0 } }, /* 17e */ + { .mk = { 0 }, .brk = { 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fe */ + { .mk = { 0 }, .brk = { 0 } } /* 1ff */ // clang-format on }; From d82d8cefedb729b7193ab1687bc8960fb7310097 Mon Sep 17 00:00:00 2001 From: cold-brewed <47337035+cold-brewed@users.noreply.github.com> Date: Fri, 28 Jun 2024 10:16:12 -0400 Subject: [PATCH 033/624] qt: Fix strings in enumeration of host drives --- src/qt/qt_mediamenu.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index a1d8a528c..5f1289740 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -157,10 +157,10 @@ MediaMenu::refresh(QMenu *parentMenu) #ifdef Q_OS_WINDOWS /* Loop through each Windows drive letter and test to see if it's a CDROM */ - for (auto &letter : driveLetters) { - auto drive = QString::asprintf("%c:\\", letter).toUtf8().constData(); - if (GetDriveType(drive) == DRIVE_CDROM) - menu->addAction(QApplication::style()->standardIcon(QStyle::SP_DriveCDIcon), tr("Host CD/DVD Drive (%1:)").arg(letter), [this, i, letter]() { cdromMount(i, 2, QString::asprintf(R"(\\.\%c:)", letter).toUtf8().constData()); })->setCheckable(false); + for (const auto &letter : driveLetters) { + auto drive = QString("%1:\\").arg(letter); + if (GetDriveType(drive.toUtf8().constData()) == DRIVE_CDROM) + menu->addAction(QApplication::style()->standardIcon(QStyle::SP_DriveCDIcon), tr("Host CD/DVD Drive (%1:)").arg(letter), [this, i, letter] { cdromMount(i, 2, QString(R"(\\.\%1:)").arg(letter)); })->setCheckable(false); } menu->addSeparator(); #endif // Q_OS_WINDOWS From a43693bbec3424915a1c5ce64e0fcb007c746c81 Mon Sep 17 00:00:00 2001 From: cold-brewed <47337035+cold-brewed@users.noreply.github.com> Date: Fri, 28 Jun 2024 10:19:53 -0400 Subject: [PATCH 034/624] Add a library required for building on windows arm --- src/sound/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index f67630c47..764e08a8e 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -90,6 +90,9 @@ if(FLUIDSYNTH) target_link_libraries(86Box PkgConfig::FLUIDSYNTH) if(STATIC_BUILD) target_link_libraries(86Box -static ${FLUIDSYNTH_STATIC_LIBRARIES} -fopenmp) + if(WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") + target_link_libraries(86Box psapi) + endif() endif() target_compile_definitions(snd PRIVATE USE_FLUIDSYNTH) From 421cbcb1656c8260130f8f534ea85c70debdc838 Mon Sep 17 00:00:00 2001 From: cold-brewed <47337035+cold-brewed@users.noreply.github.com> Date: Fri, 28 Jun 2024 10:43:19 -0400 Subject: [PATCH 035/624] qt: UUID updates * Ensure relative paths are properly resolved * Do not display a mismatch prompt unless the system has configured NICs --- src/qt/qt_util.cpp | 29 +++++++++++++++++++++++++---- src/qt/qt_util.hpp | 1 + 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/qt/qt_util.cpp b/src/qt/qt_util.cpp index 0a59cdf5d..5c9059272 100644 --- a/src/qt/qt_util.cpp +++ b/src/qt/qt_util.cpp @@ -14,6 +14,8 @@ * * Copyright 2022 Teemu Korhonen */ +#include +#include #include #include #include @@ -70,7 +72,11 @@ DlgFilter(std::initializer_list extensions, bool last) QString currentUuid() { - return QUuid::createUuidV5(QUuid{}, QString(usr_path)).toString(QUuid::WithoutBraces); + auto configPath = QFileInfo(cfg_path).dir().canonicalPath(); + if(!configPath.endsWith("/")) { + configPath.append("/"); + } + return QUuid::createUuidV5(QUuid{}, configPath).toString(QUuid::WithoutBraces); } bool compareUuid() @@ -82,6 +88,11 @@ bool compareUuid() storeCurrentUuid(); return true; } + // Do not prompt on mismatch if the system does not have any configured NICs. Just update the uuid + if(!hasConfiguredNICs() && uuid != currentUuid()) { + storeCurrentUuid(); + return true; + } // The uuid appears to be a valid, at least by length. // Compare with a simple string match return uuid == currentUuid(); @@ -99,14 +110,24 @@ generateNewMacAdresses() for (int i = 0; i < NET_CARD_MAX; ++i) { auto net_card = net_cards_conf[i]; if (net_card.device_num != 0) { - const auto network_device = network_card_getdevice(net_card.device_num); + const auto network_device = network_card_getdevice(net_card.device_num); device_context_t device_context; - - device_set_context(&device_context, network_device, i+1); + device_set_context(&device_context, network_device, i + 1); auto generatedMac = QString::asprintf("%02X:%02X:%02X", random_generate(), random_generate(), random_generate()).toLower(); config_set_string(device_context.name, "mac", generatedMac.toUtf8().constData()); } } } +bool +hasConfiguredNICs() +{ + for (int i = 0; i < NET_CARD_MAX; ++i) { + if (const auto net_card = net_cards_conf[i]; net_card.device_num != 0) { + return true; + } + } + return false; +} + } diff --git a/src/qt/qt_util.hpp b/src/qt/qt_util.hpp index 07e44b621..6a0bdc30b 100644 --- a/src/qt/qt_util.hpp +++ b/src/qt/qt_util.hpp @@ -17,6 +17,7 @@ QString currentUuid(); void storeCurrentUuid(); bool compareUuid(); void generateNewMacAdresses(); +bool hasConfiguredNICs(); }; #endif From 2373771f4d53382c33c3a1890b8d143579a74bd3 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 28 Jun 2024 23:30:56 -0400 Subject: [PATCH 036/624] Support additional serial ports ala the MP5587-1/2 --- src/86box.c | 4 ++-- src/device/serial.c | 8 +++++++- src/include/86box/86box.h | 2 +- src/include/86box/serial.h | 12 ++++++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/86box.c b/src/86box.c index 60423b2a1..16d7cf3de 100644 --- a/src/86box.c +++ b/src/86box.c @@ -171,8 +171,8 @@ int video_filter_method = 1; /* (C) video * int video_vsync = 0; /* (C) video */ int video_framerate = -1; /* (C) video */ char video_shader[512] = { '\0' }; /* (C) video */ -bool serial_passthrough_enabled[SERIAL_MAX] = { 0, 0, 0, 0 }; /* (C) activation and kind of - pass-through for serial ports */ +bool serial_passthrough_enabled[SERIAL_MAX] = { 0, 0, 0, 0, 0, 0, 0 }; /* (C) activation and kind of + pass-through for serial ports */ int bugger_enabled = 0; /* (C) enable ISAbugger */ int novell_keycard_enabled = 0; /* (C) enable Novell NetWare 2.x key card emulation. */ int postcard_enabled = 0; /* (C) enable POST card */ diff --git a/src/device/serial.c b/src/device/serial.c index 2a61347a1..ecc08f15d 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -912,7 +912,13 @@ serial_init(const device_t *info) memset(&(serial_devices[next_inst]), 0, sizeof(serial_device_t)); dev->sd = &(serial_devices[next_inst]); dev->sd->serial = dev; - if (next_inst == 3) + if (next_inst == 6) + serial_setup(dev, COM7_ADDR, COM7_IRQ); + else if (next_inst == 5) + serial_setup(dev, COM6_ADDR, COM6_IRQ); + else if (next_inst == 4) + serial_setup(dev, COM5_ADDR, COM5_IRQ); + else if (next_inst == 3) serial_setup(dev, COM4_ADDR, COM4_IRQ); else if (next_inst == 2) serial_setup(dev, COM3_ADDR, COM3_IRQ); diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index f76d70797..0d57b4cae 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -21,7 +21,7 @@ #define EMU_86BOX_H /* Configuration values. */ -#define SERIAL_MAX 4 +#define SERIAL_MAX 7 #define PARALLEL_MAX 4 #define SCREEN_RES_X 640 #define SCREEN_RES_Y 480 diff --git a/src/include/86box/serial.h b/src/include/86box/serial.h index c2312f562..a205c7cec 100644 --- a/src/include/86box/serial.h +++ b/src/include/86box/serial.h @@ -43,6 +43,18 @@ #define COM3_IRQ 4 #define COM4_ADDR 0x02e8 #define COM4_IRQ 3 +// The following support being assingned IRQ 3, 4, 5, 9, 10, 11, 12 or 15 +// There doesn't appear to be any specific standard however +// So defaults have been chosen arbitarily +// TODO: Allow configuration of the IRQ in the UI +//#define COM5_ADDR 0x03f0 +//#define COM5_IRQ 3 +#define COM5_ADDR 0x02f0 +#define COM5_IRQ 11 +#define COM6_ADDR 0x03e0 +#define COM6_IRQ 10 +#define COM7_ADDR 0x02e0 +#define COM7_IRQ 9 struct serial_device_s; struct serial_s; From 571bab3efd566c19ae8e16a9a5fc4e543f712f75 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 2 Dec 2023 21:52:24 -0500 Subject: [PATCH 037/624] Named-initializers for 80386SX CPU's --- src/cpu/cpu_table.c | 222 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 207 insertions(+), 15 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 502b2c86e..1c67c4880 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -1009,12 +1009,92 @@ const cpu_family_t cpu_families[] = { .name = "i386SX", .internal_name = "i386sx", .cpus = (const CPU[]) { - {"16", CPU_386SX, fpus_80386, 16000000, 1, 5000, 0x2308, 0, 0, 0, 3,3,3,3, 2}, - {"20", CPU_386SX, fpus_80386, 20000000, 1, 5000, 0x2308, 0, 0, 0, 4,4,3,3, 3}, - {"25", CPU_386SX, fpus_80386, 25000000, 1, 5000, 0x2308, 0, 0, 0, 4,4,3,3, 3}, - {"33", CPU_386SX, fpus_80386, 33333333, 1, 5000, 0x2308, 0, 0, 0, 6,6,3,3, 4}, - {"40", CPU_386SX, fpus_80386, 40000000, 1, 5000, 0x2308, 0, 0, 0, 7,7,3,3, 5}, - {"", 0} + { + .name = "16", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386SX, @@ -1022,12 +1102,92 @@ const cpu_family_t cpu_families[] = { .name = "Am386SX", .internal_name = "am386sx", .cpus = (const CPU[]) { - {"16", CPU_386SX, fpus_80386, 16000000, 1, 5000, 0x2308, 0, 0, 0, 3,3,3,3, 2}, - {"20", CPU_386SX, fpus_80386, 20000000, 1, 5000, 0x2308, 0, 0, 0, 4,4,3,3, 3}, - {"25", CPU_386SX, fpus_80386, 25000000, 1, 5000, 0x2308, 0, 0, 0, 4,4,3,3, 3}, - {"33", CPU_386SX, fpus_80386, 33333333, 1, 5000, 0x2308, 0, 0, 0, 6,6,3,3, 4}, - {"40", CPU_386SX, fpus_80386, 40000000, 1, 5000, 0x2308, 0, 0, 0, 7,7,3,3, 5}, - {"", 0} + { + .name = "16", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386DX, @@ -1081,9 +1241,41 @@ const cpu_family_t cpu_families[] = { .name = "M6117", .internal_name = "m6117", .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ - {"33", CPU_386SX, fpus_none, 33333333, 1, 5000, 0x2309, 0, 0, 0, 6,6,3,3, 4}, - {"40", CPU_386SX, fpus_none, 40000000, 1, 5000, 0x2309, 0, 0, 0, 7,7,3,3, 5}, - {"", 0} + { + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_none, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2309, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_none, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2309, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386SLC_IBM, From 13dac1020f3e72061d1dafd7bb2b6c79e24addd7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 7 Dec 2023 21:54:55 -0500 Subject: [PATCH 038/624] Named-initializers for 80386DX CPU's --- src/cpu/cpu_table.c | 390 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 363 insertions(+), 27 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 1c67c4880..b9e81aa72 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -1195,12 +1195,92 @@ const cpu_family_t cpu_families[] = { .name = "i386DX", .internal_name = "i386dx", .cpus = (const CPU[]) { - {"16", CPU_386DX, fpus_80386, 16000000, 1, 5000, 0x0308, 0, 0, 0, 3,3,3,3, 2}, - {"20", CPU_386DX, fpus_80386, 20000000, 1, 5000, 0x0308, 0, 0, 0, 4,4,3,3, 3}, - {"25", CPU_386DX, fpus_80386, 25000000, 1, 5000, 0x0308, 0, 0, 0, 4,4,3,3, 3}, - {"33", CPU_386DX, fpus_80386, 33333333, 1, 5000, 0x0308, 0, 0, 0, 6,6,3,3, 4}, - {"40", CPU_386DX, fpus_80386, 40000000, 1, 5000, 0x0308, 0, 0, 0, 7,7,3,3, 5}, - {"", 0} + { + .name = "16", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386DX_DESKPRO386, @@ -1208,10 +1288,58 @@ const cpu_family_t cpu_families[] = { .name = "i386DX", .internal_name = "i386dx_deskpro386", .cpus = (const CPU[]) { - {"16", CPU_386DX, fpus_80286, 16000000, 1, 5000, 0x0308, 0, 0, 0, 3,3,3,3, 2}, - {"20", CPU_386DX, fpus_80386, 20000000, 1, 5000, 0x0308, 0, 0, 0, 4,4,3,3, 3}, - {"25", CPU_386DX, fpus_80386, 25000000, 1, 5000, 0x0308, 0, 0, 0, 4,4,3,3, 3}, - {"", 0} + { + .name = "16", + .cpu_type = CPU_386DX, + .fpus = fpus_80286, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386DX, @@ -1219,10 +1347,58 @@ const cpu_family_t cpu_families[] = { .name = "RapidCAD", .internal_name = "rapidcad", .cpus = (const CPU[]) { - {"25", CPU_RAPIDCAD, fpus_internal, 25000000, 1, 5000, 0x0340, 0, 0, CPU_SUPPORTS_DYNAREC, 4,4,3,3, 3}, - {"33", CPU_RAPIDCAD, fpus_internal, 33333333, 1, 5000, 0x0340, 0, 0, CPU_SUPPORTS_DYNAREC, 6,6,3,3, 4}, - {"40", CPU_RAPIDCAD, fpus_internal, 40000000, 1, 5000, 0x0340, 0, 0, CPU_SUPPORTS_DYNAREC, 7,7,3,3, 5}, - {"", 0} + { + .name = "25", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386DX, @@ -1230,10 +1406,58 @@ const cpu_family_t cpu_families[] = { .name = "Am386DX", .internal_name = "am386dx", .cpus = (const CPU[]) { - {"25", CPU_386DX, fpus_80386, 25000000, 1, 5000, 0x0308, 0, 0, 0, 4,4,3,3, 3}, - {"33", CPU_386DX, fpus_80386, 33333333, 1, 5000, 0x0308, 0, 0, 0, 6,6,3,3, 4}, - {"40", CPU_386DX, fpus_80386, 40000000, 1, 5000, 0x0308, 0, 0, 0, 7,7,3,3, 5}, - {"", 0} + { + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_M6117, @@ -1367,10 +1591,58 @@ const cpu_family_t cpu_families[] = { .name = "Cx486DLC", .internal_name = "cx486dlc", .cpus = (const CPU[]) { - {"25", CPU_486DLC, fpus_80386, 25000000, 1, 5000, 0x401, 0, 0x0001, 0, 4, 4,3,3, 3}, - {"33", CPU_486DLC, fpus_80386, 33333333, 1, 5000, 0x401, 0, 0x0001, 0, 6, 6,3,3, 4}, - {"40", CPU_486DLC, fpus_80386, 40000000, 1, 5000, 0x401, 0, 0x0001, 0, 7, 7,3,3, 5}, - {"", 0} + { + .name = "25", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386DX, @@ -1378,11 +1650,75 @@ const cpu_family_t cpu_families[] = { .name = "Cx486DRx2", .internal_name = "cx486drx2", .cpus = (const CPU[]) { - {"32", CPU_486DLC, fpus_80386, 32000000, 2, 5000, 0x407, 0, 0x0007, 0, 6, 6,6,6, 4}, - {"40", CPU_486DLC, fpus_80386, 40000000, 2, 5000, 0x407, 0, 0x0007, 0, 8, 8,6,6, 6}, - {"50", CPU_486DLC, fpus_80386, 50000000, 2, 5000, 0x407, 0, 0x0007, 0, 8, 8,6,6, 6}, - {"66", CPU_486DLC, fpus_80386, 66666666, 2, 5000, 0x407, 0, 0x0007, 0, 12,12,6,6, 8}, - {"", 0} + { + .name = "32", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 32000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "50", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_SOCKET1, From 597735ded641be0603da0b5dd1a90da9260bd065 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 29 Jun 2024 18:57:52 -0400 Subject: [PATCH 039/624] Fix null pointers in qt_settingsports.cpp --- src/qt/qt_settingsports.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index 9b19df68d..a675d7cdb 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -59,13 +59,16 @@ SettingsPorts::SettingsPorts(QWidget *parent) cbox->setCurrentIndex(selectedRow); auto *checkBox = findChild(QString("checkBoxParallel%1").arg(i + 1)); - checkBox->setChecked(lpt_ports[i].enabled > 0); - cbox->setEnabled(lpt_ports[i].enabled > 0); + if (checkBox != NULL) + checkBox->setChecked(lpt_ports[i].enabled > 0); + if (cBox != NULL) + cbox->setEnabled(lpt_ports[i].enabled > 0); } for (int i = 0; i < SERIAL_MAX; i++) { auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); - checkBox->setChecked(com_ports[i].enabled > 0); + if (checkBox != NULL) + checkBox->setChecked(com_ports[i].enabled > 0); } ui->checkBoxSerialPassThru1->setChecked(serial_passthrough_enabled[0]); @@ -89,13 +92,16 @@ SettingsPorts::save() for (int i = 0; i < PARALLEL_MAX; i++) { auto *cbox = findChild(QString("comboBoxLpt%1").arg(i + 1)); auto *checkBox = findChild(QString("checkBoxParallel%1").arg(i + 1)); - lpt_ports[i].device = cbox->currentData().toInt(); - lpt_ports[i].enabled = checkBox->isChecked() ? 1 : 0; + if (cBox != NULL) + lpt_ports[i].device = cbox->currentData().toInt(); + if (checkBox != NULL) + lpt_ports[i].enabled = checkBox->isChecked() ? 1 : 0; } for (int i = 0; i < SERIAL_MAX; i++) { auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); - com_ports[i].enabled = checkBox->isChecked() ? 1 : 0; + if (checkBox != NULL) + com_ports[i].enabled = checkBox->isChecked() ? 1 : 0; } serial_passthrough_enabled[0] = ui->checkBoxSerialPassThru1->isChecked(); From 3a3eb133348066844e0886e6fdeb66104f5c2469 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 29 Jun 2024 19:21:57 -0400 Subject: [PATCH 040/624] Fix typos in qt_settingsports.cpp --- src/qt/qt_settingsports.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index a675d7cdb..f6486aa9a 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -61,7 +61,7 @@ SettingsPorts::SettingsPorts(QWidget *parent) auto *checkBox = findChild(QString("checkBoxParallel%1").arg(i + 1)); if (checkBox != NULL) checkBox->setChecked(lpt_ports[i].enabled > 0); - if (cBox != NULL) + if (cbox != NULL) cbox->setEnabled(lpt_ports[i].enabled > 0); } @@ -92,7 +92,7 @@ SettingsPorts::save() for (int i = 0; i < PARALLEL_MAX; i++) { auto *cbox = findChild(QString("comboBoxLpt%1").arg(i + 1)); auto *checkBox = findChild(QString("checkBoxParallel%1").arg(i + 1)); - if (cBox != NULL) + if (cbox != NULL) lpt_ports[i].device = cbox->currentData().toInt(); if (checkBox != NULL) lpt_ports[i].enabled = checkBox->isChecked() ? 1 : 0; From eab504f3889adc2a36f5d47c55be7e2dfa748a13 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 2 Jul 2024 01:47:42 +0200 Subject: [PATCH 041/624] x86seg.c: Make sure not to read beyond the end of the stack segment on stack transfers, fixes erroneous page faults when transferring 16-bit stacks to 32-bit stacks, fixes OS/2 2.0 build 6.141. --- src/cpu/x86seg.c | 45 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 40 insertions(+), 5 deletions(-) diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index 96ec726b0..61e9e558a 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -896,7 +896,7 @@ loadcscall(uint16_t seg) uint32_t oldsp; uint32_t newsp; uint32_t oldsp2; - uint16_t tempw; + uint32_t oldss_limit_high = cpu_state.seg_ss.limit_high; const x86seg *dt; if ((msw & 1) && !(cpu_state.eflags & VM_FLAG)) { @@ -1125,7 +1125,31 @@ loadcscall(uint16_t seg) } if (count) { while (count--) { - PUSHL(readmeml(oldssbase, oldsp + (count << 2))); + uint32_t temp_val; + switch (oldss_limit_high - oldsp - (count << 2)) { + default: + case 3: + /* We are at least an entire DWORD away from the limit, + read long. */ + PUSHL(readmeml(oldssbase, oldsp + (count << 2))); + break; + case 2: + /* We are 3 bytes away from the limit, + read word + byte. */ + temp_val = readmemw(oldssbase, oldsp + (count << 2)); + temp_val |= (readmemb(oldssbase, oldsp + + (count << 2) + 2) << 16); + PUSHL(temp_val); + break; + case 1: + /* We are a WORD away from the limit, read word. */ + PUSHL(readmemw(oldssbase, oldsp + (count << 2))); + break; + case 0: + /* We are a BYTE away from the limit, read byte. */ + PUSHL(readmemb(oldssbase, oldsp + (count << 2))); + break; + } if (cpu_state.abrt) { SS = oldss; ESP = oldsp2; @@ -1152,9 +1176,20 @@ loadcscall(uint16_t seg) x86seg_log("Write SP to %04X:%04X\n", SS, SP); if (count) { while (count--) { - tempw = readmemw(oldssbase, (oldsp & 0xffff) + (count << 1)); - x86seg_log("PUSH %04X\n", tempw); - PUSHW(tempw); + switch (oldss_limit_high - (oldsp & 0xffff) - (count << 1)) { + default: + case 1: + /* We are at least an entire WORD away from the limit, + read word. */ + PUSHW(readmemw(oldssbase, (oldsp & 0xffff) + + (count << 1))); + break; + case 0: + /* We are a BYTE away from the limit, read byte. */ + PUSHW(readmemb(oldssbase, (oldsp & 0xffff) + + (count << 1))); + break; + } if (cpu_state.abrt) { SS = oldss; ESP = oldsp2; From 8a4ae19d6bbdfbdc8500e8697ca79777e0d57133 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 2 Jul 2024 16:54:22 -0300 Subject: [PATCH 042/624] qt: Fix invalid scancodes crashing Windows raw input --- src/qt/qt_winrawinputfilter.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 3ca091ae6..857ccef3b 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -199,9 +199,10 @@ WindowsRawInputFilter::keyboard_handle(PRAWINPUT raw) scancode = convert_scan_code(scancode); /* Remap it according to the list from the Registry */ - if (scancode != scancode_map[scancode]) - pclog("Scan code remap: %03X -> %03X\n", scancode, scancode); - scancode = scancode_map[scancode]; + if ((scancode < (sizeof(scancode_map) / sizeof(scancode_map[0]))) && (scancode != scancode_map[scancode])) { + pclog("Scan code remap: %03X -> %03X\n", scancode, scancode_map[scancode]); + scancode = scancode_map[scancode]; + } /* If it's not 0xFFFF, send it to the emulated keyboard. From 357701dbb5563aeb879e0abdca8ad2a6ea1b5c7e Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 2 Jul 2024 17:54:44 -0300 Subject: [PATCH 043/624] SVGA: Make changedvram 1 page bigger to fix adjacent page checks going OOB when the framebuffer is at top of VRAM (Voodoo 3 drivers) --- src/video/vid_svga.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 307f455c3..5d579585a 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -1343,7 +1343,7 @@ svga_init(const device_t *info, svga_t *svga, void *priv, int memsize, svga->vram_max = memsize; svga->vram_display_mask = svga->vram_mask = memsize - 1; svga->decode_mask = 0x7fffff; - svga->changedvram = calloc(memsize >> 12, 1); + svga->changedvram = calloc((memsize >> 12) + 1, 1); svga->recalctimings_ex = recalctimings_ex; svga->video_in = video_in; svga->video_out = video_out; From 46aa5befc098a288c93033f7fa6aa75c0db9d97c Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 5 Jul 2024 14:45:13 -0300 Subject: [PATCH 044/624] CMI8x38: Channel reset bits should be fully writable, fixes #4576 --- src/sound/snd_cmi8x38.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/sound/snd_cmi8x38.c b/src/sound/snd_cmi8x38.c index 359563b99..39d54e197 100644 --- a/src/sound/snd_cmi8x38.c +++ b/src/sound/snd_cmi8x38.c @@ -706,7 +706,7 @@ cmi8x38_write(uint16_t addr, uint8_t val, void *priv) case 0x02: /* Reset or start DMA channels if requested. */ - dev->io_regs[addr] = val & 0x03; + dev->io_regs[addr] = val & 0x0f; for (int i = 0; i < (sizeof(dev->dma) / sizeof(dev->dma[0])); i++) { if (val & (0x04 << i)) { /* Reset DMA channel. */ @@ -724,15 +724,11 @@ cmi8x38_write(uint16_t addr, uint8_t val, void *priv) } } - /* Clear reset bits. */ - val &= 0x03; - /* Start playback along with DMA channels. */ if (val & 0x03) cmi8x38_start_playback(dev); /* Update interrupts. */ - dev->io_regs[addr] = val; cmi8x38_update_irqs(dev); break; From 0a8d98e9137e3d580f2ce883cb81be6a463d2853 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 5 Jul 2024 17:24:07 -0300 Subject: [PATCH 045/624] CMI8x38: Fix channel reset bit oversight --- src/sound/snd_cmi8x38.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sound/snd_cmi8x38.c b/src/sound/snd_cmi8x38.c index 39d54e197..b1f56f775 100644 --- a/src/sound/snd_cmi8x38.c +++ b/src/sound/snd_cmi8x38.c @@ -710,7 +710,7 @@ cmi8x38_write(uint16_t addr, uint8_t val, void *priv) for (int i = 0; i < (sizeof(dev->dma) / sizeof(dev->dma[0])); i++) { if (val & (0x04 << i)) { /* Reset DMA channel. */ - val &= ~(0x01 << i); + dev->io_regs[addr] &= ~(0x01 << i); /* clear enable */ dev->io_regs[0x10] &= ~(0x01 << i); /* clear interrupt */ /* Reset Sound Blaster as well when resetting channel 0. */ @@ -725,7 +725,7 @@ cmi8x38_write(uint16_t addr, uint8_t val, void *priv) } /* Start playback along with DMA channels. */ - if (val & 0x03) + if (dev->io_regs[addr] & 0x03) cmi8x38_start_playback(dev); /* Update interrupts. */ From add1c3918894b218e79674edd145434d342ca76f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 24 Aug 2022 04:42:25 -0400 Subject: [PATCH 046/624] Allow complete removal of FDC --- src/floppy/fdc.c | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 4c1170eb9..0f3cf9dbb 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -97,7 +97,6 @@ fdc_log(const char *fmt, ...) # define fdc_log(fmt, ...) #endif -#if 0 const device_t fdc_none_device = { .name = "None", .internal_name = "none", @@ -111,7 +110,6 @@ const device_t fdc_none_device = { .force_redraw = NULL, .config = NULL }; -#endif const device_t fdc_internal_device = { .name = "Internal", @@ -133,9 +131,7 @@ typedef const struct { static fdc_cards_t fdc_cards[] = { // clang-format off -#if 0 { &fdc_none_device }, -#endif { &fdc_internal_device }, { &fdc_b215_device }, { &fdc_pii151b_device }, From 07e3aba22c0520c5646cb0d39dea67914a95d625 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 29 Jun 2024 22:16:04 -0400 Subject: [PATCH 047/624] Better support for internal floppy --- src/config.c | 21 ++++++++ src/include/86box/fdc_ext.h | 3 +- src/machine/m_xt.c | 105 +++++++++++++++++------------------- 3 files changed, 73 insertions(+), 56 deletions(-) diff --git a/src/config.c b/src/config.c index ab23ddb4f..a98111edc 100644 --- a/src/config.c +++ b/src/config.c @@ -792,10 +792,31 @@ load_storage_controllers(void) } p = ini_section_get_string(cat, "fdc", NULL); +#if 0 if (p != NULL) fdc_type = fdc_card_get_from_internal_name(p); else fdc_type = FDC_INTERNAL; +#else + if (p == NULL) { + if (machine_has_flags(machine, MACHINE_FDC)) { + p = (char *) malloc((strlen("internal") + 1) * sizeof(char)); + strcpy(p, "internal"); + } else { + p = (char *) malloc((strlen("none") + 1) * sizeof(char)); + strcpy(p, "none"); + } + free_p = 1; + } + + fdc_type = fdc_card_get_from_internal_name(p); + + if (free_p) { + free(p); + p = NULL; + free_p = 0; + } +#endif p = ini_section_get_string(cat, "hdc", NULL); if (p == NULL) { diff --git a/src/include/86box/fdc_ext.h b/src/include/86box/fdc_ext.h index 0d821ac11..2c46d0704 100644 --- a/src/include/86box/fdc_ext.h +++ b/src/include/86box/fdc_ext.h @@ -25,7 +25,8 @@ extern int fdc_type; /* Controller types. */ -#define FDC_INTERNAL 0 +#define FDC_NONE 0 +#define FDC_INTERNAL 1 extern const device_t fdc_b215_device; extern const device_t fdc_pii151b_device; diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index ded68f5dc..adca9f4de 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -23,15 +23,15 @@ extern const device_t vendex_xt_rtc_onboard_device; static void -machine_xt_common_init(const machine_t *model) +machine_xt_common_init(const machine_t *model, int fixed_floppy) { + if ((fdc_type == FDC_INTERNAL) || fixed_floppy) + device_add(&fdc_xt_device); + machine_common_init(model); pit_devs[0].set_out_func(pit_devs[0].data, 1, pit_refresh_timer_xt); - if (fdc_type == FDC_INTERNAL) - device_add(&fdc_xt_device); - nmi_init(); standalone_gameport_type = &gameport_device; } @@ -59,7 +59,7 @@ machine_pc_init(const machine_t *model) device_add(&keyboard_pc_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } @@ -93,19 +93,11 @@ machine_pc82_init(const machine_t *model) device_add(&keyboard_pc82_device); device_add(&ibm_5161_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } -static void -machine_xt_init_ex(const machine_t *model) -{ - device_add(&keyboard_xt_device); - - machine_xt_common_init(model); -} - int machine_xt_init(const machine_t *model) { @@ -127,10 +119,12 @@ machine_xt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_init_ex(model); + device_add(&keyboard_xt_device); device_add(&ibm_5161_device); + machine_xt_common_init(model, 0); + return ret; } @@ -145,7 +139,9 @@ machine_genxt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_init_ex(model); + device_add(&keyboard_xt_device); + + machine_xt_common_init(model, 0); return ret; } @@ -170,17 +166,17 @@ machine_xt86_init(const machine_t *model) device_add(&keyboard_xt86_device); device_add(&ibm_5161_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } static void -machine_xt_clone_init(const machine_t *model) +machine_xt_clone_init(const machine_t *model, int fixed_floppy) { device_add(&keyboard_xtclone_device); - machine_xt_common_init(model); + machine_xt_common_init(model, fixed_floppy); } int @@ -194,7 +190,7 @@ machine_xt_americxt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -210,7 +206,7 @@ machine_xt_amixt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -226,7 +222,7 @@ machine_xt_znic_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -242,7 +238,7 @@ machine_xt_dtk_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -258,7 +254,7 @@ machine_xt_jukopc_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -274,7 +270,7 @@ machine_xt_openxt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -294,7 +290,7 @@ machine_xt_pcxt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -312,7 +308,7 @@ machine_xt_pxxt_init(const machine_t *model) device_add(&keyboard_xt_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } @@ -329,7 +325,7 @@ machine_xt_iskra3104_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -363,7 +359,7 @@ machine_xt_pravetz16_imko4_init(const machine_t *model) device_add(&keyboard_pravetz_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } @@ -379,7 +375,10 @@ machine_xt_micoms_xl7turbo_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_init_ex(model); + device_add(&keyboard_xt_device); + + machine_xt_common_init(model, 0); + return ret; } @@ -394,7 +393,7 @@ machine_xt_pc4i_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -412,7 +411,7 @@ machine_xt_mpc1600_init(const machine_t *model) device_add(&keyboard_pc82_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } @@ -435,7 +434,7 @@ machine_xt_pcspirit_init(const machine_t *model) device_add(&keyboard_pc82_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } @@ -453,7 +452,7 @@ machine_xt_pc700_init(const machine_t *model) device_add(&keyboard_pc_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } @@ -471,7 +470,7 @@ machine_xt_pc500_init(const machine_t *model) device_add(&keyboard_pc_device); - machine_xt_common_init(model); + machine_xt_common_init(model, 0); return ret; } @@ -487,18 +486,20 @@ machine_xt_vendex_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + /* On-board FDC cannot be disabled */ + machine_xt_clone_init(model, 1); + device_add(&vendex_xt_rtc_onboard_device); return ret; } static void -machine_xt_hyundai_common_init(const machine_t *model) +machine_xt_hyundai_common_init(const machine_t *model, int fixed_floppy) { device_add(&keyboard_xt_hyundai_device); - machine_xt_common_init(model); + machine_xt_common_init(model, fixed_floppy); } int @@ -512,10 +513,8 @@ machine_xt_super16t_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_hyundai_common_init(model); - /* On-board FDC cannot be disabled */ - device_add(&fdc_xt_device); + machine_xt_hyundai_common_init(model, 1); return ret; } @@ -531,10 +530,8 @@ machine_xt_super16te_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_hyundai_common_init(model); - /* On-board FDC cannot be disabled */ - device_add(&fdc_xt_device); + machine_xt_hyundai_common_init(model, 1); return ret; } @@ -550,10 +547,8 @@ machine_xt_top88_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); - /* On-board FDC cannot be disabled */ - device_add(&fdc_xt_device); + machine_xt_clone_init(model, 1); return ret; } @@ -569,7 +564,7 @@ machine_xt_kaypropc_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -585,10 +580,8 @@ machine_xt_sansx16_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); - /* On-board FDC cannot be disabled */ - device_add(&fdc_xt_device); + machine_xt_clone_init(model, 1); return ret; } @@ -604,7 +597,7 @@ machine_xt_bw230_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -620,7 +613,7 @@ machine_xt_v20xt_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -636,7 +629,7 @@ machine_xt_pb8810_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_clone_init(model); + machine_xt_clone_init(model, 0); return ret; } @@ -652,7 +645,9 @@ machine_xt_glabios_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_init_ex(model); + device_add(&keyboard_xt_device); + + machine_xt_common_init(model, 0); return ret; } From f68f0487264f02455313613752525d37803fe4f5 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 30 Jun 2024 20:27:17 -0400 Subject: [PATCH 048/624] Don't attempt to add dummy internal device to system --- src/floppy/fdc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 0f3cf9dbb..cd514e141 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -188,8 +188,8 @@ fdc_card_get_from_internal_name(char *s) void fdc_card_init(void) { - if ((fdc_type > 0) && fdc_cards[fdc_type].device) - device_add(fdc_cards[fdc_type].device); + if ((fdc_type > FDC_INTERNAL) && fdc_cards[fdc_type].device) + device_add_inst(fdc_cards[fdc_type].device, 0); } uint8_t From 8aba1361e6ec192017b4cd0cb09d615ffcd24de4 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 1 Jul 2024 00:25:52 -0400 Subject: [PATCH 049/624] Commented out support for hiding internal fdc --- src/qt/qt_settingsstoragecontrollers.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index 389e22852..fa02ce613 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -110,6 +110,14 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId) c = 0; selectedRow = 0; while (true) { +#if 0 + /* Skip "internal" if machine doesn't have it. */ + if ((c == 1) && (machine_has_flags(machineId, MACHINE_FDC) == 0)) { + c++; + continue; + } +#endif + QString name = DeviceConfig::DeviceName(fdc_card_getdevice(c), fdc_card_get_internal_name(c), 1); if (name.isEmpty()) { break; From 00068539e131a5f759f239472debd1b73e74e542 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 1 Jul 2024 01:44:54 -0400 Subject: [PATCH 050/624] Add ability to select XT or AT FDC --- src/floppy/fdc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index cd514e141..49171ae30 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -133,6 +133,8 @@ static fdc_cards_t fdc_cards[] = { // clang-format off { &fdc_none_device }, { &fdc_internal_device }, + { &fdc_xt_device }, + { &fdc_at_device }, { &fdc_b215_device }, { &fdc_pii151b_device }, { &fdc_pii158b_device }, From 7ce119dcbae0c0b6393c2dd59c66c7d86fcc99e5 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 1 Jul 2024 02:01:58 -0400 Subject: [PATCH 051/624] Fix flags in fdc.h --- src/include/86box/fdc.h | 35 +++++++++++++++++------------------ 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index 6bb8f081e..cee1fed62 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -40,24 +40,23 @@ extern int fdc_type; #define FDC_QUATERNARY_IRQ 6 #define FDC_QUATERNARY_DMA 2 -#define FDC_FLAG_PCJR 0x01 /* PCjr */ -#define FDC_FLAG_DISKCHG_ACTLOW 0x02 /* Amstrad, PS/1, PS/2 ISA */ -#define FDC_FLAG_AT 0x04 /* AT+, PS/x */ -#define FDC_FLAG_PS1 0x08 /* PS/1, PS/2 ISA */ -#define FDC_FLAG_SUPERIO 0x10 /* Super I/O chips */ -#define FDC_FLAG_START_RWC_1 0x20 /* W83877F, W83977F */ -#define FDC_FLAG_MORE_TRACKS 0x40 /* W83877F, W83977F, PC87306, PC87309 */ -#define FDC_FLAG_NSC 0x80 /* PC87306, PC87309 */ -#define FDC_FLAG_TOSHIBA 0x100 /* T1000, T1200 */ -#define FDC_FLAG_AMSTRAD 0x200 /* Non-AT Amstrad machines */ -#define FDC_FLAG_UMC 0x400 /* UMC UM8398 */ -#define FDC_FLAG_ALI 0x800 /* ALi M512x / M1543C */ -#define FDC_FLAG_SEC 0x1000 /* Is Secondary */ -#define FDC_FLAG_TER 0x2000 /* Is Tertiary */ -#define FDC_FLAG_QUA 0x3000 /* Is Quaternary */ -#define FDC_FLAG_CHANNEL 0x3000 /* Channel mask */ -#define FDC_FLAG_NO_DSR_RESET 0x4000 /* Has no DSR reset */ -#define FDC_FLAG_NEC 0x8000 /* Is NEC upd765-compatible */ +#define FDC_FLAG_PCJR 0x01 /* PCjr */ +#define FDC_FLAG_DISKCHG_ACTLOW 0x02 /* Amstrad, PS/1, PS/2 ISA */ +#define FDC_FLAG_AT 0x04 /* AT+, PS/x */ +#define FDC_FLAG_PS1 0x08 /* PS/1, PS/2 ISA */ +#define FDC_FLAG_SUPERIO 0x10 /* Super I/O chips */ +#define FDC_FLAG_START_RWC_1 0x20 /* W83877F, W83977F */ +#define FDC_FLAG_MORE_TRACKS 0x40 /* W83877F, W83977F, PC87306, PC87309 */ +#define FDC_FLAG_NSC 0x80 /* PC87306, PC87309 */ +#define FDC_FLAG_TOSHIBA 0x100 /* T1000, T1200 */ +#define FDC_FLAG_AMSTRAD 0x200 /* Non-AT Amstrad machines */ +#define FDC_FLAG_UMC 0x400 /* UMC UM8398 */ +#define FDC_FLAG_ALI 0x800 /* ALi M512x / M1543C */ +#define FDC_FLAG_NO_DSR_RESET 0x1000 /* Has no DSR reset */ +#define FDC_FLAG_NEC 0x2000 /* Is NEC upd765-compatible */ +#define FDC_FLAG_SEC 0x10000 /* Is Secondary */ +#define FDC_FLAG_TER 0x20000 /* Is Tertiary */ +#define FDC_FLAG_QUA 0x40000 /* Is Quaternary */ typedef struct fdc_t { uint8_t dor; From 516dc589b7eac6b7e13aa96ef9b3c104f1c8c8f5 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 1 Jul 2024 21:00:26 -0400 Subject: [PATCH 052/624] Handle freeing mallocs in config.c properly --- src/config.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index a98111edc..3035be95f 100644 --- a/src/config.c +++ b/src/config.c @@ -433,8 +433,11 @@ load_video(void) free_p = 1; } gfxcard[0] = video_get_video_from_internal_name(p); - if (free_p) + if (free_p) { free(p); + p = NULL; + free_p = 0; + } } if (((gfxcard[0] == VID_INTERNAL) && machine_has_flags(machine, MACHINE_VIDEO_8514A)) || @@ -853,6 +856,7 @@ load_storage_controllers(void) if (free_p) { free(p); p = NULL; + free_p = 0; } ide_ter_enabled = !!ini_section_get_int(cat, "ide_ter", 0); From db16f0f2095a444d108270fa39a1770dc7637eef Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 8 Jul 2024 03:18:26 +0200 Subject: [PATCH 053/624] Add LZW support for Teledisk 1.x advanced compressed files. --- src/floppy/CMakeLists.txt | 3 + src/floppy/fdd_td0.c | 31 ++- src/floppy/lzw/CMakeLists.txt | 16 ++ src/floppy/lzw/lzw.h | 49 ++++ src/floppy/lzw/lzwdecode.c | 269 ++++++++++++++++++++ src/floppy/lzw/lzwencode.c | 454 ++++++++++++++++++++++++++++++++++ src/floppy/lzw/lzwlocal.h | 63 +++++ 7 files changed, 876 insertions(+), 9 deletions(-) create mode 100644 src/floppy/lzw/CMakeLists.txt create mode 100644 src/floppy/lzw/lzw.h create mode 100644 src/floppy/lzw/lzwdecode.c create mode 100644 src/floppy/lzw/lzwencode.c create mode 100644 src/floppy/lzw/lzwlocal.h diff --git a/src/floppy/CMakeLists.txt b/src/floppy/CMakeLists.txt index 6d69d2d59..5aea98714 100644 --- a/src/floppy/CMakeLists.txt +++ b/src/floppy/CMakeLists.txt @@ -16,3 +16,6 @@ add_library(fdd OBJECT fdd.c fdc.c fdc_magitronic.c fdc_monster.c fdc_pii15xb.c fdi2raw.c fdd_common.c fdd_86f.c fdd_fdi.c fdd_imd.c fdd_img.c fdd_pcjs.c fdd_mfm.c fdd_td0.c) + +add_subdirectory(lzw) +target_link_libraries(86Box lzw) diff --git a/src/floppy/fdd_td0.c b/src/floppy/fdd_td0.c index 46e29343b..0bf4b1c71 100644 --- a/src/floppy/fdd_td0.c +++ b/src/floppy/fdd_td0.c @@ -42,6 +42,7 @@ #include <86box/fdd_86f.h> #include <86box/fdd_td0.h> #include <86box/fdc.h> +#include "lzw/lzw.h" #define BUFSZ 512 /* new input buffer */ #define TD0_MAX_BUFSZ (1024UL * 1024UL * 4UL) @@ -124,7 +125,9 @@ typedef struct td0_t { uint8_t xdf_ordered_pos[256][2]; uint8_t interleave_ordered_pos[256][2]; + uint8_t *lzw_buf; uint8_t *imagebuf; + uint8_t *processed_buf; } td0_t; @@ -650,11 +653,20 @@ td0_initialize(int drive) head_count = header[9]; if (header[0] == 't') { - td0_log("TD0: File is compressed\n"); - disk_decode.fdd_file = dev->fp; - state_init_Decode(&disk_decode); - disk_decode.fdd_file_offset = 12; - state_Decode(&disk_decode, dev->imagebuf, TD0_MAX_BUFSZ); + if (((header[4] / 10) % 10) == 2) { + td0_log("TD0: File is compressed (TeleDisk 2.x, LZHUF)\n"); + disk_decode.fdd_file = dev->fp; + state_init_Decode(&disk_decode); + disk_decode.fdd_file_offset = 12; + state_Decode(&disk_decode, dev->imagebuf, TD0_MAX_BUFSZ); + } else { + td0_log("TD0: File is compressed (TeleDisk 1.x, LZW)\n"); + if (fseek(dev->fp, 12, SEEK_SET) == -1) + fatal("td0_initialize(): Error seeking to offet 12\n"); + if (fread(dev->lzw_buf, 1, file_size - 12, dev->fp) != (file_size - 12)) + fatal("td0_initialize(): Error reading LZW-encoded buffer\n"); + LZWDecodeFile((char *) dev->imagebuf, (char *) dev->lzw_buf, NULL, file_size - 12); + } } else { td0_log("TD0: File is uncompressed\n"); if (fseek(dev->fp, 12, SEEK_SET) == -1) @@ -1224,10 +1236,9 @@ td0_load(int drive, char *fn) /* Allocate the processing buffers. */ i = 1024UL * 1024UL * 4UL; - dev->imagebuf = (uint8_t *) malloc(i); - memset(dev->imagebuf, 0x00, i); - dev->processed_buf = (uint8_t *) malloc(i); - memset(dev->processed_buf, 0x00, i); + dev->lzw_buf = (uint8_t *) calloc(1, i); + dev->imagebuf = (uint8_t *) calloc(1, i); + dev->processed_buf = (uint8_t *) calloc(1, i); if (!td0_initialize(drive)) { td0_log("TD0: Failed to initialize\n"); @@ -1268,6 +1279,8 @@ td0_close(int drive) d86f_unregister(drive); + if (dev->lzw_buf) + free(dev->lzw_buf); if (dev->imagebuf) free(dev->imagebuf); if (dev->processed_buf) diff --git a/src/floppy/lzw/CMakeLists.txt b/src/floppy/lzw/CMakeLists.txt new file mode 100644 index 000000000..bc6f0b612 --- /dev/null +++ b/src/floppy/lzw/CMakeLists.txt @@ -0,0 +1,16 @@ +# +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. +# +# This file is part of the 86Box distribution. +# +# CMake build script. +# +# Authors: David Hrdlička, +# +# Copyright 2020-2021 David Hrdlička. +# + +add_library(lzw STATIC lzwdecode.c lzwencode.c) \ No newline at end of file diff --git a/src/floppy/lzw/lzw.h b/src/floppy/lzw/lzw.h new file mode 100644 index 000000000..26abbf6ad --- /dev/null +++ b/src/floppy/lzw/lzw.h @@ -0,0 +1,49 @@ +/*************************************************************************** +* Header for Lempel-Ziv-Welch Encoding and Decoding Library +* +* File : lzw.h +* Purpose : Provides prototypes for functions that use Lempel-Ziv-Welch +* coding to encode/decode files. +* Author : Michael Dipperstein +* Date : January 30, 2004 +* +**************************************************************************** +* +* LZW: An ANSI C Lempel-Ziv-Welch Encoding/Decoding Routines +* Copyright (C) 2005, 2007, 2014 by +* Michael Dipperstein (mdipperstein@gmail.com) +* +* This file is part of the lzw library. +* +* The lzw library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public License as +* published by the Free Software Foundation; either version 3 of the +* License, or (at your option) any later version. +* +* The lzw library is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +* General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, see . +* +***************************************************************************/ + +#ifndef _LZW_H_ +#define _LZW_H_ + +/*************************************************************************** +* CONSTANTS +***************************************************************************/ + +/*************************************************************************** +* PROTOTYPES +***************************************************************************/ + /* encode inFile */ +int LZWEncodeFile(char *dest, char *src, uint64_t *dst_len, uint64_t src_len); + +/* decode inFile*/ +int LZWDecodeFile(char *dest, char *src, uint64_t *dst_len, uint64_t src_len); + +#endif /* ndef _LZW_H_ */ diff --git a/src/floppy/lzw/lzwdecode.c b/src/floppy/lzw/lzwdecode.c new file mode 100644 index 000000000..7634b52f8 --- /dev/null +++ b/src/floppy/lzw/lzwdecode.c @@ -0,0 +1,269 @@ +/*************************************************************************** +* Lempel-Ziv-Welch Decoding Functions +* +* File : lzwdecode.c +* Purpose : Provides a function for decoding Lempel-Ziv-Welch encoded +* file streams +* Author : Michael Dipperstein +* Date : January 30, 2005 +* +**************************************************************************** +* +* LZW: An ANSI C Lempel-Ziv-Welch Encoding/Decoding Routines +* Copyright (C) 2005, 2007, 2014, 2017 by +* Michael Dipperstein (mdipperstein@gmail.com) +* +* This file is part of the lzw library. +* +* The lzw library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public License as +* published by the Free Software Foundation; either version 3 of the +* License, or (at your option) any later version. +* +* The lzw library is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +* General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, see . +* +***************************************************************************/ + +/*************************************************************************** +* INCLUDED FILES +***************************************************************************/ +#include +#include +#include +#include +#include +#include +#include "lzw.h" +#include "lzwlocal.h" + +/*************************************************************************** +* TYPE DEFINITIONS +***************************************************************************/ +typedef struct +{ + uint8_t suffixChar; /* last char in encoded string */ + uint16_t prefixCode; /* code for remaining chars in string */ +} decode_dictionary_t; + +/*************************************************************************** +* CONSTANTS +***************************************************************************/ + +/*************************************************************************** +* MACROS +***************************************************************************/ + +/*************************************************************************** +* GLOBAL VARIABLES +***************************************************************************/ + +/* dictionary of string the code word is the dictionary index */ +static decode_dictionary_t dictionary[(MAX_CODES - FIRST_CODE)]; + +/*************************************************************************** +* PROTOTYPES +***************************************************************************/ +static uint8_t DecodeRecursive(unsigned int code, char **dest); + +/* read encoded data */ +static int GetCodeWord(char *src); + +static uint16_t bufPos = 0x0000; +static uint16_t bufLen = 0x0000; + +static uint32_t bufOutPos = 0x00000000; + +/*************************************************************************** +* FUNCTIONS +***************************************************************************/ + +/*************************************************************************** +* Function : LZWDecodeFile +* Description: This routine reads an input file 1 encoded string at a +* time and decodes it using the LZW algorithm. +* Parameters : fpIn - pointer to the open binary file to decode +* fpOut - pointer to the open binary file to write decoded +* output +* Effects : fpIn is decoded using the LZW algorithm with CODE_LEN codes +* and written to fpOut. Neither file is closed after exit. +* Returned : 0 for success, -1 for failure. errno will be set in the +* event of a failure. +***************************************************************************/ +int +LZWDecodeFile_Internal(char *dest, char *src) +{ + uint16_t nextCode; /* value of next code */ + uint16_t lastCode; /* last decoded code word */ + int code; /* code word to decode */ + uint8_t c; /* last decoded character */ + + /* validate arguments */ + if (dest == NULL) { + errno = ENOENT; + return -1; + } + + bufPos = 0x0000; + bufOutPos = 0x00000000; + + /* initialize for decoding */ + nextCode = FIRST_CODE; /* code for next (first) string */ + + /* first code from file must be a character. use it for initial values */ + lastCode = GetCodeWord(src); + c = lastCode; + *(dest++) = lastCode; + bufOutPos++; + + /* decode rest of file */ + while ((int)(code = GetCodeWord(src)) != EOF) { + if (code < nextCode) { + /* we have a known code. decode it */ + c = DecodeRecursive(code, &dest); + } else { + /*************************************************************** + * We got a code that's not in our dictionary. This must be due + * to the string + char + string + char + string exception. + * Build the decoded string using the last character + the + * string from the last code. + ***************************************************************/ + unsigned char tmp; + + tmp = c; + c = DecodeRecursive(lastCode, &dest); + *(dest++) = tmp; + bufOutPos++; + } + + /* if room, add new code to the dictionary */ + if (nextCode < MAX_CODES) { + dictionary[nextCode - FIRST_CODE].prefixCode = lastCode; + dictionary[nextCode - FIRST_CODE].suffixChar = c; + nextCode++; + } + + /* save character and code for use in unknown code word case */ + lastCode = code; + } + + return 0; +} + +int +LZWDecodeFile(char *dest, char *src, uint64_t *dst_len, uint64_t src_len) +{ + uint16_t size = 0x0000; + uint64_t pos = 0x0000000000000000ULL; + + /* validate arguments */ + if ((dest == NULL) || (src == NULL)) { + errno = ENOENT; + return -1; + } + + if (dst_len != NULL) + *dst_len = 0x0000000000000000ULL; + + while (1) { + size = *(uint16_t *) src; + src += 2; + bufLen = size; + size >>= 1; + if (bufLen & 1) + size++; + if (size > 0x1800) + return -1; + LZWDecodeFile_Internal(dest, src); + src += size; + dest += bufOutPos; + if (dst_len != NULL) + *dst_len += bufOutPos; + pos += (size + 2); + if ((size < 0x1800) || (pos >= src_len)) + /* We have just decoded a block smaller than 0x3000 bytes, + this means this has been the last block, end. */ + break; + } + + return 0; +} + +/*************************************************************************** +* Function : DecodeRecursive +* Description: This function uses the dictionary to decode a code word +* into the string it represents and write it to the output +* file. The string is actually built in reverse order and +* recursion is used to write it out in the correct order. +* Parameters : code - the code word to decode +* fpOut - the file that the decoded code word is written to +* Effects : Decoded code word is written to a file +* Returned : The first character in the decoded string +***************************************************************************/ +static uint8_t +DecodeRecursive(unsigned int code, char **dest) +{ + unsigned char c; + unsigned char firstChar; + + if (code >= FIRST_CODE) { + /* code word is string + c */ + c = dictionary[code - FIRST_CODE].suffixChar; + code = dictionary[code - FIRST_CODE].prefixCode; + + /* evaluate new code word for remaining string */ + firstChar = DecodeRecursive(code, dest); + } else { + /* code word is just c */ + c = code; + firstChar = code; + } + + *((*dest)++) = c; + bufOutPos++; + return firstChar; +} + +/*************************************************************************** +* Function : GetCodeWord +* Description: This function reads and returns a code word from an +* encoded file. In order to deal with endian issue the +* code word is read least significant byte followed by the +* remaining bits. +* Parameters : fpIn - file containing the encoded data +* codeLen - number of bits in code word +* Effects : code word is read from encoded input +* Returned : The next code word in the encoded file. EOF if the end +* of file has been reached. +* +* NOTE: If the code word contains more than 16 bits, this routine should +* be modified to read in all the bytes from least significant to +* most significant followed by any left over bits. +***************************************************************************/ +static int +GetCodeWord(char *src) +{ + int code = 0; + static unsigned int realPos; + + realPos = bufPos >> 1; + + if (bufPos >= bufLen) + /* End of buffer. */ + code = EOF; + else if (bufPos & 1) + /* Odd position. */ + code = (((uint8_t) src[realPos] & 0xf0) >> 4) | ((uint8_t) src[realPos + 1] << 4); + else + /* Even position. */ + code = ((uint8_t) src[realPos] & 0xff) | (((uint8_t) src[realPos + 1] & 0xf) << 8); + + bufPos += 3; + + return code; +} diff --git a/src/floppy/lzw/lzwencode.c b/src/floppy/lzw/lzwencode.c new file mode 100644 index 000000000..0a4d659bb --- /dev/null +++ b/src/floppy/lzw/lzwencode.c @@ -0,0 +1,454 @@ +/*************************************************************************** +* Lempel-Ziv-Welch Encoding Functions +* +* File : lzwencode.c +* Purpose : Provides a function for Lempel-Ziv-Welch encoding of file +* streams +* Author : Michael Dipperstein +* Date : January 30, 2005 +* +**************************************************************************** +* +* LZW: An ANSI C Lempel-Ziv-Welch Encoding/Decoding Routines +* Copyright (C) 2005, 2007, 2014, 2017 by +* Michael Dipperstein (mdipperstein@gmail.com) +* +* This file is part of the lzw library. +* +* The lzw library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public License as +* published by the Free Software Foundation; either version 3 of the +* License, or (at your option) any later version. +* +* The lzw library is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +* General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, see . +* +***************************************************************************/ + +/*************************************************************************** +* INCLUDED FILES +***************************************************************************/ +#include +#include +#include +#include +#include +#include +#include "lzw.h" +#include "lzwlocal.h" + +/*************************************************************************** +* TYPE DEFINITIONS +***************************************************************************/ +/* node in dictionary tree */ +typedef struct dict_node_t +{ + unsigned int codeWord; /* code word for this entry */ + unsigned char suffixChar; /* last char in encoded string */ + unsigned int prefixCode; /* code for remaining chars in string */ + + /* pointer to child nodes */ + struct dict_node_t *left; /* child with < key */ + struct dict_node_t *right; /* child with >= key */ +} dict_node_t; + +/*************************************************************************** +* CONSTANTS +***************************************************************************/ + +/*************************************************************************** +* MACROS +***************************************************************************/ + +/*************************************************************************** +* GLOBAL VARIABLES +***************************************************************************/ + +/*************************************************************************** +* PROTOTYPES +***************************************************************************/ + +/* dictionary tree node create/free */ +static dict_node_t *MakeNode(const unsigned int codeWord, const unsigned int prefixCode, + const unsigned char suffixChar); +static void FreeTree(dict_node_t *node); + +/* searches tree for matching dictionary entry */ +static dict_node_t *FindDictionaryEntry(dict_node_t *root, const int unsigned prefixCode, + const unsigned char c); + +/* makes key from prefix code and character */ +static unsigned int MakeKey(const unsigned int prefixCode, const unsigned char suffixChar); + +/* write encoded data */ +static int PutCodeWord(char *dest, int code); + +static char *src_base; +static uint64_t src_length = 0x0000000000000000ULL; + +static uint32_t bufPos = 0x00000000; +static uint32_t bufInPos = 0x00000000; + +static int +is_eob(char *src) +{ + return ((uint64_t) (uintptr_t) (src - src_base)) >= src_length; +} + +static int +get_char(char **src) +{ + int ret = EOF; + + if (!is_eob(*src)) { + ret = (uint8_t) **src; + (*src)++; + } + + return ret; +} + +/*************************************************************************** +* FUNCTIONS +***************************************************************************/ + +static int +LZWEncodeFile_Internal(char *dest, char *src) +{ + unsigned int code; /* code for current string */ + unsigned int nextCode; /* next available code index */ + int c; /* character to add to string */ + + dict_node_t *dictRoot; /* root of dictionary tree */ + dict_node_t *node; /* node of dictionary tree */ + + /* validate arguments */ + if (src == NULL) { + errno = ENOENT; + return -1; + } + + /* initialize dictionary as empty */ + dictRoot = NULL; + + nextCode = FIRST_CODE; /* code for next (first) string */ + + bufPos = 0x00000000; + bufInPos = 0x00000000; + + /* now start the actual encoding process */ + + c = get_char(&src); + + if (c == EOF) + return -1; /* empty file */ + else { + bufInPos++; + code = c; /* start with code string = first character */ + } + + /* create a tree root from 1st 2 character string */ + if ((c = get_char(&src)) != EOF) { + bufInPos++; + + /* special case for NULL root */ + dictRoot = MakeNode(nextCode, code, c); + + if (dictRoot == NULL) { + perror("Making Dictionary Root"); + return -1; + } + + nextCode++; + + /* write code for 1st char */ + (void) PutCodeWord(dest, code); + + /* new code is just 2nd char */ + code = c; + } + + /* now encode normally */ + while ((c = get_char(&src)) != EOF) { + /* look for code + c in the dictionary */ + node = FindDictionaryEntry(dictRoot, code, c); + + if ((node->prefixCode == code) && (node->suffixChar == c)) + /* code + c is in the dictionary, make it's code the new code */ + code = node->codeWord; + else { + /* code + c is not in the dictionary, add it if there's room */ + if (nextCode < MAX_CODES) { + dict_node_t *tmp = MakeNode(nextCode, code, c); + + if (tmp == NULL) { + perror("Making Dictionary Node"); + FreeTree(dictRoot); + return -1; + } + + nextCode++; + + if (MakeKey(code, c) < MakeKey(node->prefixCode, node->suffixChar)) + node->left = tmp; + else + node->right = tmp; + } + + /* write out code for the string before c was added */ + if (PutCodeWord(dest, code)) + break; + + /* new code is just c */ + code = c; + } + + bufInPos++; + } + + /* no more input. write out last of the code. */ + (void) PutCodeWord(dest, code); + + /* free the dictionary */ + FreeTree(dictRoot); + + return (c == EOF) ? 1 : 0; +} + +/*************************************************************************** +* Function : LZWEncodeFile +* Description: This routine reads an input file 1 character at a time and +* writes out an LZW encoded version of that file. +* Parameters : fpIn - pointer to the open binary file to encode +* fpOut - pointer to the open binary file to write encoded +* output +* Effects : fpIn is encoded using the LZW algorithm with CODE_LEN codes +* and written to fpOut. Neither file is closed after exit. +* Returned : 0 for success, -1 for failure. errno will be set in the +* event of a failure. +***************************************************************************/ +int +LZWEncodeFile(char *dest, char *src, uint64_t *dst_len, uint64_t src_len) +{ + uint64_t pos = 0x0000000000000000ULL; + + /* validate arguments */ + if ((dest == NULL) || (src == NULL)) { + errno = ENOENT; + return -1; + } + + if (dst_len != NULL) + *dst_len = 0x0000000000000000ULL; + + src_base = src; + src_length = src_len; + + while (1) { + int ret = LZWEncodeFile_Internal(dest + 2, src); + if (ret == -1) + break; + *(uint16_t *) dest = bufPos; + if (bufPos & 1) + bufPos = (bufPos >> 1) + 1; + else + bufPos >>= 1; + dest += (bufPos + 2); + if (dst_len != NULL) + *dst_len += (bufPos + 2); + /* TODO: Why do we need this - 1 clunkfest? */ + src += bufInPos; + pos += bufInPos; + if ((ret == 1) || (pos >= src_len) || (bufPos < 0x1800)) + break; + } + + return 0; +} + +/*************************************************************************** +* Function : MakeKey +* Description: This routine creates a simple key from a prefix code and +* an appended character. The key may be used to establish +* an order when building/searching a dictionary tree. +* Parameters : prefixCode - code for all but the last character of a +* string. +* suffixChar - the last character of a string +* Effects : None +* Returned : Key built from string represented as a prefix + char. Key +* format is {ms nibble of c} + prefix + {ls nibble of c} +***************************************************************************/ +static unsigned int +MakeKey(const unsigned int prefixCode, const unsigned char suffixChar) +{ + unsigned int key; + + /* position ms nibble */ + key = suffixChar & 0xF0; + key <<= MAX_CODE_LEN; + + /* include prefix code */ + key |= (prefixCode << 4); + + /* inclulde ls nibble */ + key |= (suffixChar & 0x0F); + + return key; +} + +/*************************************************************************** +* Function : MakeNode +* Description: This routine creates and initializes a dictionary entry +* for a string and the code word that encodes it. +* Parameters : codeWord - code word used to encode the string prefixCode + +* suffixChar +* prefixCode - code for all but the last character of a +* string. +* suffixChar - the last character of a string +* Effects : Node is allocated for new dictionary entry +* Returned : Pointer to newly allocated node or NULL on error. +* errno will be set on an error. +***************************************************************************/ +static dict_node_t * +MakeNode(const unsigned int codeWord, const unsigned int prefixCode, const unsigned char suffixChar) +{ + dict_node_t *node; + + node = malloc(sizeof(dict_node_t)); + + if (node != NULL) { + node->codeWord = codeWord; + node->prefixCode = prefixCode; + node->suffixChar = suffixChar; + + node->left = NULL; + node->right = NULL; + } + + return node; +} + +/*************************************************************************** +* Function : FreeTree +* Description: This routine will free all nodes of a tree rooted at the +* node past as a parameter. +* Parameters : node - root of tree to free +* Effects : frees allocated tree node from initial parameter down. +* Returned : none +***************************************************************************/ +static void +FreeTree(dict_node_t *node) +{ + if (node == NULL) + /* nothing to free */ + return; + + /* free left branch */ + if (node->left != NULL) + FreeTree(node->left); + + /* free right branch */ + if (node->right != NULL) + FreeTree(node->right); + + /* free root */ + free(node); +} + +/*************************************************************************** +* Function : FindDictionaryEntry +* Description: This routine searches the dictionary tree for an entry +* with a matching string (prefix code + suffix character). +* If one isn't found, the parent node for that string is +* returned. +* Parameters : prefixCode - code for the prefix of string +* c - last character in string +* Effects : None +* Returned : If string is in dictionary, pointer to node containing +* string, otherwise pointer to suitable parent node. NULL +* is returned for an empty tree. +***************************************************************************/ +static dict_node_t * +FindDictionaryEntry(dict_node_t *root, const int unsigned prefixCode, const unsigned char c) +{ + unsigned int searchKey, key; + + if (root == NULL) + return NULL; + + searchKey = MakeKey(prefixCode, c); /* key of string to find */ + + while (1) { + /* key of current node */ + key = MakeKey(root->prefixCode, root->suffixChar); + + if (key == searchKey) + /* current node contains string */ + return root; + else if (searchKey < key) { + if (root->left != NULL) + /* check left branch for string */ + root = root->left; + else + /* string isn't in tree, it can be added as a left child */ + return root; + } else { + if (root->right != NULL) + /* check right branch for string */ + root = root->right; + else + /* string isn't in tree, it can be added as a right child */ + return root; + } + } +} + +/*************************************************************************** +* Function : PutCodeWord +* Description: This function writes a code word from to an encoded file. +* In order to deal with endian issue the code word is +* written least significant byte followed by the remaining +* bits. +* Parameters : bfpOut - bit file containing the encoded data +* code - code word to add to the encoded data +* codeLen - length of the code word +* Effects : code word is written to the encoded output +* Returned : EOF for failure, ENOTSUP unsupported architecture, +* otherwise the number of bits written. If an error occurs +* after a partial write, the partially written bits will not +* be unwritten. +***************************************************************************/ +static int +PutCodeWord(char *dest, int code) +{ + static unsigned int realPos; + int ret = 0; + + if (bufPos >= 0x3000) + ret = -1; + else { + realPos = bufPos >> 1; + + if (bufPos & 1) { + /* Odd position. */ + dest[realPos] = (dest[realPos] & 0x0f) | ((code << 4) & 0xf0); + dest[realPos + 1] = (code >> 4) & 0xff; + } else { + /* Even position. */ + dest[realPos] = code & 0xff; + dest[realPos + 1] = ((code >> 8) & 0x0f); + } + + bufPos += 3; + + if (bufPos >= 0x3000) + ret = 1; + } + + return ret; +} diff --git a/src/floppy/lzw/lzwlocal.h b/src/floppy/lzw/lzwlocal.h new file mode 100644 index 000000000..79d1f9646 --- /dev/null +++ b/src/floppy/lzw/lzwlocal.h @@ -0,0 +1,63 @@ +/*************************************************************************** +* Header for Lempel-Ziv-Welch Encoding and Decoding Library +* +* File : lzwlocal.h +* Purpose : Provides constant definitions for functions values used within +* the functions for Lempel-Ziv-Welch encoding/decoding. +* Author : Michael Dipperstein +* Date : February 22, 2015 +* +**************************************************************************** +* +* LZW: An ANSI C Lempel-Ziv-Welch Encoding/Decoding Routines +* Copyright (C) 2015 by +* Michael Dipperstein (mdipperstein@gmail.com) +* +* This file is part of the lzw library. +* +* The lzw library is free software; you can redistribute it and/or +* modify it under the terms of the GNU Lesser General Public License as +* published by the Free Software Foundation; either version 3 of the +* License, or (at your option) any later version. +* +* The lzw library is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser +* General Public License for more details. +* +* You should have received a copy of the GNU Lesser General Public License +* along with this program. If not, see . +* +***************************************************************************/ + +#ifndef _LZWLOCAL_H_ +#define _LZWLOCAL_H_ +/*************************************************************************** +* INCLUDED FILES +***************************************************************************/ +#include +#include + +/*************************************************************************** +* CONSTANTS +***************************************************************************/ +#define MIN_CODE_LEN 12 /* min # bits in a code word */ +#define MAX_CODE_LEN 12 /* max # bits in a code word */ + +#define FIRST_CODE (1 << CHAR_BIT) /* value of 1st string code */ +#define MAX_CODES (1 << MAX_CODE_LEN) + +#if (MIN_CODE_LEN <= CHAR_BIT) +#error Code words must be larger than 1 character +#endif + +#if ((MAX_CODES - 1) > INT_MAX) +#error There cannot be more codes than can fit in an integer +#endif + +/*************************************************************************** +* MACROS +***************************************************************************/ +#define CURRENT_MAX_CODES(bits) ((unsigned int)(1 << (bits))) + +#endif /* ndef _LZWLOCAL_H_ */ From 215b3253a5f2ae247bbe7b3d6dbb929cf663c570 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 8 Jul 2024 00:40:52 -0400 Subject: [PATCH 054/624] Deal with some magic numbers re hdc_current --- src/disk/hdc.c | 2 +- src/include/86box/config.h | 1 + src/machine/m_at_compaq.c | 4 ++-- src/machine/m_europc.c | 2 +- src/machine/m_ps1.c | 2 +- src/machine/m_ps2_isa.c | 2 +- src/machine/m_v86p.c | 2 +- src/machine/m_xt_t1000.c | 2 +- 8 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 034b8890e..bb7adcd67 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -132,7 +132,7 @@ hdc_reset(void) hdc_current, (machines[machine].flags & MACHINE_HDC) ? 1 : 0); /* If we have a valid controller, add its device. */ - if (hdc_current > 1) + if (hdc_current > HDC_INTERNAL) device_add(controllers[hdc_current].device); /* Now, add the tertiary and/or quaternary IDE controllers. */ diff --git a/src/include/86box/config.h b/src/include/86box/config.h index 80c987162..8ce6f4cfe 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -114,6 +114,7 @@ typedef struct config_t { /* Other peripherals category */ int fdc_type; /* Floppy disk controller type */ + int hdc_current; /* Hard disk controller type */ int hdc; /* Hard disk controller */ int scsi_card; /* SCSI controller */ int ide_ter_enabled; /* Tertiary IDE controller enabled */ diff --git a/src/machine/m_at_compaq.c b/src/machine/m_at_compaq.c index 7f31d4ecd..b628ea095 100644 --- a/src/machine/m_at_compaq.c +++ b/src/machine/m_at_compaq.c @@ -798,7 +798,7 @@ machine_at_compaq_init(const machine_t *model, int type) break; case COMPAQ_PORTABLEIII: - if (hdc_current == 1) + if (hdc_current == HDC_INTERNAL) device_add(&ide_isa_device); if (gfxcard[0] == VID_INTERNAL) device_add(&compaq_plasma_device); @@ -806,7 +806,7 @@ machine_at_compaq_init(const machine_t *model, int type) break; case COMPAQ_PORTABLEIII386: - if (hdc_current == 1) + if (hdc_current == HDC_INTERNAL) device_add(&ide_isa_device); if (gfxcard[0] == VID_INTERNAL) device_add(&compaq_plasma_device); diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index e541cf718..c53061c4e 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -660,7 +660,7 @@ europc_boot(UNUSED(const device_t *info)) * * We only do this if we have not configured another one. */ - if (hdc_current == 1) + if (hdc_current == HDC_INTERNAL) (void) device_add(&xta_hd20_device); return sys; diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 34691773f..25d21cfb9 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -353,7 +353,7 @@ ps1_setup(int model) device_add(&fdc_at_ps1_device); /* Enable the builtin HDC. */ - if (hdc_current == 1) { + if (hdc_current == HDC_INTERNAL) { priv = device_add(&ps1_hdc_device); ps1_hdc_inform(priv, &ps->ps1_91); diff --git a/src/machine/m_ps2_isa.c b/src/machine/m_ps2_isa.c index fa9c5acc2..4f6d9bc2b 100644 --- a/src/machine/m_ps2_isa.c +++ b/src/machine/m_ps2_isa.c @@ -179,7 +179,7 @@ ps2_isa_setup(int model, int cpu_type) device_add(&fdc_at_ps1_device); /* Enable the builtin HDC. */ - if (hdc_current == 1) { + if (hdc_current == HDC_INTERNAL) { priv = device_add(&ps1_hdc_device); ps1_hdc_inform(priv, &ps2->ps2_91); } diff --git a/src/machine/m_v86p.c b/src/machine/m_v86p.c index 54af9b053..5d132a839 100644 --- a/src/machine/m_v86p.c +++ b/src/machine/m_v86p.c @@ -94,7 +94,7 @@ machine_v86p_init(const machine_t *model) if (gfxcard[0] == VID_INTERNAL) device_add(&f82c425_video_device); - if (hdc_current <= 1) + if (hdc_current <= HDC_INTERNAL) device_add(&st506_xt_victor_v86p_device); return ret; diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index a12fa4e96..88fc6ada2 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -969,7 +969,7 @@ machine_xt_t1200_init(const machine_t *model) if (gfxcard[0] == VID_INTERNAL) device_add(&t1200_video_device); - if (hdc_current <= 1) + if (hdc_current <= HDC_INTERNAL) device_add(&st506_xt_toshiba_t1200_device); return ret; From 84a494aa4229ec0a2276cb258898c1198a220aa6 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 8 Jul 2024 14:29:27 -0400 Subject: [PATCH 055/624] Don't change default behavior... yet --- src/config.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/config.c b/src/config.c index 3035be95f..bc4341b0d 100644 --- a/src/config.c +++ b/src/config.c @@ -795,7 +795,7 @@ load_storage_controllers(void) } p = ini_section_get_string(cat, "fdc", NULL); -#if 0 +#if 1 if (p != NULL) fdc_type = fdc_card_get_from_internal_name(p); else From 1b6fd190fbab7facacbda5cd721d0ea74fadb8f8 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 8 Jul 2024 21:21:06 +0200 Subject: [PATCH 056/624] Video changes of the day (July 8th, 2024) IBM 8514/A set: Fixed a one off video bug that was causing the VGA video to not be restored after quitting a 8514/A GUI session (namely on Win2.x' 8514/A's driver). ATI Mach32: Fixed another vertical display issue when activated (in 1280x1024 mode, when 1024 was 1022). All involved: Apply RG's changedvram fix to 8514/A, Mach8/32 and XGA's changedvram pointers. --- src/video/vid_8514a.c | 10 +++++----- src/video/vid_ati_mach8.c | 11 +++++++---- src/video/vid_svga.c | 3 ++- src/video/vid_xga.c | 2 +- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index fc205dacf..e8ae527b5 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -1004,9 +1004,9 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len) case 0x4ae8: case 0x4ae9: WRITE8(port, dev->accel.advfunc_cntl, val); - dev->on[port & 1] = dev->accel.advfunc_cntl & 0x01; - vga_on = !dev->on[port & 1]; - dev->vendor_mode[port & 1] = 0; + dev->on[0] = dev->accel.advfunc_cntl & 0x01; + vga_on = !dev->on[0]; + dev->vendor_mode[0] = 0; ibm8514_log("[%04X:%08X]: IBM 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, dev->on[port & 1], dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); ibm8514_log("IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); svga_recalctimings(svga); @@ -4311,7 +4311,7 @@ ibm8514_recalctimings(svga_t *svga) } else #endif { - if (dev->on[0] || dev->on[1]) { + if (dev->on[0]) { dev->h_total = dev->htotal + 1; dev->rowcount = !!(dev->disp_cntl & 0x08); @@ -4416,7 +4416,7 @@ ibm8514_init(const device_t *info) dev->vram_size = 1024 << 10; dev->vram = calloc(dev->vram_size, 1); - dev->changedvram = calloc(dev->vram_size >> 12, 1); + dev->changedvram = calloc((dev->vram_size >> 12) + 1, 1); dev->vram_mask = dev->vram_size - 1; dev->map8 = dev->pallook; dev->local = 0; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 6abdc213a..b170ae205 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2596,13 +2596,16 @@ mach_recalctimings(svga_t *svga) if (dev->interlace) dev->dispend >>= 1; - if (dev->dispend == 766) + if (dev->dispend == 478) dev->dispend += 2; if (dev->dispend == 598) dev->dispend += 2; - if (dev->dispend == 478) + if (dev->dispend == 766) + dev->dispend += 2; + + if (dev->dispend == 1022) dev->dispend += 2; if ((dev->local & 0xff) >= 0x02) { @@ -5870,7 +5873,7 @@ mach8_init(const device_t *info) NULL); dev->vram_size = mach->memory << 10; dev->vram = calloc(dev->vram_size, 1); - dev->changedvram = calloc(dev->vram_size >> 12, 1); + dev->changedvram = calloc((dev->vram_size >> 12) + 1, 1); dev->vram_mask = dev->vram_size - 1; dev->hwcursor.cur_ysize = 64; mach->config1 = 0x20; @@ -5918,7 +5921,7 @@ mach8_init(const device_t *info) NULL); dev->vram_size = (1024 << 10); dev->vram = calloc(dev->vram_size, 1); - dev->changedvram = calloc(dev->vram_size >> 12, 1); + dev->changedvram = calloc((dev->vram_size >> 12) + 1, 1); dev->vram_mask = dev->vram_size - 1; video_inform(VIDEO_FLAG_TYPE_8514, &timing_gfxultra_isa); mach->config1 = 0x01 | 0x02 | 0x20 | 0x08 | 0x80; diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 5d579585a..7403401be 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -223,7 +223,8 @@ svga_out(uint16_t addr, uint8_t val, void *priv) xga->on = (val & 0x01) ? 0 : 1; if (ibm8514_active && dev) { dev->on[0] = (val & 0x01) ? 0 : 1; - dev->on[1] = dev->on[0]; + if (dev->local & 0xff) + dev->on[1] = dev->on[0]; } svga_log("3C3: VGA ON = %d.\n", val & 0x01); diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index 9dcdd84b6..f1cad184e 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -3346,7 +3346,7 @@ xga_init(const device_t *info) xga->vram_size = (1024 << 10); xga->vram_mask = xga->vram_size - 1; xga->vram = calloc(xga->vram_size, 1); - xga->changedvram = calloc(xga->vram_size >> 12, 1); + xga->changedvram = calloc((xga->vram_size >> 12) + 1, 1); xga->on = 0; xga->hwcursor.cur_xsize = 64; xga->hwcursor.cur_ysize = 64; From 915ddc147f2c37f6052202a30771573312fa12b4 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 8 Jul 2024 18:02:43 -0400 Subject: [PATCH 057/624] Change the AT expansion's default start_address --- src/device/isamem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/isamem.c b/src/device/isamem.c index 2b0b8f66b..278bc49a5 100644 --- a/src/device/isamem.c +++ b/src/device/isamem.c @@ -1176,7 +1176,7 @@ static const device_config_t ibmat_config[] = { .description = "Start Address", .type = CONFIG_SPINNER, .default_string = "", - .default_int = 512, + .default_int = 1024, .file_filter = "", .spinner = { .min = 0, @@ -1224,7 +1224,7 @@ static const device_config_t genericat_config[] = { .description = "Start Address", .type = CONFIG_SPINNER, .default_string = "", - .default_int = 512, + .default_int = 1024, .file_filter = "", .spinner = { .min = 0, From eeb8af91f596985f8adf95c369f31ae9caf7e7ed Mon Sep 17 00:00:00 2001 From: cold-brewed <47337035+cold-brewed@users.noreply.github.com> Date: Sat, 13 Jul 2024 09:30:36 -0400 Subject: [PATCH 058/624] qt: Fix settings on mac and linux --- src/qt/qt_settings.cpp | 7 +- src/qt/qt_settings.ui | 36 +++-- src/qt/qt_settingsfloppycdrom.ui | 219 +++++++++++++++------------- src/qt/qt_settingsotherremovable.ui | 205 ++++++++++++++------------ 4 files changed, 252 insertions(+), 215 deletions(-) diff --git a/src/qt/qt_settings.cpp b/src/qt/qt_settings.cpp index caabdbfca..67064b73a 100644 --- a/src/qt/qt_settings.cpp +++ b/src/qt/qt_settings.cpp @@ -50,6 +50,7 @@ public: SettingsModel(QObject *parent) : QAbstractListModel(parent) { + fontHeight = QApplication::fontMetrics().height(); } QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; @@ -82,6 +83,7 @@ private: "other_removable_devices", "other_peripherals", }; + int fontHeight; }; QVariant @@ -94,6 +96,8 @@ SettingsModel::data(const QModelIndex &index, int role) const return tr(pages.at(index.row()).toUtf8().data()); case Qt::DecorationRole: return QIcon(QString("%1/%2.ico").arg(ProgSettings::getIconSetPath(), page_icons[index.row()])); + case Qt::SizeHintRole: + return QSize(-1, fontHeight * 2); default: return {}; } @@ -182,9 +186,6 @@ Settings::Settings(QWidget *parent) [this](const QModelIndex ¤t, const QModelIndex &previous) { ui->stackedWidget->setCurrentIndex(current.row()); }); - ui->listView->resizeColumnsToContents(); - ui->listView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch); - ui->listView->setCurrentIndex(model->index(0, 0)); Settings::settings = this; diff --git a/src/qt/qt_settings.ui b/src/qt/qt_settings.ui index fd92f7f58..da31b98c4 100644 --- a/src/qt/qt_settings.ui +++ b/src/qt/qt_settings.ui @@ -36,25 +36,31 @@ 0 - - - QAbstractItemView::NoEditTriggers + + + + 0 + 0 + - - QAbstractItemView::SingleSelection + + + 200 + 0 + - - QAbstractItemView::SelectRows + + + 200 + 16777215 + - - false + + QListView::ListMode + + + true - - false - - - false - diff --git a/src/qt/qt_settingsfloppycdrom.ui b/src/qt/qt_settingsfloppycdrom.ui index d7ad853b3..b9a937d8d 100644 --- a/src/qt/qt_settingsfloppycdrom.ui +++ b/src/qt/qt_settingsfloppycdrom.ui @@ -7,7 +7,7 @@ 0 0 544 - 617 + 363 @@ -35,6 +35,18 @@ + + + 0 + 0 + + + + + 16777215 + 150 + + QAbstractItemView::NoEditTriggers @@ -53,49 +65,38 @@ - - - - - Type: - - - - - - - 30 - - - - - - - Turbo timings - - - - - - - Check BPB - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - + + + + + + Type: + + + + + + + 30 + + + + + + + Turbo timings + + + + + + + Check BPB + + + + + @@ -106,6 +107,18 @@ + + + 0 + 0 + + + + + 16777215 + 150 + + QAbstractItemView::NoEditTriggers @@ -124,64 +137,66 @@ - - - - - Bus: - - - - - - - Channel: - - - - - - - Speed: - - - - - - - Type: - - - - - - - 30 - - - - - - - 30 - - - - - - - 30 - - - - - - - 30 - - - - + + + + + + Bus: + + + + + + + Channel: + + + + + + + Speed: + + + + + + + Type: + + + + + + + 30 + + + + + + + 30 + + + + + + + 30 + + + + + + + 30 + + + + + diff --git a/src/qt/qt_settingsotherremovable.ui b/src/qt/qt_settingsotherremovable.ui index 219333376..8962184fc 100644 --- a/src/qt/qt_settingsotherremovable.ui +++ b/src/qt/qt_settingsotherremovable.ui @@ -7,7 +7,7 @@ 0 0 418 - 433 + 368 @@ -35,6 +35,18 @@ + + + 0 + 0 + + + + + 16777215 + 150 + + QAbstractItemView::NoEditTriggers @@ -53,63 +65,52 @@ - - - - - Bus: - - - - - - - Channel: - - - - - - - 30 - - - - - - - 30 - - - - - - - Type: - - - - - - - 30 - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - + + + + + + Bus: + + + + + + + Channel: + + + + + + + 30 + + + + + + + 30 + + + + + + + Type: + + + + + + + 30 + + + + + @@ -120,6 +121,18 @@ + + + 0 + 0 + + + + + 16777215 + 150 + + QAbstractItemView::NoEditTriggers @@ -138,43 +151,45 @@ - - - - - Bus: - - - - - - - 30 - - - - - - - Channel: - - - - - - - 30 - - - - - - - ZIP 250 - - - - + + + + + + Bus: + + + + + + + 30 + + + + + + + Channel: + + + + + + + 30 + + + + + + + ZIP 250 + + + + + From fbf1420126904b6be05cb53c2e8770bfad10a31e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 13 Jul 2024 18:37:40 +0200 Subject: [PATCH 059/624] Fix the colors in the PCjr 640x400x2bpp mode. --- src/machine/m_pcjr.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 804da8e30..9d2aa6879 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -353,7 +353,7 @@ vid_poll(void *priv) break; case 0x03: /*640x200x4*/ for (x = 0; x < pcjr->crtc[1]; x++) { - dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; + dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1] << 8) | pcjr->vram[((pcjr->ma << 1) & mask) + offset]; pcjr->ma++; for (uint8_t c = 0; c < 8; c++) { chr = (dat >> 7) & 1; From 44be6a0dbfd8b081bd0e3f5ef719b3452a4f2970 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Jul 2024 19:14:12 -0300 Subject: [PATCH 060/624] C&T 69000: Fix PCI slot assignment and internal name --- src/config.c | 4 ++++ src/video/vid_chips_69000.c | 26 +++++++++++++------------- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/src/config.c b/src/config.c index bc4341b0d..3548fdf2d 100644 --- a/src/config.c +++ b/src/config.c @@ -431,6 +431,10 @@ load_video(void) strcpy(p, "none"); } free_p = 1; + } else if (!strcmp(p, "c&t_69000")) { + p = (char *) malloc((strlen("chips_69000") + 1) * sizeof(char)); + strcpy(p, "chips_69000"); + free_p = 1; } gfxcard[0] = video_get_video_from_internal_name(p); if (free_p) { diff --git a/src/video/vid_chips_69000.c b/src/video/vid_chips_69000.c index d91ab1a8b..2caefd413 100644 --- a/src/video/vid_chips_69000.c +++ b/src/video/vid_chips_69000.c @@ -156,7 +156,7 @@ typedef struct chips_69000_t { rom_t bios_rom; - void* i2c_ddc, *ddc; + void *i2c, *ddc; uint8_t st01; } chips_69000_t; @@ -1497,10 +1497,10 @@ chips_69000_read_ext_reg(chips_69000_t* chips) { val = chips->ext_regs[index]; if (!(chips->ext_regs[0x62] & 0x8)) - val = (val & ~8) | (i2c_gpio_get_scl(chips->i2c_ddc) << 3); + val = (val & ~8) | (i2c_gpio_get_scl(chips->i2c) << 3); if (!(chips->ext_regs[0x62] & 0x4)) - val = (val & ~4) | (i2c_gpio_get_sda(chips->i2c_ddc) << 2); + val = (val & ~4) | (i2c_gpio_get_sda(chips->i2c) << 2); break; } @@ -1560,14 +1560,14 @@ chips_69000_write_ext_reg(chips_69000_t* chips, uint8_t val) if (chips->ext_regs[0x62] & 0x8) scl = !!(val & 8); else - scl = i2c_gpio_get_scl(chips->i2c_ddc); + scl = i2c_gpio_get_scl(chips->i2c); if (chips->ext_regs[0x62] & 0x4) sda = !!(val & 4); else - scl = i2c_gpio_get_sda(chips->i2c_ddc); + scl = i2c_gpio_get_sda(chips->i2c); - i2c_gpio_set(chips->i2c_ddc, scl, sda); + i2c_gpio_set(chips->i2c, scl, sda); chips->ext_regs[chips->ext_index] = val & 0x9F; break; @@ -2455,7 +2455,7 @@ chips_69000_init(const device_t *info) io_sethandler(0x03c0, 0x0020, chips_69000_in, NULL, NULL, chips_69000_out, NULL, NULL, chips); - pci_add_card(PCI_ADD_VIDEO, chips_69000_pci_read, chips_69000_pci_write, chips, &chips->slot); + pci_add_card(info->local ? PCI_ADD_VIDEO : PCI_ADD_NORMAL, chips_69000_pci_read, chips_69000_pci_write, chips, &chips->slot); chips->svga.bpp = 8; chips->svga.miscout = 1; @@ -2477,8 +2477,8 @@ chips_69000_init(const device_t *info) timer_add(&chips->decrement_timer, chips_69000_decrement_timer, chips, 0); timer_on_auto(&chips->decrement_timer, 1000000. / 2000.); - chips->i2c_ddc = i2c_gpio_init("c&t_69000_mga"); - chips->ddc = ddc_init(i2c_gpio_get_bus(chips->i2c_ddc)); + chips->i2c = i2c_gpio_init("chips_69000_ddc"); + chips->ddc = ddc_init(i2c_gpio_get_bus(chips->i2c)); chips->flat_panel_regs[0x01] = 1; @@ -2500,7 +2500,7 @@ chips_69000_close(void *p) // thread_set_event(chips->fifo_event); // thread_wait(chips->accel_thread); ddc_close(chips->ddc); - i2c_gpio_close(chips->i2c_ddc); + i2c_gpio_close(chips->i2c); svga_close(&chips->svga); free(chips); @@ -2524,7 +2524,7 @@ chips_69000_force_redraw(void *p) const device_t chips_69000_device = { .name = "Chips & Technologies B69000", - .internal_name = "c&t_69000", + .internal_name = "chips_69000", .flags = DEVICE_PCI, .local = 0, .init = chips_69000_init, @@ -2537,8 +2537,8 @@ const device_t chips_69000_device = { }; const device_t chips_69000_onboard_device = { - .name = "Chips & Technologies B69000 (onboard)", - .internal_name = "c&t_69000_onboard", + .name = "Chips & Technologies B69000 On-Board", + .internal_name = "chips_69000_onboard", .flags = DEVICE_PCI, .local = 1, .init = chips_69000_init, From 869b4813715d395500ca9dbeeb609b8c639c448b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Jul 2024 19:15:31 -0300 Subject: [PATCH 061/624] config: Remove ancient Sound Blaster PCI 128 migration path --- src/config.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/config.c b/src/config.c index 3548fdf2d..8a837cf56 100644 --- a/src/config.c +++ b/src/config.c @@ -558,36 +558,24 @@ load_sound(void) char *p; p = ini_section_get_string(cat, "sndcard", NULL); - /* FIXME: Hack to not break configs with the Sound Blaster 128 PCI set. */ - if ((p != NULL) && (!strcmp(p, "sbpci128") || !strcmp(p, "sb128pci"))) - p = "es1371"; if (p != NULL) sound_card_current[0] = sound_card_get_from_internal_name(p); else sound_card_current[0] = 0; p = ini_section_get_string(cat, "sndcard2", NULL); - /* FIXME: Hack to not break configs with the Sound Blaster 128 PCI set. */ - if ((p != NULL) && (!strcmp(p, "sbpci128") || !strcmp(p, "sb128pci"))) - p = "es1371"; if (p != NULL) sound_card_current[1] = sound_card_get_from_internal_name(p); else sound_card_current[1] = 0; p = ini_section_get_string(cat, "sndcard3", NULL); - /* FIXME: Hack to not break configs with the Sound Blaster 128 PCI set. */ - if ((p != NULL) && (!strcmp(p, "sbpci128") || !strcmp(p, "sb128pci"))) - p = "es1371"; if (p != NULL) sound_card_current[2] = sound_card_get_from_internal_name(p); else sound_card_current[2] = 0; p = ini_section_get_string(cat, "sndcard4", NULL); - /* FIXME: Hack to not break configs with the Sound Blaster 128 PCI set. */ - if ((p != NULL) && (!strcmp(p, "sbpci128") || !strcmp(p, "sb128pci"))) - p = "es1371"; if (p != NULL) sound_card_current[3] = sound_card_get_from_internal_name(p); else From f247fa84acbc1512dc13384975fae88b27467cff Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 13 Jul 2024 19:17:48 -0300 Subject: [PATCH 062/624] gdbstub: Don't reload CS on jump --- src/gdbstub.c | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/gdbstub.c b/src/gdbstub.c index 703637422..8322c5ef6 100644 --- a/src/gdbstub.c +++ b/src/gdbstub.c @@ -365,13 +365,7 @@ gdbstub_break(void) static void gdbstub_jump(uint32_t new_pc) { - /* Nasty hack; qemu always uses the full 32-bit EIP internally... */ - if (cpu_state.op32 || ((new_pc >= cs) && (new_pc < (cs + 65536)))) { - cpu_state.pc = new_pc - cs; - } else { - loadseg((new_pc >> 4) & 0xf000, &cpu_state.seg_cs); - cpu_state.pc = new_pc & 0xffff; - } + cpu_state.pc = new_pc - cs; flushmmucache(); } From 1c034a15ed2b4ee60fa350802619c5ed86d77438 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Jul 2024 01:33:06 +0200 Subject: [PATCH 063/624] PCjr: Fix overscan. --- src/machine/m_pcjr.c | 298 ++++++++++++++++++++++++++++++++----------- 1 file changed, 226 insertions(+), 72 deletions(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 9d2aa6879..6638402f7 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -161,6 +161,19 @@ recalc_timings(pcjr_t *pcjr) pcjr->dispofftime = (uint64_t) (_dispofftime); } +static int +vid_get_h_overscan_size(pcjr_t *pcjr) +{ + int ret; + + if (pcjr->array[0] & 1) + ret = 128; + else + ret = 256; + + return ret; +} + static void vid_out(uint16_t addr, uint8_t val, void *priv) { @@ -181,6 +194,8 @@ vid_out(uint16_t addr, uint8_t val, void *priv) case 0x3d7: old = pcjr->crtc[pcjr->crtcreg]; pcjr->crtc[pcjr->crtcreg] = val & crtcmask[pcjr->crtcreg]; + if (pcjr->crtcreg == 2) + overscan_x = vid_get_h_overscan_size(pcjr); if (old != val) { if (pcjr->crtcreg < 0xe || pcjr->crtcreg > 0x10) { pcjr->fullchange = changeframecount; @@ -273,6 +288,93 @@ vid_read(uint32_t addr, void *priv) return (pcjr->b8000[addr & 0x3fff]); } +static int +vid_get_h_overscan_delta(pcjr_t *pcjr) +{ + int def; + int coef; + int ret; + + switch ((pcjr->array[0] & 0x13) | ((pcjr->array[3] & 0x08) << 5)) { + case 0x13: /*320x200x16*/ + def = 0x56; + coef = 8; + break; + case 0x12: /*160x200x16*/ + def = 0x2b; + coef = 16; + break; + case 0x03: /*640x200x4*/ + def = 0x56; + coef = 8; + break; + case 0x01: /*80 column text*/ + def = 0x5a; + coef = 8; + break; + case 0x00: /*40 column text*/ + default: + def = 0x2c; + coef = 16; + break; + case 0x02: /*320x200x4*/ + def = 0x2b; + coef = 16; + break; + case 0x102: /*640x200x2*/ + def = 0x2b; + coef = 16; + break; + } + + ret = pcjr->crtc[0x02] - def; + + if (ret < -8) + ret = -8; + + if (ret > 8) + ret = 8; + + return ret * coef; +} + +static void +vid_blit_h_overscan(pcjr_t *pcjr) +{ + int cols; + int i; + int x; + int y = (pcjr->lastline << 1) + 16; + int ho_s = vid_get_h_overscan_size(pcjr); + + if (pcjr->dispon) + cols = (pcjr->array[2] & 0xf) + 16; + else { + if (pcjr->array[3] & 4) + cols = (pcjr->array[2] & 0xf) + 16; + else + cols = pcjr->array[0 + 16] + 16; + } + + if (pcjr->array[0] & 1) + x = (pcjr->crtc[1] << 3) + ho_s; + else + x = (pcjr->crtc[1] << 4) + ho_s; + + for (i = 0; i < 16; i++) { + hline(buffer32, 0, i, x, cols); + hline(buffer32, 0, y + i, x, cols); + + if (pcjr->composite) { + Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[i]); + Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[y + i]); + } else { + video_process_8(x, i); + video_process_8(x, y + i); + } + } +} + static void vid_poll(void *priv) { @@ -288,6 +390,9 @@ vid_poll(void *priv) uint16_t dat; int cols[4]; int oldsc; + int l = (pcjr->displine << 1) + 16; + int ho_s = vid_get_h_overscan_size(pcjr); + int ho_d = vid_get_h_overscan_delta(pcjr) + (ho_s / 2); if (!pcjr->linepos) { timer_advance_u64(&pcjr->timer, pcjr->dispofftime); @@ -306,13 +411,13 @@ vid_poll(void *priv) } pcjr->lastline = pcjr->displine; cols[0] = (pcjr->array[2] & 0xf) + 16; - for (uint8_t c = 0; c < 8; c++) { - (buffer32->line[pcjr->displine])[c] = cols[0]; - if (pcjr->array[0] & 1) { - buffer32->line[pcjr->displine << 1][c + (pcjr->crtc[1] << 3) + 8] = buffer32->line[(pcjr->displine << 1) + 1][c + (pcjr->crtc[1] << 3) + 8] = cols[0]; - } else { - buffer32->line[pcjr->displine << 1][c + (pcjr->crtc[1] << 4) + 8] = buffer32->line[(pcjr->displine << 1) + 1][c + (pcjr->crtc[1] << 4) + 8] = cols[0]; - } + + if (pcjr->array[0] & 1) { + hline(buffer32, 0, l, (pcjr->crtc[1] << 3) + ho_s, cols[0]); + hline(buffer32, 0, l + 1, (pcjr->crtc[1] << 3) + ho_s, cols[0]); + } else { + hline(buffer32, 0, l, (pcjr->crtc[1] << 4) + ho_s, cols[0]); + hline(buffer32, 0, l + 1, (pcjr->crtc[1] << 4) + ho_s, cols[0]); } switch (pcjr->addr_mode) { @@ -326,45 +431,76 @@ vid_poll(void *priv) case 3: /*High resolution graphics*/ offset = (pcjr->sc & 3) * 0x2000; break; - default: break; } switch ((pcjr->array[0] & 0x13) | ((pcjr->array[3] & 0x08) << 5)) { case 0x13: /*320x200x16*/ for (x = 0; x < pcjr->crtc[1]; x++) { - dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; + int ef_x = (x << 3) + ho_d; + dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | + pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; pcjr->ma++; - buffer32->line[pcjr->displine << 1][(x << 3) + 8] = buffer32->line[pcjr->displine << 1][(x << 3) + 9] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 9] = pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16; - buffer32->line[pcjr->displine << 1][(x << 3) + 10] = buffer32->line[pcjr->displine << 1][(x << 3) + 11] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 10] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 11] = pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16; - buffer32->line[pcjr->displine << 1][(x << 3) + 12] = buffer32->line[pcjr->displine << 1][(x << 3) + 13] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 12] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 13] = pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16; - buffer32->line[pcjr->displine << 1][(x << 3) + 14] = buffer32->line[pcjr->displine << 1][(x << 3) + 15] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 14] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 15] = pcjr->array[(dat & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x] = buffer32->line[l][ef_x + 1] = + buffer32->line[l + 1][ef_x] = buffer32->line[l + 1][ef_x + 1] = + pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x + 2] = buffer32->line[l][ef_x + 3] = + buffer32->line[l + 1][ef_x + 2] = buffer32->line[l + 1][ef_x + 3] = + pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x + 4] = buffer32->line[l][ef_x + 5] = + buffer32->line[l + 1][ef_x + 4] = buffer32->line[l + 1][ef_x + 5] = + pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x + 6] = buffer32->line[l][ef_x + 7] = + buffer32->line[l + 1][ef_x + 6] = buffer32->line[l + 1][ef_x + 7] = + pcjr->array[(dat & pcjr->array[1]) + 16] + 16; } break; case 0x12: /*160x200x16*/ for (x = 0; x < pcjr->crtc[1]; x++) { - dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; + int ef_x = (x << 4) + ho_d; + dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | + pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; pcjr->ma++; - buffer32->line[pcjr->displine << 1][(x << 4) + 8] = buffer32->line[pcjr->displine << 1][(x << 4) + 9] = buffer32->line[pcjr->displine << 1][(x << 4) + 10] = buffer32->line[pcjr->displine << 1][(x << 4) + 11] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 9] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 10] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 11] = pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16; - buffer32->line[pcjr->displine << 1][(x << 4) + 12] = buffer32->line[pcjr->displine << 1][(x << 4) + 13] = buffer32->line[pcjr->displine << 1][(x << 4) + 14] = buffer32->line[pcjr->displine << 1][(x << 4) + 15] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 12] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 13] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 14] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 15] = pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16; - buffer32->line[pcjr->displine << 1][(x << 4) + 16] = buffer32->line[pcjr->displine << 1][(x << 4) + 17] = buffer32->line[pcjr->displine << 1][(x << 4) + 18] = buffer32->line[pcjr->displine << 1][(x << 4) + 19] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 16] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 17] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 18] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 19] = pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16; - buffer32->line[pcjr->displine << 1][(x << 4) + 20] = buffer32->line[pcjr->displine << 1][(x << 4) + 21] = buffer32->line[pcjr->displine << 1][(x << 4) + 22] = buffer32->line[pcjr->displine << 1][(x << 4) + 23] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 20] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 21] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 22] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + 23] = pcjr->array[(dat & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x] = buffer32->line[l][ef_x + 1] = + buffer32->line[l][ef_x + 2] = buffer32->line[l][ef_x + 3] = + buffer32->line[l + 1][ef_x] = buffer32->line[l + 1][ef_x + 1] = + buffer32->line[l + 1][ef_x + 2] = buffer32->line[l + 1][ef_x + 3] = + pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x + 4] = buffer32->line[l][ef_x + 5] = + buffer32->line[l][ef_x + 6] = buffer32->line[l][ef_x + 7] = + buffer32->line[l + 1][(x << 4) + 12] = buffer32->line[l + 1][(x << 4) + 13] = + buffer32->line[l + 1][(x << 4) + 14] = buffer32->line[l + 1][(x << 4) + 15] = + pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x + 8] = buffer32->line[l][ef_x + 9] = + buffer32->line[l][ef_x + 10] = buffer32->line[l][ef_x + 11] = + buffer32->line[l + 1][ef_x + 8] = buffer32->line[l + 1][ef_x + 9] = + buffer32->line[l + 1][ef_x + 10] = buffer32->line[l + 1][ef_x + 11] = + pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x + 12] = buffer32->line[l][ef_x + 13] = + buffer32->line[l][ef_x + 14] = buffer32->line[l][ef_x + 15] = + buffer32->line[l + 1][ef_x + 12] = buffer32->line[l + 1][ef_x + 13] = + buffer32->line[l + 1][ef_x + 14] = buffer32->line[l + 1][ef_x + 15] = + pcjr->array[(dat & pcjr->array[1]) + 16] + 16; } break; case 0x03: /*640x200x4*/ for (x = 0; x < pcjr->crtc[1]; x++) { - dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1] << 8) | pcjr->vram[((pcjr->ma << 1) & mask) + offset]; + int ef_x = (x << 3) + ho_d; + dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1] << 8) | + pcjr->vram[((pcjr->ma << 1) & mask) + offset]; pcjr->ma++; for (uint8_t c = 0; c < 8; c++) { chr = (dat >> 7) & 1; chr |= ((dat >> 14) & 2); - buffer32->line[pcjr->displine << 1][(x << 3) + 8 + c] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + 8 + c] = pcjr->array[(chr & pcjr->array[1]) + 16] + 16; + buffer32->line[l][ef_x + c] = buffer32->line[l + 1][ef_x + c] = + pcjr->array[(chr & pcjr->array[1]) + 16] + 16; dat <<= 1; } } break; case 0x01: /*80 column text*/ for (x = 0; x < pcjr->crtc[1]; x++) { + int ef_x = (x << 3) + ho_d; chr = pcjr->vram[((pcjr->ma << 1) & mask) + offset]; attr = pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron); @@ -377,26 +513,26 @@ vid_poll(void *priv) cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16; cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16] + 16; } - if (pcjr->sc & 8) { + if (pcjr->sc & 8) + for (uint8_t c = 0; c < 8; c++) + buffer32->line[l][ef_x + c] = + buffer32->line[l + 1][ef_x + c] = cols[0]; + else + for (uint8_t c = 0; c < 8; c++) + buffer32->line[l][ef_x + c] = + buffer32->line[l + 1][ef_x + c] = + cols[(fontdat[chr][pcjr->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; + if (drawcursor) for (uint8_t c = 0; c < 8; c++) { - buffer32->line[pcjr->displine << 1][(x << 3) + c + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + c + 8] = cols[0]; + buffer32->line[l][ef_x + c] ^= 15; + buffer32->line[l + 1][ef_x + c] ^= 15; } - } else { - for (uint8_t c = 0; c < 8; c++) { - buffer32->line[pcjr->displine << 1][(x << 3) + c + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + c + 8] = cols[(fontdat[chr][pcjr->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; - } - } - if (drawcursor) { - for (uint8_t c = 0; c < 8; c++) { - buffer32->line[pcjr->displine << 1][(x << 3) + c + 8] ^= 15; - buffer32->line[(pcjr->displine << 1) + 1][(x << 3) + c + 8] ^= 15; - } - } pcjr->ma++; } break; case 0x00: /*40 column text*/ for (x = 0; x < pcjr->crtc[1]; x++) { + int ef_x = (x << 4) + ho_d; chr = pcjr->vram[((pcjr->ma << 1) & mask) + offset]; attr = pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron); @@ -410,21 +546,24 @@ vid_poll(void *priv) cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16] + 16; } pcjr->ma++; - if (pcjr->sc & 8) { - for (uint8_t c = 0; c < 8; c++) { - buffer32->line[pcjr->displine << 1][(x << 4) + (c << 1) + 8] = buffer32->line[pcjr->displine << 1][(x << 4) + (c << 1) + 1 + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + (c << 1) + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + (c << 1) + 1 + 8] = cols[0]; - } - } else { - for (uint8_t c = 0; c < 8; c++) { - buffer32->line[pcjr->displine << 1][(x << 4) + (c << 1) + 8] = buffer32->line[pcjr->displine << 1][(x << 4) + (c << 1) + 1 + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + (c << 1) + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + (c << 1) + 1 + 8] = cols[(fontdat[chr][pcjr->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; - } - } - if (drawcursor) { + if (pcjr->sc & 8) + for (uint8_t c = 0; c < 8; c++) + buffer32->line[l][ef_x + (c << 1)] = + buffer32->line[l][ef_x + (c << 1) + 1] = + buffer32->line[l + 1][ef_x + (c << 1)] = + buffer32->line[l + 1][ef_x + (c << 1) + 1] = cols[0]; + else + for (uint8_t c = 0; c < 8; c++) + buffer32->line[l][ef_x + (c << 1)] = + buffer32->line[l][ef_x + (c << 1) + 1] = + buffer32->line[l + 1][ef_x + (c << 1)] = + buffer32->line[l + 1][ef_x + (c << 1) + 1] = + cols[(fontdat[chr][pcjr->sc & 7] & (1 << (c ^ 7))) ? 1 : 0]; + if (drawcursor) for (uint8_t c = 0; c < 16; c++) { - buffer32->line[pcjr->displine << 1][(x << 4) + c + 8] ^= 15; - buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + c + 8] ^= 15; + buffer32->line[l][ef_x + c] ^= 15; + buffer32->line[l + 1][ef_x + c] ^= 15; } - } } break; case 0x02: /*320x200x4*/ @@ -433,10 +572,15 @@ vid_poll(void *priv) cols[2] = pcjr->array[2 + 16] + 16; cols[3] = pcjr->array[3 + 16] + 16; for (x = 0; x < pcjr->crtc[1]; x++) { - dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; + int ef_x = (x << 4) + ho_d; + dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | + pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; pcjr->ma++; for (uint8_t c = 0; c < 8; c++) { - buffer32->line[pcjr->displine << 1][(x << 4) + (c << 1) + 8] = buffer32->line[pcjr->displine << 1][(x << 4) + (c << 1) + 1 + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + (c << 1) + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + (c << 1) + 1 + 8] = cols[dat >> 14]; + buffer32->line[l][ef_x + (c << 1)] = + buffer32->line[l][ef_x + (c << 1) + 1] = + buffer32->line[l + 1][ef_x + (c << 1)] = + buffer32->line[l + 1][ef_x + (c << 1) + 1] = cols[dat >> 14]; dat <<= 2; } } @@ -445,10 +589,13 @@ vid_poll(void *priv) cols[0] = pcjr->array[0 + 16] + 16; cols[1] = pcjr->array[1 + 16] + 16; for (x = 0; x < pcjr->crtc[1]; x++) { - dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; + int ef_x = (x << 4) + ho_d; + dat = (pcjr->vram[((pcjr->ma << 1) & mask) + offset] << 8) | + pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; pcjr->ma++; for (uint8_t c = 0; c < 16; c++) { - buffer32->line[pcjr->displine << 1][(x << 4) + c + 8] = buffer32->line[(pcjr->displine << 1) + 1][(x << 4) + c + 8] = cols[dat >> 15]; + buffer32->line[l][ef_x + c] = buffer32->line[l + 1][ef_x + c] = + cols[dat >> 15]; dat <<= 1; } } @@ -460,33 +607,33 @@ vid_poll(void *priv) } else { if (pcjr->array[3] & 4) { if (pcjr->array[0] & 1) { - hline(buffer32, 0, (pcjr->displine << 1), (pcjr->crtc[1] << 3) + 16, (pcjr->array[2] & 0xf) + 16); - hline(buffer32, 0, (pcjr->displine << 1) + 1, (pcjr->crtc[1] << 3) + 16, (pcjr->array[2] & 0xf) + 16); + hline(buffer32, 0, l, (pcjr->crtc[1] << 3) + ho_s, (pcjr->array[2] & 0xf) + 16); + hline(buffer32, 0, l + 1, (pcjr->crtc[1] << 3) + ho_s, (pcjr->array[2] & 0xf) + 16); } else { - hline(buffer32, 0, (pcjr->displine << 1), (pcjr->crtc[1] << 4) + 16, (pcjr->array[2] & 0xf) + 16); - hline(buffer32, 0, (pcjr->displine << 1) + 1, (pcjr->crtc[1] << 4) + 16, (pcjr->array[2] & 0xf) + 16); + hline(buffer32, 0, l, (pcjr->crtc[1] << 4) + ho_s, (pcjr->array[2] & 0xf) + 16); + hline(buffer32, 0, l + 1, (pcjr->crtc[1] << 4) + ho_s, (pcjr->array[2] & 0xf) + 16); } } else { cols[0] = pcjr->array[0 + 16] + 16; if (pcjr->array[0] & 1) { - hline(buffer32, 0, (pcjr->displine << 1), (pcjr->crtc[1] << 3) + 16, cols[0]); - hline(buffer32, 0, (pcjr->displine << 1) + 1, (pcjr->crtc[1] << 3) + 16, cols[0]); + hline(buffer32, 0, l, (pcjr->crtc[1] << 3) + ho_s, cols[0]); + hline(buffer32, 0, l + 1, (pcjr->crtc[1] << 3) + ho_s, cols[0]); } else { - hline(buffer32, 0, (pcjr->displine << 1), (pcjr->crtc[1] << 4) + 16, cols[0]); - hline(buffer32, 0, (pcjr->displine << 1) + 1, (pcjr->crtc[1] << 4) + 16, cols[0]); + hline(buffer32, 0, l, (pcjr->crtc[1] << 4) + ho_s, cols[0]); + hline(buffer32, 0, l + 1, (pcjr->crtc[1] << 4) + ho_s, cols[0]); } } } if (pcjr->array[0] & 1) - x = (pcjr->crtc[1] << 3) + 16; + x = (pcjr->crtc[1] << 3) + ho_s; else - x = (pcjr->crtc[1] << 4) + 16; + x = (pcjr->crtc[1] << 4) + ho_s; if (pcjr->composite) { - Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[pcjr->displine << 1]); - Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[(pcjr->displine << 1) + 1]); + Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[l]); + Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[l + 1]); } else { - video_process_8(x, pcjr->displine << 1); - video_process_8(x, (pcjr->displine << 1) + 1); + video_process_8(x, l); + video_process_8(x, l + 1); } pcjr->sc = oldsc; if (pcjr->vc == pcjr->crtc[7] && !pcjr->sc) { @@ -547,37 +694,42 @@ vid_poll(void *priv) picint(1 << 5); if (pcjr->crtc[7]) { if (pcjr->array[0] & 1) - x = (pcjr->crtc[1] << 3) + 16; + x = (pcjr->crtc[1] << 3) + ho_s; else - x = (pcjr->crtc[1] << 4) + 16; + x = (pcjr->crtc[1] << 4) + ho_s; pcjr->lastline++; xs_temp = x; ys_temp = (pcjr->lastline - pcjr->firstline) << 1; if ((xs_temp > 0) && (ys_temp > 0)) { + int actual_ys = ys_temp; + if (xs_temp < 64) xs_temp = 656; if (ys_temp < 32) ys_temp = 400; if (!enable_overscan) - xs_temp -= 16; + xs_temp -= ho_s; if ((xs_temp != xsize) || (ys_temp != ysize) || video_force_resize_get()) { xsize = xs_temp; ysize = ys_temp; - set_screen_size(xsize, ysize + (enable_overscan ? 16 : 0)); + + set_screen_size(xsize, ysize + (enable_overscan ? 32 : 0)); if (video_force_resize_get()) video_force_resize_set(0); } + vid_blit_h_overscan(pcjr); + if (enable_overscan) { - video_blit_memtoscreen(0, (pcjr->firstline - 4) << 1, - xsize, ((pcjr->lastline - pcjr->firstline) + 8) << 1); + video_blit_memtoscreen(0, pcjr->firstline << 1, + xsize, actual_ys + 32); } else { - video_blit_memtoscreen(8, pcjr->firstline << 1, - xsize, (pcjr->lastline - pcjr->firstline) << 1); + video_blit_memtoscreen(ho_s / 2, (pcjr->firstline << 1) + 16, + xsize, actual_ys); } } @@ -838,6 +990,8 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr->memctrl &= ~0x24; display_type = machine_get_config_int("display_type"); pcjr->composite = (display_type != PCJR_RGB); + overscan_x = 256; + overscan_y = 32; pic_init_pcjr(); pit_common_init(0, pit_irq0_timer_pcjr, NULL); From 234d06c6200163b90e6ba30c4cdf2efbd1dee3e4 Mon Sep 17 00:00:00 2001 From: Oleg Farenyuk Date: Sun, 14 Jul 2024 05:52:15 +0300 Subject: [PATCH 064/624] Initial support for the 8-bit NE2000 compatible boards. --- src/include/86box/net_ne2000.h | 20 +++--- src/include/86box/network.h | 1 + src/network/net_ne2000.c | 108 ++++++++++++++++++++++++++++++++- src/network/network.c | 1 + 4 files changed, 120 insertions(+), 10 deletions(-) diff --git a/src/include/86box/net_ne2000.h b/src/include/86box/net_ne2000.h index 75185cf90..cb17ef8b1 100644 --- a/src/include/86box/net_ne2000.h +++ b/src/include/86box/net_ne2000.h @@ -37,15 +37,17 @@ #define NET_NE2000_H enum { - NE2K_NONE = 0, - NE2K_NE1000 = 1, /* 8-bit ISA NE1000 */ - NE2K_NE1000_COMPAT = 2, /* 8-bit ISA NE1000-Compatible */ - NE2K_NE2000 = 3, /* 16-bit ISA NE2000 */ - NE2K_NE2000_COMPAT = 4, /* 16-bit ISA NE2000-Compatible */ - NE2K_ETHERNEXT_MC = 5, /* 16-bit MCA EtherNext/MC */ - NE2K_RTL8019AS = 6, /* 16-bit ISA PnP Realtek 8019AS */ - NE2K_DE220P = 7, /* 16-bit ISA PnP D-Link DE-220P */ - NE2K_RTL8029AS = 8 /* 32-bit PCI Realtek 8029AS */ + NE2K_NONE = 0, + NE2K_NE1000 = 1, /* 8-bit ISA NE1000 */ + NE2K_NE1000_COMPAT = 2, /* 8-bit ISA NE1000-Compatible */ + NE2K_NE2000 = 3, /* 16-bit ISA NE2000 */ + NE2K_NE2000_COMPAT = 4, /* 16-bit ISA NE2000-Compatible */ + NE2K_NE2000_COMPAT_8BIT = 5, /* 8-bit ISA NE2000-Compatible, like: https://github.com/skiselev/isa8_eth */ + NE2K_ETHERNEXT_MC = 6, /* 16-bit MCA EtherNext/MC */ + NE2K_RTL8019AS = 7, /* 16-bit ISA PnP Realtek 8019AS */ + NE2K_DE220P = 8, /* 16-bit ISA PnP D-Link DE-220P */ + NE2K_RTL8029AS = 9, /* 32-bit PCI Realtek 8029AS */ + /* Check nic_init() if adding items after this point. */ }; #endif /*NET_NE2000_H*/ diff --git a/src/include/86box/network.h b/src/include/86box/network.h index 9588de86a..fa6408790 100644 --- a/src/include/86box/network.h +++ b/src/include/86box/network.h @@ -211,6 +211,7 @@ extern const device_t ne1000_device; extern const device_t ne1000_compat_device; extern const device_t ne2000_device; extern const device_t ne2000_compat_device; +extern const device_t ne2000_compat_8bit_device; extern const device_t ethernext_mc_device; extern const device_t rtl8019as_device; extern const device_t de220p_device; diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index ee32119ba..0f3480492 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -934,7 +934,8 @@ nic_init(const device_t *info) if (dev->board != NE2K_ETHERNEXT_MC) { dev->base_address = device_get_config_hex16("base"); dev->base_irq = device_get_config_int("irq"); - if ((dev->board == NE2K_NE2000) || (dev->board == NE2K_NE2000_COMPAT)) { + if ((dev->board == NE2K_NE2000) || (dev->board == NE2K_NE2000_COMPAT) || + (dev->board == NE2K_NE2000_COMPAT_8BIT) ) { dev->bios_addr = device_get_config_hex20("bios_addr"); dev->has_bios = !!dev->bios_addr; } else { @@ -1008,6 +1009,16 @@ nic_init(const device_t *info) dp8390_mem_alloc(dev->dp8390, 0x4000, 0x4000); break; + case NE2K_NE2000_COMPAT_8BIT: + dev->maclocal[0] = 0x00; /* 00:86:B0 (86Box OID) */ + dev->maclocal[1] = 0x86; + dev->maclocal[2] = 0xB0; + dev->is_8bit = 1; + rom = ROM_PATH_NE2000; + dp8390_set_defaults(dev->dp8390, DP8390_FLAG_EVEN_MAC | DP8390_FLAG_CHECK_CR | DP8390_FLAG_CLEAR_IRQ); + dp8390_mem_alloc(dev->dp8390, 0x4000, 0x4000); + break; + case NE2K_ETHERNEXT_MC: dev->maclocal[0] = 0x00; /* 00:00:D8 (Networth Inc. OID) */ dev->maclocal[1] = 0x00; @@ -1448,6 +1459,87 @@ static const device_config_t ne2000_compat_config[] = { { .name = "", .description = "", .type = CONFIG_END } }; +static const device_config_t ne2000_compat_8bit_config[] = { + { + .name = "base", + .description = "Address", + .type = CONFIG_HEX16, + .default_string = "", + .default_int = 0x320, + .file_filter = "", + .spinner = { 0 }, + .selection = { + /* Source: board docs, https://github.com/skiselev/isa8_eth */ + { .description = "0x200", .value = 0x200 }, + { .description = "0x220", .value = 0x220 }, + { .description = "0x240", .value = 0x240 }, + { .description = "0x260", .value = 0x260 }, + { .description = "0x280", .value = 0x280 }, + { .description = "0x2a0", .value = 0x2a0 }, + { .description = "0x2c0", .value = 0x2c0 }, + { .description = "0x2e0", .value = 0x2e0 }, + { .description = "0x300", .value = 0x300 }, + { .description = "0x320", .value = 0x320 }, + { .description = "0x340", .value = 0x340 }, + { .description = "0x360", .value = 0x360 }, + { .description = "0x380", .value = 0x380 }, + { .description = "0x3a0", .value = 0x3a0 }, + { .description = "0x3c0", .value = 0x3c0 }, + { .description = "0x3e0", .value = 0x3e0 }, + { .description = "" } + }, + }, + { + .name = "irq", + .description = "IRQ", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 3, + .file_filter = "", + .spinner = { 0 }, + .selection = { + /* Source: board docs, https://github.com/skiselev/isa8_eth */ + { .description = "IRQ 2", .value = 2 }, + { .description = "IRQ 3", .value = 3 }, + { .description = "IRQ 4", .value = 4 }, + { .description = "IRQ 5", .value = 5 }, + { .description = "IRQ 9", .value = 9 }, + { .description = "" } + }, + }, + { + .name = "mac", + .description = "MAC Address", + .type = CONFIG_MAC, + .default_string = "", + .default_int = -1 + }, + { + .name = "bios_addr", + .description = "BIOS address", + .type = CONFIG_HEX20, + .default_string = "", + .default_int = 0, + .file_filter = "", + .spinner = { 0 }, + .selection = { + /* Source: board docs, https://github.com/skiselev/isa8_eth */ + { .description = "Disabled", .value = 0x00000 }, + { .description = "C000", .value = 0xC0000 }, + { .description = "C400", .value = 0xC4000 }, + { .description = "C800", .value = 0xC8000 }, + { .description = "CC00", .value = 0xCC000 }, + { .description = "D000", .value = 0xD0000 }, + { .description = "D400", .value = 0xD4000 }, + { .description = "D800", .value = 0xD8000 }, + { .description = "DC00", .value = 0xDC000 }, + { .description = "" } + }, + }, + { .name = "", .description = "", .type = CONFIG_END } +}; + + static const device_config_t rtl8019as_config[] = { { .name = "mac", @@ -1545,6 +1637,20 @@ const device_t ne2000_compat_device = { .config = ne2000_compat_config }; +const device_t ne2000_compat_8bit_device = { + .name = "NE2000 Compatible 8-bit", + .internal_name = "ne2k8", + .flags = DEVICE_ISA, + .local = NE2K_NE2000_COMPAT_8BIT, + .init = nic_init, + .close = nic_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = ne2000_compat_8bit_config +}; + const device_t ethernext_mc_device = { .name = "NetWorth EtherNext/MC", .internal_name = "ethernextmc", diff --git a/src/network/network.c b/src/network/network.c index d0ebe8ef3..10f81b938 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -115,6 +115,7 @@ static const device_t *net_cards[] = { &de220p_device, &ne1000_compat_device, &ne2000_compat_device, + &ne2000_compat_8bit_device, &ne1000_device, &ne2000_device, &pcnet_am79c960_eb_device, From fcc6b783164c012e4920934d13fe97b4be9c8bdb Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 14 Jul 2024 20:19:51 +0200 Subject: [PATCH 065/624] PVGA 256 col+ fixes (July 14th, 2024) Sometimes 256 color+ would still glitch because the generic way of enabling 8bpp mode is triggered instead. This fixes some stuff that relies on it. --- src/video/vid_paradise.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index f572521f2..34e433760 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -364,7 +364,7 @@ paradise_write(uint32_t addr, uint8_t val, void *priv) addr = (addr & 0x7fff) + paradise->write_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if (svga->gdcreg[0x0e] & 0x01) { + if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; @@ -401,7 +401,7 @@ paradise_writew(uint32_t addr, uint16_t val, void *priv) addr = (addr & 0x7fff) + paradise->write_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if (svga->gdcreg[0x0e] & 0x01) { + if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; @@ -437,7 +437,7 @@ paradise_read(uint32_t addr, void *priv) addr = (addr & 0x7fff) + paradise->read_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if (svga->gdcreg[0x0e] & 0x01) { + if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; @@ -472,7 +472,7 @@ paradise_readw(uint32_t addr, void *priv) addr = (addr & 0x7fff) + paradise->read_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if (svga->gdcreg[0x0e] & 0x01) { + if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; From 0a2fa21f06ccdb8e67cf1358cdd6cb272208007c Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 14 Jul 2024 20:42:50 +0200 Subject: [PATCH 066/624] SCSI and disk fixes (July 14th, 2024) All: the icon refresh for the respective storage now works properly across all adapters that use it (especially the aha154x compatibles and spock/tribble). SCSI CD-ROM: The Sony/Texel/DEC SCSI command 0xC0 (Set Address Format) isn't a command that checks for ready status, however, it is for other vendors like NEC, Matsushita, etc. and I am not wishing to create a duplicate command_flags array duplicate just for vendor unique commands. This fixes the MSF bit of Sony/Texel/DEC CD-ROM drives which don't use the Mode Page equivalent. Toshiba only: attempt to mark the 3201B as a SCSI-1 only CD-ROM drive properly. --- src/disk/mo.c | 1 - src/disk/zip.c | 1 - src/qt/qt_machinestatus.cpp | 11 +++++++++++ src/scsi/scsi_cdrom.c | 32 +++++++++++++++++++++++++++----- src/scsi/scsi_disk.c | 5 ++--- 5 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/disk/mo.c b/src/disk/mo.c index e90267b95..44f68effa 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -701,7 +701,6 @@ mo_command_common(mo_t *dev) static void mo_command_complete(mo_t *dev) { - ui_sb_update_icon(SB_MO | dev->id, 0); dev->packet_status = PHASE_COMPLETE; mo_command_common(dev); } diff --git a/src/disk/zip.c b/src/disk/zip.c index d4cbd0b41..764dc1f53 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -875,7 +875,6 @@ zip_command_common(zip_t *dev) static void zip_command_complete(zip_t *dev) { - ui_sb_update_icon(SB_ZIP | dev->id, 0); dev->packet_status = PHASE_COMPLETE; zip_command_common(dev); } diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index a074f556e..d6f84ea71 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -393,14 +393,23 @@ MachineStatus::refreshIcons() } for (size_t i = 0; i < CDROM_NUM; ++i) { d->cdrom[i].setActive(machine_status.cdrom[i].active); + if (machine_status.cdrom[i].active) + ui_sb_update_icon(SB_CDROM | i, 0); + d->cdrom[i].setEmpty(machine_status.cdrom[i].empty); } for (size_t i = 0; i < ZIP_NUM; i++) { d->zip[i].setActive(machine_status.zip[i].active); + if (machine_status.zip[i].active) + ui_sb_update_icon(SB_ZIP | i, 0); + d->zip[i].setEmpty(machine_status.zip[i].empty); } for (size_t i = 0; i < MO_NUM; i++) { d->mo[i].setActive(machine_status.mo[i].active); + if (machine_status.mo[i].active) + ui_sb_update_icon(SB_MO | i, 0); + d->mo[i].setEmpty(machine_status.mo[i].empty); } @@ -408,6 +417,8 @@ MachineStatus::refreshIcons() for (size_t i = 0; i < HDD_BUS_USB; i++) { d->hdds[i].setActive(machine_status.hdd[i].active); + if (machine_status.hdd[i].active) + ui_sb_update_icon(SB_HDD | i, 0); } for (size_t i = 0; i < NET_CARD_MAX; i++) { diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index f6e4b9cf6..a049c69d0 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1080,7 +1080,6 @@ scsi_cdrom_command_common(scsi_cdrom_t *dev) static void scsi_cdrom_command_complete(scsi_cdrom_t *dev) { - ui_sb_update_icon(SB_CDROM | dev->id, 0); dev->packet_status = PHASE_COMPLETE; scsi_cdrom_command_common(dev); dev->tf->phase = 3; @@ -1637,9 +1636,29 @@ skip_ready_check: dev->media_status = (dev->unit_attention) ? MEC_NEW_MEDIA : MEC_NO_CHANGE; if ((scsi_cdrom_command_flags[cdb[0]] & CHECK_READY) && !ready) { - scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); - scsi_cdrom_not_ready(dev); - return 0; + if (scsi_cdrom_command_flags[cdb[0]] & SCSI_ONLY) { /*Note by TC1995: Some vendor commands from X vendor don't really check for ready status + but they do on Y vendor. Quite confusing I know.*/ + switch (dev->drv->type) { + case CDROM_TYPE_DEC_RRD45_0436: + case CDROM_TYPE_SONY_CDU541_10i: + case CDROM_TYPE_SONY_CDU561_18k: + case CDROM_TYPE_SONY_CDU76S_100: + case CDROM_TYPE_TEXEL_DMXX24_100: + if (cdb[0] == 0xC0) + break; + scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); + scsi_cdrom_not_ready(dev); + return 0; + default: + scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); + scsi_cdrom_not_ready(dev); + return 0; + } + } else { + scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); + scsi_cdrom_not_ready(dev); + return 0; + } } scsi_cdrom_log("CD-ROM %i: Continuing with command %02X\n", dev->id, cdb[0]); @@ -3223,7 +3242,6 @@ begin: case CDROM_TYPE_TEAC_CD50_100: case CDROM_TYPE_TEAC_R55S_10R: case CDROM_TYPE_TEXEL_DMXX24_100: - case CDROM_TYPE_TOSHIBA_XM3201B_3232: dev->buffer[2] = 0x00; dev->buffer[3] = 0x01; /*SCSI-1 compliant*/ break; @@ -3235,6 +3253,10 @@ begin: case CDROM_TYPE_NEC_464_105: dev->buffer[3] = 0x00; /*SCSI unknown version per NEC manuals*/ break; + case CDROM_TYPE_TOSHIBA_XM3201B_3232: + dev->buffer[2] = 0x01; + dev->buffer[3] = 0x01; /*SCSI-1 compliant*/ + break; default: dev->buffer[2] = 0x02; /*SCSI-2 compliant*/ break; diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c index f29e85431..792dad31b 100644 --- a/src/scsi/scsi_disk.c +++ b/src/scsi/scsi_disk.c @@ -461,7 +461,7 @@ scsi_disk_command_common(scsi_disk_t *dev) (uint64_t) period); dev->callback += period; break; - default: + default: dev->callback = 0; break; } @@ -511,7 +511,6 @@ scsi_disk_command_common(scsi_disk_t *dev) static void scsi_disk_command_complete(scsi_disk_t *dev) { - ui_sb_update_icon(SB_HDD | dev->drv->bus, 0); dev->packet_status = PHASE_COMPLETE; scsi_disk_command_common(dev); } @@ -1647,7 +1646,7 @@ scsi_disk_identify(ide_t *ide, int ide_has_dma) scsi_disk_log("ATAPI Identify: %s\n", device_identify); /* ATAPI device, direct-access device, non-removable media, accelerated DRQ */ - ide->buffer[0] = 0x8000 | (0 << 8) | 0x00 | (2 << 5); + ide->buffer[0] = 0x8000 | (0 << 8) | 0x00 | (2 << 5); ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */ ide_padstr((char *) (ide->buffer + 23), EMU_VERSION_EX, 8); /* Firmware */ From b4e049db7eab32fc7b62f5fa107448363c0184ca Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 14 Jul 2024 20:51:00 +0200 Subject: [PATCH 067/624] Compile fix on PVGA. See above. --- src/video/vid_paradise.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 34e433760..dbc4c2ba3 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -472,7 +472,7 @@ paradise_readw(uint32_t addr, void *priv) addr = (addr & 0x7fff) + paradise->read_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { { + if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; From 40aa577fb4ce4b73e6afab2c800436ddcf04f7dd Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 16 Aug 2023 16:54:12 -0400 Subject: [PATCH 068/624] Update residfp to newer build Co-Authored-By: Alexander Babikov <2708460+lemondrops@users.noreply.github.com> --- src/sound/CMakeLists.txt | 2 +- src/sound/resid-fp/AUTHORS | 6 +- src/sound/resid-fp/CMakeLists.txt | 9 +- src/sound/resid-fp/COPYING | 41 +- src/sound/resid-fp/ChangeLog | 136 - src/sound/resid-fp/Dac.cpp | 123 + src/sound/resid-fp/Dac.h | 111 + src/sound/resid-fp/EnvelopeGenerator.cpp | 155 + src/sound/resid-fp/EnvelopeGenerator.h | 419 ++ src/sound/resid-fp/ExternalFilter.cpp | 68 + src/sound/resid-fp/ExternalFilter.h | 125 + src/sound/resid-fp/Filter.cpp | 90 + src/sound/resid-fp/Filter.h | 177 + src/sound/resid-fp/Filter6581.cpp | 75 + src/sound/resid-fp/Filter6581.h | 425 ++ src/sound/resid-fp/Filter8580.cpp | 101 + src/sound/resid-fp/Filter8580.h | 383 ++ src/sound/resid-fp/FilterModelConfig.cpp | 82 + src/sound/resid-fp/FilterModelConfig.h | 165 + src/sound/resid-fp/FilterModelConfig6581.cpp | 328 + src/sound/resid-fp/FilterModelConfig6581.h | 112 + src/sound/resid-fp/FilterModelConfig8580.cpp | 282 + src/sound/resid-fp/FilterModelConfig8580.h | 68 + src/sound/resid-fp/INSTALL | 14 - src/sound/resid-fp/Integrator6581.cpp | 25 + src/sound/resid-fp/Integrator6581.h | 285 + src/sound/resid-fp/Integrator8580.cpp | 25 + src/sound/resid-fp/Integrator8580.h | 142 + src/sound/resid-fp/Makefile.am | 29 - src/sound/resid-fp/Makefile.in | 557 -- src/sound/resid-fp/NEWS | 1 - src/sound/resid-fp/OpAmp.cpp | 84 + src/sound/resid-fp/OpAmp.h | 121 + src/sound/resid-fp/Potentiometer.h | 50 + src/sound/resid-fp/README | 87 +- src/sound/resid-fp/README.VICE | 14 - src/sound/resid-fp/SID.cpp | 506 ++ src/sound/resid-fp/Spline.cpp | 119 + src/sound/resid-fp/Spline.h | 78 + src/sound/resid-fp/Voice.h | 130 + src/sound/resid-fp/WaveformCalculator.cpp | 195 + src/sound/resid-fp/WaveformCalculator.h | 136 + src/sound/resid-fp/WaveformGenerator.cpp | 397 ++ src/sound/resid-fp/WaveformGenerator.h | 440 ++ src/sound/resid-fp/aclocal.m4 | 850 --- src/sound/resid-fp/array.h | 86 + src/sound/resid-fp/configure | 5955 ----------------- src/sound/resid-fp/configure.in | 166 - src/sound/resid-fp/convolve-sse.cc | 76 - src/sound/resid-fp/convolve.cc | 27 - src/sound/resid-fp/envelope.cc | 254 - src/sound/resid-fp/envelope.h | 174 - src/sound/resid-fp/extfilt.cc | 94 - src/sound/resid-fp/extfilt.h | 120 - src/sound/resid-fp/filter.cc | 194 - src/sound/resid-fp/filter.h | 383 -- src/sound/resid-fp/pot.cc | 26 - src/sound/resid-fp/pot.h | 31 - src/sound/resid-fp/resample/Resampler.h | 86 + src/sound/resid-fp/resample/SincResampler.cpp | 397 ++ src/sound/resid-fp/resample/SincResampler.h | 114 + .../resid-fp/resample/TwoPassSincResampler.h | 83 + .../resid-fp/resample/ZeroOrderResampler.h | 88 + src/sound/resid-fp/resample/test.cpp | 91 + src/sound/resid-fp/samp2src.pl | 65 - src/sound/resid-fp/sid.cc | 946 --- src/sound/resid-fp/sid.h | 486 +- src/sound/resid-fp/sidcxx11.h | 58 + src/sound/resid-fp/siddefs-fp.h | 78 +- src/sound/resid-fp/siddefs-fp.h.in | 77 +- src/sound/resid-fp/version.cc | 2 +- src/sound/resid-fp/voice.cc | 102 - src/sound/resid-fp/voice.h | 73 - src/sound/resid-fp/wave.cc | 151 - src/sound/resid-fp/wave.h | 457 -- src/sound/resid-fp/wave6581_PST.cc | 536 -- src/sound/resid-fp/wave6581_PST.dat | Bin 4096 -> 0 bytes src/sound/resid-fp/wave6581_PS_.cc | 536 -- src/sound/resid-fp/wave6581_PS_.dat | Bin 4096 -> 0 bytes src/sound/resid-fp/wave6581_P_T.cc | 536 -- src/sound/resid-fp/wave6581_P_T.dat | Bin 4096 -> 0 bytes src/sound/resid-fp/wave6581__ST.cc | 536 -- src/sound/resid-fp/wave6581__ST.dat | Bin 4096 -> 0 bytes src/sound/resid-fp/wave8580_PST.cc | 536 -- src/sound/resid-fp/wave8580_PST.dat | Bin 4096 -> 0 bytes src/sound/resid-fp/wave8580_PS_.cc | 536 -- src/sound/resid-fp/wave8580_PS_.dat | Bin 4096 -> 0 bytes src/sound/resid-fp/wave8580_P_T.cc | 536 -- src/sound/resid-fp/wave8580_P_T.dat | Bin 4096 -> 0 bytes src/sound/resid-fp/wave8580__ST.cc | 536 -- src/sound/resid-fp/wave8580__ST.dat | Bin 4096 -> 0 bytes src/sound/{snd_resid.cc => snd_resid.cpp} | 35 +- 92 files changed, 7500 insertions(+), 15531 deletions(-) delete mode 100644 src/sound/resid-fp/ChangeLog create mode 100644 src/sound/resid-fp/Dac.cpp create mode 100644 src/sound/resid-fp/Dac.h create mode 100644 src/sound/resid-fp/EnvelopeGenerator.cpp create mode 100644 src/sound/resid-fp/EnvelopeGenerator.h create mode 100644 src/sound/resid-fp/ExternalFilter.cpp create mode 100644 src/sound/resid-fp/ExternalFilter.h create mode 100644 src/sound/resid-fp/Filter.cpp create mode 100644 src/sound/resid-fp/Filter.h create mode 100644 src/sound/resid-fp/Filter6581.cpp create mode 100644 src/sound/resid-fp/Filter6581.h create mode 100644 src/sound/resid-fp/Filter8580.cpp create mode 100644 src/sound/resid-fp/Filter8580.h create mode 100644 src/sound/resid-fp/FilterModelConfig.cpp create mode 100644 src/sound/resid-fp/FilterModelConfig.h create mode 100644 src/sound/resid-fp/FilterModelConfig6581.cpp create mode 100644 src/sound/resid-fp/FilterModelConfig6581.h create mode 100644 src/sound/resid-fp/FilterModelConfig8580.cpp create mode 100644 src/sound/resid-fp/FilterModelConfig8580.h delete mode 100644 src/sound/resid-fp/INSTALL create mode 100644 src/sound/resid-fp/Integrator6581.cpp create mode 100644 src/sound/resid-fp/Integrator6581.h create mode 100644 src/sound/resid-fp/Integrator8580.cpp create mode 100644 src/sound/resid-fp/Integrator8580.h delete mode 100644 src/sound/resid-fp/Makefile.am delete mode 100644 src/sound/resid-fp/Makefile.in delete mode 100644 src/sound/resid-fp/NEWS create mode 100644 src/sound/resid-fp/OpAmp.cpp create mode 100644 src/sound/resid-fp/OpAmp.h create mode 100644 src/sound/resid-fp/Potentiometer.h delete mode 100644 src/sound/resid-fp/README.VICE create mode 100644 src/sound/resid-fp/SID.cpp create mode 100644 src/sound/resid-fp/Spline.cpp create mode 100644 src/sound/resid-fp/Spline.h create mode 100644 src/sound/resid-fp/Voice.h create mode 100644 src/sound/resid-fp/WaveformCalculator.cpp create mode 100644 src/sound/resid-fp/WaveformCalculator.h create mode 100644 src/sound/resid-fp/WaveformGenerator.cpp create mode 100644 src/sound/resid-fp/WaveformGenerator.h delete mode 100644 src/sound/resid-fp/aclocal.m4 create mode 100644 src/sound/resid-fp/array.h delete mode 100644 src/sound/resid-fp/configure delete mode 100644 src/sound/resid-fp/configure.in delete mode 100644 src/sound/resid-fp/convolve-sse.cc delete mode 100644 src/sound/resid-fp/convolve.cc delete mode 100644 src/sound/resid-fp/envelope.cc delete mode 100644 src/sound/resid-fp/envelope.h delete mode 100644 src/sound/resid-fp/extfilt.cc delete mode 100644 src/sound/resid-fp/extfilt.h delete mode 100644 src/sound/resid-fp/filter.cc delete mode 100644 src/sound/resid-fp/filter.h delete mode 100644 src/sound/resid-fp/pot.cc delete mode 100644 src/sound/resid-fp/pot.h create mode 100644 src/sound/resid-fp/resample/Resampler.h create mode 100644 src/sound/resid-fp/resample/SincResampler.cpp create mode 100644 src/sound/resid-fp/resample/SincResampler.h create mode 100644 src/sound/resid-fp/resample/TwoPassSincResampler.h create mode 100644 src/sound/resid-fp/resample/ZeroOrderResampler.h create mode 100644 src/sound/resid-fp/resample/test.cpp delete mode 100644 src/sound/resid-fp/samp2src.pl delete mode 100644 src/sound/resid-fp/sid.cc create mode 100644 src/sound/resid-fp/sidcxx11.h delete mode 100644 src/sound/resid-fp/voice.cc delete mode 100644 src/sound/resid-fp/voice.h delete mode 100644 src/sound/resid-fp/wave.cc delete mode 100644 src/sound/resid-fp/wave.h delete mode 100644 src/sound/resid-fp/wave6581_PST.cc delete mode 100644 src/sound/resid-fp/wave6581_PST.dat delete mode 100644 src/sound/resid-fp/wave6581_PS_.cc delete mode 100644 src/sound/resid-fp/wave6581_PS_.dat delete mode 100644 src/sound/resid-fp/wave6581_P_T.cc delete mode 100644 src/sound/resid-fp/wave6581_P_T.dat delete mode 100644 src/sound/resid-fp/wave6581__ST.cc delete mode 100644 src/sound/resid-fp/wave6581__ST.dat delete mode 100644 src/sound/resid-fp/wave8580_PST.cc delete mode 100644 src/sound/resid-fp/wave8580_PST.dat delete mode 100644 src/sound/resid-fp/wave8580_PS_.cc delete mode 100644 src/sound/resid-fp/wave8580_PS_.dat delete mode 100644 src/sound/resid-fp/wave8580_P_T.cc delete mode 100644 src/sound/resid-fp/wave8580_P_T.dat delete mode 100644 src/sound/resid-fp/wave8580__ST.cc delete mode 100644 src/sound/resid-fp/wave8580__ST.dat rename src/sound/{snd_resid.cc => snd_resid.cpp} (62%) diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index 764e08a8e..a05481228 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -13,7 +13,7 @@ # Copyright 2020-2021 David Hrdlička. # -add_library(snd OBJECT sound.c snd_opl.c snd_opl_nuked.c snd_opl_ymfm.cpp snd_resid.cc +add_library(snd OBJECT sound.c snd_opl.c snd_opl_nuked.c snd_opl_ymfm.cpp snd_resid.cpp midi.c snd_speaker.c snd_pssj.c snd_lpt_dac.c snd_ac97_codec.c snd_ac97_via.c snd_lpt_dss.c snd_ps1.c snd_adlib.c snd_adlibgold.c snd_ad1848.c snd_audiopci.c snd_azt2316a.c snd_cms.c snd_cmi8x38.c snd_cs423x.c snd_gus.c snd_sb.c snd_sb_dsp.c diff --git a/src/sound/resid-fp/AUTHORS b/src/sound/resid-fp/AUTHORS index cd2ca3fcc..b04ee0f01 100644 --- a/src/sound/resid-fp/AUTHORS +++ b/src/sound/resid-fp/AUTHORS @@ -1,4 +1,6 @@ -Authors of reSID. +Authors of reSIDfp. Dag Lem: Designed and programmed complete emulation engine. -Antti S. Lankila: Support 6581 filter distortion, envelope & voice nonlinearities, output amp clipping effects. +Antti S. Lankila: Distortion simulation and calculation of combined waveforms +Ken Händel: source code conversion to Java +Leandro Nini: port to c++, merge with reSID 1.0 diff --git a/src/sound/resid-fp/CMakeLists.txt b/src/sound/resid-fp/CMakeLists.txt index 699fcae54..5246dd73b 100644 --- a/src/sound/resid-fp/CMakeLists.txt +++ b/src/sound/resid-fp/CMakeLists.txt @@ -13,7 +13,8 @@ # Copyright 2020-2021 David Hrdlička. # -add_library(resid-fp STATIC convolve-sse.cc convolve.cc envelope.cc extfilt.cc - filter.cc pot.cc sid.cc voice.cc wave.cc wave6581_PST.cc - wave6581_PS_.cc wave6581_P_T.cc wave6581__ST.cc wave8580_PST.cc - wave8580_PS_.cc wave8580_P_T.cc wave8580__ST.cc) \ No newline at end of file +add_library(resid-fp STATIC Dac.cpp EnvelopeGenerator.cpp ExternalFilter.cpp + Filter.cpp Filter6581.cpp Filter8580.cpp FilterModelConfig.cpp + FilterModelConfig6581.cpp FilterModelConfig8580.cpp + Integrator6581.cpp Integrator8580.cpp OpAmp.cpp SID.cpp + Spline.cpp WaveformCalculator.cpp WaveformGenerator.cpp resample/SincResampler.cpp) diff --git a/src/sound/resid-fp/COPYING b/src/sound/resid-fp/COPYING index d60c31a97..d159169d1 100644 --- a/src/sound/resid-fp/COPYING +++ b/src/sound/resid-fp/COPYING @@ -1,12 +1,12 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - Preamble + Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public @@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to +the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not @@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. - - GNU GENERAL PUBLIC LICENSE + + GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains @@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions: License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) - + These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in @@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. - + 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is @@ -225,7 +225,7 @@ impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. - + 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License @@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. - NO WARRANTY + NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN @@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it @@ -303,17 +303,16 @@ the "copyright" line and a pointer to where the full notice is found. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: - Gnomovision version 69, Copyright (C) year name of author + Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. @@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names: This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General +library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. diff --git a/src/sound/resid-fp/ChangeLog b/src/sound/resid-fp/ChangeLog deleted file mode 100644 index c12e828b9..000000000 --- a/src/sound/resid-fp/ChangeLog +++ /dev/null @@ -1,136 +0,0 @@ -2008-12-05 Antti S. Lankila - - * Sync against V27 patch version. Filter updates described below. - - * Reduce Q maximum to 2.2 or so. This may still be slightly too much, - but it's hard to say exactly... - - * Arrange for about 3 dB boost of lowpass output that is independent - of state variable mixing or other feedback. This seems to produce - the right kind of sounds for songs like AMJ's Blasphemy. - - * Assume that bp is slightly louder than bp (= more distorted). - This seems to help against very large number of songs which sport - lead sounds and effects distorted in a smooth, bassy way. - - * Parameter tuneup. - -2008-10-31 Antti S. Lankila - - * Sync against V25 patch version. Filter updates described below. - - * Tweak filter algorithm to do some state variable mixing in the - 6581 code path. This corresponds with assumed output impedance of - the SID "amplifiers", and is separate effect to the output strip - backmixing. - - * Retire the V24 attempt of dynamically adjusting BP distortion - threshold. It doesn't really seem to work. - - * Increase Q value maximum to 2.5. This may be too much, but it sounds - fine to me. - - * JT's Star Ball was very distorted when played by V24. This related - to the hardclipping I had assumed to occur in the filter output amp, - but maybe that theory is incorrect. I now only add distortion to the - unfiltered voice path, but I'm not happy about it. - -2008-08-29 Antti S. Lankila - - * Optimized resampling to be about 2x faster through using aliasing - to increase passband width and hence reduce FIR length. - - * Fixed some valgrind warnings. - - * Added nuke_denormals() method to periodically flush these to zero, as - this can only be done for SSE registers by the FPU and we can't use - any in order to support CPUs older than P3. - - * Marco, Hannu and me developed a runtime switching system - that detects SSE from cpuinfo and calls some SSE routines when they - are compiled in and the CPU can support them. We lost only very - little performance, but gained compatibility to very, very old - hardware. - - * The old code for ST_lockup proved unnecessary, so it is now removed. - -2008-08-21 Antti S. Lankila - - * Fixed a bug where nonlinearity setting appeared to get lost, and - kenchis discovered further bugs in it. Oh well. - - * I removed a lot of code associated with the lower quality modes of - ReSID, and only left the 1 MHz clock routines. Analysis shows that the - filter code is a major culprit, but the digital side emulation is not - completely cheap, either. I already added some small hacks to optimize - it, and I now think about reinjecting pieces of those clocking modes - that run the analog parts with reduced accuracy. - - * I defined type4 filters based on equation of straight line. These are - characterized by parameters k and b, and the equation is - freq = k * fc. Strictly speaking, straight line is not 100 % - accurate, and a 2nd degree component would help, but based on - measurements against two of Trurl's 8580s, the maximum error - introduced using linear approximation is mere 3 %. - -2008-08-10 Antti S. Lankila - - * I ripped off Type1 definitions from the filter, and the spline.h - and PointPlotter were unnecessary and so removed. - - * I also added a bit of hardclipping in the output that seems to be - required to get Fred Gray's Break Thru. This might not occur so - strongly on all chips, so it should probably be added as a proper - tunable. For now, I just settled for a slight effect to collect - feedback. - -2008-07-15 Antti S. Lankila - - * This release is a bit slower than usual. The culprit is the changes in - voice.h where a new kinked-dac style calculation is used to simulate - the nonlinear shape of the waveform outputs. The cost of the new - calculation varies by song as I was lazy and only cached the result of - previous calculation, so speed depends on the pitch of the waveforms - and the precise waveform chosen. - - * exp() is back, but this time it is implemented as an integer - calculation according to Schraudolph's paper "A Fast, Compact - Approximation of the Exponential Function". Using near-proper exp() - simplified the distortion algorithm. I think it all sounds much better - now. - - * A new effect where I mix bp-hp and lp-bp together by their difference - to simulate a small resistor between them appears to improve SidRiders - and several other songs, largerly eliminating some types of hard - distortion sounds that do not occur on the chip. It also helped - Mechanicus. I am trying to understand where this term comes from... - -2008-07-09 Antti S. Lankila - - * I now have somewhat less arbitrary values for the distortion - tunables. They are now related to the relative signal levels in the - simulation. I'm still sorting out the particulars of the values I - ended up with ("why 128 instead of 256"). - -2008-03-02 Antti S. Lankila - - * Exposed the filter at sid.cc to callers through get_filter() - method, and fixed a few types. - -2008-02-19 Antti S. Lankila - - * For some reason ReSID code adjusted the external filter frequency - based on calculated passband, while in the real C64 the filter is - fixed to about 16 kHz. - -2008-02-06 Antti S. Lankila - - * I got interested to improve ReSID after chatting with Kevtris. He is - aiming to replicate the filter using analog hardware. He has the EE - experience that I have sorely lacked and made an infinitely valuable - contribution by telling me exactly how the distortion works. - -2004-06-11 Dag Lem - - * Version 0.16 released. (From this point forwards, read - ../resid/ChangeLog.) diff --git a/src/sound/resid-fp/Dac.cpp b/src/sound/resid-fp/Dac.cpp new file mode 100644 index 000000000..0665da817 --- /dev/null +++ b/src/sound/resid-fp/Dac.cpp @@ -0,0 +1,123 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2016 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "Dac.h" + +namespace reSIDfp +{ + +Dac::Dac(unsigned int bits) : + dac(new double[bits]), + dacLength(bits) +{} + +Dac::~Dac() +{ + delete [] dac; +} + +double Dac::getOutput(unsigned int input) const +{ + double dacValue = 0.; + + for (unsigned int i = 0; i < dacLength; i++) + { + if ((input & (1 << i)) != 0) + { + dacValue += dac[i]; + } + } + + return dacValue; +} + +void Dac::kinkedDac(ChipModel chipModel) +{ + const double R_INFINITY = 1e6; + + // Non-linearity parameter, 8580 DACs are perfectly linear + const double _2R_div_R = chipModel == MOS6581 ? 2.20 : 2.00; + + // 6581 DACs are not terminated by a 2R resistor + const bool term = chipModel == MOS8580; + + // Calculate voltage contribution by each individual bit in the R-2R ladder. + for (unsigned int set_bit = 0; set_bit < dacLength; set_bit++) + { + double Vn = 1.; // Normalized bit voltage. + double R = 1.; // Normalized R + const double _2R = _2R_div_R * R; // 2R + double Rn = term ? // Rn = 2R for correct termination, + _2R : R_INFINITY; // INFINITY for missing termination. + + unsigned int bit; + + // Calculate DAC "tail" resistance by repeated parallel substitution. + for (bit = 0; bit < set_bit; bit++) + { + Rn = (Rn == R_INFINITY) ? + R + _2R : + R + (_2R * Rn) / (_2R + Rn); // R + 2R || Rn + } + + // Source transformation for bit voltage. + if (Rn == R_INFINITY) + { + Rn = _2R; + } + else + { + Rn = (_2R * Rn) / (_2R + Rn); // 2R || Rn + Vn = Vn * Rn / _2R; + } + + // Calculate DAC output voltage by repeated source transformation from + // the "tail". + + for (++bit; bit < dacLength; bit++) + { + Rn += R; + const double I = Vn / Rn; + Rn = (_2R * Rn) / (_2R + Rn); // 2R || Rn + Vn = Rn * I; + } + + dac[set_bit] = Vn; + } + + // Normalize to integerish behavior + double Vsum = 0.; + + for (unsigned int i = 0; i < dacLength; i++) + { + Vsum += dac[i]; + } + + Vsum /= 1 << dacLength; + + for (unsigned int i = 0; i < dacLength; i++) + { + dac[i] /= Vsum; + } +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/Dac.h b/src/sound/resid-fp/Dac.h new file mode 100644 index 000000000..35bc0b2ca --- /dev/null +++ b/src/sound/resid-fp/Dac.h @@ -0,0 +1,111 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2016 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef DAC_H +#define DAC_H + +#include "siddefs-fp.h" + +namespace reSIDfp +{ + +/** + * Estimate DAC nonlinearity. + * The SID DACs are built up as R-2R ladder as follows: + * + * n n-1 2 1 0 VGND + * | | | | | | Termination + * 2R 2R 2R 2R 2R 2R only for + * | | | | | | MOS 8580 + * Vo -o-R-o-R-...-o-R-o-R-- --+ + * + * + * All MOS 6581 DACs are missing a termination resistor at bit 0. This causes + * pronounced errors for the lower 4 - 5 bits (e.g. the output for bit 0 is + * actually equal to the output for bit 1), resulting in DAC discontinuities + * for the lower bits. + * In addition to this, the 6581 DACs exhibit further severe discontinuities + * for higher bits, which may be explained by a less than perfect match between + * the R and 2R resistors, or by output impedance in the NMOS transistors + * providing the bit voltages. A good approximation of the actual DAC output is + * achieved for 2R/R ~ 2.20. + * + * The MOS 8580 DACs, on the other hand, do not exhibit any discontinuities. + * These DACs include the correct termination resistor, and also seem to have + * very accurately matched R and 2R resistors (2R/R = 2.00). + * + * On the 6581 the output of the waveform and envelope DACs go through + * a voltage follower built with two NMOS: + * + * Vdd + * + * | + * |-+ + * Vin -------| T1 (enhancement-mode) + * |-+ + * | + * o-------- Vout + * | + * |-+ + * +---| T2 (depletion-mode) + * | |-+ + * | | + * + * GND GND + */ +class Dac +{ +private: + /// analog values + double * const dac; + + /// the dac array length + const unsigned int dacLength; + +public: + /** + * Initialize DAC model. + * + * @param bits the number of input bits + */ + Dac(unsigned int bits); + ~Dac(); + + /** + * Build DAC model for specific chip. + * + * @param chipModel 6581 or 8580 + */ + void kinkedDac(ChipModel chipModel); + + /** + * Get the Vo output for a given combination of input bits. + * + * @param input the digital input + * @return the analog output value + */ + double getOutput(unsigned int input) const; +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/EnvelopeGenerator.cpp b/src/sound/resid-fp/EnvelopeGenerator.cpp new file mode 100644 index 000000000..af636ac7f --- /dev/null +++ b/src/sound/resid-fp/EnvelopeGenerator.cpp @@ -0,0 +1,155 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2020 Leandro Nini + * Copyright 2018 VICE Project + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define ENVELOPEGENERATOR_CPP + +#include "EnvelopeGenerator.h" + +namespace reSIDfp +{ + +/** + * Lookup table to convert from attack, decay, or release value to rate + * counter period. + * + * The rate counter is a 15 bit register which is left shifted each cycle. + * When the counter reaches a specific comparison value, + * the envelope counter is incremented (attack) or decremented + * (decay/release) and the rate counter is resetted. + * + * see [kevtris.org](http://blog.kevtris.org/?p=13) + */ +const unsigned int EnvelopeGenerator::adsrtable[16] = +{ + 0x007f, + 0x3000, + 0x1e00, + 0x0660, + 0x0182, + 0x5573, + 0x000e, + 0x3805, + 0x2424, + 0x2220, + 0x090c, + 0x0ecd, + 0x010e, + 0x23f7, + 0x5237, + 0x64a8 +}; + +void EnvelopeGenerator::reset() +{ + // counter is not changed on reset + envelope_pipeline = 0; + + state_pipeline = 0; + + attack = 0; + decay = 0; + sustain = 0; + release = 0; + + gate = false; + + resetLfsr = true; + + exponential_counter = 0; + exponential_counter_period = 1; + new_exponential_counter_period = 0; + + state = RELEASE; + counter_enabled = true; + rate = adsrtable[release]; +} + +void EnvelopeGenerator::writeCONTROL_REG(unsigned char control) +{ + const bool gate_next = (control & 0x01) != 0; + + if (gate_next != gate) + { + gate = gate_next; + + // The rate counter is never reset, thus there will be a delay before the + // envelope counter starts counting up (attack) or down (release). + + if (gate_next) + { + // Gate bit on: Start attack, decay, sustain. + next_state = ATTACK; + state_pipeline = 2; + + if (resetLfsr || (exponential_pipeline == 2)) + { + envelope_pipeline = (exponential_counter_period == 1) || (exponential_pipeline == 2) ? 2 : 4; + } + else if (exponential_pipeline == 1) + { + state_pipeline = 3; + } + } + else + { + // Gate bit off: Start release. + next_state = RELEASE; + state_pipeline = envelope_pipeline > 0 ? 3 : 2; + } + } +} + +void EnvelopeGenerator::writeATTACK_DECAY(unsigned char attack_decay) +{ + attack = (attack_decay >> 4) & 0x0f; + decay = attack_decay & 0x0f; + + if (state == ATTACK) + { + rate = adsrtable[attack]; + } + else if (state == DECAY_SUSTAIN) + { + rate = adsrtable[decay]; + } +} + +void EnvelopeGenerator::writeSUSTAIN_RELEASE(unsigned char sustain_release) +{ + // From the sustain levels it follows that both the low and high 4 bits + // of the envelope counter are compared to the 4-bit sustain value. + // This has been verified by sampling ENV3. + // + // For a detailed description see: + // http://ploguechipsounds.blogspot.it/2010/11/new-research-on-sid-adsr.html + sustain = (sustain_release & 0xf0) | ((sustain_release >> 4) & 0x0f); + + release = sustain_release & 0x0f; + + if (state == RELEASE) + { + rate = adsrtable[release]; + } +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/EnvelopeGenerator.h b/src/sound/resid-fp/EnvelopeGenerator.h new file mode 100644 index 000000000..f2aab3874 --- /dev/null +++ b/src/sound/resid-fp/EnvelopeGenerator.h @@ -0,0 +1,419 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2022 Leandro Nini + * Copyright 2018 VICE Project + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef ENVELOPEGENERATOR_H +#define ENVELOPEGENERATOR_H + +#include "siddefs-fp.h" + +namespace reSIDfp +{ + +/** + * A 15 bit [LFSR] is used to implement the envelope rates, in effect dividing + * the clock to the envelope counter by the currently selected rate period. + * + * In addition, another 5 bit counter is used to implement the exponential envelope decay, + * in effect further dividing the clock to the envelope counter. + * The period of this counter is set to 1, 2, 4, 8, 16, 30 at the envelope counter + * values 255, 93, 54, 26, 14, 6, respectively. + * + * [LFSR]: https://en.wikipedia.org/wiki/Linear_feedback_shift_register + */ +class EnvelopeGenerator +{ +private: + /** + * The envelope state machine's distinct states. In addition to this, + * envelope has a hold mode, which freezes envelope counter to zero. + */ + enum State + { + ATTACK, DECAY_SUSTAIN, RELEASE + }; + +private: + /// XOR shift register for ADSR prescaling. + unsigned int lfsr; + + /// Comparison value (period) of the rate counter before next event. + unsigned int rate; + + /** + * During release mode, the SID approximates envelope decay via piecewise + * linear decay rate. + */ + unsigned int exponential_counter; + + /** + * Comparison value (period) of the exponential decay counter before next + * decrement. + */ + unsigned int exponential_counter_period; + unsigned int new_exponential_counter_period; + + unsigned int state_pipeline; + + /// + unsigned int envelope_pipeline; + + unsigned int exponential_pipeline; + + /// Current envelope state + State state; + State next_state; + + /// Whether counter is enabled. Only switching to ATTACK can release envelope. + bool counter_enabled; + + /// Gate bit + bool gate; + + /// + bool resetLfsr; + + /// The current digital value of envelope output. + unsigned char envelope_counter; + + /// Attack register + unsigned char attack; + + /// Decay register + unsigned char decay; + + /// Sustain register + unsigned char sustain; + + /// Release register + unsigned char release; + + /// The ENV3 value, sampled at the first phase of the clock + unsigned char env3; + +private: + static const unsigned int adsrtable[16]; + +private: + void set_exponential_counter(); + + void state_change(); + +public: + /** + * SID clocking. + */ + void clock(); + + /** + * Get the Envelope Generator digital output. + */ + unsigned int output() const { return envelope_counter; } + + /** + * Constructor. + */ + EnvelopeGenerator() : + lfsr(0x7fff), + rate(0), + exponential_counter(0), + exponential_counter_period(1), + new_exponential_counter_period(0), + state_pipeline(0), + envelope_pipeline(0), + exponential_pipeline(0), + state(RELEASE), + next_state(RELEASE), + counter_enabled(true), + gate(false), + resetLfsr(false), + envelope_counter(0xaa), + attack(0), + decay(0), + sustain(0), + release(0), + env3(0) + {} + + /** + * SID reset. + */ + void reset(); + + /** + * Write control register. + * + * @param control + * control register value + */ + void writeCONTROL_REG(unsigned char control); + + /** + * Write Attack/Decay register. + * + * @param attack_decay + * attack/decay value + */ + void writeATTACK_DECAY(unsigned char attack_decay); + + /** + * Write Sustain/Release register. + * + * @param sustain_release + * sustain/release value + */ + void writeSUSTAIN_RELEASE(unsigned char sustain_release); + + /** + * Return the envelope current value. + * + * @return envelope counter value + */ + unsigned char readENV() const { return env3; } +}; + +} // namespace reSIDfp + +#if RESID_INLINING || defined(ENVELOPEGENERATOR_CPP) + +namespace reSIDfp +{ + +RESID_INLINE +void EnvelopeGenerator::clock() +{ + env3 = envelope_counter; + + if (unlikely(new_exponential_counter_period > 0)) + { + exponential_counter_period = new_exponential_counter_period; + new_exponential_counter_period = 0; + } + + if (unlikely(state_pipeline)) + { + state_change(); + } + + if (unlikely(envelope_pipeline != 0) && (--envelope_pipeline == 0)) + { + if (likely(counter_enabled)) + { + if (state == ATTACK) + { + if (++envelope_counter==0xff) + { + next_state = DECAY_SUSTAIN; + state_pipeline = 3; + } + } + else if ((state == DECAY_SUSTAIN) || (state == RELEASE)) + { + if (--envelope_counter==0x00) + { + counter_enabled = false; + } + } + + set_exponential_counter(); + } + } + else if (unlikely(exponential_pipeline != 0) && (--exponential_pipeline == 0)) + { + exponential_counter = 0; + + if (((state == DECAY_SUSTAIN) && (envelope_counter != sustain)) + || (state == RELEASE)) + { + // The envelope counter can flip from 0x00 to 0xff by changing state to + // attack, then to release. The envelope counter will then continue + // counting down in the release state. + // This has been verified by sampling ENV3. + + envelope_pipeline = 1; + } + } + else if (unlikely(resetLfsr)) + { + lfsr = 0x7fff; + resetLfsr = false; + + if (state == ATTACK) + { + // The first envelope step in the attack state also resets the exponential + // counter. This has been verified by sampling ENV3. + exponential_counter = 0; // NOTE this is actually delayed one cycle, not modeled + + // The envelope counter can flip from 0xff to 0x00 by changing state to + // release, then to attack. The envelope counter is then frozen at + // zero; to unlock this situation the state must be changed to release, + // then to attack. This has been verified by sampling ENV3. + + envelope_pipeline = 2; + } + else + { + if (counter_enabled && (++exponential_counter == exponential_counter_period)) + exponential_pipeline = exponential_counter_period != 1 ? 2 : 1; + } + } + + // ADSR delay bug. + // If the rate counter comparison value is set below the current value of the + // rate counter, the counter will continue counting up until it wraps around + // to zero at 2^15 = 0x8000, and then count rate_period - 1 before the + // envelope can constly be stepped. + // This has been verified by sampling ENV3. + + // check to see if LFSR matches table value + if (likely(lfsr != rate)) + { + // it wasn't a match, clock the LFSR once + // by performing XOR on last 2 bits + const unsigned int feedback = ((lfsr << 14) ^ (lfsr << 13)) & 0x4000; + lfsr = (lfsr >> 1) | feedback; + } + else + { + resetLfsr = true; + } +} + +/** + * This is what happens on chip during state switching, + * based on die reverse engineering and transistor level + * emulation. + * + * Attack + * + * 0 - Gate on + * 1 - Counting direction changes + * During this cycle the decay rate is "accidentally" activated + * 2 - Counter is being inverted + * Now the attack rate is correctly activated + * Counter is enabled + * 3 - Counter will be counting upward from now on + * + * Decay + * + * 0 - Counter == $ff + * 1 - Counting direction changes + * The attack state is still active + * 2 - Counter is being inverted + * During this cycle the decay state is activated + * 3 - Counter will be counting downward from now on + * + * Release + * + * 0 - Gate off + * 1 - During this cycle the release state is activated if coming from sustain/decay + * *2 - Counter is being inverted, the release state is activated + * *3 - Counter will be counting downward from now on + * + * (* only if coming directly from Attack state) + * + * Freeze + * + * 0 - Counter == $00 + * 1 - Nothing + * 2 - Counter is disabled + */ +RESID_INLINE +void EnvelopeGenerator::state_change() +{ + state_pipeline--; + + switch (next_state) + { + case ATTACK: + if (state_pipeline == 1) + { + // The decay rate is "accidentally" enabled during first cycle of attack phase + rate = adsrtable[decay]; + } + else if (state_pipeline == 0) + { + state = ATTACK; + // The attack rate is correctly enabled during second cycle of attack phase + rate = adsrtable[attack]; + counter_enabled = true; + } + break; + case DECAY_SUSTAIN: + if (state_pipeline == 0) + { + state = DECAY_SUSTAIN; + rate = adsrtable[decay]; + } + break; + case RELEASE: + if (((state == ATTACK) && (state_pipeline == 0)) + || ((state == DECAY_SUSTAIN) && (state_pipeline == 1))) + { + state = RELEASE; + rate = adsrtable[release]; + } + break; + } +} + +RESID_INLINE +void EnvelopeGenerator::set_exponential_counter() +{ + // Check for change of exponential counter period. + // + // For a detailed description see: + // http://ploguechipsounds.blogspot.it/2010/03/sid-6581r3-adsr-tables-up-close.html + switch (envelope_counter) + { + case 0xff: + case 0x00: + new_exponential_counter_period = 1; + break; + + case 0x5d: + new_exponential_counter_period = 2; + break; + + case 0x36: + new_exponential_counter_period = 4; + break; + + case 0x1a: + new_exponential_counter_period = 8; + break; + + case 0x0e: + new_exponential_counter_period = 16; + break; + + case 0x06: + new_exponential_counter_period = 30; + break; + } +} + +} // namespace reSIDfp + +#endif + +#endif diff --git a/src/sound/resid-fp/ExternalFilter.cpp b/src/sound/resid-fp/ExternalFilter.cpp new file mode 100644 index 000000000..eac790b31 --- /dev/null +++ b/src/sound/resid-fp/ExternalFilter.cpp @@ -0,0 +1,68 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2020 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define EXTERNALFILTER_CPP + +#include "ExternalFilter.h" + +namespace reSIDfp +{ + +/** + * Get the 3 dB attenuation point. + * + * @param res the resistance value in Ohms + * @param cap the capacitance value in Farads + */ +inline double getRC(double res, double cap) +{ + return res * cap; +} + +ExternalFilter::ExternalFilter() : + w0lp_1_s7(0), + w0hp_1_s17(0) +{ + reset(); +} + +void ExternalFilter::setClockFrequency(double frequency) +{ + const double dt = 1. / frequency; + + // Low-pass: R = 10kOhm, C = 1000pF; w0l = dt/(dt+RC) = 1e-6/(1e-6+1e4*1e-9) = 0.091 + // Cutoff 1/2*PI*RC = 1/2*PI*1e4*1e-9 = 15915.5 Hz + w0lp_1_s7 = static_cast((dt / (dt + getRC(10e3, 1000e-12))) * (1 << 7) + 0.5); + + // High-pass: R = 10kOhm, C = 10uF; w0h = dt/(dt+RC) = 1e-6/(1e-6+1e4*1e-5) = 0.00000999 + // Cutoff 1/2*PI*RC = 1/2*PI*1e4*1e-5 = 1.59155 Hz + w0hp_1_s17 = static_cast((dt / (dt + getRC(10e3, 10e-6))) * (1 << 17) + 0.5); +} + +void ExternalFilter::reset() +{ + // State of filter. + Vlp = 0; //1 << (15 + 11); + Vhp = 0; +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/ExternalFilter.h b/src/sound/resid-fp/ExternalFilter.h new file mode 100644 index 000000000..760ee5c22 --- /dev/null +++ b/src/sound/resid-fp/ExternalFilter.h @@ -0,0 +1,125 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2020 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef EXTERNALFILTER_H +#define EXTERNALFILTER_H + +#include "siddefs-fp.h" + +namespace reSIDfp +{ + +/** + * The audio output stage in a Commodore 64 consists of two STC networks, a + * low-pass RC filter with 3 dB frequency 16kHz followed by a DC-blocker which + * acts as a high-pass filter with a cutoff dependent on the attached audio + * equipment impedance. Here we suppose an impedance of 10kOhm resulting + * in a 3 dB attenuation at 1.6Hz. + * To operate properly the 6581 audio output needs a pull-down resistor + *(1KOhm recommended, not needed on 8580) + * + * ~~~ + * 9/12V + * -----+ + * audio| 10k | + * +---o----R---o--------o-----(K) +----- + * out | | | | | |audio + * -----+ R 1k C 1000 | | 10 uF | + * | | pF +-C----o-----C-----+ 10k + * 470 | | + * GND GND pF R 1K | amp + * * * | +----- + * + * GND + * ~~~ + * + * The STC networks are connected with a [BJT] based [common collector] + * used as a voltage follower (featuring a 2SC1815 NPN transistor). + * * The C64c board additionally includes a [bootstrap] condenser to increase + * the input impedance of the common collector. + * + * [BJT]: https://en.wikipedia.org/wiki/Bipolar_junction_transistor + * [common collector]: https://en.wikipedia.org/wiki/Common_collector + * [bootstrap]: https://en.wikipedia.org/wiki/Bootstrapping_(electronics) + */ +class ExternalFilter +{ +private: + /// Lowpass filter voltage + int Vlp; + + /// Highpass filter voltage + int Vhp; + + int w0lp_1_s7; + + int w0hp_1_s17; + +public: + /** + * SID clocking. + * + * @param input + */ + int clock(unsigned short input); + + /** + * Constructor. + */ + ExternalFilter(); + + /** + * Setup of the external filter sampling parameters. + * + * @param frequency the main system clock frequency + */ + void setClockFrequency(double frequency); + + /** + * SID reset. + */ + void reset(); +}; + +} // namespace reSIDfp + +#if RESID_INLINING || defined(EXTERNALFILTER_CPP) + +namespace reSIDfp +{ + +RESID_INLINE +int ExternalFilter::clock(unsigned short input) +{ + const int Vi = (static_cast(input)<<11) - (1 << (11+15)); + const int dVlp = (w0lp_1_s7 * (Vi - Vlp) >> 7); + const int dVhp = (w0hp_1_s17 * (Vlp - Vhp) >> 17); + Vlp += dVlp; + Vhp += dVhp; + return (Vlp - Vhp) >> 11; +} + +} // namespace reSIDfp + +#endif + +#endif diff --git a/src/sound/resid-fp/Filter.cpp b/src/sound/resid-fp/Filter.cpp new file mode 100644 index 000000000..2a2dd24f7 --- /dev/null +++ b/src/sound/resid-fp/Filter.cpp @@ -0,0 +1,90 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2013 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "Filter.h" + +namespace reSIDfp +{ + +void Filter::enable(bool enable) +{ + enabled = enable; + + if (enabled) + { + writeRES_FILT(filt); + } + else + { + filt1 = filt2 = filt3 = filtE = false; + } +} + +void Filter::reset() +{ + writeFC_LO(0); + writeFC_HI(0); + writeMODE_VOL(0); + writeRES_FILT(0); +} + +void Filter::writeFC_LO(unsigned char fc_lo) +{ + fc = (fc & 0x7f8) | (fc_lo & 0x007); + updatedCenterFrequency(); +} + +void Filter::writeFC_HI(unsigned char fc_hi) +{ + fc = (fc_hi << 3 & 0x7f8) | (fc & 0x007); + updatedCenterFrequency(); +} + +void Filter::writeRES_FILT(unsigned char res_filt) +{ + filt = res_filt; + + updateResonance((res_filt >> 4) & 0x0f); + + if (enabled) + { + filt1 = (filt & 0x01) != 0; + filt2 = (filt & 0x02) != 0; + filt3 = (filt & 0x04) != 0; + filtE = (filt & 0x08) != 0; + } + + updatedMixing(); +} + +void Filter::writeMODE_VOL(unsigned char mode_vol) +{ + vol = mode_vol & 0x0f; + lp = (mode_vol & 0x10) != 0; + bp = (mode_vol & 0x20) != 0; + hp = (mode_vol & 0x40) != 0; + voice3off = (mode_vol & 0x80) != 0; + + updatedMixing(); +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/Filter.h b/src/sound/resid-fp/Filter.h new file mode 100644 index 000000000..4b3473369 --- /dev/null +++ b/src/sound/resid-fp/Filter.h @@ -0,0 +1,177 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2017 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef FILTER_H +#define FILTER_H + +namespace reSIDfp +{ + +/** + * SID filter base class + */ +class Filter +{ +protected: + /// Current volume amplifier setting. + unsigned short* currentGain; + + /// Current filter/voice mixer setting. + unsigned short* currentMixer; + + /// Filter input summer setting. + unsigned short* currentSummer; + + /// Filter resonance value. + unsigned short* currentResonance; + + /// Filter highpass state. + int Vhp; + + /// Filter bandpass state. + int Vbp; + + /// Filter lowpass state. + int Vlp; + + /// Filter external input. + int ve; + + /// Filter cutoff frequency. + unsigned int fc; + + /// Routing to filter or outside filter + bool filt1, filt2, filt3, filtE; + + /// Switch voice 3 off. + bool voice3off; + + /// Highpass, bandpass, and lowpass filter modes. + bool hp, bp, lp; + + /// Current volume. + unsigned char vol; + +private: + /// Filter enabled. + bool enabled; + + /// Selects which inputs to route through filter. + unsigned char filt; + +protected: + /** + * Set filter cutoff frequency. + */ + virtual void updatedCenterFrequency() = 0; + + /** + * Set filter resonance. + */ + virtual void updateResonance(unsigned char res) = 0; + + /** + * Mixing configuration modified (offsets change) + */ + virtual void updatedMixing() = 0; + +public: + Filter() : + currentGain(nullptr), + currentMixer(nullptr), + currentSummer(nullptr), + currentResonance(nullptr), + Vhp(0), + Vbp(0), + Vlp(0), + ve(0), + fc(0), + filt1(false), + filt2(false), + filt3(false), + filtE(false), + voice3off(false), + hp(false), + bp(false), + lp(false), + vol(0), + enabled(true), + filt(0) {} + + virtual ~Filter() {} + + /** + * SID clocking - 1 cycle + * + * @param v1 voice 1 in + * @param v2 voice 2 in + * @param v3 voice 3 in + * @return filtered output + */ + virtual unsigned short clock(int v1, int v2, int v3) = 0; + + /** + * Enable filter. + * + * @param enable + */ + void enable(bool enable); + + /** + * SID reset. + */ + void reset(); + + /** + * Write Frequency Cutoff Low register. + * + * @param fc_lo Frequency Cutoff Low-Byte + */ + void writeFC_LO(unsigned char fc_lo); + + /** + * Write Frequency Cutoff High register. + * + * @param fc_hi Frequency Cutoff High-Byte + */ + void writeFC_HI(unsigned char fc_hi); + + /** + * Write Resonance/Filter register. + * + * @param res_filt Resonance/Filter + */ + void writeRES_FILT(unsigned char res_filt); + + /** + * Write filter Mode/Volume register. + * + * @param mode_vol Filter Mode/Volume + */ + void writeMODE_VOL(unsigned char mode_vol); + + virtual void input(int input) = 0; +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/Filter6581.cpp b/src/sound/resid-fp/Filter6581.cpp new file mode 100644 index 000000000..c064a8801 --- /dev/null +++ b/src/sound/resid-fp/Filter6581.cpp @@ -0,0 +1,75 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2015 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define FILTER6581_CPP + +#include "Filter6581.h" + +#include "Integrator6581.h" + +namespace reSIDfp +{ + +Filter6581::~Filter6581() +{ + delete [] f0_dac; +} + +void Filter6581::updatedCenterFrequency() +{ + const unsigned short Vw = f0_dac[fc]; + hpIntegrator->setVw(Vw); + bpIntegrator->setVw(Vw); +} + +void Filter6581::updatedMixing() +{ + currentGain = gain_vol[vol]; + + unsigned int ni = 0; + unsigned int no = 0; + + (filt1 ? ni : no)++; + (filt2 ? ni : no)++; + + if (filt3) ni++; + else if (!voice3off) no++; + + (filtE ? ni : no)++; + + currentSummer = summer[ni]; + + if (lp) no++; + if (bp) no++; + if (hp) no++; + + currentMixer = mixer[no]; +} + +void Filter6581::setFilterCurve(double curvePosition) +{ + delete [] f0_dac; + f0_dac = FilterModelConfig6581::getInstance()->getDAC(curvePosition); + updatedCenterFrequency(); +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/Filter6581.h b/src/sound/resid-fp/Filter6581.h new file mode 100644 index 000000000..7fca331ab --- /dev/null +++ b/src/sound/resid-fp/Filter6581.h @@ -0,0 +1,425 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2022 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef FILTER6581_H +#define FILTER6581_H + +#include "siddefs-fp.h" + +#include + +#include "Filter.h" +#include "FilterModelConfig6581.h" + +#include "sidcxx11.h" + +namespace reSIDfp +{ + +class Integrator6581; + +/** + * The SID filter is modeled with a two-integrator-loop biquadratic filter, + * which has been confirmed by Bob Yannes to be the actual circuit used in + * the SID chip. + * + * Measurements show that excellent emulation of the SID filter is achieved, + * except when high resonance is combined with high sustain levels. + * In this case the SID op-amps are performing less than ideally and are + * causing some peculiar behavior of the SID filter. This however seems to + * have more effect on the overall amplitude than on the color of the sound. + * + * The theory for the filter circuit can be found in "Microelectric Circuits" + * by Adel S. Sedra and Kenneth C. Smith. + * The circuit is modeled based on the explanation found there except that + * an additional inverter is used in the feedback from the bandpass output, + * allowing the summer op-amp to operate in single-ended mode. This yields + * filter outputs with levels independent of Q, which corresponds with the + * results obtained from a real SID. + * + * We have been able to model the summer and the two integrators of the circuit + * to form components of an IIR filter. + * Vhp is the output of the summer, Vbp is the output of the first integrator, + * and Vlp is the output of the second integrator in the filter circuit. + * + * According to Bob Yannes, the active stages of the SID filter are not really + * op-amps. Rather, simple NMOS inverters are used. By biasing an inverter + * into its region of quasi-linear operation using a feedback resistor from + * input to output, a MOS inverter can be made to act like an op-amp for + * small signals centered around the switching threshold. + * + * In 2008, Michael Huth facilitated closer investigation of the SID 6581 + * filter circuit by publishing high quality microscope photographs of the die. + * Tommi Lempinen has done an impressive work on re-vectorizing and annotating + * the die photographs, substantially simplifying further analysis of the + * filter circuit. + * + * The filter schematics below are reverse engineered from these re-vectorized + * and annotated die photographs. While the filter first depicted in reSID 0.9 + * is a correct model of the basic filter, the schematics are now completed + * with the audio mixer and output stage, including details on intended + * relative resistor values. Also included are schematics for the NMOS FET + * voltage controlled resistors (VCRs) used to control cutoff frequency, the + * DAC which controls the VCRs, the NMOS op-amps, and the output buffer. + * + * + * SID filter / mixer / output + * --------------------------- + * ~~~ + * +---------------------------------------------------+ + * | | + * | +--1R1-- \--+ D7 | + * | +---R1--+ | | | + * | | | o--2R1-- \--o D6 | + * | +---------o----o--Rw--o--[A>--o--Rw--o--[A>--o + * ve (EXT IN) | | | | + * D3 \ ---------------R8--o | | (CAP2A) | (CAP1A) + * | v3 | | vhp | vbp | vlp + * D2 | \ -----------R8--o +-----+ | | + * | | v2 | | | | + * D1 | | \ -------R8--o | +----------------+ | + * | | | v1 | | | | + * D0 | | | \ ---R8--+ | | +---------------------------+ + * | | | | | | | + * R6 R6 R6 R6 R6 R6 R6 + * | | | | $18 | | | $18 + * | \ | | D7: 1=open \ \ \ D6 - D4: 0=open + * | | | | | | | + * +---o---o---o-------------o---o---+ 12V + * | + * | D3 +--/ --1R2--+ | + * | +---R8--+ | | +---R2--+ | + * | | | D2 o--/ --2R2--o | | ||--+ + * +---o--[A>--o------o o--o--[A>--o--|| + * D1 o--/ --4R2--o (4.25R2) ||--+ + * $18 | | | + * 0=open D0 +--/ --8R2--+ (8.75R2) | + * + * vo (AUDIO + * OUT) + * + * + * v1 - voice 1 + * v2 - voice 2 + * v3 - voice 3 + * ve - ext in + * vhp - highpass output + * vbp - bandpass output + * vlp - lowpass output + * vo - audio out + * [A> - single ended inverting op-amp (self-biased NMOS inverter) + * Rn - "resistors", implemented with custom NMOS FETs + * Rw - cutoff frequency resistor (VCR) + * C - capacitor + * ~~~ + * Notes: + * + * R2 ~ 2.0*R1 + * R6 ~ 6.0*R1 + * R8 ~ 8.0*R1 + * R24 ~ 24.0*R1 + * + * The Rn "resistors" in the circuit are implemented with custom NMOS FETs, + * probably because of space constraints on the SID die. The silicon substrate + * is laid out in a narrow strip or "snake", with a strip length proportional + * to the intended resistance. The polysilicon gate electrode covers the entire + * silicon substrate and is fixed at 12V in order for the NMOS FET to operate + * in triode mode (a.k.a. linear mode or ohmic mode). + * + * Even in "linear mode", an NMOS FET is only an approximation of a resistor, + * as the apparant resistance increases with increasing drain-to-source + * voltage. If the drain-to-source voltage should approach the gate voltage + * of 12V, the NMOS FET will enter saturation mode (a.k.a. active mode), and + * the NMOS FET will not operate anywhere like a resistor. + * + * + * + * NMOS FET voltage controlled resistor (VCR) + * ------------------------------------------ + * ~~~ + * Vw + * + * | + * | + * R1 + * | + * +--R1--o + * | __|__ + * | ----- + * | | | + * vi -----o----+ +--o----- vo + * | | + * +----R24----+ + * + * + * vi - input + * vo - output + * Rn - "resistors", implemented with custom NMOS FETs + * Vw - voltage from 11-bit DAC (frequency cutoff control) + * ~~~ + * Notes: + * + * An approximate value for R24 can be found by using the formula for the + * filter cutoff frequency: + * + * FCmin = 1/(2*pi*Rmax*C) + * + * Assuming that a the setting for minimum cutoff frequency in combination with + * a low level input signal ensures that only negligible current will flow + * through the transistor in the schematics above, values for FCmin and C can + * be substituted in this formula to find Rmax. + * Using C = 470pF and FCmin = 220Hz (measured value), we get: + * + * FCmin = 1/(2*pi*Rmax*C) + * Rmax = 1/(2*pi*FCmin*C) = 1/(2*pi*220*470e-12) ~ 1.5MOhm + * + * From this it follows that: + * R24 = Rmax ~ 1.5MOhm + * R1 ~ R24/24 ~ 64kOhm + * R2 ~ 2.0*R1 ~ 128kOhm + * R6 ~ 6.0*R1 ~ 384kOhm + * R8 ~ 8.0*R1 ~ 512kOhm + * + * Note that these are only approximate values for one particular SID chip, + * due to process variations the values can be substantially different in + * other chips. + * + * + * + * Filter frequency cutoff DAC + * --------------------------- + * + * ~~~ + * 12V 10 9 8 7 6 5 4 3 2 1 0 VGND + * | | | | | | | | | | | | | Missing + * 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R 2R termination + * | | | | | | | | | | | | | + * Vw --o-R-o-R-o-R-o-R-o-R-o-R-o-R-o-R-o-R-o-R-o-R-o- -+ + * + * + * Bit on: 12V + * Bit off: 5V (VGND) + * ~~~ + * As is the case with all MOS 6581 DACs, the termination to (virtual) ground + * at bit 0 is missing. + * + * Furthermore, the control of the two VCRs imposes a load on the DAC output + * which varies with the input signals to the VCRs. This can be seen from the + * VCR figure above. + * + * + * + * "Op-amp" (self-biased NMOS inverter) + * ------------------------------------ + * ~~~ + * + * 12V + * + * | + * +-----------o + * | | + * | +------o + * | | | + * | | ||--+ + * | +--|| + * | ||--+ + * ||--+ | + * vi -----|| o---o----- vo + * ||--+ | | + * | ||--+ | + * |-------|| | + * | ||--+ | + * ||--+ | | + * +--|| | | + * | ||--+ | | + * | | | | + * | +-----------o | + * | | | + * | | + * | GND | + * | | + * +----------------------+ + * + * + * vi - input + * vo - output + * ~~~ + * Notes: + * + * The schematics above are laid out to show that the "op-amp" logically + * consists of two building blocks; a saturated load NMOS inverter (on the + * right hand side of the schematics) with a buffer / bias input stage + * consisting of a variable saturated load NMOS inverter (on the left hand + * side of the schematics). + * + * Provided a reasonably high input impedance and a reasonably low output + * impedance, the "op-amp" can be modeled as a voltage transfer function + * mapping input voltage to output voltage. + * + * + * + * Output buffer (NMOS voltage follower) + * ------------------------------------- + * ~~~ + * + * 12V + * + * | + * | + * ||--+ + * vi -----|| + * ||--+ + * | + * o------ vo + * | (AUDIO + * Rext OUT) + * | + * | + * + * GND + * + * vi - input + * vo - output + * Rext - external resistor, 1kOhm + * ~~~ + * Notes: + * + * The external resistor Rext is needed to complete the NMOS voltage follower, + * this resistor has a recommended value of 1kOhm. + * + * Die photographs show that actually, two NMOS transistors are used in the + * voltage follower. However the two transistors are coupled in parallel (all + * terminals are pairwise common), which implies that we can model the two + * transistors as one. + */ +class Filter6581 final : public Filter +{ +private: + const unsigned short* f0_dac; + + unsigned short** mixer; + unsigned short** summer; + unsigned short** gain_res; + unsigned short** gain_vol; + + const int voiceScaleS11; + const int voiceDC; + + /// VCR + associated capacitor connected to highpass output. + std::unique_ptr const hpIntegrator; + + /// VCR + associated capacitor connected to bandpass output. + std::unique_ptr const bpIntegrator; + +protected: + /** + * Set filter cutoff frequency. + */ + void updatedCenterFrequency() override; + + /** + * Set filter resonance. + * + * In the MOS 6581, 1/Q is controlled linearly by res. + */ + void updateResonance(unsigned char res) override { currentResonance = gain_res[res]; } + + void updatedMixing() override; + +public: + Filter6581() : + f0_dac(FilterModelConfig6581::getInstance()->getDAC(0.5)), + mixer(FilterModelConfig6581::getInstance()->getMixer()), + summer(FilterModelConfig6581::getInstance()->getSummer()), + gain_res(FilterModelConfig6581::getInstance()->getGainRes()), + gain_vol(FilterModelConfig6581::getInstance()->getGainVol()), + voiceScaleS11(FilterModelConfig6581::getInstance()->getVoiceScaleS11()), + voiceDC(FilterModelConfig6581::getInstance()->getNormalizedVoiceDC()), + hpIntegrator(FilterModelConfig6581::getInstance()->buildIntegrator()), + bpIntegrator(FilterModelConfig6581::getInstance()->buildIntegrator()) + { + input(0); + } + + ~Filter6581(); + + unsigned short clock(int voice1, int voice2, int voice3) override; + + void input(int sample) override { ve = (sample * voiceScaleS11 * 3 >> 11) + mixer[0][0]; } + + /** + * Set filter curve type based on single parameter. + * + * @param curvePosition 0 .. 1, where 0 sets center frequency high ("light") and 1 sets it low ("dark"), default is 0.5 + */ + void setFilterCurve(double curvePosition); +}; + +} // namespace reSIDfp + +#if RESID_INLINING || defined(FILTER6581_CPP) + +#include "Integrator6581.h" + +namespace reSIDfp +{ + +RESID_INLINE +unsigned short Filter6581::clock(int voice1, int voice2, int voice3) +{ + voice1 = (voice1 * voiceScaleS11 >> 15) + voiceDC; + voice2 = (voice2 * voiceScaleS11 >> 15) + voiceDC; + // Voice 3 is silenced by voice3off if it is not routed through the filter. + voice3 = (filt3 || !voice3off) ? (voice3 * voiceScaleS11 >> 15) + voiceDC : 0; + + int Vi = 0; + int Vo = 0; + + (filt1 ? Vi : Vo) += voice1; + (filt2 ? Vi : Vo) += voice2; + (filt3 ? Vi : Vo) += voice3; + (filtE ? Vi : Vo) += ve; + + Vhp = currentSummer[currentResonance[Vbp] + Vlp + Vi]; + Vbp = hpIntegrator->solve(Vhp); + Vlp = bpIntegrator->solve(Vbp); + + if (lp) Vo += Vlp; + if (bp) Vo += Vbp; + if (hp) Vo += Vhp; + + return currentGain[currentMixer[Vo]]; +} + +} // namespace reSIDfp + +#endif + +#endif diff --git a/src/sound/resid-fp/Filter8580.cpp b/src/sound/resid-fp/Filter8580.cpp new file mode 100644 index 000000000..a70285a8a --- /dev/null +++ b/src/sound/resid-fp/Filter8580.cpp @@ -0,0 +1,101 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2019 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define FILTER8580_CPP + +#include "Filter8580.h" + +#include "Integrator8580.h" + +namespace reSIDfp +{ + +/** + * W/L ratio of frequency DAC bit 0, + * other bit are proportional. + * When no bit are selected a resistance with half + * W/L ratio is selected. + */ +const double DAC_WL0 = 0.00615; + +Filter8580::~Filter8580() {} + +void Filter8580::updatedCenterFrequency() +{ + double wl; + double dacWL = DAC_WL0; + if (fc) + { + wl = 0.; + for (unsigned int i = 0; i < 11; i++) + { + if (fc & (1 << i)) + { + wl += dacWL; + } + dacWL *= 2.; + } + } + else + { + wl = dacWL/2.; + } + + hpIntegrator->setFc(wl); + bpIntegrator->setFc(wl); +} + +void Filter8580::updatedMixing() +{ + currentGain = gain_vol[vol]; + + unsigned int ni = 0; + unsigned int no = 0; + + (filt1 ? ni : no)++; + (filt2 ? ni : no)++; + + if (filt3) ni++; + else if (!voice3off) no++; + + (filtE ? ni : no)++; + + currentSummer = summer[ni]; + + if (lp) no++; + if (bp) no++; + if (hp) no++; + + currentMixer = mixer[no]; +} + +void Filter8580::setFilterCurve(double curvePosition) +{ + // Adjust cp + // 1.2 <= cp <= 1.8 + cp = 1.8 - curvePosition * 3./5.; + + hpIntegrator->setV(cp); + bpIntegrator->setV(cp); +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/Filter8580.h b/src/sound/resid-fp/Filter8580.h new file mode 100644 index 000000000..2166ec0da --- /dev/null +++ b/src/sound/resid-fp/Filter8580.h @@ -0,0 +1,383 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2022 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef FILTER8580_H +#define FILTER8580_H + +#include "siddefs-fp.h" + +#include + +#include "Filter.h" +#include "FilterModelConfig8580.h" +#include "Integrator8580.h" + +#include "sidcxx11.h" + +namespace reSIDfp +{ + +class Integrator8580; + +/** + * Filter for 8580 chip + * -------------------- + * The 8580 filter stage had been redesigned to be more linear and robust + * against temperature change. It also features real op-amps and a + * revisited resonance model. + * The filter schematics below are reverse engineered from re-vectorized + * and annotated die photographs. Credits to Michael Huth for the microscope + * photographs of the die, Tommi Lempinen for re-vectorizating and annotating + * the images and ttlworks from forum.6502.org for the circuit analysis. + * + * ~~~ + * + * +---------------------------------------------------+ + * | $17 +----Rf-+ | + * | | | | + * | D4&!D5 o- \-R3-o | + * | | | $17 | + * | !D4&!D5 o- \-R2-o | + * | | | +---R8-- \--+ !D6&D7 | + * | D4&!D5 o- \-R1-o | | | + * | | | o---RC-- \--o D6&D7 | + * | +---------o----o--Rfc-o--[A>--o--Rfc-o--[A>--o + * ve (EXT IN) | | | | + * D3 \ --------------R12--o | | (CAP2A) | (CAP1A) + * | v3 | | vhp | vbp | vlp + * D2 | \ -----------R7--o +-----+ | | + * | | v2 | | | | + * D1 | | \ -------R7--o | +----------------+ | + * | | | v1 | | | | + * D0 | | | \ ---R7--+ | | +---------------------------+ + * | | | | | | | + * R9 R5 R5 R5 R5 R5 R5 + * | | | | $18 | | | $18 + * | \ | | D7: 1=open \ \ \ D6 - D4: 0=open + * | | | | | | | + * +---o---o---o-------------o---o---+ + * | + * | D3 +--/ --1R4--+ + * | +---R8--+ | | +---R2--+ + * | | | D2 o--/ --2R4--o | | + * +---o--[A>--o------o o--o--[A>--o-- vo (AUDIO OUT) + * D1 o--/ --4R4--o + * $18 | | + * 0=open D0 +--/ --8R4--+ + * + * + * + * Resonance + * --------- + * For resonance, we have two tiny DACs that controls both the input + * and feedback resistances. + * + * The "resistors" are switched in as follows by bits in register $17: + * + * feedback: + * R1: bit4&!bit5 + * R2: !bit4&bit5 + * R3: bit4&bit5 + * Rf: always on + * + * input: + * R4: bit6&!bit7 + * R8: !bit6&bit7 + * RC: bit6&bit7 + * Ri: !(R4|R8|RC) = !(bit6|bit7) = !bit6&!bit7 + * + * + * The relative "resistor" values are approximately (using channel length): + * + * R1 = 15.3*Ri + * R2 = 7.3*Ri + * R3 = 4.7*Ri + * Rf = 1.4*Ri + * R4 = 1.4*Ri + * R8 = 2.0*Ri + * RC = 2.8*Ri + * + * + * Approximate values for 1/Q can now be found as follows (assuming an + * ideal op-amp): + * + * res feedback input -gain (1/Q) + * --- -------- ----- ---------- + * 0 Rf Ri Rf/Ri = 1/(Ri*(1/Rf)) = 1/0.71 + * 1 Rf|R1 Ri (Rf|R1)/Ri = 1/(Ri*(1/Rf+1/R1)) = 1/0.78 + * 2 Rf|R2 Ri (Rf|R2)/Ri = 1/(Ri*(1/Rf+1/R2)) = 1/0.85 + * 3 Rf|R3 Ri (Rf|R3)/Ri = 1/(Ri*(1/Rf+1/R3)) = 1/0.92 + * 4 Rf R4 Rf/R4 = 1/(R4*(1/Rf)) = 1/1.00 + * 5 Rf|R1 R4 (Rf|R1)/R4 = 1/(R4*(1/Rf+1/R1)) = 1/1.10 + * 6 Rf|R2 R4 (Rf|R2)/R4 = 1/(R4*(1/Rf+1/R2)) = 1/1.20 + * 7 Rf|R3 R4 (Rf|R3)/R4 = 1/(R4*(1/Rf+1/R3)) = 1/1.30 + * 8 Rf R8 Rf/R8 = 1/(R8*(1/Rf)) = 1/1.43 + * 9 Rf|R1 R8 (Rf|R1)/R8 = 1/(R8*(1/Rf+1/R1)) = 1/1.56 + * A Rf|R2 R8 (Rf|R2)/R8 = 1/(R8*(1/Rf+1/R2)) = 1/1.70 + * B Rf|R3 R8 (Rf|R3)/R8 = 1/(R8*(1/Rf+1/R3)) = 1/1.86 + * C Rf RC Rf/RC = 1/(RC*(1/Rf)) = 1/2.00 + * D Rf|R1 RC (Rf|R1)/RC = 1/(RC*(1/Rf+1/R1)) = 1/2.18 + * E Rf|R2 RC (Rf|R2)/RC = 1/(RC*(1/Rf+1/R2)) = 1/2.38 + * F Rf|R3 RC (Rf|R3)/RC = 1/(RC*(1/Rf+1/R3)) = 1/2.60 + * + * + * These data indicate that the following function for 1/Q has been + * modeled in the MOS 8580: + * + * 1/Q = 2^(1/2)*2^(-x/8) = 2^(1/2 - x/8) = 2^((4 - x)/8) + * + * + * + * Op-amps + * ------- + * Unlike the 6581, the 8580 has real OpAmps. + * + * Temperature compensated differential amplifier: + * + * 9V + * + * | + * +-------o-o-o-------+ + * | | | | + * | R R | + * +--|| | | ||--+ + * ||---o o---|| + * +--|| | | ||--+ + * | | | | + * o-----+ | | o--- Va + * | | | | | + * +--|| | | | ||--+ + * ||-o-+---+---|| + * +--|| | | ||--+ + * | | | | + * | | + * GND | | GND + * ||--+ +--|| + * in- -----|| ||------ in+ + * ||----o----|| + * | + * 8 Current sink + * | + * + * GND + * + * Inverter + non-inverting output amplifier: + * + * Va ---o---||-------------------o--------------------+ + * | | 9V | + * | +----------+----------+ | | + * | 9V | | 9V | ||--+ | + * | | | 9V | | +-|| | + * | R | | | ||--+ ||--+ | + * | | | ||--+ +--|| o---o--- Vout + * | o---o---|| ||--+ ||--+ + * | | ||--+ o-----|| + * | ||--+ | ||--+ ||--+ + * +-----|| o-----|| | + * ||--+ | ||--+ + * | R | GND + * | + * GND GND + * GND + * + * + * + * Virtual ground + * -------------- + * A PolySi resitive voltage divider provides the voltage + * for the positive input of the filter op-amps. + * + * 5V + * +----------+ + * | | |\ | + * R1 +---|-\ | + * 5V | |A >---o--- Vref + * o-------|+/ + * | | |/ + * R10 R4 + * | | + * o---+ + * | + * R10 + * | + * + * GND + * + * Rn = n*R1 + * + * + * + * Rfc - freq control DAC resistance ladder + * ---------------------------------------- + * The 8580 has 11 bits for frequency control, but 12 bit DACs. + * If those 11 bits would be '0', the impedance of the DACs would be "infinitely high". + * To get around this, there is an 11 input NOR gate below the DACs sensing those 11 bits. + * If all are 0, the NOR gate gives the gate control voltage to the 12 bit DAC LSB. + * + * ----o---o--...--o---o---o--- + * | | | | | + * Rb10 Rb9 ... Rb1 Rb0 R0 + * | | | | | + * ----o---o--...--o---o---o--- + * + * + * + * Crystal stabilized precision switched capacitor voltage divider + * --------------------------------------------------------------- + * There is a FET working as a temperature sensor close to the DACs which changes the gate voltage + * of the frequency control DACs according to the temperature of the DACs, + * to reduce the effects of temperature on the filter curve. + * An asynchronous 3 bit binary counter, running at the speed of PHI2, drives two big capacitors + * whose AC resistance is then used as a voltage divider. + * This implicates that frequency difference between PAL and NTSC might shift the filter curve by 4% or such. + * + * |\ OpAmp has a smaller capacitor than the other OPs + * Vref ---|+\ + * |A >---o--- Vdac + * +-------|-/ | + * | |/ | + * | | + * C1 | C2 | + * +---||---o---+ +---o-----||-------o + * | | | | | | + * o----+ | ----- | | + * | | | ----- +----+ +-----o + * | ----- | | | | + * | ----- | ----- | + * | | | ----- | + * | +-----------+ | | + * | /Q Q | +-------+ + * GND +-----------+ FET close to DAC + * | clk/8 | working as temperature sensor + * +-----------+ + */ +class Filter8580 final : public Filter +{ +private: + unsigned short** mixer; + unsigned short** summer; + unsigned short** gain_res; + unsigned short** gain_vol; + + const int voiceScaleS11; + const int voiceDC; + + double cp; + + /// VCR + associated capacitor connected to highpass output. + std::unique_ptr const hpIntegrator; + + /// VCR + associated capacitor connected to bandpass output. + std::unique_ptr const bpIntegrator; + +protected: + /** + * Set filter cutoff frequency. + */ + void updatedCenterFrequency() override; + + /** + * Set filter resonance. + * + * @param res the new resonance value + */ + void updateResonance(unsigned char res) override { currentResonance = gain_res[res]; } + + void updatedMixing() override; + +public: + Filter8580() : + mixer(FilterModelConfig8580::getInstance()->getMixer()), + summer(FilterModelConfig8580::getInstance()->getSummer()), + gain_res(FilterModelConfig8580::getInstance()->getGainRes()), + gain_vol(FilterModelConfig8580::getInstance()->getGainVol()), + voiceScaleS11(FilterModelConfig8580::getInstance()->getVoiceScaleS11()), + voiceDC(FilterModelConfig8580::getInstance()->getNormalizedVoiceDC()), + cp(0.5), + hpIntegrator(FilterModelConfig8580::getInstance()->buildIntegrator()), + bpIntegrator(FilterModelConfig8580::getInstance()->buildIntegrator()) + { + setFilterCurve(cp); + input(0); + } + + ~Filter8580(); + + unsigned short clock(int voice1, int voice2, int voice3) override; + + void input(int sample) override { ve = (sample * voiceScaleS11 * 3 >> 11) + mixer[0][0]; } + + /** + * Set filter curve type based on single parameter. + * + * @param curvePosition 0 .. 1, where 0 sets center frequency high ("light") and 1 sets it low ("dark"), default is 0.5 + */ + void setFilterCurve(double curvePosition); +}; + +} // namespace reSIDfp + +#if RESID_INLINING || defined(FILTER8580_CPP) + +namespace reSIDfp +{ + +RESID_INLINE +unsigned short Filter8580::clock(int voice1, int voice2, int voice3) +{ + voice1 = (voice1 * voiceScaleS11 >> 15) + voiceDC; + voice2 = (voice2 * voiceScaleS11 >> 15) + voiceDC; + // Voice 3 is silenced by voice3off if it is not routed through the filter. + voice3 = (filt3 || !voice3off) ? (voice3 * voiceScaleS11 >> 15) + voiceDC : 0; + + int Vi = 0; + int Vo = 0; + + (filt1 ? Vi : Vo) += voice1; + (filt2 ? Vi : Vo) += voice2; + (filt3 ? Vi : Vo) += voice3; + (filtE ? Vi : Vo) += ve; + + Vhp = currentSummer[currentResonance[Vbp] + Vlp + Vi]; + Vbp = hpIntegrator->solve(Vhp); + Vlp = bpIntegrator->solve(Vbp); + + if (lp) Vo += Vlp; + if (bp) Vo += Vbp; + if (hp) Vo += Vhp; + + return currentGain[currentMixer[Vo]]; +} + +} // namespace reSIDfp + +#endif + +#endif diff --git a/src/sound/resid-fp/FilterModelConfig.cpp b/src/sound/resid-fp/FilterModelConfig.cpp new file mode 100644 index 000000000..cd4b20400 --- /dev/null +++ b/src/sound/resid-fp/FilterModelConfig.cpp @@ -0,0 +1,82 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2022 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "FilterModelConfig.h" + +#include + +namespace reSIDfp +{ + +FilterModelConfig::FilterModelConfig( + double vvr, + double vdv, + double c, + double vdd, + double vth, + double ucox, + const Spline::Point *opamp_voltage, + int opamp_size +) : + voice_voltage_range(vvr), + voice_DC_voltage(vdv), + C(c), + Vdd(vdd), + Vth(vth), + Ut(26.0e-3), + uCox(ucox), + Vddt(Vdd - Vth), + vmin(opamp_voltage[0].x), + vmax(std::max(Vddt, opamp_voltage[0].y)), + denorm(vmax - vmin), + norm(1.0 / denorm), + N16(norm * ((1 << 16) - 1)), + currFactorCoeff(denorm * (uCox / 2. * 1.0e-6 / C)) +{ + // Convert op-amp voltage transfer to 16 bit values. + + std::vector scaled_voltage(opamp_size); + + for (int i = 0; i < opamp_size; i++) + { + scaled_voltage[i].x = N16 * (opamp_voltage[i].x - opamp_voltage[i].y) / 2.; + // We add 32768 to get a positive number in the range [0-65535] + scaled_voltage[i].x += static_cast(1u << 15); + + scaled_voltage[i].y = N16 * (opamp_voltage[i].x - vmin); + } + + // Create lookup table mapping capacitor voltage to op-amp input voltage: + + Spline s(scaled_voltage); + + for (int x = 0; x < (1 << 16); x++) + { + const Spline::Point out = s.evaluate(x); + // When interpolating outside range the first elements may be negative + double tmp = out.x > 0. ? out.x : 0.; + assert(tmp < 65535.5); + opamp_rev[x] = static_cast(tmp + 0.5); + } +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/FilterModelConfig.h b/src/sound/resid-fp/FilterModelConfig.h new file mode 100644 index 000000000..9e557d363 --- /dev/null +++ b/src/sound/resid-fp/FilterModelConfig.h @@ -0,0 +1,165 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef FILTERMODELCONFIG_H +#define FILTERMODELCONFIG_H + +#include +#include + +#include "Spline.h" + +#include "sidcxx11.h" + +namespace reSIDfp +{ + +class FilterModelConfig +{ +protected: + const double voice_voltage_range; + const double voice_DC_voltage; + + /// Capacitor value. + const double C; + + /// Transistor parameters. + //@{ + const double Vdd; + const double Vth; ///< Threshold voltage + const double Ut; ///< Thermal voltage: Ut = kT/q = 8.61734315e-5*T ~ 26mV + const double uCox; ///< Transconductance coefficient: u*Cox + const double Vddt; ///< Vdd - Vth + //@} + + // Derived stuff + const double vmin, vmax; + const double denorm, norm; + + /// Fixed point scaling for 16 bit op-amp output. + const double N16; + + /// Current factor coefficient for op-amp integrators. + const double currFactorCoeff; + + /// Lookup tables for gain and summer op-amps in output stage / filter. + //@{ + unsigned short* mixer[8]; //-V730_NOINIT this is initialized in the derived class constructor + unsigned short* summer[5]; //-V730_NOINIT this is initialized in the derived class constructor + unsigned short* gain_vol[16]; //-V730_NOINIT this is initialized in the derived class constructor + unsigned short* gain_res[16]; //-V730_NOINIT this is initialized in the derived class constructor + //@} + + /// Reverse op-amp transfer function. + unsigned short opamp_rev[1 << 16]; //-V730_NOINIT this is initialized in the derived class constructor + +private: + FilterModelConfig (const FilterModelConfig&) DELETE; + FilterModelConfig& operator= (const FilterModelConfig&) DELETE; + +protected: + /** + * @param vvr voice voltage range + * @param vdv voice DC voltage + * @param c capacitor value + * @param vdd Vdd + * @param vth threshold voltage + * @param ucox u*Cox + * @param ominv opamp min voltage + * @param omaxv opamp max voltage + */ + FilterModelConfig( + double vvr, + double vdv, + double c, + double vdd, + double vth, + double ucox, + const Spline::Point *opamp_voltage, + int opamp_size + ); + + ~FilterModelConfig() + { + for (int i = 0; i < 8; i++) + { + delete [] mixer[i]; + } + + for (int i = 0; i < 5; i++) + { + delete [] summer[i]; + } + + for (int i = 0; i < 16; i++) + { + delete [] gain_vol[i]; + delete [] gain_res[i]; + } + } + +public: + unsigned short** getGainVol() { return gain_vol; } + unsigned short** getGainRes() { return gain_res; } + unsigned short** getSummer() { return summer; } + unsigned short** getMixer() { return mixer; } + + /** + * The digital range of one voice is 20 bits; create a scaling term + * for multiplication which fits in 11 bits. + */ + int getVoiceScaleS11() const { return static_cast((norm * ((1 << 11) - 1)) * voice_voltage_range); } + + /** + * The "zero" output level of the voices. + */ + int getNormalizedVoiceDC() const { return static_cast(N16 * (voice_DC_voltage - vmin)); } + + inline unsigned short getOpampRev(int i) const { return opamp_rev[i]; } + inline double getVddt() const { return Vddt; } + inline double getVth() const { return Vth; } + + // helper functions + inline unsigned short getNormalizedValue(double value) const + { + const double tmp = N16 * (value - vmin); + assert(tmp > -0.5 && tmp < 65535.5); + return static_cast(tmp + 0.5); + } + + inline unsigned short getNormalizedCurrentFactor(double wl) const + { + const double tmp = (1 << 13) * currFactorCoeff * wl; + assert(tmp > -0.5 && tmp < 65535.5); + return static_cast(tmp + 0.5); + } + + inline unsigned short getNVmin() const { + const double tmp = N16 * vmin; + assert(tmp > -0.5 && tmp < 65535.5); + return static_cast(tmp + 0.5); + } +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/FilterModelConfig6581.cpp b/src/sound/resid-fp/FilterModelConfig6581.cpp new file mode 100644 index 000000000..7a80802e9 --- /dev/null +++ b/src/sound/resid-fp/FilterModelConfig6581.cpp @@ -0,0 +1,328 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "FilterModelConfig6581.h" + +#include + +#include "Integrator6581.h" +#include "OpAmp.h" + +namespace reSIDfp +{ + +#ifndef HAVE_CXX11 +/** + * Compute log(1+x) without losing precision for small values of x + * + * @note when compiling with -ffastm-math the compiler will + * optimize the expression away leaving a plain log(1. + x) + */ +inline double log1p(double x) +{ + return log(1. + x) - (((1. + x) - 1.) - x) / (1. + x); +} +#endif + +const unsigned int OPAMP_SIZE = 33; + +/** + * This is the SID 6581 op-amp voltage transfer function, measured on + * CAP1B/CAP1A on a chip marked MOS 6581R4AR 0687 14. + * All measured chips have op-amps with output voltages (and thus input + * voltages) within the range of 0.81V - 10.31V. + */ +const Spline::Point opamp_voltage[OPAMP_SIZE] = +{ + { 0.81, 10.31 }, // Approximate start of actual range + { 2.40, 10.31 }, + { 2.60, 10.30 }, + { 2.70, 10.29 }, + { 2.80, 10.26 }, + { 2.90, 10.17 }, + { 3.00, 10.04 }, + { 3.10, 9.83 }, + { 3.20, 9.58 }, + { 3.30, 9.32 }, + { 3.50, 8.69 }, + { 3.70, 8.00 }, + { 4.00, 6.89 }, + { 4.40, 5.21 }, + { 4.54, 4.54 }, // Working point (vi = vo) + { 4.60, 4.19 }, + { 4.80, 3.00 }, + { 4.90, 2.30 }, // Change of curvature + { 4.95, 2.03 }, + { 5.00, 1.88 }, + { 5.05, 1.77 }, + { 5.10, 1.69 }, + { 5.20, 1.58 }, + { 5.40, 1.44 }, + { 5.60, 1.33 }, + { 5.80, 1.26 }, + { 6.00, 1.21 }, + { 6.40, 1.12 }, + { 7.00, 1.02 }, + { 7.50, 0.97 }, + { 8.50, 0.89 }, + { 10.00, 0.81 }, + { 10.31, 0.81 }, // Approximate end of actual range +}; + +std::unique_ptr FilterModelConfig6581::instance(nullptr); + +FilterModelConfig6581* FilterModelConfig6581::getInstance() +{ + if (!instance.get()) + { + instance.reset(new FilterModelConfig6581()); + } + + return instance.get(); +} + +FilterModelConfig6581::FilterModelConfig6581() : + FilterModelConfig( + 1.5, // voice voltage range + 5.075, // voice DC voltage + 470e-12, // capacitor value + 12.18, // Vdd + 1.31, // Vth + 20e-6, // uCox + opamp_voltage, + OPAMP_SIZE + ), + WL_vcr(9.0 / 1.0), + WL_snake(1.0 / 115.0), + dac_zero(6.65), + dac_scale(2.63), + dac(DAC_BITS) +{ + dac.kinkedDac(MOS6581); + + // Create lookup tables for gains / summers. + +#ifndef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + + #pragma omp parallel sections + { + #pragma omp section + { +#ifdef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + // The filter summer operates at n ~ 1, and has 5 fundamentally different + // input configurations (2 - 6 input "resistors"). + // + // Note that all "on" transistors are modeled as one. This is not + // entirely accurate, since the input for each transistor is different, + // and transistors are not linear components. However modeling all + // transistors separately would be extremely costly. + for (int i = 0; i < 5; i++) + { + const int idiv = 2 + i; // 2 - 6 input "resistors". + const int size = idiv << 16; + const double n = idiv; + opampModel.reset(); + summer[i] = new unsigned short[size]; + + for (int vi = 0; vi < size; vi++) + { + const double vin = vmin + vi / N16 / idiv; /* vmin .. vmax */ + summer[i][vi] = getNormalizedValue(opampModel.solve(n, vin)); + } + } + } + + #pragma omp section + { +#ifdef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + // The audio mixer operates at n ~ 8/6, and has 8 fundamentally different + // input configurations (0 - 7 input "resistors"). + // + // All "on", transistors are modeled as one - see comments above for + // the filter summer. + for (int i = 0; i < 8; i++) + { + const int idiv = (i == 0) ? 1 : i; + const int size = (i == 0) ? 1 : i << 16; + const double n = i * 8.0 / 6.0; + opampModel.reset(); + mixer[i] = new unsigned short[size]; + + for (int vi = 0; vi < size; vi++) + { + const double vin = vmin + vi / N16 / idiv; /* vmin .. vmax */ + mixer[i][vi] = getNormalizedValue(opampModel.solve(n, vin)); + } + } + } + + #pragma omp section + { +#ifdef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + // 4 bit "resistor" ladders in the audio output gain + // necessitate 16 gain tables. + // From die photographs of the volume "resistor" ladders + // it follows that gain ~ vol/12 (assuming ideal + // op-amps and ideal "resistors"). + for (int n8 = 0; n8 < 16; n8++) + { + const int size = 1 << 16; + const double n = n8 / 12.0; + opampModel.reset(); + gain_vol[n8] = new unsigned short[size]; + + for (int vi = 0; vi < size; vi++) + { + const double vin = vmin + vi / N16; /* vmin .. vmax */ + gain_vol[n8][vi] = getNormalizedValue(opampModel.solve(n, vin)); + } + } + } + + #pragma omp section + { +#ifdef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + // 4 bit "resistor" ladders in the bandpass resonance gain + // necessitate 16 gain tables. + // From die photographs of the bandpass "resistor" ladders + // it follows that 1/Q ~ ~res/8 (assuming ideal + // op-amps and ideal "resistors"). + for (int n8 = 0; n8 < 16; n8++) + { + const int size = 1 << 16; + const double n = (~n8 & 0xf) / 8.0; + opampModel.reset(); + gain_res[n8] = new unsigned short[size]; + + for (int vi = 0; vi < size; vi++) + { + const double vin = vmin + vi / N16; /* vmin .. vmax */ + gain_res[n8][vi] = getNormalizedValue(opampModel.solve(n, vin)); + } + } + } + + #pragma omp section + { + const double nVddt = N16 * (Vddt - vmin); + + for (unsigned int i = 0; i < (1 << 16); i++) + { + // The table index is right-shifted 16 times in order to fit in + // 16 bits; the argument to sqrt is thus multiplied by (1 << 16). + const double tmp = nVddt - sqrt(static_cast(i << 16)); + assert(tmp > -0.5 && tmp < 65535.5); + vcr_nVg[i] = static_cast(tmp + 0.5); + } + } + + #pragma omp section + { + // EKV model: + // + // Ids = Is * (if - ir) + // Is = (2 * u*Cox * Ut^2)/k * W/L + // if = ln^2(1 + e^((k*(Vg - Vt) - Vs)/(2*Ut)) + // ir = ln^2(1 + e^((k*(Vg - Vt) - Vd)/(2*Ut)) + + // moderate inversion characteristic current + const double Is = (2. * uCox * Ut * Ut) * WL_vcr; + + // Normalized current factor for 1 cycle at 1MHz. + const double N15 = norm * ((1 << 15) - 1); + const double n_Is = N15 * 1.0e-6 / C * Is; + + // kVgt_Vx = k*(Vg - Vt) - Vx + // I.e. if k != 1.0, Vg must be scaled accordingly. + for (int kVgt_Vx = 0; kVgt_Vx < (1 << 16); kVgt_Vx++) + { + const double log_term = log1p(exp((kVgt_Vx / N16) / (2. * Ut))); + // Scaled by m*2^15 + const double tmp = n_Is * log_term * log_term; + assert(tmp > -0.5 && tmp < 65535.5); + vcr_n_Ids_term[kVgt_Vx] = static_cast(tmp + 0.5); + } + } + } +} + +unsigned short* FilterModelConfig6581::getDAC(double adjustment) const +{ + const double dac_zero = getDacZero(adjustment); + + unsigned short* f0_dac = new unsigned short[1 << DAC_BITS]; + + for (unsigned int i = 0; i < (1 << DAC_BITS); i++) + { + const double fcd = dac.getOutput(i); + f0_dac[i] = getNormalizedValue(dac_zero + fcd * dac_scale / (1 << DAC_BITS)); + } + + return f0_dac; +} + +std::unique_ptr FilterModelConfig6581::buildIntegrator() +{ + return MAKE_UNIQUE(Integrator6581, this, WL_snake); +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/FilterModelConfig6581.h b/src/sound/resid-fp/FilterModelConfig6581.h new file mode 100644 index 000000000..06fcc5ce8 --- /dev/null +++ b/src/sound/resid-fp/FilterModelConfig6581.h @@ -0,0 +1,112 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2020 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef FILTERMODELCONFIG6581_H +#define FILTERMODELCONFIG6581_H + +#include "FilterModelConfig.h" + +#include + +#include "Dac.h" + +#include "sidcxx11.h" + +namespace reSIDfp +{ + +class Integrator6581; + +/** + * Calculate parameters for 6581 filter emulation. + */ +class FilterModelConfig6581 final : public FilterModelConfig +{ +private: + static const unsigned int DAC_BITS = 11; + +private: + static std::unique_ptr instance; + // This allows access to the private constructor +#ifdef HAVE_CXX11 + friend std::unique_ptr::deleter_type; +#else + friend class std::auto_ptr; +#endif + + /// Transistor parameters. + //@{ + const double WL_vcr; ///< W/L for VCR + const double WL_snake; ///< W/L for "snake" + //@} + + /// DAC parameters. + //@{ + const double dac_zero; + const double dac_scale; + //@} + + /// DAC lookup table + Dac dac; + + /// VCR - 6581 only. + //@{ + unsigned short vcr_nVg[1 << 16]; + unsigned short vcr_n_Ids_term[1 << 16]; + //@} + +private: + double getDacZero(double adjustment) const { return dac_zero + (1. - adjustment); } + + FilterModelConfig6581(); + ~FilterModelConfig6581() DEFAULT; + +public: + static FilterModelConfig6581* getInstance(); + + /** + * Construct an 11 bit cutoff frequency DAC output voltage table. + * Ownership is transferred to the requester which becomes responsible + * of freeing the object when done. + * + * @param adjustment + * @return the DAC table + */ + unsigned short* getDAC(double adjustment) const; + + /** + * Construct an integrator solver. + * + * @return the integrator + */ + std::unique_ptr buildIntegrator(); + + inline unsigned short getVcr_nVg(int i) const { return vcr_nVg[i]; } + inline unsigned short getVcr_n_Ids_term(int i) const { return vcr_n_Ids_term[i]; } + // only used if SLOPE_FACTOR is defined + inline double getUt() const { return Ut; } + inline double getN16() const { return N16; } +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/FilterModelConfig8580.cpp b/src/sound/resid-fp/FilterModelConfig8580.cpp new file mode 100644 index 000000000..fe294d8ce --- /dev/null +++ b/src/sound/resid-fp/FilterModelConfig8580.cpp @@ -0,0 +1,282 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "FilterModelConfig8580.h" + +#include "Integrator8580.h" +#include "OpAmp.h" + + +namespace reSIDfp +{ + +/* + * R1 = 15.3*Ri + * R2 = 7.3*Ri + * R3 = 4.7*Ri + * Rf = 1.4*Ri + * R4 = 1.4*Ri + * R8 = 2.0*Ri + * RC = 2.8*Ri + * + * res feedback input + * --- -------- ----- + * 0 Rf Ri + * 1 Rf|R1 Ri + * 2 Rf|R2 Ri + * 3 Rf|R3 Ri + * 4 Rf R4 + * 5 Rf|R1 R4 + * 6 Rf|R2 R4 + * 7 Rf|R3 R4 + * 8 Rf R8 + * 9 Rf|R1 R8 + * A Rf|R2 R8 + * B Rf|R3 R8 + * C Rf RC + * D Rf|R1 RC + * E Rf|R2 RC + * F Rf|R3 RC + */ +const double resGain[16] = +{ + 1.4/1.0, // Rf/Ri 1.4 + ((1.4*15.3)/(1.4+15.3))/1.0, // (Rf|R1)/Ri 1.28263 + ((1.4*7.3)/(1.4+7.3))/1.0, // (Rf|R2)/Ri 1.17471 + ((1.4*4.7)/(1.4+4.7))/1.0, // (Rf|R3)/Ri 1.07869 + 1.4/1.4, // Rf/R4 1 + ((1.4*15.3)/(1.4+15.3))/1.4, // (Rf|R1)/R4 0.916168 + ((1.4*7.3)/(1.4+7.3))/1.4, // (Rf|R2)/R4 0.83908 + ((1.4*4.7)/(1.4+4.7))/1.4, // (Rf|R3)/R4 0.770492 + 1.4/2.0, // Rf/R8 0.7 + ((1.4*15.3)/(1.4+15.3))/2.0, // (Rf|R1)/R8 0.641317 + ((1.4*7.3)/(1.4+7.3))/2.0, // (Rf|R2)/R8 0.587356 + ((1.4*4.7)/(1.4+4.7))/2.0, // (Rf|R3)/R8 0.539344 + 1.4/2.8, // Rf/RC 0.5 + ((1.4*15.3)/(1.4+15.3))/2.8, // (Rf|R1)/RC 0.458084 + ((1.4*7.3)/(1.4+7.3))/2.8, // (Rf|R2)/RC 0.41954 + ((1.4*4.7)/(1.4+4.7))/2.8, // (Rf|R3)/RC 0.385246 +}; + +const unsigned int OPAMP_SIZE = 21; + +/** + * This is the SID 8580 op-amp voltage transfer function, measured on + * CAP1B/CAP1A on a chip marked CSG 8580R5 1690 25. + */ +const Spline::Point opamp_voltage[OPAMP_SIZE] = +{ + { 1.30, 8.91 }, // Approximate start of actual range + { 4.76, 8.91 }, + { 4.77, 8.90 }, + { 4.78, 8.88 }, + { 4.785, 8.86 }, + { 4.79, 8.80 }, + { 4.795, 8.60 }, + { 4.80, 8.25 }, + { 4.805, 7.50 }, + { 4.81, 6.10 }, + { 4.815, 4.05 }, // Change of curvature + { 4.82, 2.27 }, + { 4.825, 1.65 }, + { 4.83, 1.55 }, + { 4.84, 1.47 }, + { 4.85, 1.43 }, + { 4.87, 1.37 }, + { 4.90, 1.34 }, + { 5.00, 1.30 }, + { 5.10, 1.30 }, + { 8.91, 1.30 }, // Approximate end of actual range +}; + +std::unique_ptr FilterModelConfig8580::instance(nullptr); + +FilterModelConfig8580* FilterModelConfig8580::getInstance() +{ + if (!instance.get()) + { + instance.reset(new FilterModelConfig8580()); + } + + return instance.get(); +} + +FilterModelConfig8580::FilterModelConfig8580() : + FilterModelConfig( + 0.30, // voice voltage range FIXME measure + 4.84, // voice DC voltage FIXME measure + 22e-9, // capacitor value + 9.09, // Vdd + 0.80, // Vth + 100e-6, // uCox + opamp_voltage, + OPAMP_SIZE + ) +{ + // Create lookup tables for gains / summers. +#ifndef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + + #pragma omp parallel sections + { + #pragma omp section + { +#ifdef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + // The filter summer operates at n ~ 1, and has 5 fundamentally different + // input configurations (2 - 6 input "resistors"). + // + // Note that all "on" transistors are modeled as one. This is not + // entirely accurate, since the input for each transistor is different, + // and transistors are not linear components. However modeling all + // transistors separately would be extremely costly. + for (int i = 0; i < 5; i++) + { + const int idiv = 2 + i; // 2 - 6 input "resistors". + const int size = idiv << 16; + const double n = idiv; + opampModel.reset(); + summer[i] = new unsigned short[size]; + + for (int vi = 0; vi < size; vi++) + { + const double vin = vmin + vi / N16 / idiv; /* vmin .. vmax */ + summer[i][vi] = getNormalizedValue(opampModel.solve(n, vin)); + } + } + } + + #pragma omp section + { +#ifdef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + // The audio mixer operates at n ~ 8/5, and has 8 fundamentally different + // input configurations (0 - 7 input "resistors"). + // + // All "on", transistors are modeled as one - see comments above for + // the filter summer. + for (int i = 0; i < 8; i++) + { + const int idiv = (i == 0) ? 1 : i; + const int size = (i == 0) ? 1 : i << 16; + const double n = i * 8.0 / 5.0; + opampModel.reset(); + mixer[i] = new unsigned short[size]; + + for (int vi = 0; vi < size; vi++) + { + const double vin = vmin + vi / N16 / idiv; /* vmin .. vmax */ + mixer[i][vi] = getNormalizedValue(opampModel.solve(n, vin)); + } + } + } + + #pragma omp section + { +#ifdef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + // 4 bit "resistor" ladders in the audio output gain + // necessitate 16 gain tables. + // From die photographs of the volume "resistor" ladders + // it follows that gain ~ vol/16 (assuming ideal + // op-amps and ideal "resistors"). + for (int n8 = 0; n8 < 16; n8++) + { + const int size = 1 << 16; + const double n = n8 / 16.0; + opampModel.reset(); + gain_vol[n8] = new unsigned short[size]; + + for (int vi = 0; vi < size; vi++) + { + const double vin = vmin + vi / N16; /* vmin .. vmax */ + gain_vol[n8][vi] = getNormalizedValue(opampModel.solve(n, vin)); + } + } + } + + #pragma omp section + { +#ifdef _OPENMP + OpAmp opampModel( + std::vector( + std::begin(opamp_voltage), + std::end(opamp_voltage)), + Vddt, + vmin, + vmax); +#endif + // 4 bit "resistor" ladders in the bandpass resonance gain + // necessitate 16 gain tables. + // From die photographs of the bandpass "resistor" ladders + // it follows that 1/Q ~ 2^((4 - res)/8) (assuming ideal + // op-amps and ideal "resistors"). + for (int n8 = 0; n8 < 16; n8++) + { + const int size = 1 << 16; + opampModel.reset(); + gain_res[n8] = new unsigned short[size]; + + for (int vi = 0; vi < size; vi++) + { + const double vin = vmin + vi / N16; /* vmin .. vmax */ + gain_res[n8][vi] = getNormalizedValue(opampModel.solve(resGain[n8], vin)); + } + } + } + } +} + +std::unique_ptr FilterModelConfig8580::buildIntegrator() +{ + return MAKE_UNIQUE(Integrator8580, this); +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/FilterModelConfig8580.h b/src/sound/resid-fp/FilterModelConfig8580.h new file mode 100644 index 000000000..509171bc3 --- /dev/null +++ b/src/sound/resid-fp/FilterModelConfig8580.h @@ -0,0 +1,68 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2020 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef FILTERMODELCONFIG8580_H +#define FILTERMODELCONFIG8580_H + +#include "FilterModelConfig.h" + +#include + +#include "sidcxx11.h" + +namespace reSIDfp +{ + +class Integrator8580; + +/** + * Calculate parameters for 8580 filter emulation. + */ +class FilterModelConfig8580 final : public FilterModelConfig +{ +private: + static std::unique_ptr instance; + // This allows access to the private constructor +#ifdef HAVE_CXX11 + friend std::unique_ptr::deleter_type; +#else + friend class std::auto_ptr; +#endif + +private: + FilterModelConfig8580(); + ~FilterModelConfig8580() DEFAULT; + +public: + static FilterModelConfig8580* getInstance(); + + /** + * Construct an integrator solver. + * + * @return the integrator + */ + std::unique_ptr buildIntegrator(); +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/INSTALL b/src/sound/resid-fp/INSTALL deleted file mode 100644 index 4573d6544..000000000 --- a/src/sound/resid-fp/INSTALL +++ /dev/null @@ -1,14 +0,0 @@ -Unless you want to do anything fancy, just say: - -% ./configure -% make - -ReSID-FP is compiled with a C++ compiler, so if you wish to specify compiler -and compiler flags you must set CXX and CXXFLAGS, e.g.: -% CXX=g++ CXXFLAGS="-g -O" ./configure - -In addition to normal configure flags, you may specify ---disable-inline - Disable inlining of functions (for debugging/profiling) - -ReSID-FP makes no installable files. The libresid.a is linked to final -executable automatically. diff --git a/src/sound/resid-fp/Integrator6581.cpp b/src/sound/resid-fp/Integrator6581.cpp new file mode 100644 index 000000000..490be9b5c --- /dev/null +++ b/src/sound/resid-fp/Integrator6581.cpp @@ -0,0 +1,25 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2014 Leandro Nini + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define INTEGRATOR_CPP + +#include "Integrator6581.h" + +// This is needed when compiling with --disable-inline diff --git a/src/sound/resid-fp/Integrator6581.h b/src/sound/resid-fp/Integrator6581.h new file mode 100644 index 000000000..5bdeca37d --- /dev/null +++ b/src/sound/resid-fp/Integrator6581.h @@ -0,0 +1,285 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2022 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004, 2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef INTEGRATOR6581_H +#define INTEGRATOR6581_H + +#include "FilterModelConfig6581.h" + +#include +#include + +// uncomment to enable use of the slope factor +// in the EKV model +// actually produces worse results, needs investigation +//#define SLOPE_FACTOR + +#ifdef SLOPE_FACTOR +# include +#endif + +#include "siddefs-fp.h" + +namespace reSIDfp +{ + +/** + * Find output voltage in inverting integrator SID op-amp circuits, using a + * single fixpoint iteration step. + * + * A circuit diagram of a MOS 6581 integrator is shown below. + * + * +---C---+ + * | | + * vi --o--Rw--o-o--[A>--o-- vo + * | | vx + * +--Rs--+ + * + * From Kirchoff's current law it follows that + * + * IRw + IRs + ICr = 0 + * + * Using the formula for current through a capacitor, i = C*dv/dt, we get + * + * IRw + IRs + C*(vc - vc0)/dt = 0 + * dt/C*(IRw + IRs) + vc - vc0 = 0 + * vc = vc0 - n*(IRw(vi,vx) + IRs(vi,vx)) + * + * which may be rewritten as the following iterative fixpoint function: + * + * vc = vc0 - n*(IRw(vi,g(vc)) + IRs(vi,g(vc))) + * + * To accurately calculate the currents through Rs and Rw, we need to use + * transistor models. Rs has a gate voltage of Vdd = 12V, and can be + * assumed to always be in triode mode. For Rw, the situation is rather + * more complex, as it turns out that this transistor will operate in + * both subthreshold, triode, and saturation modes. + * + * The Shichman-Hodges transistor model routinely used in textbooks may + * be written as follows: + * + * Ids = 0 , Vgst < 0 (subthreshold mode) + * Ids = K*W/L*(2*Vgst - Vds)*Vds , Vgst >= 0, Vds < Vgst (triode mode) + * Ids = K*W/L*Vgst^2 , Vgst >= 0, Vds >= Vgst (saturation mode) + * + * where + * K = u*Cox/2 (transconductance coefficient) + * W/L = ratio between substrate width and length + * Vgst = Vg - Vs - Vt (overdrive voltage) + * + * This transistor model is also called the quadratic model. + * + * Note that the equation for the triode mode can be reformulated as + * independent terms depending on Vgs and Vgd, respectively, by the + * following substitution: + * + * Vds = Vgst - (Vgst - Vds) = Vgst - Vgdt + * + * Ids = K*W/L*(2*Vgst - Vds)*Vds + * = K*W/L*(2*Vgst - (Vgst - Vgdt)*(Vgst - Vgdt) + * = K*W/L*(Vgst + Vgdt)*(Vgst - Vgdt) + * = K*W/L*(Vgst^2 - Vgdt^2) + * + * This turns out to be a general equation which covers both the triode + * and saturation modes (where the second term is 0 in saturation mode). + * The equation is also symmetrical, i.e. it can calculate negative + * currents without any change of parameters (since the terms for drain + * and source are identical except for the sign). + * + * FIXME: Subthreshold as function of Vgs, Vgd. + * + * Ids = I0*W/L*e^(Vgst/(Ut/k)) , Vgst < 0 (subthreshold mode) + * + * where + * I0 = (2 * uCox * Ut^2) / k + * + * The remaining problem with the textbook model is that the transition + * from subthreshold to triode/saturation is not continuous. + * + * Realizing that the subthreshold and triode/saturation modes may both + * be defined by independent (and equal) terms of Vgs and Vds, + * respectively, the corresponding terms can be blended into (equal) + * continuous functions suitable for table lookup. + * + * The EKV model (Enz, Krummenacher and Vittoz) essentially performs this + * blending using an elegant mathematical formulation: + * + * Ids = Is * (if - ir) + * Is = ((2 * u*Cox * Ut^2)/k) * W/L + * if = ln^2(1 + e^((k*(Vg - Vt) - Vs)/(2*Ut)) + * ir = ln^2(1 + e^((k*(Vg - Vt) - Vd)/(2*Ut)) + * + * For our purposes, the EKV model preserves two important properties + * discussed above: + * + * - It consists of two independent terms, which can be represented by + * the same lookup table. + * - It is symmetrical, i.e. it calculates current in both directions, + * facilitating a branch-free implementation. + * + * Rw in the circuit diagram above is a VCR (voltage controlled resistor), + * as shown in the circuit diagram below. + * + * + * Vdd + * | + * Vdd _|_ + * | +---+ +---- Vw + * _|_ | + * +--+ +---o Vg + * | __|__ + * | ----- Rw + * | | | + * vi -----o------+ +-------- vo + * + * + * In order to calculalate the current through the VCR, its gate voltage + * must be determined. + * + * Assuming triode mode and applying Kirchoff's current law, we get the + * following equation for Vg: + * + * u*Cox/2*W/L*((nVddt - Vg)^2 - (nVddt - vi)^2 + (nVddt - Vg)^2 - (nVddt - Vw)^2) = 0 + * 2*(nVddt - Vg)^2 - (nVddt - vi)^2 - (nVddt - Vw)^2 = 0 + * (nVddt - Vg) = sqrt(((nVddt - vi)^2 + (nVddt - Vw)^2)/2) + * + * Vg = nVddt - sqrt(((nVddt - vi)^2 + (nVddt - Vw)^2)/2) + */ +class Integrator6581 +{ +private: + unsigned int nVddt_Vw_2; + mutable int vx; + mutable int vc; + +#ifdef SLOPE_FACTOR + // Slope factor n = 1/k + // where k is the gate coupling coefficient + // k = Cox/(Cox+Cdep) ~ 0.7 (depends on gate voltage) + mutable double n; +#endif + const unsigned short nVddt; + const unsigned short nVt; + const unsigned short nVmin; + const unsigned short nSnake; + + const FilterModelConfig6581* fmc; + +public: + Integrator6581(const FilterModelConfig6581* fmc, + double WL_snake) : + nVddt_Vw_2(0), + vx(0), + vc(0), +#ifdef SLOPE_FACTOR + n(1.4), +#endif + nVddt(fmc->getNormalizedValue(fmc->getVddt())), + nVt(fmc->getNormalizedValue(fmc->getVth())), + nVmin(fmc->getNVmin()), + nSnake(fmc->getNormalizedCurrentFactor(WL_snake)), + fmc(fmc) {} + + void setVw(unsigned short Vw) { nVddt_Vw_2 = ((nVddt - Vw) * (nVddt - Vw)) >> 1; } + + int solve(int vi) const; +}; + +} // namespace reSIDfp + +#if RESID_INLINING || defined(INTEGRATOR_CPP) + +namespace reSIDfp +{ + +RESID_INLINE +int Integrator6581::solve(int vi) const +{ + // Make sure Vgst>0 so we're not in subthreshold mode + assert(vx < nVddt); + + // Check that transistor is actually in triode mode + // Vds < Vgs - Vth + assert(vi < nVddt); + + // "Snake" voltages for triode mode calculation. + const unsigned int Vgst = nVddt - vx; + const unsigned int Vgdt = nVddt - vi; + + const unsigned int Vgst_2 = Vgst * Vgst; + const unsigned int Vgdt_2 = Vgdt * Vgdt; + + // "Snake" current, scaled by (1/m)*2^13*m*2^16*m*2^16*2^-15 = m*2^30 + const int n_I_snake = nSnake * (static_cast(Vgst_2 - Vgdt_2) >> 15); + + // VCR gate voltage. // Scaled by m*2^16 + // Vg = Vddt - sqrt(((Vddt - Vw)^2 + Vgdt^2)/2) + const int nVg = static_cast(fmc->getVcr_nVg((nVddt_Vw_2 + (Vgdt_2 >> 1)) >> 16)); +#ifdef SLOPE_FACTOR + const double nVp = static_cast(nVg - nVt) / n; // Pinch-off voltage + const int kVgt = static_cast(nVp + 0.5) - nVmin; +#else + const int kVgt = (nVg - nVt) - nVmin; +#endif + + // VCR voltages for EKV model table lookup. + const int kVgt_Vs = (vx < kVgt) ? kVgt - vx : 0; + assert(kVgt_Vs < (1 << 16)); + const int kVgt_Vd = (vi < kVgt) ? kVgt - vi : 0; + assert(kVgt_Vd < (1 << 16)); + + // VCR current, scaled by m*2^15*2^15 = m*2^30 + const unsigned int If = static_cast(fmc->getVcr_n_Ids_term(kVgt_Vs)) << 15; + const unsigned int Ir = static_cast(fmc->getVcr_n_Ids_term(kVgt_Vd)) << 15; +#ifdef SLOPE_FACTOR + const double iVcr = static_cast(If - Ir); + const int n_I_vcr = static_cast(iVcr * n); +#else + const int n_I_vcr = If - Ir; +#endif + +#ifdef SLOPE_FACTOR + // estimate new slope factor based on gate voltage + const double gamma = 1.0; // body effect factor + const double phi = 0.8; // bulk Fermi potential + const double Vp = nVp / fmc->getN16(); + n = 1. + (gamma / (2. * sqrt(Vp + phi + 4. * fmc->getUt()))); + assert((n > 1.2) && (n < 1.8)); +#endif + + // Change in capacitor charge. + vc += n_I_snake + n_I_vcr; + + // vx = g(vc) + const int tmp = (vc >> 15) + (1 << 15); + assert(tmp < (1 << 16)); + vx = fmc->getOpampRev(tmp); + + // Return vo. + return vx - (vc >> 14); +} + +} // namespace reSIDfp + +#endif + +#endif diff --git a/src/sound/resid-fp/Integrator8580.cpp b/src/sound/resid-fp/Integrator8580.cpp new file mode 100644 index 000000000..6fba9521b --- /dev/null +++ b/src/sound/resid-fp/Integrator8580.cpp @@ -0,0 +1,25 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2014-2016 Leandro Nini + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define INTEGRATOR8580_CPP + +#include "Integrator8580.h" + +// This is needed when compiling with --disable-inline diff --git a/src/sound/resid-fp/Integrator8580.h b/src/sound/resid-fp/Integrator8580.h new file mode 100644 index 000000000..db9e46b05 --- /dev/null +++ b/src/sound/resid-fp/Integrator8580.h @@ -0,0 +1,142 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004, 2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef INTEGRATOR8580_H +#define INTEGRATOR8580_H + +#include "FilterModelConfig8580.h" + +#include +#include + +#include "siddefs-fp.h" + +namespace reSIDfp +{ + +/** + * 8580 integrator + * + * +---C---+ + * | | + * vi -----Rfc---o--[A>--o-- vo + * vx + * + * IRfc + ICr = 0 + * IRfc + C*(vc - vc0)/dt = 0 + * dt/C*(IRfc) + vc - vc0 = 0 + * vc = vc0 - n*(IRfc(vi,vx)) + * vc = vc0 - n*(IRfc(vi,g(vc))) + * + * IRfc = K*W/L*(Vgst^2 - Vgdt^2) = n*((Vddt - vx)^2 - (Vddt - vi)^2) + * + * Rfc gate voltage is generated by an OP Amp and depends on chip temperature. + */ +class Integrator8580 +{ +private: + mutable int vx; + mutable int vc; + + unsigned short nVgt; + unsigned short n_dac; + + const FilterModelConfig8580* fmc; + +public: + Integrator8580(const FilterModelConfig8580* fmc) : + vx(0), + vc(0), + fmc(fmc) + { + setV(1.5); + } + + /** + * Set Filter Cutoff resistor ratio. + */ + void setFc(double wl) + { + // Normalized current factor, 1 cycle at 1MHz. + // Fit in 5 bits. + n_dac = fmc->getNormalizedCurrentFactor(wl); + } + + /** + * Set FC gate voltage multiplier. + */ + void setV(double v) + { + // Gate voltage is controlled by the switched capacitor voltage divider + // Ua = Ue * v = 4.76v 1 1.0 && v < 2.0); + const double Vg = 4.76 * v; + const double Vgt = Vg - fmc->getVth(); + + // Vg - Vth, normalized so that translated values can be subtracted: + // Vgt - x = (Vgt - t) - (x - t) + nVgt = fmc->getNormalizedValue(Vgt); + } + + int solve(int vi) const; +}; + +} // namespace reSIDfp + +#if RESID_INLINING || defined(INTEGRATOR8580_CPP) + +namespace reSIDfp +{ + +RESID_INLINE +int Integrator8580::solve(int vi) const +{ + // Make sure we're not in subthreshold mode + assert(vx < nVgt); + + // DAC voltages + const unsigned int Vgst = nVgt - vx; + const unsigned int Vgdt = (vi < nVgt) ? nVgt - vi : 0; // triode/saturation mode + + const unsigned int Vgst_2 = Vgst * Vgst; + const unsigned int Vgdt_2 = Vgdt * Vgdt; + + // DAC current, scaled by (1/m)*2^13*m*2^16*m*2^16*2^-15 = m*2^30 + const int n_I_dac = n_dac * (static_cast(Vgst_2 - Vgdt_2) >> 15); + + // Change in capacitor charge. + vc += n_I_dac; + + // vx = g(vc) + const int tmp = (vc >> 15) + (1 << 15); + assert(tmp < (1 << 16)); + vx = fmc->getOpampRev(tmp); + + // Return vo. + return vx - (vc >> 14); +} + +} // namespace reSIDfp + +#endif + +#endif diff --git a/src/sound/resid-fp/Makefile.am b/src/sound/resid-fp/Makefile.am deleted file mode 100644 index 5af263229..000000000 --- a/src/sound/resid-fp/Makefile.am +++ /dev/null @@ -1,29 +0,0 @@ -## Process this file with automake to create Makefile.in - -AR = @AR@ - -noinst_LIBRARIES = libresidfp.a - -libresidfp_a_SOURCES = sid.cc voice.cc wave.cc envelope.cc filter.cc extfilt.cc pot.cc version.cc convolve.cc $(noinst_DATA:.dat=.cc) - -BUILT_SOURCES = $(noinst_DATA:.dat=.cc) - -noinst_HEADERS = sid.h voice.h wave.h envelope.h filter.h extfilt.h pot.h - -noinst_DATA = wave6581_PST.dat wave6581_PS_.dat wave6581_P_T.dat wave6581__ST.dat wave8580_PST.dat wave8580_PS_.dat wave8580_P_T.dat wave8580__ST.dat - -noinst_SCRIPTS = samp2src.pl - -EXTRA_DIST = $(noinst_HEADERS) $(noinst_DATA) $(noinst_SCRIPTS) README.VICE convolve-sse.cc - -SUFFIXES = .dat - -.dat.cc: - $(PERL) $(srcdir)/samp2src.pl $* $< $(srcdir)/$@ - -if USE_SSE -convolve-sse.o: convolve-sse.cc - $(CXXCOMPILE) -msse -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< - -libresidfp_a_LIBADD = convolve-sse.o -endif diff --git a/src/sound/resid-fp/Makefile.in b/src/sound/resid-fp/Makefile.in deleted file mode 100644 index 5045f99a1..000000000 --- a/src/sound/resid-fp/Makefile.in +++ /dev/null @@ -1,557 +0,0 @@ -# Makefile.in generated by automake 1.9.6 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, -# 2003, 2004, 2005 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -@SET_MAKE@ - - - - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ -top_builddir = . -am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd -INSTALL = @INSTALL@ -install_sh_DATA = $(install_sh) -c -m 644 -install_sh_PROGRAM = $(install_sh) -c -install_sh_SCRIPT = $(install_sh) -c -INSTALL_HEADER = $(INSTALL_DATA) -transform = $(program_transform_name) -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -subdir = . -DIST_COMMON = README $(am__configure_deps) $(noinst_HEADERS) \ - $(srcdir)/../../depcomp $(srcdir)/../../install-sh \ - $(srcdir)/../../missing $(srcdir)/../../mkinstalldirs \ - $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ - $(srcdir)/siddefs-fp.h.in $(top_srcdir)/configure AUTHORS \ - COPYING ChangeLog INSTALL NEWS -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ - configure.lineno configure.status.lineno -mkinstalldirs = $(SHELL) $(top_srcdir)/../../mkinstalldirs -CONFIG_CLEAN_FILES = siddefs-fp.h -LIBRARIES = $(noinst_LIBRARIES) -ARFLAGS = cru -libresidfp_a_AR = $(AR) $(ARFLAGS) -@USE_SSE_TRUE@libresidfp_a_DEPENDENCIES = convolve-sse.o -am__objects_1 = wave6581_PST.$(OBJEXT) wave6581_PS_.$(OBJEXT) \ - wave6581_P_T.$(OBJEXT) wave6581__ST.$(OBJEXT) \ - wave8580_PST.$(OBJEXT) wave8580_PS_.$(OBJEXT) \ - wave8580_P_T.$(OBJEXT) wave8580__ST.$(OBJEXT) -am_libresidfp_a_OBJECTS = sid.$(OBJEXT) voice.$(OBJEXT) wave.$(OBJEXT) \ - envelope.$(OBJEXT) filter.$(OBJEXT) extfilt.$(OBJEXT) \ - pot.$(OBJEXT) version.$(OBJEXT) convolve.$(OBJEXT) \ - $(am__objects_1) -libresidfp_a_OBJECTS = $(am_libresidfp_a_OBJECTS) -SCRIPTS = $(noinst_SCRIPTS) -DEFAULT_INCLUDES = -I. -I$(srcdir) -depcomp = $(SHELL) $(top_srcdir)/../../depcomp -am__depfiles_maybe = depfiles -CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ - $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -CXXLD = $(CXX) -CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ - -o $@ -SOURCES = $(libresidfp_a_SOURCES) -DIST_SOURCES = $(libresidfp_a_SOURCES) -DATA = $(noinst_DATA) -HEADERS = $(noinst_HEADERS) -ETAGS = etags -CTAGS = ctags -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - { test ! -d $(distdir) \ - || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -fr $(distdir); }; } -DIST_ARCHIVES = $(distdir).tar.gz -GZIP_ENV = --best -distuninstallcheck_listfiles = find . -type f -print -distcleancheck_listfiles = find . -type f -print -ACLOCAL = @ACLOCAL@ -AMDEP_FALSE = @AMDEP_FALSE@ -AMDEP_TRUE = @AMDEP_TRUE@ -AMTAR = @AMTAR@ -AR = @AR@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -CPPFLAGS = @CPPFLAGS@ -CXX = @CXX@ -CXXCPP = @CXXCPP@ -CXXDEPMODE = @CXXDEPMODE@ -CXXFLAGS = @CXXFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -GREP = @GREP@ -HAVE_EXPF_PROTOTYPE = @HAVE_EXPF_PROTOTYPE@ -HAVE_LOGF_PROTOTYPE = @HAVE_LOGF_PROTOTYPE@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -OBJEXT = @OBJEXT@ -PACKAGE = @PACKAGE@ -PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ -PACKAGE_NAME = @PACKAGE_NAME@ -PACKAGE_STRING = @PACKAGE_STRING@ -PACKAGE_TARNAME = @PACKAGE_TARNAME@ -PACKAGE_VERSION = @PACKAGE_VERSION@ -PATH_SEPARATOR = @PATH_SEPARATOR@ -PERL = @PERL@ -RANLIB = @RANLIB@ -RESID_HAVE_BOOL = @RESID_HAVE_BOOL@ -RESID_INLINE = @RESID_INLINE@ -RESID_USE_SSE = @RESID_USE_SSE@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -USE_SSE_FALSE = @USE_SSE_FALSE@ -USE_SSE_TRUE = @USE_SSE_TRUE@ -VERSION = @VERSION@ -ac_ct_CXX = @ac_ct_CXX@ -am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ -am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ -am__include = @am__include@ -am__leading_dot = @am__leading_dot@ -am__quote = @am__quote@ -am__tar = @am__tar@ -am__untar = @am__untar@ -bindir = @bindir@ -build_alias = @build_alias@ -datadir = @datadir@ -datarootdir = @datarootdir@ -docdir = @docdir@ -dvidir = @dvidir@ -exec_prefix = @exec_prefix@ -host_alias = @host_alias@ -htmldir = @htmldir@ -includedir = @includedir@ -infodir = @infodir@ -install_sh = @install_sh@ -libdir = @libdir@ -libexecdir = @libexecdir@ -localedir = @localedir@ -localstatedir = @localstatedir@ -mandir = @mandir@ -mkdir_p = @mkdir_p@ -oldincludedir = @oldincludedir@ -pdfdir = @pdfdir@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -sbindir = @sbindir@ -sharedstatedir = @sharedstatedir@ -sysconfdir = @sysconfdir@ -target_alias = @target_alias@ -noinst_LIBRARIES = libresidfp.a -libresidfp_a_SOURCES = sid.cc voice.cc wave.cc envelope.cc filter.cc extfilt.cc pot.cc version.cc convolve.cc $(noinst_DATA:.dat=.cc) -BUILT_SOURCES = $(noinst_DATA:.dat=.cc) -noinst_HEADERS = sid.h voice.h wave.h envelope.h filter.h extfilt.h pot.h -noinst_DATA = wave6581_PST.dat wave6581_PS_.dat wave6581_P_T.dat wave6581__ST.dat wave8580_PST.dat wave8580_PS_.dat wave8580_P_T.dat wave8580__ST.dat -noinst_SCRIPTS = samp2src.pl -EXTRA_DIST = $(noinst_HEADERS) $(noinst_DATA) $(noinst_SCRIPTS) README.VICE convolve-sse.cc -SUFFIXES = .dat -@USE_SSE_TRUE@libresidfp_a_LIBADD = convolve-sse.o -all: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) all-am - -.SUFFIXES: -.SUFFIXES: .dat .cc .o .obj -am--refresh: - @: -$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) - @for dep in $?; do \ - case '$(am__configure_deps)' in \ - *$$dep*) \ - echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ - cd $(srcdir) && $(AUTOMAKE) --gnu \ - && exit 0; \ - exit 1;; \ - esac; \ - done; \ - echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ - cd $(top_srcdir) && \ - $(AUTOMAKE) --gnu Makefile -.PRECIOUS: Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - @case '$?' in \ - *config.status*) \ - echo ' $(SHELL) ./config.status'; \ - $(SHELL) ./config.status;; \ - *) \ - echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ - cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ - esac; - -$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck - -$(top_srcdir)/configure: $(am__configure_deps) - cd $(srcdir) && $(AUTOCONF) -$(ACLOCAL_M4): $(am__aclocal_m4_deps) - cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) -siddefs-fp.h: $(top_builddir)/config.status $(srcdir)/siddefs-fp.h.in - cd $(top_builddir) && $(SHELL) ./config.status $@ - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) -libresidfp.a: $(libresidfp_a_OBJECTS) $(libresidfp_a_DEPENDENCIES) - -rm -f libresidfp.a - $(libresidfp_a_AR) libresidfp.a $(libresidfp_a_OBJECTS) $(libresidfp_a_LIBADD) - $(RANLIB) libresidfp.a - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/convolve.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/envelope.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/extfilt.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filter.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pot.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sid.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/voice.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave6581_PST.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave6581_PS_.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave6581_P_T.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave6581__ST.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave8580_PST.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave8580_PS_.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave8580_P_T.Po@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/wave8580__ST.Po@am__quote@ - -.cc.o: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $< - -.cc.obj: -@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ -@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ -@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ -@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` -uninstall-info-am: - -ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - mkid -fID $$unique -tags: TAGS - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ - test -n "$$unique" || unique=$$empty_fix; \ - $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ - $$tags $$unique; \ - fi -ctags: CTAGS -CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ - $(TAGS_FILES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | \ - $(AWK) ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(CTAGS_ARGS)$$tags$$unique" \ - || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ - $$tags $$unique - -GTAGS: - here=`$(am__cd) $(top_builddir) && pwd` \ - && cd $(top_srcdir) \ - && gtags -i $(GTAGS_ARGS) $$here - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -distdir: $(DISTFILES) - $(am__remove_distdir) - mkdir $(distdir) - $(mkdir_p) $(distdir)/. $(distdir)/../.. - @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ - topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ - list='$(DISTFILES)'; for file in $$list; do \ - case $$file in \ - $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ - $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ - esac; \ - if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ - dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ - if test "$$dir" != "$$file" && test "$$dir" != "."; then \ - dir="/$$dir"; \ - $(mkdir_p) "$(distdir)$$dir"; \ - else \ - dir=''; \ - fi; \ - if test -d $$d/$$file; then \ - if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ - cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ - fi; \ - cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ - else \ - test -f $(distdir)/$$file \ - || cp -p $$d/$$file $(distdir)/$$file \ - || exit 1; \ - fi; \ - done - -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ - ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ - ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ - || chmod -R a+r $(distdir) -dist-gzip: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 - $(am__remove_distdir) - -dist-tarZ: distdir - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__remove_distdir) - -dist-shar: distdir - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__remove_distdir) - -dist dist-all: distdir - tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz - $(am__remove_distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - case '$(DIST_ARCHIVES)' in \ - *.tar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ - *.tar.bz2*) \ - bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ - *.tar.Z*) \ - uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ - *.shar.gz*) \ - GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ - *.zip*) \ - unzip $(distdir).zip ;;\ - esac - chmod -R a-w $(distdir); chmod a+w $(distdir) - mkdir $(distdir)/_build - mkdir $(distdir)/_inst - chmod a-w $(distdir) - dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ - && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ - && cd $(distdir)/_build \ - && ../configure --srcdir=.. --prefix="$$dc_install_base" \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ - distuninstallcheck \ - && chmod -R a-w "$$dc_install_base" \ - && ({ \ - (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ - && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ - distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ - } || { rm -rf "$$dc_destdir"; exit 1; }) \ - && rm -rf "$$dc_destdir" \ - && $(MAKE) $(AM_MAKEFLAGS) dist \ - && rm -rf $(DIST_ARCHIVES) \ - && $(MAKE) $(AM_MAKEFLAGS) distcleancheck - $(am__remove_distdir) - @(echo "$(distdir) archives ready for distribution: "; \ - list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ - sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' -distuninstallcheck: - @cd $(distuninstallcheck_dir) \ - && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ - || { echo "ERROR: files left after uninstall:" ; \ - if test -n "$(DESTDIR)"; then \ - echo " (check DESTDIR support)"; \ - fi ; \ - $(distuninstallcheck_listfiles) ; \ - exit 1; } >&2 -distcleancheck: distclean - @if test '$(srcdir)' = . ; then \ - echo "ERROR: distcleancheck can only run from a VPATH build" ; \ - exit 1 ; \ - fi - @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ - || { echo "ERROR: files left in build directory after distclean:" ; \ - $(distcleancheck_listfiles) ; \ - exit 1; } >&2 -check-am: all-am -check: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) check-am -all-am: Makefile $(LIBRARIES) $(SCRIPTS) $(DATA) $(HEADERS) -installdirs: -install: $(BUILT_SOURCES) - $(MAKE) $(AM_MAKEFLAGS) install-am -install-exec: install-exec-am -install-data: install-data-am -uninstall: uninstall-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am - -installcheck: installcheck-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - `test -z '$(STRIP)' || \ - echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." - -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) -clean: clean-am - -clean-am: clean-generic clean-noinstLIBRARIES mostlyclean-am - -distclean: distclean-am - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf ./$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-tags - -dvi: dvi-am - -dvi-am: - -html: html-am - -info: info-am - -info-am: - -install-data-am: - -install-exec-am: - -install-info: install-info-am - -install-man: - -installcheck-am: - -maintainer-clean: maintainer-clean-am - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -rf ./$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-am - -mostlyclean-am: mostlyclean-compile mostlyclean-generic - -pdf: pdf-am - -pdf-am: - -ps: ps-am - -ps-am: - -uninstall-am: uninstall-info-am - -.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \ - clean-generic clean-noinstLIBRARIES ctags dist dist-all \ - dist-bzip2 dist-gzip dist-shar dist-tarZ dist-zip distcheck \ - distclean distclean-compile distclean-generic distclean-tags \ - distcleancheck distdir distuninstallcheck dvi dvi-am html \ - html-am info info-am install install-am install-data \ - install-data-am install-exec install-exec-am install-info \ - install-info-am install-man install-strip installcheck \ - installcheck-am installdirs maintainer-clean \ - maintainer-clean-generic mostlyclean mostlyclean-compile \ - mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ - uninstall-am uninstall-info-am - - -.dat.cc: - $(PERL) $(srcdir)/samp2src.pl $* $< $(srcdir)/$@ - -@USE_SSE_TRUE@convolve-sse.o: convolve-sse.cc -@USE_SSE_TRUE@ $(CXXCOMPILE) -msse -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/src/sound/resid-fp/NEWS b/src/sound/resid-fp/NEWS deleted file mode 100644 index 70b2d4f8e..000000000 --- a/src/sound/resid-fp/NEWS +++ /dev/null @@ -1 +0,0 @@ -See ChangeLog for information about new features. diff --git a/src/sound/resid-fp/OpAmp.cpp b/src/sound/resid-fp/OpAmp.cpp new file mode 100644 index 000000000..b26b2efcb --- /dev/null +++ b/src/sound/resid-fp/OpAmp.cpp @@ -0,0 +1,84 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2015 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "OpAmp.h" + +#include + +#include "siddefs-fp.h" + +namespace reSIDfp +{ + +const double EPSILON = 1e-8; + +double OpAmp::solve(double n, double vi) const +{ + // Start off with an estimate of x and a root bracket [ak, bk]. + // f is decreasing, so that f(ak) > 0 and f(bk) < 0. + double ak = vmin; + double bk = vmax; + + const double a = n + 1.; + const double b = Vddt; + const double b_vi = (b > vi) ? (b - vi) : 0.; + const double c = n * (b_vi * b_vi); + + for (;;) + { + const double xk = x; + + // Calculate f and df. + + Spline::Point out = opamp->evaluate(x); + const double vo = out.x; + const double dvo = out.y; + + const double b_vx = (b > x) ? b - x : 0.; + const double b_vo = (b > vo) ? b - vo : 0.; + + // f = a*(b - vx)^2 - c - (b - vo)^2 + const double f = a * (b_vx * b_vx) - c - (b_vo * b_vo); + + // df = 2*((b - vo)*dvo - a*(b - vx)) + const double df = 2. * (b_vo * dvo - a * b_vx); + + // Newton-Raphson step: xk1 = xk - f(xk)/f'(xk) + x -= f / df; + + if (unlikely(fabs(x - xk) < EPSILON)) + { + out = opamp->evaluate(x); + return out.x; + } + + // Narrow down root bracket. + (f < 0. ? bk : ak) = xk; + + if (unlikely(x <= ak) || unlikely(x >= bk)) + { + // Bisection step (ala Dekker's method). + x = (ak + bk) * 0.5; + } + } +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/OpAmp.h b/src/sound/resid-fp/OpAmp.h new file mode 100644 index 000000000..f048b1845 --- /dev/null +++ b/src/sound/resid-fp/OpAmp.h @@ -0,0 +1,121 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef OPAMP_H +#define OPAMP_H + +#include +#include + +#include "Spline.h" + +#include "sidcxx11.h" + +namespace reSIDfp +{ + +/** + * Find output voltage in inverting gain and inverting summer SID op-amp + * circuits, using a combination of Newton-Raphson and bisection. + * + * +---R2--+ + * | | + * vi ---R1--o--[A>--o-- vo + * vx + * + * From Kirchoff's current law it follows that + * + * IR1f + IR2r = 0 + * + * Substituting the triode mode transistor model K*W/L*(Vgst^2 - Vgdt^2) + * for the currents, we get: + * + * n*((Vddt - vx)^2 - (Vddt - vi)^2) + (Vddt - vx)^2 - (Vddt - vo)^2 = 0 + * + * where n is the ratio between R1 and R2. + * + * Our root function f can thus be written as: + * + * f = (n + 1)*(Vddt - vx)^2 - n*(Vddt - vi)^2 - (Vddt - vo)^2 = 0 + * + * Using substitution constants + * + * a = n + 1 + * b = Vddt + * c = n*(Vddt - vi)^2 + * + * the equations for the root function and its derivative can be written as: + * + * f = a*(b - vx)^2 - c - (b - vo)^2 + * df = 2*((b - vo)*dvo - a*(b - vx)) + */ +class OpAmp +{ +private: + /// Current root position (cached as guess to speed up next iteration) + mutable double x; + + const double Vddt; + const double vmin; + const double vmax; + + std::unique_ptr const opamp; + +public: + /** + * Opamp input -> output voltage conversion + * + * @param opamp opamp mapping table as pairs of points (in -> out) + * @param Vddt transistor dt parameter (in volts) + * @param vmin + * @param vmax + */ + OpAmp(const std::vector &opamp, double Vddt, + double vmin, double vmax + ) : + x(0.), + Vddt(Vddt), + vmin(vmin), + vmax(vmax), + opamp(new Spline(opamp)) {} + + /** + * Reset root position + */ + void reset() const + { + x = vmin; + } + + /** + * Solve the opamp equation for input vi in loading context n + * + * @param n the ratio of input/output loading + * @param vi input voltage + * @return vo output voltage + */ + double solve(double n, double vi) const; +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/Potentiometer.h b/src/sound/resid-fp/Potentiometer.h new file mode 100644 index 000000000..8b63df130 --- /dev/null +++ b/src/sound/resid-fp/Potentiometer.h @@ -0,0 +1,50 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2013 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright (C) 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef POTENTIOMETER_H +#define POTENTIOMETER_H + +namespace reSIDfp +{ + +/** + * Potentiometer representation. + * + * This class will probably never be implemented in any real way. + * + * @author Ken Händel + * @author Dag Lem + */ +class Potentiometer +{ +public: + /** + * Read paddle value. Not modeled. + * + * @return paddle value (always 0xff) + */ + unsigned char readPOT() const { return 0xff; } +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/README b/src/sound/resid-fp/README index ac4f4275e..45d4bfb92 100644 --- a/src/sound/resid-fp/README +++ b/src/sound/resid-fp/README @@ -1,79 +1,20 @@ -Please refer to original ../resid/README file for general discussion what -ReSID is. +reSIDfp is a fork of Dag Lem's reSID 0.16, a reverse engineered software emulation +of the MOS6581/8580 SID (Sound Interface Device). -This is ReSID-FP, a fork of ReSID that has been adapted to floating point -numbers. Some SSE assembly is used for vector convolutions when both the CPU -and compiler support it. In addition, some liberties have been taken in the -frequency region > 20 kHz which should be inaudible to humans. +The project was started by Antti S. Lankila in order to improve SID emulation +with special focus on the 6581 filter. +The codebase has been later on ported to java by Ken Händel within the jsidplay2 project +and has seen further work by Antti Lankila. +It was then ported back to c++ and integrated with improvements from reSID 1.0 by Leandro Nini. -In the emulation front, several changes to the original ReSID (henceforth -classical ReSID) have been made. These changes are listed here: -Waveforms: +Main differences from reSID: -- Noise waveform control via test bit is now possible. - (Unknown: how long does it take for the noise bits to fade with test bit on?) - This is used in SounDemoN's Tamaking, Bojojoing, etc, and the patch to - implement it in ReSID is his. +* combined waveforms are emulated by a parametrized model based on samplings from Kevtris; +* envelope generator is implemented like in the real machine with a shift register; +* high quality resampling is done in two steps to allow computational savings using lower order filters; +* part of the calculations are done with floats instead of fixed point; +* interpolation is accomplished with Fritsch-Carlson method to preserve monotonicity. -- Waveform 0, the frozen DAC, is emulated, which should make the new 8-bit - sample player routine work. -- Envelope and waveform outputs contain approximation of the imperfect DACs - (Unknown: are there other significant effects that affect the analog waveform - before it goes into filter, which should be modelled?) - -- I changed voice DC offsets around for 6581 to better match my R4AR 3789. - -Envelope: - -- Performance work at envelope. Validation pending, should ensure that the new - code behaves 100% identically to the old one. - -Mixer: - -- Experimentally, a subtle negative offset is injected into the mixer through - ext-in pin. This part seems, however, physically incorrect and is likely - removed in the future. (The coupling capacitor external to the chip must - eliminate any DC offset, and the ext-in circuit inside the chip has nothing - that could generate offsets. In the meantime, this fix still helps 8580 - Netherworld to play more correctly.) - -- I removed the mixer_DC very subtle effect on 6581, as it already has 10x - more offsets elsewhere. - -Filter: - -- 6581 filter output contains approximation of the distortion effect -- 8580 filter output has bp flipped in phase with the other outputs -- 6581 resonance is slightly boosted. Potentially 8580 resonance needs to be - slightly stronger as well, as many songs show a bit more "punch" on the real - chip and one way to get more of that is increasing resonance. 10-20 % - increment is a practical maximum. - -The upshot of all this is that for i386/x86-64 hardware, ReSID-FP's more -complicated algorithms may not seem any more expensive than the original ReSID. -For high-quality modes, it is virtually certain that ReSID-FP is actually -faster. - -Meanwhile, emulation quality should be improved. If there are bugs, I'd like -to know about them. If the filter sounds wrong, I might be able to improve it, -too. - -Here are some problematic songs, to get a feel for what's left to do: - -- Markus Mueller: Mechanicus - * the distorted guitar effect is too distorted, but don't know how/why. - -- Galway: Wizball - * the initial lead punches through with too much distortion. The "toggle" - between the muffled and more intense sound is too hard, even if similar - things do occur on the chip. - -Undoubtedly, many more such examples will be found. However, samplings and such -are really valueable only if they can be made on a chip that I have modelled -for ReSID-FP. In practice I want to know about badly-playing chips, but might -conclude that it actually plays alright. At any event, information about sound -issues is welcome. - -alankila@bel.fi +reSIDfp is free software. See the file COPYING for copying permission. diff --git a/src/sound/resid-fp/README.VICE b/src/sound/resid-fp/README.VICE deleted file mode 100644 index 02072ce9e..000000000 --- a/src/sound/resid-fp/README.VICE +++ /dev/null @@ -1,14 +0,0 @@ -This version of reSID has been modified for use with VICE. It is based on the -work contained in the resid/ directory, with duplicate files removed. All -classes have been renamed with suffix FP to avoid link-time clashes with the -other RESID implementation. - -These files reuse some define terms also defined by resid. You should not mix -resid/* and resid-fp/* files in one compile unit, or the results are probably -invalid. - -In particular, libtool is not used to build the library, and there -might be some workarounds for various substandard compilers. - -Please get the original version if you want to use reSID in your own -project. diff --git a/src/sound/resid-fp/SID.cpp b/src/sound/resid-fp/SID.cpp new file mode 100644 index 000000000..840d264e2 --- /dev/null +++ b/src/sound/resid-fp/SID.cpp @@ -0,0 +1,506 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2016 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define SID_CPP + +#include "sid.h" + +#include + +#include "array.h" +#include "Dac.h" +#include "Filter6581.h" +#include "Filter8580.h" +#include "Potentiometer.h" +#include "WaveformCalculator.h" +#include "resample/TwoPassSincResampler.h" +#include "resample/ZeroOrderResampler.h" + +namespace reSIDfp +{ + +const unsigned int ENV_DAC_BITS = 8; +const unsigned int OSC_DAC_BITS = 12; + +/** + * The waveform D/A converter introduces a DC offset in the signal + * to the envelope multiplying D/A converter. The "zero" level of + * the waveform D/A converter can be found as follows: + * + * Measure the "zero" voltage of voice 3 on the SID audio output + * pin, routing only voice 3 to the mixer ($d417 = $0b, $d418 = + * $0f, all other registers zeroed). + * + * Then set the sustain level for voice 3 to maximum and search for + * the waveform output value yielding the same voltage as found + * above. This is done by trying out different waveform output + * values until the correct value is found, e.g. with the following + * program: + * + * lda #$08 + * sta $d412 + * lda #$0b + * sta $d417 + * lda #$0f + * sta $d418 + * lda #$f0 + * sta $d414 + * lda #$21 + * sta $d412 + * lda #$01 + * sta $d40e + * + * ldx #$00 + * lda #$38 ; Tweak this to find the "zero" level + *l cmp $d41b + * bne l + * stx $d40e ; Stop frequency counter - freeze waveform output + * brk + * + * The waveform output range is 0x000 to 0xfff, so the "zero" + * level should ideally have been 0x800. In the measured chip, the + * waveform output "zero" level was found to be 0x380 (i.e. $d41b + * = 0x38) at an audio output voltage of 5.94V. + * + * With knowledge of the mixer op-amp characteristics, further estimates + * of waveform voltages can be obtained by sampling the EXT IN pin. + * From EXT IN samples, the corresponding waveform output can be found by + * using the model for the mixer. + * + * Such measurements have been done on a chip marked MOS 6581R4AR + * 0687 14, and the following results have been obtained: + * * The full range of one voice is approximately 1.5V. + * * The "zero" level rides at approximately 5.0V. + * + * + * zero-x did the measuring on the 8580 (https://sourceforge.net/p/vice-emu/bugs/1036/#c5b3): + * When it sits on basic from powerup it's at 4.72 + * Run 1.prg and check the output pin level. + * Then run 2.prg and adjust it until the output level is the same... + * 0x94-0xA8 gives me the same 4.72 1.prg shows. + * On another 8580 it's 0x90-0x9C + * Third chip 0x94-0xA8 + * Fourth chip 0x90-0xA4 + * On the 8580 that plays digis the output is 4.66 and 0x93 is the only value to reach that. + * To me that seems as regular 8580s have somewhat wide 0-level range, + * whereas that digi-compatible 8580 has it very narrow. + * On my 6581R4AR has 0x3A as the only value giving the same output level as 1.prg + */ +//@{ +unsigned int constexpr OFFSET_6581 = 0x380; +unsigned int constexpr OFFSET_8580 = 0x9c0; +//@} + +/** + * Bus value stays alive for some time after each operation. + * Values differs between chip models, the timings used here + * are taken from VICE [1]. + * See also the discussion "How do I reliably detect 6581/8580 sid?" on CSDb [2]. + * + * Results from real C64 (testprogs/SID/bitfade/delayfrq0.prg): + * + * (new SID) (250469/8580R5) (250469/8580R5) + * delayfrq0 ~7a000 ~108000 + * + * (old SID) (250407/6581) + * delayfrq0 ~01d00 + * + * [1]: http://sourceforge.net/p/vice-emu/patches/99/ + * [2]: http://noname.c64.org/csdb/forums/?roomid=11&topicid=29025&showallposts=1 + */ +//@{ +int constexpr BUS_TTL_6581 = 0x01d00; +int constexpr BUS_TTL_8580 = 0xa2000; +//@} + +SID::SID() : + filter6581(new Filter6581()), + filter8580(new Filter8580()), + externalFilter(new ExternalFilter()), + resampler(nullptr), + potX(new Potentiometer()), + potY(new Potentiometer()) +{ + voice[0].reset(new Voice()); + voice[1].reset(new Voice()); + voice[2].reset(new Voice()); + + muted[0] = muted[1] = muted[2] = false; + + reset(); + setChipModel(MOS8580); +} + +SID::~SID() +{ + // Needed to delete auto_ptr with complete type +} + +void SID::setFilter6581Curve(double filterCurve) +{ + filter6581->setFilterCurve(filterCurve); +} + +void SID::setFilter8580Curve(double filterCurve) +{ + filter8580->setFilterCurve(filterCurve); +} + +void SID::enableFilter(bool enable) +{ + filter6581->enable(enable); + filter8580->enable(enable); +} + +void SID::voiceSync(bool sync) +{ + if (sync) + { + // Synchronize the 3 waveform generators. + for (int i = 0; i < 3; i++) + { + voice[i]->wave()->synchronize(voice[(i + 1) % 3]->wave(), voice[(i + 2) % 3]->wave()); + } + } + + // Calculate the time to next voice sync + nextVoiceSync = std::numeric_limits::max(); + + for (int i = 0; i < 3; i++) + { + WaveformGenerator* const wave = voice[i]->wave(); + const unsigned int freq = wave->readFreq(); + + if (wave->readTest() || freq == 0 || !voice[(i + 1) % 3]->wave()->readSync()) + { + continue; + } + + const unsigned int accumulator = wave->readAccumulator(); + const unsigned int thisVoiceSync = ((0x7fffff - accumulator) & 0xffffff) / freq + 1; + + if (thisVoiceSync < nextVoiceSync) + { + nextVoiceSync = thisVoiceSync; + } + } +} + +void SID::setChipModel(ChipModel model) +{ + switch (model) + { + case MOS6581: + filter = filter6581.get(); + modelTTL = BUS_TTL_6581; + break; + + case MOS8580: + filter = filter8580.get(); + modelTTL = BUS_TTL_8580; + break; + + default: + throw SIDError("Unknown chip type"); + } + + this->model = model; + + // calculate waveform-related tables + matrix_t* wavetables = WaveformCalculator::getInstance()->getWaveTable(); + matrix_t* pulldowntables = WaveformCalculator::getInstance()->buildPulldownTable(model); + + // calculate envelope DAC table + { + Dac dacBuilder(ENV_DAC_BITS); + dacBuilder.kinkedDac(model); + + for (unsigned int i = 0; i < (1 << ENV_DAC_BITS); i++) + { + envDAC[i] = static_cast(dacBuilder.getOutput(i)); + } + } + + // calculate oscillator DAC table + const bool is6581 = model == MOS6581; + + { + Dac dacBuilder(OSC_DAC_BITS); + dacBuilder.kinkedDac(model); + + const double offset = dacBuilder.getOutput(is6581 ? OFFSET_6581 : OFFSET_8580); + + for (unsigned int i = 0; i < (1 << OSC_DAC_BITS); i++) + { + const double dacValue = dacBuilder.getOutput(i); + oscDAC[i] = static_cast(dacValue - offset); + } + } + + // set voice tables + for (int i = 0; i < 3; i++) + { + voice[i]->setEnvDAC(envDAC); + voice[i]->setWavDAC(oscDAC); + voice[i]->wave()->setModel(is6581); + voice[i]->wave()->setWaveformModels(wavetables); + voice[i]->wave()->setPulldownModels(pulldowntables); + } +} + +void SID::reset() +{ + for (int i = 0; i < 3; i++) + { + voice[i]->reset(); + } + + filter6581->reset(); + filter8580->reset(); + externalFilter->reset(); + + if (resampler.get()) + { + resampler->reset(); + } + + busValue = 0; + busValueTtl = 0; + voiceSync(false); +} + +void SID::input(int value) +{ + filter6581->input(value); + filter8580->input(value); +} + +unsigned char SID::read(int offset) +{ + switch (offset) + { + case 0x19: // X value of paddle + busValue = potX->readPOT(); + busValueTtl = modelTTL; + break; + + case 0x1a: // Y value of paddle + busValue = potY->readPOT(); + busValueTtl = modelTTL; + break; + + case 0x1b: // Voice #3 waveform output + busValue = voice[2]->wave()->readOSC(); + busValueTtl = modelTTL; + break; + + case 0x1c: // Voice #3 ADSR output + busValue = voice[2]->envelope()->readENV(); + busValueTtl = modelTTL; + break; + + default: + // Reading from a write-only or non-existing register + // makes the bus discharge faster. + // Emulate this by halving the residual TTL. + busValueTtl /= 2; + break; + } + + return busValue; +} + +void SID::write(int offset, unsigned char value) +{ + busValue = value; + busValueTtl = modelTTL; + + switch (offset) + { + case 0x00: // Voice #1 frequency (Low-byte) + voice[0]->wave()->writeFREQ_LO(value); + break; + + case 0x01: // Voice #1 frequency (High-byte) + voice[0]->wave()->writeFREQ_HI(value); + break; + + case 0x02: // Voice #1 pulse width (Low-byte) + voice[0]->wave()->writePW_LO(value); + break; + + case 0x03: // Voice #1 pulse width (bits #8-#15) + voice[0]->wave()->writePW_HI(value); + break; + + case 0x04: // Voice #1 control register + voice[0]->writeCONTROL_REG(muted[0] ? 0 : value); + break; + + case 0x05: // Voice #1 Attack and Decay length + voice[0]->envelope()->writeATTACK_DECAY(value); + break; + + case 0x06: // Voice #1 Sustain volume and Release length + voice[0]->envelope()->writeSUSTAIN_RELEASE(value); + break; + + case 0x07: // Voice #2 frequency (Low-byte) + voice[1]->wave()->writeFREQ_LO(value); + break; + + case 0x08: // Voice #2 frequency (High-byte) + voice[1]->wave()->writeFREQ_HI(value); + break; + + case 0x09: // Voice #2 pulse width (Low-byte) + voice[1]->wave()->writePW_LO(value); + break; + + case 0x0a: // Voice #2 pulse width (bits #8-#15) + voice[1]->wave()->writePW_HI(value); + break; + + case 0x0b: // Voice #2 control register + voice[1]->writeCONTROL_REG(muted[1] ? 0 : value); + break; + + case 0x0c: // Voice #2 Attack and Decay length + voice[1]->envelope()->writeATTACK_DECAY(value); + break; + + case 0x0d: // Voice #2 Sustain volume and Release length + voice[1]->envelope()->writeSUSTAIN_RELEASE(value); + break; + + case 0x0e: // Voice #3 frequency (Low-byte) + voice[2]->wave()->writeFREQ_LO(value); + break; + + case 0x0f: // Voice #3 frequency (High-byte) + voice[2]->wave()->writeFREQ_HI(value); + break; + + case 0x10: // Voice #3 pulse width (Low-byte) + voice[2]->wave()->writePW_LO(value); + break; + + case 0x11: // Voice #3 pulse width (bits #8-#15) + voice[2]->wave()->writePW_HI(value); + break; + + case 0x12: // Voice #3 control register + voice[2]->writeCONTROL_REG(muted[2] ? 0 : value); + break; + + case 0x13: // Voice #3 Attack and Decay length + voice[2]->envelope()->writeATTACK_DECAY(value); + break; + + case 0x14: // Voice #3 Sustain volume and Release length + voice[2]->envelope()->writeSUSTAIN_RELEASE(value); + break; + + case 0x15: // Filter cut off frequency (bits #0-#2) + filter6581->writeFC_LO(value); + filter8580->writeFC_LO(value); + break; + + case 0x16: // Filter cut off frequency (bits #3-#10) + filter6581->writeFC_HI(value); + filter8580->writeFC_HI(value); + break; + + case 0x17: // Filter control + filter6581->writeRES_FILT(value); + filter8580->writeRES_FILT(value); + break; + + case 0x18: // Volume and filter modes + filter6581->writeMODE_VOL(value); + filter8580->writeMODE_VOL(value); + break; + + default: + break; + } + + // Update voicesync just in case. + voiceSync(false); +} + +void SID::setSamplingParameters(double clockFrequency, SamplingMethod method, double samplingFrequency, double highestAccurateFrequency) +{ + externalFilter->setClockFrequency(clockFrequency); + + switch (method) + { + case DECIMATE: + resampler.reset(new ZeroOrderResampler(clockFrequency, samplingFrequency)); + break; + + case RESAMPLE: + resampler.reset(TwoPassSincResampler::create(clockFrequency, samplingFrequency, highestAccurateFrequency)); + break; + + default: + throw SIDError("Unknown sampling method"); + } +} + +void SID::clockSilent(unsigned int cycles) +{ + ageBusValue(cycles); + + while (cycles != 0) + { + int delta_t = std::min(nextVoiceSync, cycles); + + if (delta_t > 0) + { + for (int i = 0; i < delta_t; i++) + { + // clock waveform generators (can affect OSC3) + voice[0]->wave()->clock(); + voice[1]->wave()->clock(); + voice[2]->wave()->clock(); + + voice[0]->wave()->output(voice[2]->wave()); + voice[1]->wave()->output(voice[0]->wave()); + voice[2]->wave()->output(voice[1]->wave()); + + // clock ENV3 only + voice[2]->envelope()->clock(); + } + + cycles -= delta_t; + nextVoiceSync -= delta_t; + } + + if (nextVoiceSync == 0) + { + voiceSync(true); + } + } +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/Spline.cpp b/src/sound/resid-fp/Spline.cpp new file mode 100644 index 000000000..50d55fef1 --- /dev/null +++ b/src/sound/resid-fp/Spline.cpp @@ -0,0 +1,119 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2015 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "Spline.h" + +#include +#include + +namespace reSIDfp +{ + +Spline::Spline(const std::vector &input) : + params(input.size()), + c(¶ms[0]) +{ + assert(input.size() > 2); + + const size_t coeffLength = input.size() - 1; + + std::vector dxs(coeffLength); + std::vector ms(coeffLength); + + // Get consecutive differences and slopes + for (size_t i = 0; i < coeffLength; i++) + { + assert(input[i].x < input[i + 1].x); + + const double dx = input[i + 1].x - input[i].x; + const double dy = input[i + 1].y - input[i].y; + dxs[i] = dx; + ms[i] = dy/dx; + } + + // Get degree-1 coefficients + params[0].c = ms[0]; + for (size_t i = 1; i < coeffLength; i++) + { + const double m = ms[i - 1]; + const double mNext = ms[i]; + if (m * mNext <= 0) + { + params[i].c = 0.0; + } + else + { + const double dx = dxs[i - 1]; + const double dxNext = dxs[i]; + const double common = dx + dxNext; + params[i].c = 3.0 * common / ((common + dxNext) / m + (common + dx) / mNext); + } + } + params[coeffLength].c = ms[coeffLength - 1]; + + // Get degree-2 and degree-3 coefficients + for (size_t i = 0; i < coeffLength; i++) + { + params[i].x1 = input[i].x; + params[i].x2 = input[i + 1].x; + params[i].d = input[i].y; + + const double c1 = params[i].c; + const double m = ms[i]; + const double invDx = 1.0 / dxs[i]; + const double common = c1 + params[i + 1].c - m - m; + params[i].b = (m - c1 - common) * invDx; + params[i].a = common * invDx * invDx; + } + + // Fix the upper range, because we interpolate outside original bounds if necessary. + params[coeffLength - 1].x2 = std::numeric_limits::max(); +} + +Spline::Point Spline::evaluate(double x) const +{ + if ((x < c->x1) || (x > c->x2)) + { + for (size_t i = 0; i < params.size(); i++) + { + if (x <= params[i].x2) + { + c = ¶ms[i]; + break; + } + } + } + + // Interpolate + const double diff = x - c->x1; + + Point out; + + // y = a*x^3 + b*x^2 + c*x + d + out.x = ((c->a * diff + c->b) * diff + c->c) * diff + c->d; + + // dy = 3*a*x^2 + 2*b*x + c + out.y = (3.0 * c->a * diff + 2.0 * c->b) * diff + c->c; + + return out; +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/Spline.h b/src/sound/resid-fp/Spline.h new file mode 100644 index 000000000..6cc2b1edc --- /dev/null +++ b/src/sound/resid-fp/Spline.h @@ -0,0 +1,78 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2015 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef SPLINE_H +#define SPLINE_H + +#include +#include + +namespace reSIDfp +{ + +/** + * Fritsch-Carlson monotone cubic spline interpolation. + * + * Based on the implementation from the [Monotone cubic interpolation] wikipedia page. + * + * [Monotone cubic interpolation]: https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + */ +class Spline +{ +public: + typedef struct + { + double x; + double y; + } Point; + +private: + typedef struct + { + double x1; + double x2; + double a; + double b; + double c; + double d; + } Param; + + typedef std::vector ParamVector; + +private: + /// Interpolation parameters + ParamVector params; + + /// Last used parameters, cached for speed up + mutable ParamVector::const_pointer c; + +public: + Spline(const std::vector &input); + + /** + * Evaluate y and its derivative at given point x. + */ + Point evaluate(double x) const; +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/Voice.h b/src/sound/resid-fp/Voice.h new file mode 100644 index 000000000..fc7ed41b7 --- /dev/null +++ b/src/sound/resid-fp/Voice.h @@ -0,0 +1,130 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2022 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef VOICE_H +#define VOICE_H + +#include + +#include "siddefs-fp.h" +#include "WaveformGenerator.h" +#include "EnvelopeGenerator.h" + +#include "sidcxx11.h" + +namespace reSIDfp +{ + +/** + * Representation of SID voice block. + */ +class Voice +{ +private: + std::unique_ptr const waveformGenerator; + + std::unique_ptr const envelopeGenerator; + + /// The DAC LUT for analog waveform output + float* wavDAC; //-V730_NOINIT this is initialized in the SID constructor + + /// The DAC LUT for analog envelope output + float* envDAC; //-V730_NOINIT this is initialized in the SID constructor + +public: + /** + * Amplitude modulated waveform output. + * + * The waveform DAC generates a voltage between virtual ground and Vdd + * (5-12 V for the 6581 and 4.75-9 V for the 8580) + * corresponding to oscillator state 0 .. 4095. + * + * The envelope DAC generates a voltage between waveform gen output and + * the virtual ground level, corresponding to envelope state 0 .. 255. + * + * Ideal range [-2048*255, 2047*255]. + * + * @param ringModulator Ring-modulator for waveform + * @return the voice analog output + */ + RESID_INLINE + int output(const WaveformGenerator* ringModulator) const + { + unsigned int const wav = waveformGenerator->output(ringModulator); + unsigned int const env = envelopeGenerator->output(); + + // DAC imperfections are emulated by using the digital output + // as an index into a DAC lookup table. + return static_cast(wavDAC[wav] * envDAC[env]); + } + + /** + * Constructor. + */ + Voice() : + waveformGenerator(new WaveformGenerator()), + envelopeGenerator(new EnvelopeGenerator()) {} + + /** + * Set the analog DAC emulation for waveform generator. + * Must be called before any operation. + * + * @param dac + */ + void setWavDAC(float* dac) { wavDAC = dac; } + + /** + * Set the analog DAC emulation for envelope. + * Must be called before any operation. + * + * @param dac + */ + void setEnvDAC(float* dac) { envDAC = dac; } + + WaveformGenerator* wave() const { return waveformGenerator.get(); } + + EnvelopeGenerator* envelope() const { return envelopeGenerator.get(); } + + /** + * Write control register. + * + * @param control Control register value. + */ + void writeCONTROL_REG(unsigned char control) + { + waveformGenerator->writeCONTROL_REG(control); + envelopeGenerator->writeCONTROL_REG(control); + } + + /** + * SID reset. + */ + void reset() + { + waveformGenerator->reset(); + envelopeGenerator->reset(); + } +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/WaveformCalculator.cpp b/src/sound/resid-fp/WaveformCalculator.cpp new file mode 100644 index 000000000..f72cf93b7 --- /dev/null +++ b/src/sound/resid-fp/WaveformCalculator.cpp @@ -0,0 +1,195 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "WaveformCalculator.h" + +#include + +namespace reSIDfp +{ + +WaveformCalculator* WaveformCalculator::getInstance() +{ + static WaveformCalculator instance; + return &instance; +} + +/** + * Parameters derived with the Monte Carlo method based on + * samplings by kevtris. Code and data available in the project repository [1]. + * + * The score here reported is the acoustic error + * calculated XORing the estimated and the sampled values. + * In parentheses the number of mispredicted bits. + * + * [1] https://github.com/libsidplayfp/combined-waveforms + */ +const CombinedWaveformConfig config[2][5] = +{ + { /* kevtris chip G (6581 R2) */ + {0.862147212f, 0.f, 10.8962431f, 2.50848103f }, // TS error 1941 (327/28672) + {0.932746708f, 2.07508397f, 1.03668225f, 1.14876997f }, // PT error 5992 (126/32768) + {0.860927045f, 2.43506575f, 0.908603609f, 1.07907593f }, // PS error 3693 (521/28672) + {0.741343081f, 0.0452554375f, 1.1439606f, 1.05711341f }, // PTS error 338 ( 29/28672) + {0.96f, 2.5f, 1.1f, 1.2f }, // NP guessed + }, + { /* kevtris chip V (8580 R5) */ + {0.715788841f, 0.f, 1.32999945f, 2.2172699f }, // TS error 928 (135/32768) + {0.93500334f, 1.05977178f, 1.08629429f, 1.43518543f }, // PT error 7991 (212/32768) + {0.920648575f, 0.943601072f, 1.13034654f, 1.41881108f }, // PS error 12566 (394/32768) + {0.90921098f, 0.979807794f, 0.942194462f, 1.40958893f }, // PTS error 2092 ( 60/32768) + {0.95f, 1.15f, 1.f, 1.45f }, // NP guessed + }, +}; + +typedef float (*distance_t)(float, int); + +// Distance functions +static float exponentialDistance(float distance, int i) +{ + return pow(distance, -i); +} + +MAYBE_UNUSED static float linearDistance(float distance, int i) +{ + return 1.f / (1.f + i * distance); +} + +MAYBE_UNUSED static float quadraticDistance(float distance, int i) +{ + return 1.f / (1.f + (i*i) * distance); +} + +/// Calculate triangle waveform +static unsigned int triXor(unsigned int val) +{ + return (((val & 0x800) == 0) ? val : (val ^ 0xfff)) << 1; +} + +/** + * Generate bitstate based on emulation of combined waves pulldown. + * + * @param distancetable + * @param pulsestrength + * @param threshold + * @param accumulator the high bits of the accumulator value + */ +short calculatePulldown(float distancetable[], float pulsestrength, float threshold, unsigned int accumulator) +{ + unsigned char bit[12]; + + for (unsigned int i = 0; i < 12; i++) + { + bit[i] = (accumulator & (1u << i)) != 0 ? 1 : 0; + } + + float pulldown[12]; + + for (int sb = 0; sb < 12; sb++) + { + float avg = 0.f; + float n = 0.f; + + for (int cb = 0; cb < 12; cb++) + { + if (cb == sb) + continue; + const float weight = distancetable[sb - cb + 12]; + avg += static_cast(1 - bit[cb]) * weight; + n += weight; + } + + avg -= pulsestrength; + + pulldown[sb] = avg / n; + } + + // Get the predicted value + short value = 0; + + for (unsigned int i = 0; i < 12; i++) + { + const float bitValue = bit[i] != 0 ? 1.f - pulldown[i] : 0.f; + if (bitValue > threshold) + { + value |= 1u << i; + } + } + + return value; +} + +WaveformCalculator::WaveformCalculator() : + wftable(4, 4096) +{ + // Build waveform table. + for (unsigned int idx = 0; idx < (1u << 12); idx++) + { + const short saw = static_cast(idx); + const short tri = static_cast(triXor(idx)); + + wftable[0][idx] = 0xfff; + wftable[1][idx] = tri; + wftable[2][idx] = saw; + wftable[3][idx] = saw & (saw << 1); + } +} + +matrix_t* WaveformCalculator::buildPulldownTable(ChipModel model) +{ + const CombinedWaveformConfig* cfgArray = config[model == MOS6581 ? 0 : 1]; + + cw_cache_t::iterator lb = PULLDOWN_CACHE.lower_bound(cfgArray); + + if (lb != PULLDOWN_CACHE.end() && !(PULLDOWN_CACHE.key_comp()(cfgArray, lb->first))) + { + return &(lb->second); + } + + matrix_t pdTable(5, 4096); + + for (int wav = 0; wav < 5; wav++) + { + const CombinedWaveformConfig& cfg = cfgArray[wav]; + + const distance_t distFunc = exponentialDistance; + + float distancetable[12 * 2 + 1]; + distancetable[12] = 1.f; + for (int i = 12; i > 0; i--) + { + distancetable[12-i] = distFunc(cfg.distance1, i); + distancetable[12+i] = distFunc(cfg.distance2, i); + } + + for (unsigned int idx = 0; idx < (1u << 12); idx++) + { + pdTable[wav][idx] = calculatePulldown(distancetable, cfg.pulsestrength, cfg.threshold, idx); + } + } +#ifdef HAVE_CXX11 + return &(PULLDOWN_CACHE.emplace_hint(lb, cw_cache_t::value_type(cfgArray, pdTable))->second); +#else + return &(PULLDOWN_CACHE.insert(lb, cw_cache_t::value_type(cfgArray, pdTable))->second); +#endif +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/WaveformCalculator.h b/src/sound/resid-fp/WaveformCalculator.h new file mode 100644 index 000000000..4ad677274 --- /dev/null +++ b/src/sound/resid-fp/WaveformCalculator.h @@ -0,0 +1,136 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef WAVEFORMCALCULATOR_h +#define WAVEFORMCALCULATOR_h + +#include + +#include "array.h" +#include "sidcxx11.h" +#include "siddefs-fp.h" + + +namespace reSIDfp +{ + +/** + * Combined waveform model parameters. + */ +typedef struct +{ + float threshold; + float pulsestrength; + float distance1; + float distance2; +} CombinedWaveformConfig; + +/** + * Combined waveform calculator for WaveformGenerator. + * By combining waveforms, the bits of each waveform are effectively short + * circuited. A zero bit in one waveform will result in a zero output bit + * (thus the infamous claim that the waveforms are AND'ed). + * However, a zero bit in one waveform may also affect the neighboring bits + * in the output. + * + * Example: + * + * 1 1 + * Bit # 1 0 9 8 7 6 5 4 3 2 1 0 + * ----------------------- + * Sawtooth 0 0 0 1 1 1 1 1 1 0 0 0 + * + * Triangle 0 0 1 1 1 1 1 1 0 0 0 0 + * + * AND 0 0 0 1 1 1 1 1 0 0 0 0 + * + * Output 0 0 0 0 1 1 1 0 0 0 0 0 + * + * + * Re-vectorized die photographs reveal the mechanism behind this behavior. + * Each waveform selector bit acts as a switch, which directly connects + * internal outputs into the waveform DAC inputs as follows: + * + * - Noise outputs the shift register bits to DAC inputs as described above. + * Each output is also used as input to the next bit when the shift register + * is shifted. Lower four bits are grounded. + * - Pulse connects a single line to all DAC inputs. The line is connected to + * either 5V (pulse on) or 0V (pulse off) at bit 11, and ends at bit 0. + * - Triangle connects the upper 11 bits of the (MSB EOR'ed) accumulator to the + * DAC inputs, so that DAC bit 0 = 0, DAC bit n = accumulator bit n - 1. + * - Sawtooth connects the upper 12 bits of the accumulator to the DAC inputs, + * so that DAC bit n = accumulator bit n. Sawtooth blocks out the MSB from + * the EOR used to generate the triangle waveform. + * + * We can thus draw the following conclusions: + * + * - The shift register may be written to by combined waveforms. + * - The pulse waveform interconnects all bits in combined waveforms via the + * pulse line. + * - The combination of triangle and sawtooth interconnects neighboring bits + * of the sawtooth waveform. + * + * Also in the 6581 the MSB of the oscillator, used as input for the + * triangle xor logic and the pulse adder's last bit, is connected directly + * to the waveform selector, while in the 8580 it is latched at sid_clk2 + * before being forwarded to the selector. Thus in the 6581 if the sawtooth MSB + * is pulled down it might affect the oscillator's adder + * driving the top bit low. + * + */ +class WaveformCalculator +{ +private: + typedef std::map cw_cache_t; + +private: + matrix_t wftable; + + cw_cache_t PULLDOWN_CACHE; + +private: + WaveformCalculator(); + +public: + /** + * Get the singleton instance. + */ + static WaveformCalculator* getInstance(); + + /** + * Get the waveform table for use by WaveformGenerator. + * + * @return Waveform table + */ + matrix_t* getWaveTable() { return &wftable; } + + /** + * Build pulldown table for use by WaveformGenerator. + * + * @param model Chip model to use + * @return Pulldown table + */ + matrix_t* buildPulldownTable(ChipModel model); +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/WaveformGenerator.cpp b/src/sound/resid-fp/WaveformGenerator.cpp new file mode 100644 index 000000000..207431c94 --- /dev/null +++ b/src/sound/resid-fp/WaveformGenerator.cpp @@ -0,0 +1,397 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#define WAVEFORMGENERATOR_CPP + +#include "WaveformGenerator.h" + +namespace reSIDfp +{ + +/** + * Number of cycles after which the waveform output fades to 0 when setting + * the waveform register to 0. + * Values measured on warm chips (6581R3/R4 and 8580R5) + * checking OSC3. + * Times vary wildly with temperature and may differ + * from chip to chip so the numbers here represent + * only the big difference between the old and new models. + * + * See [VICE Bug #290](http://sourceforge.net/p/vice-emu/bugs/290/) + * and [VICE Bug #1128](http://sourceforge.net/p/vice-emu/bugs/1128/) + */ +// ~95ms +const unsigned int FLOATING_OUTPUT_TTL_6581R3 = 54000; +const unsigned int FLOATING_OUTPUT_FADE_6581R3 = 1400; +// ~1s +const unsigned int FLOATING_OUTPUT_TTL_6581R4 = 1000000; +// ~1s +const unsigned int FLOATING_OUTPUT_TTL_8580R5 = 800000; +const unsigned int FLOATING_OUTPUT_FADE_8580R5 = 50000; + +/** + * Number of cycles after which the shift register is reset + * when the test bit is set. + * Values measured on warm chips (6581R3/R4 and 8580R5) + * checking OSC3. + * Times vary wildly with temperature and may differ + * from chip to chip so the numbers here represent + * only the big difference between the old and new models. + */ +// ~210ms +const unsigned int SHIFT_REGISTER_RESET_6581R3 = 50000; +const unsigned int SHIFT_REGISTER_FADE_6581R3 = 15000; +// ~2.15s +const unsigned int SHIFT_REGISTER_RESET_6581R4 = 2150000; +// ~2.8s +const unsigned int SHIFT_REGISTER_RESET_8580R5 = 986000; +const unsigned int SHIFT_REGISTER_FADE_8580R5 = 314300; + +const unsigned int shift_mask = + ~( + (1u << 2) | // Bit 20 + (1u << 4) | // Bit 18 + (1u << 8) | // Bit 14 + (1u << 11) | // Bit 11 + (1u << 13) | // Bit 9 + (1u << 17) | // Bit 5 + (1u << 20) | // Bit 2 + (1u << 22) // Bit 0 + ); + +/* + * This is what happens when the lfsr is clocked: + * + * cycle 0: bit 19 of the accumulator goes from low to high, the noise register acts normally, + * the output may pulldown a bit; + * + * cycle 1: first phase of the shift, the bits are interconnected and the output of each bit + * is latched into the following. The output may overwrite the latched value. + * + * cycle 2: second phase of the shift, the latched value becomes active in the first + * half of the clock and from the second half the register returns to normal operation. + * + * When the test or reset lines are active the first phase is executed at every cyle + * until the signal is released triggering the second phase. + * + * | | bit n | bit n+1 + * | bit19 | latch output | latch output + * -----+-------+--------------+-------------- + * phi1 | 0 | A <-> A | B <-> B + * phi2 | 0 | A <-> A | B <-> B + * -----+-------+--------------+-------------- + * phi1 | 1 | A <-> A | B <-> B <- bit19 raises + * phi2 | 1 | A <-> A | B <-> B + * -----+-------+--------------+-------------- + * phi1 | 1 | X A --|-> A B <- shift phase 1 + * phi2 | 1 | X A --|-> A B + * -----+-------+--------------+-------------- + * phi1 | 1 | X --> X | A --> A <- shift phase 2 + * phi2 | 1 | X <-> X | A <-> A + */ + +inline bool do_writeback(unsigned int waveform_old, unsigned int waveform_new, bool is6581) +{ + // no writeback without combined waveforms + if (waveform_new <= 8) + return false; + if (waveform_old <= 8) + return false; // fixes SID/noisewriteback/noise_writeback_test2-{old,new} + + // What's happening here? + if (is6581 && + ((((waveform_old & 0x3) == 0x1) && ((waveform_new & 0x3) == 0x2)) + || (((waveform_old & 0x3) == 0x2) && ((waveform_new & 0x3) == 0x1)))) + { + // fixes + // noise_writeback_check_9_to_A_old + // noise_writeback_check_9_to_E_old + // noise_writeback_check_A_to_9_old + // noise_writeback_check_A_to_D_old + // noise_writeback_check_D_to_A_old + // noise_writeback_check_E_to_9_old + return false; + } + if (waveform_old == 0xc) + { + // fixes + // noise_writeback_check_C_to_A_new + return false; + } + if (waveform_new == 0xc) + { + // fixes + // noise_writeback_check_9_to_C_old + // noise_writeback_check_A_to_C_old + return false; + } + + // ok do the writeback + return true; +} + +inline unsigned int get_noise_writeback(unsigned int waveform_output) +{ + return + ((waveform_output & (1u << 11)) >> 9) | // Bit 11 -> bit 20 + ((waveform_output & (1u << 10)) >> 6) | // Bit 10 -> bit 18 + ((waveform_output & (1u << 9)) >> 1) | // Bit 9 -> bit 14 + ((waveform_output & (1u << 8)) << 3) | // Bit 8 -> bit 11 + ((waveform_output & (1u << 7)) << 6) | // Bit 7 -> bit 9 + ((waveform_output & (1u << 6)) << 11) | // Bit 6 -> bit 5 + ((waveform_output & (1u << 5)) << 15) | // Bit 5 -> bit 2 + ((waveform_output & (1u << 4)) << 18); // Bit 4 -> bit 0 +} + +/* + * Perform the actual shifting, moving the latched value into following bits. + * The XORing for bit0 is done in this cycle using the test bit latched during + * the previous phi2 cycle. + */ +void WaveformGenerator::shift_phase2(unsigned int waveform_old, unsigned int waveform_new) +{ + if (do_writeback(waveform_old, waveform_new, is6581)) + { + // if noise is combined with another waveform the output drives the SR bits + shift_latch = (shift_register & shift_mask) | get_noise_writeback(waveform_output); + } + + // bit0 = (bit22 | test | reset) ^ bit17 = 1 ^ bit17 = ~bit17 + const unsigned int bit22 = ((test_or_reset ? 1 : 0) | shift_latch) << 22; + const unsigned int bit0 = (bit22 ^ (shift_latch << 17)) & (1 << 22); + + shift_register = (shift_latch >> 1) | bit0; +#ifdef TRACE + std::cout << std::hex << shift_latch << " -> " << shift_register << std::endl; +#endif + set_noise_output(); +} + +void WaveformGenerator::write_shift_register() +{ + if (unlikely(waveform > 0x8)) + { + if (waveform == 0xc) + return; // breaks SID/wf12nsr/wf12nsr + + // Write changes to the shift register output caused by combined waveforms + // back into the shift register. + if (likely(shift_pipeline != 1) && !test) + { +#ifdef TRACE + std::cout << "write shift_register" << std::endl; +#endif + // the output pulls down the SR bits + shift_register = shift_register & (shift_mask | get_noise_writeback(waveform_output)); + noise_output &= waveform_output; + } + else + { +#ifdef TRACE + std::cout << "write shift_latch" << std::endl; +#endif + // shift phase 1: the output drives the SR bits + noise_output = waveform_output; + } + + set_no_noise_or_noise_output(); + } +} + +void WaveformGenerator::set_noise_output() +{ + noise_output = + ((shift_register & (1u << 2)) << 9) | // Bit 20 -> bit 11 + ((shift_register & (1u << 4)) << 6) | // Bit 18 -> bit 10 + ((shift_register & (1u << 8)) << 1) | // Bit 14 -> bit 9 + ((shift_register & (1u << 11)) >> 3) | // Bit 11 -> bit 8 + ((shift_register & (1u << 13)) >> 6) | // Bit 9 -> bit 7 + ((shift_register & (1u << 17)) >> 11) | // Bit 5 -> bit 6 + ((shift_register & (1u << 20)) >> 15) | // Bit 2 -> bit 5 + ((shift_register & (1u << 22)) >> 18); // Bit 0 -> bit 4 + + set_no_noise_or_noise_output(); +} + +void WaveformGenerator::setWaveformModels(matrix_t* models) +{ + model_wave = models; +} + +void WaveformGenerator::setPulldownModels(matrix_t* models) +{ + model_pulldown = models; +} + +void WaveformGenerator::synchronize(WaveformGenerator* syncDest, const WaveformGenerator* syncSource) const +{ + // A special case occurs when a sync source is synced itself on the same + // cycle as when its MSB is set high. In this case the destination will + // not be synced. This has been verified by sampling OSC3. + if (unlikely(msb_rising) && syncDest->sync && !(sync && syncSource->msb_rising)) + { + syncDest->accumulator = 0; + } +} + +void WaveformGenerator::set_no_noise_or_noise_output() +{ + no_noise_or_noise_output = no_noise | noise_output; +} + +void WaveformGenerator::writeCONTROL_REG(unsigned char control) +{ + const unsigned int waveform_prev = waveform; + const bool test_prev = test; + + waveform = (control >> 4) & 0x0f; + test = (control & 0x08) != 0; + sync = (control & 0x02) != 0; + + // Substitution of accumulator MSB when sawtooth = 0, ring_mod = 1. + ring_msb_mask = ((~control >> 5) & (control >> 2) & 0x1) << 23; + + if (waveform != waveform_prev) + { + // Set up waveform tables + wave = (*model_wave)[waveform & 0x3]; + // We assume tha combinations including noise + // behave the same as without + switch (waveform & 0x7) + { + case 3: + pulldown = (*model_pulldown)[0]; + break; + case 4: + pulldown = (waveform & 0x8) ? (*model_pulldown)[4] : nullptr; + break; + case 5: + pulldown = (*model_pulldown)[1]; + break; + case 6: + pulldown = (*model_pulldown)[2]; + break; + case 7: + pulldown = (*model_pulldown)[3]; + break; + default: + pulldown = nullptr; + break; + } + + // no_noise and no_pulse are used in set_waveform_output() as bitmasks to + // only let the noise or pulse influence the output when the noise or pulse + // waveforms are selected. + no_noise = (waveform & 0x8) != 0 ? 0x000 : 0xfff; + set_no_noise_or_noise_output(); + no_pulse = (waveform & 0x4) != 0 ? 0x000 : 0xfff; + + if (waveform == 0) + { + // Change to floating DAC input. + // Reset fading time for floating DAC input. + floating_output_ttl = is6581 ? FLOATING_OUTPUT_TTL_6581R3 : FLOATING_OUTPUT_TTL_8580R5; + } + } + + if (test != test_prev) + { + if (test) + { + // Reset accumulator. + accumulator = 0; + + // Flush shift pipeline. + shift_pipeline = 0; + + // Latch the shift register value. + shift_latch = shift_register; +#ifdef TRACE + std::cout << "shift phase 1 (test)" << std::endl; +#endif + + // Set reset time for shift register. + shift_register_reset = is6581 ? SHIFT_REGISTER_RESET_6581R3 : SHIFT_REGISTER_RESET_8580R5; + } + else + { + // When the test bit is falling, the second phase of the shift is + // completed by enabling SRAM write. + shift_phase2(waveform_prev, waveform); + } + } +} + +void WaveformGenerator::waveBitfade() +{ + waveform_output &= waveform_output >> 1; + osc3 = waveform_output; + if (waveform_output != 0) + floating_output_ttl = is6581 ? FLOATING_OUTPUT_FADE_6581R3 : FLOATING_OUTPUT_FADE_8580R5; +} + +void WaveformGenerator::shiftregBitfade() +{ + shift_register |= shift_register >> 1; + shift_register |= 0x400000; + if (shift_register != 0x7fffff) + shift_register_reset = is6581 ? SHIFT_REGISTER_FADE_6581R3 : SHIFT_REGISTER_FADE_8580R5; +} + +void WaveformGenerator::reset() +{ + // accumulator is not changed on reset + freq = 0; + pw = 0; + + msb_rising = false; + + waveform = 0; + osc3 = 0; + + test = false; + sync = false; + + wave = model_wave ? (*model_wave)[0] : nullptr; + pulldown = nullptr; + + ring_msb_mask = 0; + no_noise = 0xfff; + no_pulse = 0xfff; + pulse_output = 0xfff; + + shift_register_reset = 0; + shift_register = 0x7fffff; + // when reset is released the shift register is clocked once + // so the lower bit is zeroed out + // bit0 = (bit22 | test) ^ bit17 = 1 ^ 1 = 0 + test_or_reset = true; + shift_latch = shift_register; + shift_phase2(0, 0); + + shift_pipeline = 0; + + waveform_output = 0; + floating_output_ttl = 0; +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/WaveformGenerator.h b/src/sound/resid-fp/WaveformGenerator.h new file mode 100644 index 000000000..adca6c228 --- /dev/null +++ b/src/sound/resid-fp/WaveformGenerator.h @@ -0,0 +1,440 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2023 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004,2010 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef WAVEFORMGENERATOR_H +#define WAVEFORMGENERATOR_H + +#include "siddefs-fp.h" +#include "array.h" + +#include "sidcxx11.h" + +// print SR debugging info +//#define TRACE 1 + +#ifdef TRACE +# include +#endif + +namespace reSIDfp +{ + +/** + * A 24 bit accumulator is the basis for waveform generation. + * FREQ is added to the lower 16 bits of the accumulator each cycle. + * The accumulator is set to zero when TEST is set, and starts counting + * when TEST is cleared. + * + * Waveforms are generated as follows: + * + * - No waveform: + * When no waveform is selected, the DAC input is floating. + * + * + * - Triangle: + * The upper 12 bits of the accumulator are used. + * The MSB is used to create the falling edge of the triangle by inverting + * the lower 11 bits. The MSB is thrown away and the lower 11 bits are + * left-shifted (half the resolution, full amplitude). + * Ring modulation substitutes the MSB with MSB EOR NOT sync_source MSB. + * + * + * - Sawtooth: + * The output is identical to the upper 12 bits of the accumulator. + * + * + * - Pulse: + * The upper 12 bits of the accumulator are used. + * These bits are compared to the pulse width register by a 12 bit digital + * comparator; output is either all one or all zero bits. + * The pulse setting is delayed one cycle after the compare. + * The test bit, when set to one, holds the pulse waveform output at 0xfff + * regardless of the pulse width setting. + * + * + * - Noise: + * The noise output is taken from intermediate bits of a 23-bit shift register + * which is clocked by bit 19 of the accumulator. + * The shift is delayed 2 cycles after bit 19 is set high. + * + * Operation: Calculate EOR result, shift register, set bit 0 = result. + * + * reset +--------------------------------------------+ + * | | | + * test--OR-->EOR<--+ | + * | | | + * 2 2 2 1 1 1 1 1 1 1 1 1 1 | + * Register bits: 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 <---+ + * | | | | | | | | + * Waveform bits: 1 1 9 8 7 6 5 4 + * 1 0 + * + * The low 4 waveform bits are zero (grounded). + */ +class WaveformGenerator +{ +private: + matrix_t* model_wave; + matrix_t* model_pulldown; + + short* wave; + short* pulldown; + + // PWout = (PWn/40.95)% + unsigned int pw; + + unsigned int shift_register; + + /// Shift register is latched when transitioning to shift phase 1. + unsigned int shift_latch; + + /// Emulation of pipeline causing bit 19 to clock the shift register. + int shift_pipeline; + + unsigned int ring_msb_mask; + unsigned int no_noise; + unsigned int noise_output; + unsigned int no_noise_or_noise_output; + unsigned int no_pulse; + unsigned int pulse_output; + + /// The control register right-shifted 4 bits; used for output function table lookup. + unsigned int waveform; + + unsigned int waveform_output; + + /// Current accumulator value. + unsigned int accumulator; + + // Fout = (Fn*Fclk/16777216)Hz + unsigned int freq; + + /// 8580 tri/saw pipeline + unsigned int tri_saw_pipeline; + + /// The OSC3 value + unsigned int osc3; + + /// Remaining time to fully reset shift register. + unsigned int shift_register_reset; + + // The wave signal TTL when no waveform is selected. + unsigned int floating_output_ttl; + + /// The control register bits. Gate is handled by EnvelopeGenerator. + //@{ + bool test; + bool sync; + //@} + + /// Test bit is latched at phi2 for the noise XOR. + bool test_or_reset; + + /// Tell whether the accumulator MSB was set high on this cycle. + bool msb_rising; + + bool is6581; //-V730_NOINIT this is initialized in the SID constructor + +private: + void shift_phase2(unsigned int waveform_old, unsigned int waveform_new); + + void write_shift_register(); + + void set_noise_output(); + + void set_no_noise_or_noise_output(); + + void waveBitfade(); + + void shiftregBitfade(); + +public: + void setWaveformModels(matrix_t* models); + void setPulldownModels(matrix_t* models); + + /** + * Set the chip model. + * Must be called before any operation. + * + * @param is6581 true if MOS6581, false if CSG8580 + */ + void setModel(bool is6581) { this->is6581 = is6581; } + + /** + * SID clocking. + */ + void clock(); + + /** + * Synchronize oscillators. + * This must be done after all the oscillators have been clock()'ed, + * so that they are in the same state. + * + * @param syncDest The oscillator that will be synced + * @param syncSource The sync source oscillator + */ + void synchronize(WaveformGenerator* syncDest, const WaveformGenerator* syncSource) const; + + /** + * Constructor. + */ + WaveformGenerator() : + model_wave(nullptr), + model_pulldown(nullptr), + wave(nullptr), + pulldown(nullptr), + pw(0), + shift_register(0), + shift_pipeline(0), + ring_msb_mask(0), + no_noise(0), + noise_output(0), + no_noise_or_noise_output(0), + no_pulse(0), + pulse_output(0), + waveform(0), + waveform_output(0), + accumulator(0x555555), // Accumulator's even bits are high on powerup + freq(0), + tri_saw_pipeline(0x555), + osc3(0), + shift_register_reset(0), + floating_output_ttl(0), + test(false), + sync(false), + msb_rising(false) {} + + /** + * Write FREQ LO register. + * + * @param freq_lo low 8 bits of frequency + */ + void writeFREQ_LO(unsigned char freq_lo) { freq = (freq & 0xff00) | (freq_lo & 0xff); } + + /** + * Write FREQ HI register. + * + * @param freq_hi high 8 bits of frequency + */ + void writeFREQ_HI(unsigned char freq_hi) { freq = (freq_hi << 8 & 0xff00) | (freq & 0xff); } + + /** + * Write PW LO register. + * + * @param pw_lo low 8 bits of pulse width + */ + void writePW_LO(unsigned char pw_lo) { pw = (pw & 0xf00) | (pw_lo & 0x0ff); } + + /** + * Write PW HI register. + * + * @param pw_hi high 8 bits of pulse width + */ + void writePW_HI(unsigned char pw_hi) { pw = (pw_hi << 8 & 0xf00) | (pw & 0x0ff); } + + /** + * Write CONTROL REGISTER register. + * + * @param control control register value + */ + void writeCONTROL_REG(unsigned char control); + + /** + * SID reset. + */ + void reset(); + + /** + * 12-bit waveform output. + * + * @param ringModulator The oscillator ring-modulating current one. + * @return the waveform generator digital output + */ + unsigned int output(const WaveformGenerator* ringModulator); + + /** + * Read OSC3 value. + */ + unsigned char readOSC() const { return static_cast(osc3 >> 4); } + + /** + * Read accumulator value. + */ + unsigned int readAccumulator() const { return accumulator; } + + /** + * Read freq value. + */ + unsigned int readFreq() const { return freq; } + + /** + * Read test value. + */ + bool readTest() const { return test; } + + /** + * Read sync value. + */ + bool readSync() const { return sync; } +}; + +} // namespace reSIDfp + +#if RESID_INLINING || defined(WAVEFORMGENERATOR_CPP) + +namespace reSIDfp +{ + +RESID_INLINE +void WaveformGenerator::clock() +{ + if (unlikely(test)) + { + if (unlikely(shift_register_reset != 0) && unlikely(--shift_register_reset == 0)) + { +#ifdef TRACE + std::cout << "shiftregBitfade" << std::endl; +#endif + shiftregBitfade(); + shift_latch = shift_register; + + // New noise waveform output. + set_noise_output(); + } + + // Latch the test bit value for shift phase 2. + test_or_reset = true; + + // The test bit sets pulse high. + pulse_output = 0xfff; + } + else + { + // Calculate new accumulator value; + const unsigned int accumulator_old = accumulator; + accumulator = (accumulator + freq) & 0xffffff; + + // Check which bit have changed from low to high + const unsigned int accumulator_bits_set = ~accumulator_old & accumulator; + + // Check whether the MSB is set high. This is used for synchronization. + msb_rising = (accumulator_bits_set & 0x800000) != 0; + + // Shift noise register once for each time accumulator bit 19 is set high. + // The shift is delayed 2 cycles. + if (unlikely((accumulator_bits_set & 0x080000) != 0)) + { + // Pipeline: Detect rising bit, shift phase 1, shift phase 2. + shift_pipeline = 2; + } + else if (unlikely(shift_pipeline != 0)) + { + switch (--shift_pipeline) + { + case 0: +#ifdef TRACE + std::cout << "shift phase 2" << std::endl; +#endif + shift_phase2(waveform, waveform); + break; + case 1: +#ifdef TRACE + std::cout << "shift phase 1" << std::endl; +#endif + // Start shift phase 1. + test_or_reset = false; + shift_latch = shift_register; + break; + } + } + } +} + +RESID_INLINE +unsigned int WaveformGenerator::output(const WaveformGenerator* ringModulator) +{ + // Set output value. + if (likely(waveform != 0)) + { + const unsigned int ix = (accumulator ^ (~ringModulator->accumulator & ring_msb_mask)) >> 12; + + // The bit masks no_pulse and no_noise are used to achieve branch-free + // calculation of the output value. + waveform_output = wave[ix] & (no_pulse | pulse_output) & no_noise_or_noise_output; + if (pulldown != nullptr) + waveform_output = pulldown[waveform_output]; + + // Triangle/Sawtooth output is delayed half cycle on 8580. + // This will appear as a one cycle delay on OSC3 as it is latched + // in the first phase of the clock. + if ((waveform & 3) && !is6581) + { + osc3 = tri_saw_pipeline & (no_pulse | pulse_output) & no_noise_or_noise_output; + if (pulldown != nullptr) + osc3 = pulldown[osc3]; + tri_saw_pipeline = wave[ix]; + } + else + { + osc3 = waveform_output; + } + + // In the 6581 the top bit of the accumulator may be driven low by combined waveforms + // when the sawtooth is selected + if (is6581 + && (waveform & 0x2) + && ((waveform_output & 0x800) == 0)) + accumulator &= 0x7fffff; + + write_shift_register(); + } + else + { + // Age floating DAC input. + if (likely(floating_output_ttl != 0) && unlikely(--floating_output_ttl == 0)) + { + waveBitfade(); + } + } + + // The pulse level is defined as (accumulator >> 12) >= pw ? 0xfff : 0x000. + // The expression -((accumulator >> 12) >= pw) & 0xfff yields the same + // results without any branching (and thus without any pipeline stalls). + // NB! This expression relies on that the result of a boolean expression + // is either 0 or 1, and furthermore requires two's complement integer. + // A few more cycles may be saved by storing the pulse width left shifted + // 12 bits, and dropping the and with 0xfff (this is valid since pulse is + // used as a bit mask on 12 bit values), yielding the expression + // -(accumulator >= pw24). However this only results in negligible savings. + + // The result of the pulse width compare is delayed one cycle. + // Push next pulse level into pulse level pipeline. + pulse_output = ((accumulator >> 12) >= pw) ? 0xfff : 0x000; + + return waveform_output; +} + +} // namespace reSIDfp + +#endif + +#endif diff --git a/src/sound/resid-fp/aclocal.m4 b/src/sound/resid-fp/aclocal.m4 deleted file mode 100644 index aef181a6d..000000000 --- a/src/sound/resid-fp/aclocal.m4 +++ /dev/null @@ -1,850 +0,0 @@ -# generated automatically by aclocal 1.9.6 -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, -# 2005 Free Software Foundation, Inc. -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - -# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_AUTOMAKE_VERSION(VERSION) -# ---------------------------- -# Automake X.Y traces this macro to ensure aclocal.m4 has been -# generated from the m4 files accompanying Automake X.Y. -AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"]) - -# AM_SET_CURRENT_AUTOMAKE_VERSION -# ------------------------------- -# Call AM_AUTOMAKE_VERSION so it can be traced. -# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. -AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], - [AM_AUTOMAKE_VERSION([1.9.6])]) - -# AM_AUX_DIR_EXPAND -*- Autoconf -*- - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets -# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to -# `$srcdir', `$srcdir/..', or `$srcdir/../..'. -# -# Of course, Automake must honor this variable whenever it calls a -# tool from the auxiliary directory. The problem is that $srcdir (and -# therefore $ac_aux_dir as well) can be either absolute or relative, -# depending on how configure is run. This is pretty annoying, since -# it makes $ac_aux_dir quite unusable in subdirectories: in the top -# source directory, any form will work fine, but in subdirectories a -# relative path needs to be adjusted first. -# -# $ac_aux_dir/missing -# fails when called from a subdirectory if $ac_aux_dir is relative -# $top_srcdir/$ac_aux_dir/missing -# fails if $ac_aux_dir is absolute, -# fails when called from a subdirectory in a VPATH build with -# a relative $ac_aux_dir -# -# The reason of the latter failure is that $top_srcdir and $ac_aux_dir -# are both prefixed by $srcdir. In an in-source build this is usually -# harmless because $srcdir is `.', but things will broke when you -# start a VPATH build or use an absolute $srcdir. -# -# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, -# iff we strip the leading $srcdir from $ac_aux_dir. That would be: -# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` -# and then we would define $MISSING as -# MISSING="\${SHELL} $am_aux_dir/missing" -# This will work as long as MISSING is not called from configure, because -# unfortunately $(top_srcdir) has no meaning in configure. -# However there are other variables, like CC, which are often used in -# configure, and could therefore not use this "fixed" $ac_aux_dir. -# -# Another solution, used here, is to always expand $ac_aux_dir to an -# absolute PATH. The drawback is that using absolute paths prevent a -# configured tree to be moved without reconfiguration. - -AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` -]) - -# AM_CONDITIONAL -*- Autoconf -*- - -# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 7 - -# AM_CONDITIONAL(NAME, SHELL-CONDITION) -# ------------------------------------- -# Define a conditional. -AC_DEFUN([AM_CONDITIONAL], -[AC_PREREQ(2.52)dnl - ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], - [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl -AC_SUBST([$1_TRUE]) -AC_SUBST([$1_FALSE]) -if $2; then - $1_TRUE= - $1_FALSE='#' -else - $1_TRUE='#' - $1_FALSE= -fi -AC_CONFIG_COMMANDS_PRE( -[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then - AC_MSG_ERROR([[conditional "$1" was never defined. -Usually this means the macro was only invoked conditionally.]]) -fi])]) - - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 8 - -# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be -# written in clear, in which case automake, when reading aclocal.m4, -# will think it sees a *use*, and therefore will trigger all it's -# C support machinery. Also note that it means that autoscan, seeing -# CC etc. in the Makefile, will ask for an AC_PROG_CC use... - - -# _AM_DEPENDENCIES(NAME) -# ---------------------- -# See how the compiler implements dependency checking. -# NAME is "CC", "CXX", "GCJ", or "OBJC". -# We try a few techniques and use that to set a single cache variable. -# -# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was -# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular -# dependency, and given that the user is not expected to run this macro, -# just rely on AC_PROG_CC. -AC_DEFUN([_AM_DEPENDENCIES], -[AC_REQUIRE([AM_SET_DEPDIR])dnl -AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl -AC_REQUIRE([AM_MAKE_INCLUDE])dnl -AC_REQUIRE([AM_DEP_TRACK])dnl - -ifelse([$1], CC, [depcc="$CC" am_compiler_list=], - [$1], CXX, [depcc="$CXX" am_compiler_list=], - [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], - [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], - [depcc="$$1" am_compiler_list=]) - -AC_CACHE_CHECK([dependency style of $depcc], - [am_cv_$1_dependencies_compiler_type], -[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_$1_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_$1_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_$1_dependencies_compiler_type=none -fi -]) -AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) -AM_CONDITIONAL([am__fastdep$1], [ - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) -]) - - -# AM_SET_DEPDIR -# ------------- -# Choose a directory name for dependency files. -# This macro is AC_REQUIREd in _AM_DEPENDENCIES -AC_DEFUN([AM_SET_DEPDIR], -[AC_REQUIRE([AM_SET_LEADING_DOT])dnl -AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl -]) - - -# AM_DEP_TRACK -# ------------ -AC_DEFUN([AM_DEP_TRACK], -[AC_ARG_ENABLE(dependency-tracking, -[ --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors]) -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi -AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) -AC_SUBST([AMDEPBACKSLASH]) -]) - -# Generate code to set up dependency tracking. -*- Autoconf -*- - -# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -#serial 3 - -# _AM_OUTPUT_DEPENDENCY_COMMANDS -# ------------------------------ -AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], -[for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`AS_DIRNAME("$mf")` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`AS_DIRNAME(["$file"])` - AS_MKDIR_P([$dirpart/$fdir]) - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done -done -])# _AM_OUTPUT_DEPENDENCY_COMMANDS - - -# AM_OUTPUT_DEPENDENCY_COMMANDS -# ----------------------------- -# This macro should only be invoked once -- use via AC_REQUIRE. -# -# This code is only required when automatic dependency tracking -# is enabled. FIXME. This creates each `.P' file that we will -# need in order to bootstrap the dependency handling code. -AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], -[AC_CONFIG_COMMANDS([depfiles], - [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], - [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) -]) - -# Do all the work for Automake. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 12 - -# This macro actually does too much. Some checks are only needed if -# your package does certain things. But this isn't really a big deal. - -# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) -# AM_INIT_AUTOMAKE([OPTIONS]) -# ----------------------------------------------- -# The call with PACKAGE and VERSION arguments is the old style -# call (pre autoconf-2.50), which is being phased out. PACKAGE -# and VERSION should now be passed to AC_INIT and removed from -# the call to AM_INIT_AUTOMAKE. -# We support both call styles for the transition. After -# the next Automake release, Autoconf can make the AC_INIT -# arguments mandatory, and then we can depend on a new Autoconf -# release and drop the old call support. -AC_DEFUN([AM_INIT_AUTOMAKE], -[AC_PREREQ([2.58])dnl -dnl Autoconf wants to disallow AM_ names. We explicitly allow -dnl the ones we care about. -m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl -AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl -AC_REQUIRE([AC_PROG_INSTALL])dnl -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi -AC_SUBST([CYGPATH_W]) - -# Define the identity of the package. -dnl Distinguish between old-style and new-style calls. -m4_ifval([$2], -[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl - AC_SUBST([PACKAGE], [$1])dnl - AC_SUBST([VERSION], [$2])], -[_AM_SET_OPTIONS([$1])dnl - AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl - AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl - -_AM_IF_OPTION([no-define],, -[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) - AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl - -# Some tools Automake needs. -AC_REQUIRE([AM_SANITY_CHECK])dnl -AC_REQUIRE([AC_ARG_PROGRAM])dnl -AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) -AM_MISSING_PROG(AUTOCONF, autoconf) -AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) -AM_MISSING_PROG(AUTOHEADER, autoheader) -AM_MISSING_PROG(MAKEINFO, makeinfo) -AM_PROG_INSTALL_SH -AM_PROG_INSTALL_STRIP -AC_REQUIRE([AM_PROG_MKDIR_P])dnl -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -AC_REQUIRE([AC_PROG_AWK])dnl -AC_REQUIRE([AC_PROG_MAKE_SET])dnl -AC_REQUIRE([AM_SET_LEADING_DOT])dnl -_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], - [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], - [_AM_PROG_TAR([v7])])]) -_AM_IF_OPTION([no-dependencies],, -[AC_PROVIDE_IFELSE([AC_PROG_CC], - [_AM_DEPENDENCIES(CC)], - [define([AC_PROG_CC], - defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl -AC_PROVIDE_IFELSE([AC_PROG_CXX], - [_AM_DEPENDENCIES(CXX)], - [define([AC_PROG_CXX], - defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl -]) -]) - - -# When config.status generates a header, we must update the stamp-h file. -# This file resides in the same directory as the config header -# that is generated. The stamp files are numbered to have different names. - -# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the -# loop where config.status creates the headers, so we can generate -# our stamp files there. -AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], -[# Compute $1's index in $config_headers. -_am_stamp_count=1 -for _am_header in $config_headers :; do - case $_am_header in - $1 | $1:* ) - break ;; - * ) - _am_stamp_count=`expr $_am_stamp_count + 1` ;; - esac -done -echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_SH -# ------------------ -# Define $install_sh. -AC_DEFUN([AM_PROG_INSTALL_SH], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -install_sh=${install_sh-"$am_aux_dir/install-sh"} -AC_SUBST(install_sh)]) - -# Copyright (C) 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# Check whether the underlying file-system supports filenames -# with a leading dot. For instance MS-DOS doesn't. -AC_DEFUN([AM_SET_LEADING_DOT], -[rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null -AC_SUBST([am__leading_dot])]) - -# Check to see how 'make' treats includes. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 3 - -# AM_MAKE_INCLUDE() -# ----------------- -# Check to see how make treats includes. -AC_DEFUN([AM_MAKE_INCLUDE], -[am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo done -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -AC_MSG_CHECKING([for style of include used by $am_make]) -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi -fi -AC_SUBST([am__include]) -AC_SUBST([am__quote]) -AC_MSG_RESULT([$_am_result]) -rm -f confinc confmf -]) - -# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- - -# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# AM_MISSING_PROG(NAME, PROGRAM) -# ------------------------------ -AC_DEFUN([AM_MISSING_PROG], -[AC_REQUIRE([AM_MISSING_HAS_RUN]) -$1=${$1-"${am_missing_run}$2"} -AC_SUBST($1)]) - - -# AM_MISSING_HAS_RUN -# ------------------ -# Define MISSING if not defined so far and test if it supports --run. -# If it does, set am_missing_run to use it, otherwise, to nothing. -AC_DEFUN([AM_MISSING_HAS_RUN], -[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - AC_MSG_WARN([`missing' script is too old or missing]) -fi -]) - -# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_MKDIR_P -# --------------- -# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. -# -# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories -# created by `make install' are always world readable, even if the -# installer happens to have an overly restrictive umask (e.g. 077). -# This was a mistake. There are at least two reasons why we must not -# use `-m 0755': -# - it causes special bits like SGID to be ignored, -# - it may be too restrictive (some setups expect 775 directories). -# -# Do not use -m 0755 and let people choose whatever they expect by -# setting umask. -# -# We cannot accept any implementation of `mkdir' that recognizes `-p'. -# Some implementations (such as Solaris 8's) are not thread-safe: if a -# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' -# concurrently, both version can detect that a/ is missing, but only -# one can create it and the other will error out. Consequently we -# restrict ourselves to GNU make (using the --version option ensures -# this.) -AC_DEFUN([AM_PROG_MKDIR_P], -[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi -AC_SUBST([mkdir_p])]) - -# Helper functions for option handling. -*- Autoconf -*- - -# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 3 - -# _AM_MANGLE_OPTION(NAME) -# ----------------------- -AC_DEFUN([_AM_MANGLE_OPTION], -[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) - -# _AM_SET_OPTION(NAME) -# ------------------------------ -# Set option NAME. Presently that only means defining a flag for this option. -AC_DEFUN([_AM_SET_OPTION], -[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) - -# _AM_SET_OPTIONS(OPTIONS) -# ---------------------------------- -# OPTIONS is a space-separated list of Automake options. -AC_DEFUN([_AM_SET_OPTIONS], -[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) - -# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) -# ------------------------------------------- -# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. -AC_DEFUN([_AM_IF_OPTION], -[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) - -# Check to make sure that the build environment is sane. -*- Autoconf -*- - -# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 -# Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 4 - -# AM_SANITY_CHECK -# --------------- -AC_DEFUN([AM_SANITY_CHECK], -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$[*]" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$[*]" != "X $srcdir/configure conftest.file" \ - && test "$[*]" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "$[2]" = conftest.file - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -AC_MSG_RESULT(yes)]) - -# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# AM_PROG_INSTALL_STRIP -# --------------------- -# One issue with vendor `install' (even GNU) is that you can't -# specify the program used to strip binaries. This is especially -# annoying in cross-compiling environments, where the build's strip -# is unlikely to handle the host's binaries. -# Fortunately install-sh will honor a STRIPPROG variable, so we -# always use install-sh in `make install-strip', and initialize -# STRIPPROG with the value of the STRIP variable (set by the user). -AC_DEFUN([AM_PROG_INSTALL_STRIP], -[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -dnl Don't test for $cross_compiling = yes, because it might be `maybe'. -if test "$cross_compiling" != no; then - AC_CHECK_TOOL([STRIP], [strip], :) -fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" -AC_SUBST([INSTALL_STRIP_PROGRAM])]) - -# Check how to create a tarball. -*- Autoconf -*- - -# Copyright (C) 2004, 2005 Free Software Foundation, Inc. -# -# This file is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# serial 2 - -# _AM_PROG_TAR(FORMAT) -# -------------------- -# Check how to create a tarball in format FORMAT. -# FORMAT should be one of `v7', `ustar', or `pax'. -# -# Substitute a variable $(am__tar) that is a command -# writing to stdout a FORMAT-tarball containing the directory -# $tardir. -# tardir=directory && $(am__tar) > result.tar -# -# Substitute a variable $(am__untar) that extract such -# a tarball read from stdin. -# $(am__untar) < result.tar -AC_DEFUN([_AM_PROG_TAR], -[# Always define AMTAR for backward compatibility. -AM_MISSING_PROG([AMTAR], [tar]) -m4_if([$1], [v7], - [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], - [m4_case([$1], [ustar],, [pax],, - [m4_fatal([Unknown tar format])]) -AC_MSG_CHECKING([how to create a $1 tar archive]) -# Loop over all known methods to create a tar archive until one works. -_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' -_am_tools=${am_cv_prog_tar_$1-$_am_tools} -# Do not fold the above two line into one, because Tru64 sh and -# Solaris sh will not grok spaces in the rhs of `-'. -for _am_tool in $_am_tools -do - case $_am_tool in - gnutar) - for _am_tar in tar gnutar gtar; - do - AM_RUN_LOG([$_am_tar --version]) && break - done - am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' - am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' - am__untar="$_am_tar -xf -" - ;; - plaintar) - # Must skip GNU tar: if it does not support --format= it doesn't create - # ustar tarball either. - (tar --version) >/dev/null 2>&1 && continue - am__tar='tar chf - "$$tardir"' - am__tar_='tar chf - "$tardir"' - am__untar='tar xf -' - ;; - pax) - am__tar='pax -L -x $1 -w "$$tardir"' - am__tar_='pax -L -x $1 -w "$tardir"' - am__untar='pax -r' - ;; - cpio) - am__tar='find "$$tardir" -print | cpio -o -H $1 -L' - am__tar_='find "$tardir" -print | cpio -o -H $1 -L' - am__untar='cpio -i -H $1 -d' - ;; - none) - am__tar=false - am__tar_=false - am__untar=false - ;; - esac - - # If the value was cached, stop now. We just wanted to have am__tar - # and am__untar set. - test -n "${am_cv_prog_tar_$1}" && break - - # tar/untar a dummy directory, and stop if the command works - rm -rf conftest.dir - mkdir conftest.dir - echo GrepMe > conftest.dir/file - AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) - rm -rf conftest.dir - if test -s conftest.tar; then - AM_RUN_LOG([$am__untar /dev/null 2>&1 && break - fi -done -rm -rf conftest.dir - -AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) -AC_MSG_RESULT([$am_cv_prog_tar_$1])]) -AC_SUBST([am__tar]) -AC_SUBST([am__untar]) -]) # _AM_PROG_TAR - diff --git a/src/sound/resid-fp/array.h b/src/sound/resid-fp/array.h new file mode 100644 index 000000000..a0d390966 --- /dev/null +++ b/src/sound/resid-fp/array.h @@ -0,0 +1,86 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright (C) 2011-2014 Leandro Nini + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef ARRAY_H +#define ARRAY_H + + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef HAVE_CXX11 +# include +#endif + +/** + * Counter. + */ +class counter +{ +private: +#ifndef HAVE_CXX11 + volatile unsigned int c; +#else + std::atomic c; +#endif + +public: + counter() : c(1) {} + void increase() { ++c; } + unsigned int decrease() { return --c; } +}; + +/** + * Reference counted pointer to matrix wrapper, for use with standard containers. + */ +template +class matrix +{ +private: + T* data; + counter* count; + const unsigned int x, y; + +public: + matrix(unsigned int x, unsigned int y) : + data(new T[x * y]), + count(new counter()), + x(x), + y(y) {} + + matrix(const matrix& p) : + data(p.data), + count(p.count), + x(p.x), + y(p.y) { count->increase(); } + + ~matrix() { if (count->decrease() == 0) { delete count; delete [] data; } } + + unsigned int length() const { return x * y; } + + T* operator[](unsigned int a) { return &data[a * y]; } + + T const* operator[](unsigned int a) const { return &data[a * y]; } +}; + +typedef matrix matrix_t; + +#endif diff --git a/src/sound/resid-fp/configure b/src/sound/resid-fp/configure deleted file mode 100644 index 35a9c8f7d..000000000 --- a/src/sound/resid-fp/configure +++ /dev/null @@ -1,5955 +0,0 @@ -#! /bin/sh -# Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.61. -# -# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -as_nl=' -' -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - -if test "x$CONFIG_SHELL" = x; then - if (eval ":") 2>/dev/null; then - as_have_required=yes -else - as_have_required=no -fi - - if test $as_have_required = yes && (eval ": -(as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=\$LINENO - as_lineno_2=\$LINENO - test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && - test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } -") 2> /dev/null; then - : -else - as_candidate_shells= - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - case $as_dir in - /*) - for as_base in sh bash ksh sh5; do - as_candidate_shells="$as_candidate_shells $as_dir/$as_base" - done;; - esac -done -IFS=$as_save_IFS - - - for as_shell in $as_candidate_shells $SHELL; do - # Try only shells that exist, to save several forks. - if { test -f "$as_shell" || test -f "$as_shell.exe"; } && - { ("$as_shell") 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -_ASEOF -}; then - CONFIG_SHELL=$as_shell - as_have_required=yes - if { "$as_shell" 2> /dev/null <<\_ASEOF -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - -: -(as_func_return () { - (exit $1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = "$1" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test $exitcode = 0) || { (exit 1); exit 1; } - -( - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } - -_ASEOF -}; then - break -fi - -fi - - done - - if test "x$CONFIG_SHELL" != x; then - for as_var in BASH_ENV ENV - do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - done - export CONFIG_SHELL - exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} -fi - - - if test $as_have_required = no; then - echo This script requires a shell more modern than all the - echo shells that I found on your system. Please install a - echo modern shell, or manually run the script under such a - echo shell if you do have one. - { (exit 1); exit 1; } -fi - - -fi - -fi - - - -(eval "as_func_return () { - (exit \$1) -} -as_func_success () { - as_func_return 0 -} -as_func_failure () { - as_func_return 1 -} -as_func_ret_success () { - return 0 -} -as_func_ret_failure () { - return 1 -} - -exitcode=0 -if as_func_success; then - : -else - exitcode=1 - echo as_func_success failed. -fi - -if as_func_failure; then - exitcode=1 - echo as_func_failure succeeded. -fi - -if as_func_ret_success; then - : -else - exitcode=1 - echo as_func_ret_success failed. -fi - -if as_func_ret_failure; then - exitcode=1 - echo as_func_ret_failure succeeded. -fi - -if ( set x; as_func_ret_success y && test x = \"\$1\" ); then - : -else - exitcode=1 - echo positional parameters were not saved. -fi - -test \$exitcode = 0") || { - echo No shell found that supports shell functions. - echo Please tell autoconf@gnu.org about your system, - echo including any error possibly output before this - echo message -} - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir -fi -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - - -exec 7<&0 &1 - -# Name of the host. -# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, -# so uname gets run too. -ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` - -# -# Initializations. -# -ac_default_prefix=/usr/local -ac_clean_files= -ac_config_libobj_dir=. -LIBOBJS= -cross_compiling=no -subdirs= -MFLAGS= -MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} - -# Identity of this package. -PACKAGE_NAME= -PACKAGE_TARNAME= -PACKAGE_VERSION= -PACKAGE_STRING= -PACKAGE_BUGREPORT= - -ac_unique_file="sid.h" -# Factoring default headers for most tests. -ac_includes_default="\ -#include -#ifdef HAVE_SYS_TYPES_H -# include -#endif -#ifdef HAVE_SYS_STAT_H -# include -#endif -#ifdef STDC_HEADERS -# include -# include -#else -# ifdef HAVE_STDLIB_H -# include -# endif -#endif -#ifdef HAVE_STRING_H -# if !defined STDC_HEADERS && defined HAVE_MEMORY_H -# include -# endif -# include -#endif -#ifdef HAVE_STRINGS_H -# include -#endif -#ifdef HAVE_INTTYPES_H -# include -#endif -#ifdef HAVE_STDINT_H -# include -#endif -#ifdef HAVE_UNISTD_H -# include -#endif" - -ac_subst_vars='SHELL -PATH_SEPARATOR -PACKAGE_NAME -PACKAGE_TARNAME -PACKAGE_VERSION -PACKAGE_STRING -PACKAGE_BUGREPORT -exec_prefix -prefix -program_transform_name -bindir -sbindir -libexecdir -datarootdir -datadir -sysconfdir -sharedstatedir -localstatedir -includedir -oldincludedir -docdir -infodir -htmldir -dvidir -pdfdir -psdir -libdir -localedir -mandir -DEFS -ECHO_C -ECHO_N -ECHO_T -LIBS -build_alias -host_alias -target_alias -INSTALL_PROGRAM -INSTALL_SCRIPT -INSTALL_DATA -CYGPATH_W -PACKAGE -VERSION -ACLOCAL -AUTOCONF -AUTOMAKE -AUTOHEADER -MAKEINFO -install_sh -STRIP -INSTALL_STRIP_PROGRAM -mkdir_p -AWK -SET_MAKE -am__leading_dot -AMTAR -am__tar -am__untar -RESID_INLINE -CXX -CXXFLAGS -LDFLAGS -CPPFLAGS -ac_ct_CXX -EXEEXT -OBJEXT -DEPDIR -am__include -am__quote -AMDEP_TRUE -AMDEP_FALSE -AMDEPBACKSLASH -CXXDEPMODE -am__fastdepCXX_TRUE -am__fastdepCXX_FALSE -AR -RANLIB -PERL -CXXCPP -GREP -EGREP -USE_SSE_TRUE -USE_SSE_FALSE -RESID_HAVE_BOOL -RESID_USE_SSE -HAVE_LOGF_PROTOTYPE -HAVE_EXPF_PROTOTYPE -LIBOBJS -LTLIBOBJS' -ac_subst_files='' - ac_precious_vars='build_alias -host_alias -target_alias -CXX -CXXFLAGS -LDFLAGS -LIBS -CPPFLAGS -CCC -CXXCPP' - - -# Initialize some variables set by options. -ac_init_help= -ac_init_version=false -# The variables have the same names as the options, with -# dashes changed to underlines. -cache_file=/dev/null -exec_prefix=NONE -no_create= -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -verbose= -x_includes=NONE -x_libraries=NONE - -# Installation directory options. -# These are left unexpanded so users can "make install exec_prefix=/foo" -# and all the variables that are supposed to be based on exec_prefix -# by default will actually change. -# Use braces instead of parens because sh, perl, etc. also accept them. -# (The list follows the same order as the GNU Coding Standards.) -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datarootdir='${prefix}/share' -datadir='${datarootdir}' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -includedir='${prefix}/include' -oldincludedir='/usr/include' -docdir='${datarootdir}/doc/${PACKAGE}' -infodir='${datarootdir}/info' -htmldir='${docdir}' -dvidir='${docdir}' -pdfdir='${docdir}' -psdir='${docdir}' -libdir='${exec_prefix}/lib' -localedir='${datarootdir}/locale' -mandir='${datarootdir}/man' - -ac_prev= -ac_dashdash= -for ac_option -do - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval $ac_prev=\$ac_option - ac_prev= - continue - fi - - case $ac_option in - *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; - *) ac_optarg=yes ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case $ac_dashdash$ac_option in - --) - ac_dashdash=yes ;; - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir=$ac_optarg ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build_alias ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build_alias=$ac_optarg ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file=$ac_optarg ;; - - --config-cache | -C) - cache_file=config.cache ;; - - -datadir | --datadir | --datadi | --datad) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=*) - datadir=$ac_optarg ;; - - -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ - | --dataroo | --dataro | --datar) - ac_prev=datarootdir ;; - -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ - | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) - datarootdir=$ac_optarg ;; - - -disable-* | --disable-*) - ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` - eval enable_$ac_feature=no ;; - - -docdir | --docdir | --docdi | --doc | --do) - ac_prev=docdir ;; - -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) - docdir=$ac_optarg ;; - - -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) - ac_prev=dvidir ;; - -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) - dvidir=$ac_optarg ;; - - -enable-* | --enable-*) - ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid feature name: $ac_feature" >&2 - { (exit 1); exit 1; }; } - ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'` - eval enable_$ac_feature=\$ac_optarg ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix=$ac_optarg ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he | -h) - ac_init_help=long ;; - -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) - ac_init_help=recursive ;; - -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) - ac_init_help=short ;; - - -host | --host | --hos | --ho) - ac_prev=host_alias ;; - -host=* | --host=* | --hos=* | --ho=*) - host_alias=$ac_optarg ;; - - -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) - ac_prev=htmldir ;; - -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ - | --ht=*) - htmldir=$ac_optarg ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir=$ac_optarg ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir=$ac_optarg ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir=$ac_optarg ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir=$ac_optarg ;; - - -localedir | --localedir | --localedi | --localed | --locale) - ac_prev=localedir ;; - -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) - localedir=$ac_optarg ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst | --locals) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) - localstatedir=$ac_optarg ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir=$ac_optarg ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c | -n) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir=$ac_optarg ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix=$ac_optarg ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix=$ac_optarg ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix=$ac_optarg ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name=$ac_optarg ;; - - -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) - ac_prev=pdfdir ;; - -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) - pdfdir=$ac_optarg ;; - - -psdir | --psdir | --psdi | --psd | --ps) - ac_prev=psdir ;; - -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) - psdir=$ac_optarg ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir=$ac_optarg ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir=$ac_optarg ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site=$ac_optarg ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir=$ac_optarg ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir=$ac_optarg ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target_alias ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target_alias=$ac_optarg ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers | -V) - ac_init_version=: ;; - - -with-* | --with-*) - ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/[-.]/_/g'` - eval with_$ac_package=\$ac_optarg ;; - - -without-* | --without-*) - ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` - # Reject names that are not valid shell variable names. - expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid package name: $ac_package" >&2 - { (exit 1); exit 1; }; } - ac_package=`echo $ac_package | sed 's/[-.]/_/g'` - eval with_$ac_package=no ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes=$ac_optarg ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries=$ac_optarg ;; - - -*) { echo "$as_me: error: unrecognized option: $ac_option -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } - ;; - - *=*) - ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` - # Reject names that are not valid shell variable names. - expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && - { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 - { (exit 1); exit 1; }; } - eval $ac_envvar=\$ac_optarg - export $ac_envvar ;; - - *) - # FIXME: should be removed in autoconf 3.0. - echo "$as_me: WARNING: you should use --build, --host, --target" >&2 - expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && - echo "$as_me: WARNING: invalid host type: $ac_option" >&2 - : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} - ;; - - esac -done - -if test -n "$ac_prev"; then - ac_option=--`echo $ac_prev | sed 's/_/-/g'` - { echo "$as_me: error: missing argument to $ac_option" >&2 - { (exit 1); exit 1; }; } -fi - -# Be sure to have absolute directory names. -for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ - datadir sysconfdir sharedstatedir localstatedir includedir \ - oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ - libdir localedir mandir -do - eval ac_val=\$$ac_var - case $ac_val in - [\\/$]* | ?:[\\/]* ) continue;; - NONE | '' ) case $ac_var in *prefix ) continue;; esac;; - esac - { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 - { (exit 1); exit 1; }; } -done - -# There might be people who depend on the old broken behavior: `$host' -# used to hold the argument of --host etc. -# FIXME: To remove some day. -build=$build_alias -host=$host_alias -target=$target_alias - -# FIXME: To remove some day. -if test "x$host_alias" != x; then - if test "x$build_alias" = x; then - cross_compiling=maybe - echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. - If a cross compiler is detected then cross compile mode will be used." >&2 - elif test "x$build_alias" != "x$host_alias"; then - cross_compiling=yes - fi -fi - -ac_tool_prefix= -test -n "$host_alias" && ac_tool_prefix=$host_alias- - -test "$silent" = yes && exec 6>/dev/null - - -ac_pwd=`pwd` && test -n "$ac_pwd" && -ac_ls_di=`ls -di .` && -ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || - { echo "$as_me: error: Working directory cannot be determined" >&2 - { (exit 1); exit 1; }; } -test "X$ac_ls_di" = "X$ac_pwd_ls_di" || - { echo "$as_me: error: pwd does not report name of working directory" >&2 - { (exit 1); exit 1; }; } - - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then the parent directory. - ac_confdir=`$as_dirname -- "$0" || -$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$0" : 'X\(//\)[^/]' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X"$0" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - srcdir=$ac_confdir - if test ! -r "$srcdir/$ac_unique_file"; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r "$srcdir/$ac_unique_file"; then - test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." - { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 - { (exit 1); exit 1; }; } -fi -ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" -ac_abs_confdir=`( - cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2 - { (exit 1); exit 1; }; } - pwd)` -# When building in place, set srcdir=. -if test "$ac_abs_confdir" = "$ac_pwd"; then - srcdir=. -fi -# Remove unnecessary trailing slashes from srcdir. -# Double slashes in file names in object file debugging info -# mess up M-x gdb in Emacs. -case $srcdir in -*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; -esac -for ac_var in $ac_precious_vars; do - eval ac_env_${ac_var}_set=\${${ac_var}+set} - eval ac_env_${ac_var}_value=\$${ac_var} - eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} - eval ac_cv_env_${ac_var}_value=\$${ac_var} -done - -# -# Report the --help message. -# -if test "$ac_init_help" = "long"; then - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat <<_ACEOF -\`configure' configures this package to adapt to many kinds of systems. - -Usage: $0 [OPTION]... [VAR=VALUE]... - -To assign environment variables (e.g., CC, CFLAGS...), specify them as -VAR=VALUE. See below for descriptions of some of the useful variables. - -Defaults for the options are specified in brackets. - -Configuration: - -h, --help display this help and exit - --help=short display options specific to this package - --help=recursive display the short help of all the included packages - -V, --version display version information and exit - -q, --quiet, --silent do not print \`checking...' messages - --cache-file=FILE cache test results in FILE [disabled] - -C, --config-cache alias for \`--cache-file=config.cache' - -n, --no-create do not create output files - --srcdir=DIR find the sources in DIR [configure dir or \`..'] - -Installation directories: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [PREFIX] - -By default, \`make install' will install all the files in -\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify -an installation prefix other than \`$ac_default_prefix' using \`--prefix', -for instance \`--prefix=\$HOME'. - -For better control, use the options below. - -Fine tuning of the installation directories: - --bindir=DIR user executables [EPREFIX/bin] - --sbindir=DIR system admin executables [EPREFIX/sbin] - --libexecdir=DIR program executables [EPREFIX/libexec] - --sysconfdir=DIR read-only single-machine data [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] - --localstatedir=DIR modifiable single-machine data [PREFIX/var] - --libdir=DIR object code libraries [EPREFIX/lib] - --includedir=DIR C header files [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc [/usr/include] - --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] - --datadir=DIR read-only architecture-independent data [DATAROOTDIR] - --infodir=DIR info documentation [DATAROOTDIR/info] - --localedir=DIR locale-dependent data [DATAROOTDIR/locale] - --mandir=DIR man documentation [DATAROOTDIR/man] - --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] - --htmldir=DIR html documentation [DOCDIR] - --dvidir=DIR dvi documentation [DOCDIR] - --pdfdir=DIR pdf documentation [DOCDIR] - --psdir=DIR ps documentation [DOCDIR] -_ACEOF - - cat <<\_ACEOF - -Program names: - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM run sed PROGRAM on installed program names -_ACEOF -fi - -if test -n "$ac_init_help"; then - - cat <<\_ACEOF - -Optional Features: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-inline enable inlining of functions default=yes - --enable-sse enable the use of SSE default=yes - --disable-dependency-tracking speeds up one-time build - --enable-dependency-tracking do not reject slow dependency extractors - -Some influential environment variables: - CXX C++ compiler command - CXXFLAGS C++ compiler flags - LDFLAGS linker flags, e.g. -L if you have libraries in a - nonstandard directory - LIBS libraries to pass to the linker, e.g. -l - CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if - you have headers in a nonstandard directory - CXXCPP C++ preprocessor - -Use these variables to override the choices made by `configure' or to help -it to find libraries and programs with nonstandard names/locations. - -_ACEOF -ac_status=$? -fi - -if test "$ac_init_help" = "recursive"; then - # If there are subdirs, report their specific --help. - for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue - test -d "$ac_dir" || continue - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - cd "$ac_dir" || { ac_status=$?; continue; } - # Check for guested configure. - if test -f "$ac_srcdir/configure.gnu"; then - echo && - $SHELL "$ac_srcdir/configure.gnu" --help=recursive - elif test -f "$ac_srcdir/configure"; then - echo && - $SHELL "$ac_srcdir/configure" --help=recursive - else - echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 - fi || ac_status=$? - cd "$ac_pwd" || { ac_status=$?; break; } - done -fi - -test -n "$ac_init_help" && exit $ac_status -if $ac_init_version; then - cat <<\_ACEOF -configure -generated by GNU Autoconf 2.61 - -Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, -2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc. -This configure script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it. -_ACEOF - exit -fi -cat >config.log <<_ACEOF -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. - -It was created by $as_me, which was -generated by GNU Autoconf 2.61. Invocation command line was - - $ $0 $@ - -_ACEOF -exec 5>>config.log -{ -cat <<_ASUNAME -## --------- ## -## Platform. ## -## --------- ## - -hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` -uname -m = `(uname -m) 2>/dev/null || echo unknown` -uname -r = `(uname -r) 2>/dev/null || echo unknown` -uname -s = `(uname -s) 2>/dev/null || echo unknown` -uname -v = `(uname -v) 2>/dev/null || echo unknown` - -/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` -/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` - -/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` -/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` -/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` -/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` -/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` -/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` -/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` - -_ASUNAME - -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - echo "PATH: $as_dir" -done -IFS=$as_save_IFS - -} >&5 - -cat >&5 <<_ACEOF - - -## ----------- ## -## Core tests. ## -## ----------- ## - -_ACEOF - - -# Keep a trace of the command line. -# Strip out --no-create and --no-recursion so they do not pile up. -# Strip out --silent because we don't want to record it for future runs. -# Also quote any args containing shell meta-characters. -# Make two passes to allow for proper duplicate-argument suppression. -ac_configure_args= -ac_configure_args0= -ac_configure_args1= -ac_must_keep_next=false -for ac_pass in 1 2 -do - for ac_arg - do - case $ac_arg in - -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - continue ;; - *\'*) - ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; - esac - case $ac_pass in - 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; - 2) - ac_configure_args1="$ac_configure_args1 '$ac_arg'" - if test $ac_must_keep_next = true; then - ac_must_keep_next=false # Got value, back to normal. - else - case $ac_arg in - *=* | --config-cache | -C | -disable-* | --disable-* \ - | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ - | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ - | -with-* | --with-* | -without-* | --without-* | --x) - case "$ac_configure_args0 " in - "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; - esac - ;; - -* ) ac_must_keep_next=true ;; - esac - fi - ac_configure_args="$ac_configure_args '$ac_arg'" - ;; - esac - done -done -$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } -$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } - -# When interrupted or exit'd, cleanup temporary files, and complete -# config.log. We remove comments because anyway the quotes in there -# would cause problems or look ugly. -# WARNING: Use '\'' to represent an apostrophe within the trap. -# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. -trap 'exit_status=$? - # Save into config.log some information that might help in debugging. - { - echo - - cat <<\_ASBOX -## ---------------- ## -## Cache variables. ## -## ---------------- ## -_ASBOX - echo - # The following way of writing the cache mishandles newlines in values, -( - for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - (set) 2>&1 | - case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - sed -n \ - "s/'\''/'\''\\\\'\'''\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" - ;; #( - *) - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) - echo - - cat <<\_ASBOX -## ----------------- ## -## Output variables. ## -## ----------------- ## -_ASBOX - echo - for ac_var in $ac_subst_vars - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - echo "$ac_var='\''$ac_val'\''" - done | sort - echo - - if test -n "$ac_subst_files"; then - cat <<\_ASBOX -## ------------------- ## -## File substitutions. ## -## ------------------- ## -_ASBOX - echo - for ac_var in $ac_subst_files - do - eval ac_val=\$$ac_var - case $ac_val in - *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; - esac - echo "$ac_var='\''$ac_val'\''" - done | sort - echo - fi - - if test -s confdefs.h; then - cat <<\_ASBOX -## ----------- ## -## confdefs.h. ## -## ----------- ## -_ASBOX - echo - cat confdefs.h - echo - fi - test "$ac_signal" != 0 && - echo "$as_me: caught signal $ac_signal" - echo "$as_me: exit $exit_status" - } >&5 - rm -f core *.core core.conftest.* && - rm -f -r conftest* confdefs* conf$$* $ac_clean_files && - exit $exit_status -' 0 -for ac_signal in 1 2 13 15; do - trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal -done -ac_signal=0 - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -f -r conftest* confdefs.h - -# Predefined preprocessor variables. - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_NAME "$PACKAGE_NAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_TARNAME "$PACKAGE_TARNAME" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_VERSION "$PACKAGE_VERSION" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_STRING "$PACKAGE_STRING" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" -_ACEOF - - -# Let the site file select an alternate cache file if it wants to. -# Prefer explicitly selected file to automatically selected ones. -if test -n "$CONFIG_SITE"; then - set x "$CONFIG_SITE" -elif test "x$prefix" != xNONE; then - set x "$prefix/share/config.site" "$prefix/etc/config.site" -else - set x "$ac_default_prefix/share/config.site" \ - "$ac_default_prefix/etc/config.site" -fi -shift -for ac_site_file -do - if test -r "$ac_site_file"; then - { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 -echo "$as_me: loading site script $ac_site_file" >&6;} - sed 's/^/| /' "$ac_site_file" >&5 - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - # Some versions of bash will fail to source /dev/null (special - # files actually), so we avoid doing that. - if test -f "$cache_file"; then - { echo "$as_me:$LINENO: loading cache $cache_file" >&5 -echo "$as_me: loading cache $cache_file" >&6;} - case $cache_file in - [\\/]* | ?:[\\/]* ) . "$cache_file";; - *) . "./$cache_file";; - esac - fi -else - { echo "$as_me:$LINENO: creating cache $cache_file" >&5 -echo "$as_me: creating cache $cache_file" >&6;} - >$cache_file -fi - -# Check that the precious variables saved in the cache have kept the same -# value. -ac_cache_corrupted=false -for ac_var in $ac_precious_vars; do - eval ac_old_set=\$ac_cv_env_${ac_var}_set - eval ac_new_set=\$ac_env_${ac_var}_set - eval ac_old_val=\$ac_cv_env_${ac_var}_value - eval ac_new_val=\$ac_env_${ac_var}_value - case $ac_old_set,$ac_new_set in - set,) - { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,set) - { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 -echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} - ac_cache_corrupted=: ;; - ,);; - *) - if test "x$ac_old_val" != "x$ac_new_val"; then - { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 -echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} - { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 -echo "$as_me: former value: $ac_old_val" >&2;} - { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 -echo "$as_me: current value: $ac_new_val" >&2;} - ac_cache_corrupted=: - fi;; - esac - # Pass precious variables to config.status. - if test "$ac_new_set" = set; then - case $ac_new_val in - *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; - *) ac_arg=$ac_var=$ac_new_val ;; - esac - case " $ac_configure_args " in - *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. - *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; - esac - fi -done -if $ac_cache_corrupted; then - { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 -echo "$as_me: error: changes in the environment can compromise the build" >&2;} - { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 -echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} - { (exit 1); exit 1; }; } -fi - - - - - - - - - - - - - - - - - -ac_ext=c -ac_cpp='$CPP $CPPFLAGS' -ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_c_compiler_gnu - - - -am__api_version="1.9" -ac_aux_dir= -for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do - if test -f "$ac_dir/install-sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f "$ac_dir/install.sh"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f "$ac_dir/shtool"; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 -echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} - { (exit 1); exit 1; }; } -fi - -# These three variables are undocumented and unsupported, -# and are intended to be withdrawn in a future Autoconf release. -# They can cause serious problems if a builder's source tree is in a directory -# whose full name contains unusual characters. -ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. -ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. -ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. - - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 -echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; } -if test -z "$INSTALL"; then -if test "${ac_cv_path_install+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in - ./ | .// | /cC/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - done - done - ;; -esac -done -IFS=$as_save_IFS - - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi -fi -{ echo "$as_me:$LINENO: result: $INSTALL" >&5 -echo "${ECHO_T}$INSTALL" >&6; } - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5 -echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; } -# Just in case -sleep 1 -echo timestamp > conftest.file -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftest.file` - fi - rm -f conftest.file - if test "$*" != "X $srcdir/configure conftest.file" \ - && test "$*" != "X conftest.file $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&5 -echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" >&2;} - { (exit 1); exit 1; }; } - fi - - test "$2" = conftest.file - ) -then - # Ok. - : -else - { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! -Check your system clock" >&5 -echo "$as_me: error: newly created file is older than distributed files! -Check your system clock" >&2;} - { (exit 1); exit 1; }; } -fi -{ echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } -test "$program_prefix" != NONE && - program_transform_name="s&^&$program_prefix&;$program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s&\$&$program_suffix&;$program_transform_name" -# Double any \ or $. echo might interpret backslashes. -# By default was `s,x,x', remove it if useless. -cat <<\_ACEOF >conftest.sed -s/[\\$]/&&/g;s/;s,x,x,$// -_ACEOF -program_transform_name=`echo $program_transform_name | sed -f conftest.sed` -rm -f conftest.sed - -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` - -test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" -# Use eval to expand $SHELL -if eval "$MISSING --run true"; then - am_missing_run="$MISSING --run " -else - am_missing_run= - { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 -echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} -fi - -if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then - # We used to keeping the `.' as first argument, in order to - # allow $(mkdir_p) to be used without argument. As in - # $(mkdir_p) $(somedir) - # where $(somedir) is conditionally defined. However this is wrong - # for two reasons: - # 1. if the package is installed by a user who cannot write `.' - # make install will fail, - # 2. the above comment should most certainly read - # $(mkdir_p) $(DESTDIR)$(somedir) - # so it does not work when $(somedir) is undefined and - # $(DESTDIR) is not. - # To support the latter case, we have to write - # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir), - # so the `.' trick is pointless. - mkdir_p='mkdir -p --' -else - # On NextStep and OpenStep, the `mkdir' command does not - # recognize any option. It will interpret all options as - # directories to create, and then abort because `.' already - # exists. - for d in ./-p ./--version; - do - test -d $d && rmdir $d - done - # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. - if test -f "$ac_aux_dir/mkinstalldirs"; then - mkdir_p='$(mkinstalldirs)' - else - mkdir_p='$(install_sh) -d' - fi -fi - -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_AWK+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AWK="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { echo "$as_me:$LINENO: result: $AWK" >&5 -echo "${ECHO_T}$AWK" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$AWK" && break -done - -{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 -echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; } -set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` -if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.make <<\_ACEOF -SHELL = /bin/sh -all: - @echo '@@@%%%=$(MAKE)=@@@%%%' -_ACEOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -case `${MAKE-make} -f conftest.make 2>/dev/null` in - *@@@%%%=?*=@@@%%%*) - eval ac_cv_prog_make_${ac_make}_set=yes;; - *) - eval ac_cv_prog_make_${ac_make}_set=no;; -esac -rm -f conftest.make -fi -if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - SET_MAKE= -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - SET_MAKE="MAKE=${MAKE-make}" -fi - -rm -rf .tst 2>/dev/null -mkdir .tst 2>/dev/null -if test -d .tst; then - am__leading_dot=. -else - am__leading_dot=_ -fi -rmdir .tst 2>/dev/null - -# test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && - test -f $srcdir/config.status; then - { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 -echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} - { (exit 1); exit 1; }; } -fi - -# test whether we have cygpath -if test -z "$CYGPATH_W"; then - if (cygpath --version) >/dev/null 2>/dev/null; then - CYGPATH_W='cygpath -w' - else - CYGPATH_W=echo - fi -fi - - -# Define the identity of the package. - PACKAGE=resid - VERSION=0.16vice - - -cat >>confdefs.h <<_ACEOF -#define PACKAGE "$PACKAGE" -_ACEOF - - -cat >>confdefs.h <<_ACEOF -#define VERSION "$VERSION" -_ACEOF - -# Some tools Automake needs. - -ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} - - -AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} - - -AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} - - -AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} - - -MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} - -install_sh=${install_sh-"$am_aux_dir/install-sh"} - -# Installed binaries are usually stripped using `strip' when the user -# run `make install-strip'. However `strip' might not be the right -# tool to use in cross-compilation environments, therefore Automake -# will honor the `STRIP' environment variable to overrule this program. -if test "$cross_compiling" != no; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. -set dummy ${ac_tool_prefix}strip; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$STRIP"; then - ac_cv_prog_STRIP="$STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_STRIP="${ac_tool_prefix}strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -STRIP=$ac_cv_prog_STRIP -if test -n "$STRIP"; then - { echo "$as_me:$LINENO: result: $STRIP" >&5 -echo "${ECHO_T}$STRIP" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_STRIP"; then - ac_ct_STRIP=$STRIP - # Extract the first word of "strip", so it can be a program name with args. -set dummy strip; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_STRIP"; then - ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_STRIP="strip" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP -if test -n "$ac_ct_STRIP"; then - { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 -echo "${ECHO_T}$ac_ct_STRIP" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_STRIP" = x; then - STRIP=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - STRIP=$ac_ct_STRIP - fi -else - STRIP="$ac_cv_prog_STRIP" -fi - -fi -INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" - -# We need awk for the "check" target. The system "awk" is bad on -# some platforms. -# Always define AMTAR for backward compatibility. - -AMTAR=${AMTAR-"${am_missing_run}tar"} - -am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' - - - - - -LTVERSION=5:0:0 - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - -# Check whether --enable-inline was given. -if test "${enable_inline+set}" = set; then - enableval=$enable_inline; -fi - -# Check whether --enable-sse was given. -if test "${enable_sse+set}" = set; then - enableval=$enable_sse; -fi - - -if test "$enable_inline" != no; then - RESID_INLINE=inline -else - RESID_INLINE= -fi - - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test -z "$CXX"; then - if test -n "$CCC"; then - CXX=$CCC - else - if test -n "$ac_tool_prefix"; then - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC - do - # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. -set dummy $ac_tool_prefix$ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$CXX"; then - ac_cv_prog_CXX="$CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -CXX=$ac_cv_prog_CXX -if test -n "$CXX"; then - { echo "$as_me:$LINENO: result: $CXX" >&5 -echo "${ECHO_T}$CXX" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$CXX" && break - done -fi -if test -z "$CXX"; then - ac_ct_CXX=$CXX - for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_CXX"; then - ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_CXX="$ac_prog" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_CXX=$ac_cv_prog_ac_ct_CXX -if test -n "$ac_ct_CXX"; then - { echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 -echo "${ECHO_T}$ac_ct_CXX" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - test -n "$ac_ct_CXX" && break -done - - if test "x$ac_ct_CXX" = x; then - CXX="g++" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - CXX=$ac_ct_CXX - fi -fi - - fi -fi -# Provide some information about the compiler. -echo "$as_me:$LINENO: checking for C++ compiler version" >&5 -ac_compiler=`set X $ac_compile; echo $2` -{ (ac_try="$ac_compiler --version >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler --version >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -v >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -v >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } -{ (ac_try="$ac_compiler -V >&5" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compiler -V >&5") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files a.out a.exe b.out" -# Try to create an executable without -o first, disregard a.out. -# It will help us diagnose broken compilers, and finding out an intuition -# of exeext. -{ echo "$as_me:$LINENO: checking for C++ compiler default output file name" >&5 -echo $ECHO_N "checking for C++ compiler default output file name... $ECHO_C" >&6; } -ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` -# -# List of possible output files, starting from the most likely. -# The algorithm is not robust to junk in `.', hence go to wildcards (a.*) -# only as a last resort. b.out is created by i960 compilers. -ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out' -# -# The IRIX 6 linker writes into existing files which may not be -# executable, retaining their permissions. Remove them first so a -# subsequent execution test works. -ac_rmfiles= -for ac_file in $ac_files -do - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; - * ) ac_rmfiles="$ac_rmfiles $ac_file";; - esac -done -rm -f $ac_rmfiles - -if { (ac_try="$ac_link_default" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link_default") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. -# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' -# in a Makefile. We should not override ac_cv_exeext if it was cached, -# so that the user can short-circuit this test for compilers unknown to -# Autoconf. -for ac_file in $ac_files '' -do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) - ;; - [ab].out ) - # We found the default executable, but exeext='' is most - # certainly right. - break;; - *.* ) - if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; - then :; else - ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - fi - # We set ac_cv_exeext here because the later test for it is not - # safe: cross compilers may not add the suffix if given an `-o' - # argument, so we may need to know it at that point already. - # Even if this section looks crufty: it has the advantage of - # actually working. - break;; - * ) - break;; - esac -done -test "$ac_cv_exeext" = no && ac_cv_exeext= - -else - ac_file='' -fi - -{ echo "$as_me:$LINENO: result: $ac_file" >&5 -echo "${ECHO_T}$ac_file" >&6; } -if test -z "$ac_file"; then - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: C++ compiler cannot create executables -See \`config.log' for more details." >&5 -echo "$as_me: error: C++ compiler cannot create executables -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } -fi - -ac_exeext=$ac_cv_exeext - -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ echo "$as_me:$LINENO: checking whether the C++ compiler works" >&5 -echo $ECHO_N "checking whether the C++ compiler works... $ECHO_C" >&6; } -# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 -# If not cross compiling, check that we can run a simple program. -if test "$cross_compiling" != yes; then - if { ac_try='./$ac_file' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - cross_compiling=no - else - if test "$cross_compiling" = maybe; then - cross_compiling=yes - else - { { echo "$as_me:$LINENO: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot run C++ compiled programs. -If you meant to cross compile, use \`--host'. -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } - fi - fi -fi -{ echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - -rm -f a.out a.exe conftest$ac_cv_exeext b.out -ac_clean_files=$ac_clean_files_save -# Check that the compiler produces executables we can run. If not, either -# the compiler is broken, or we cross compile. -{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 -echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; } -{ echo "$as_me:$LINENO: result: $cross_compiling" >&5 -echo "${ECHO_T}$cross_compiling" >&6; } - -{ echo "$as_me:$LINENO: checking for suffix of executables" >&5 -echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; } -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - # If both `conftest.exe' and `conftest' are `present' (well, observable) -# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will -# work properly (i.e., refer to `conftest.exe'), while it won't with -# `rm'. -for ac_file in conftest.exe conftest conftest.*; do - test -f "$ac_file" || continue - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;; - *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` - break;; - * ) break;; - esac -done -else - { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of executables: cannot compile and link -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest$ac_cv_exeext -{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 -echo "${ECHO_T}$ac_cv_exeext" >&6; } - -rm -f conftest.$ac_ext -EXEEXT=$ac_cv_exeext -ac_exeext=$EXEEXT -{ echo "$as_me:$LINENO: checking for suffix of object files" >&5 -echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; } -if test "${ac_cv_objext+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.o conftest.obj -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; then - for ac_file in conftest.o conftest.obj conftest.*; do - test -f "$ac_file" || continue; - case $ac_file in - *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;; - *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` - break;; - esac -done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute suffix of object files: cannot compile -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -rm -f conftest.$ac_cv_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 -echo "${ECHO_T}$ac_cv_objext" >&6; } -OBJEXT=$ac_cv_objext -ac_objext=$OBJEXT -{ echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 -echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6; } -if test "${ac_cv_cxx_compiler_gnu+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -#ifndef __GNUC__ - choke me -#endif - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_compiler_gnu=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_compiler_gnu=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -ac_cv_cxx_compiler_gnu=$ac_compiler_gnu - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 -echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6; } -GXX=`test $ac_compiler_gnu = yes && echo yes` -ac_test_CXXFLAGS=${CXXFLAGS+set} -ac_save_CXXFLAGS=$CXXFLAGS -{ echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 -echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6; } -if test "${ac_cv_prog_cxx_g+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_save_cxx_werror_flag=$ac_cxx_werror_flag - ac_cxx_werror_flag=yes - ac_cv_prog_cxx_g=no - CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - CXXFLAGS="" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cxx_werror_flag=$ac_save_cxx_werror_flag - CXXFLAGS="-g" - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_prog_cxx_g=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - ac_cxx_werror_flag=$ac_save_cxx_werror_flag -fi -{ echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 -echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6; } -if test "$ac_test_CXXFLAGS" = set; then - CXXFLAGS=$ac_save_CXXFLAGS -elif test $ac_cv_prog_cxx_g = yes; then - if test "$GXX" = yes; then - CXXFLAGS="-g -O2" - else - CXXFLAGS="-g" - fi -else - if test "$GXX" = yes; then - CXXFLAGS="-O2" - else - CXXFLAGS= - fi -fi -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -DEPDIR="${am__leading_dot}deps" - -ac_config_commands="$ac_config_commands depfiles" - - -am_make=${MAKE-make} -cat > confinc << 'END' -am__doit: - @echo done -.PHONY: am__doit -END -# If we don't find an include directive, just comment out the code. -{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 -echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; } -am__include="#" -am__quote= -_am_result=none -# First try GNU make style include. -echo "include confinc" > confmf -# We grep out `Entering directory' and `Leaving directory' -# messages which can occur if `w' ends up in MAKEFLAGS. -# In particular we don't look at `^make:' because GNU make might -# be invoked under some other name (usually "gmake"), in which -# case it prints its new name instead of `make'. -if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then - am__include=include - am__quote= - _am_result=GNU -fi -# Now try BSD make style include. -if test "$am__include" = "#"; then - echo '.include "confinc"' > confmf - if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then - am__include=.include - am__quote="\"" - _am_result=BSD - fi -fi - - -{ echo "$as_me:$LINENO: result: $_am_result" >&5 -echo "${ECHO_T}$_am_result" >&6; } -rm -f confinc confmf - -# Check whether --enable-dependency-tracking was given. -if test "${enable_dependency_tracking+set}" = set; then - enableval=$enable_dependency_tracking; -fi - -if test "x$enable_dependency_tracking" != xno; then - am_depcomp="$ac_aux_dir/depcomp" - AMDEPBACKSLASH='\' -fi - - -if test "x$enable_dependency_tracking" != xno; then - AMDEP_TRUE= - AMDEP_FALSE='#' -else - AMDEP_TRUE='#' - AMDEP_FALSE= -fi - - - - -depcc="$CXX" am_compiler_list= - -{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 -echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; } -if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then - # We make a subdir and do the tests there. Otherwise we can end up - # making bogus files that we don't know about and never remove. For - # instance it was reported that on HP-UX the gcc test will end up - # making a dummy file named `D' -- because `-MD' means `put the output - # in D'. - mkdir conftest.dir - # Copy depcomp to subdir because otherwise we won't find it if we're - # using a relative directory. - cp "$am_depcomp" conftest.dir - cd conftest.dir - # We will build objects and dependencies in a subdirectory because - # it helps to detect inapplicable dependency modes. For instance - # both Tru64's cc and ICC support -MD to output dependencies as a - # side effect of compilation, but ICC will put the dependencies in - # the current directory while Tru64 will put them in the object - # directory. - mkdir sub - - am_cv_CXX_dependencies_compiler_type=none - if test "$am_compiler_list" = ""; then - am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` - fi - for depmode in $am_compiler_list; do - # Setup a source with many dependencies, because some compilers - # like to wrap large dependency lists on column 80 (with \), and - # we should not choose a depcomp mode which is confused by this. - # - # We need to recreate these files for each test, as the compiler may - # overwrite some of them when testing with obscure command lines. - # This happens at least with the AIX C compiler. - : > sub/conftest.c - for i in 1 2 3 4 5 6; do - echo '#include "conftst'$i'.h"' >> sub/conftest.c - # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with - # Solaris 8's {/usr,}/bin/sh. - touch sub/conftst$i.h - done - echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf - - case $depmode in - nosideeffect) - # after this tag, mechanisms are not by side-effect, so they'll - # only be used when explicitly requested - if test "x$enable_dependency_tracking" = xyes; then - continue - else - break - fi - ;; - none) break ;; - esac - # We check with `-c' and `-o' for the sake of the "dashmstdout" - # mode. It turns out that the SunPro C++ compiler does not properly - # handle `-M -o', and we need to detect this. - if depmode=$depmode \ - source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ - depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ - $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ - >/dev/null 2>conftest.err && - grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && - grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && - ${MAKE-make} -s -f confmf > /dev/null 2>&1; then - # icc doesn't choke on unknown options, it will just issue warnings - # or remarks (even with -Werror). So we grep stderr for any message - # that says an option was ignored or not supported. - # When given -MP, icc 7.0 and 7.1 complain thusly: - # icc: Command line warning: ignoring option '-M'; no argument required - # The diagnosis changed in icc 8.0: - # icc: Command line remark: option '-MP' not supported - if (grep 'ignoring option' conftest.err || - grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else - am_cv_CXX_dependencies_compiler_type=$depmode - break - fi - fi - done - - cd .. - rm -rf conftest.dir -else - am_cv_CXX_dependencies_compiler_type=none -fi - -fi -{ echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 -echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6; } -CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type - - - -if - test "x$enable_dependency_tracking" != xno \ - && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then - am__fastdepCXX_TRUE= - am__fastdepCXX_FALSE='#' -else - am__fastdepCXX_TRUE='#' - am__fastdepCXX_FALSE= -fi - - - -if test x"$enable_sse" != "xno"; then - if test "$GXX" = yes; then - if test "$ac_test_CXXFLAGS" != set; then - CXXFLAGS="-g -Wall -O2 -msse" - { echo "$as_me:$LINENO: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 -echo $ECHO_N "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works... $ECHO_C" >&6; } - -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -int test; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - MSSE="-msse" - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - MSSE="" - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi - fi -else - MSSE="" -fi - -if test "$GXX" = yes; then - if test "$ac_test_CXXFLAGS" != set; then - CXXFLAGS="-g -Wall -O2 $MSSE -fno-exceptions" - { echo "$as_me:$LINENO: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 -echo $ECHO_N "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works... $ECHO_C" >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -int test; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - NO_EXCEPTIONS="-fno-exceptions" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - NO_EXCEPTIONS="" - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi -fi - -if test "$GXX" = yes; then - if test "$ac_test_CXXFLAGS" != set; then - CXXFLAGS="-g -Wall -O2 $MSSE -fno-exceptions $NO_EXCEPTIONS -fno-pic" - { echo "$as_me:$LINENO: checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works" >&5 -echo $ECHO_N "checking whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works... $ECHO_C" >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ -int test; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - NO_PIC="-fno-pic" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - NO_PIC="" - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - fi -fi - -CXXFLAGS="-g -Wall -O2 $MSSE $NO_EXCEPTIONS $NO_PIC" -if test x"$MSSE" = "x-msse"; then - { echo "$as_me:$LINENO: checking if the xmmintrin.h include can be used" >&5 -echo $ECHO_N "checking if the xmmintrin.h include can be used... $ECHO_C" >&6; } - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -int -main () -{ -int test; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - MSSE="" - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - CXXFLAGS="-g -Wall -O2 $NO_EXCEPTIONS $NO_PIC" -fi - -# Extract the first word of "ar", so it can be a program name with args. -set dummy ar; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_AR+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$AR"; then - ac_cv_prog_AR="$AR" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_AR="ar" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - - test -z "$ac_cv_prog_AR" && ac_cv_prog_AR="ar" -fi -fi -AR=$ac_cv_prog_AR -if test -n "$AR"; then - { echo "$as_me:$LINENO: result: $AR" >&5 -echo "${ECHO_T}$AR" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. -set dummy ${ac_tool_prefix}ranlib; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -RANLIB=$ac_cv_prog_RANLIB -if test -n "$RANLIB"; then - { echo "$as_me:$LINENO: result: $RANLIB" >&5 -echo "${ECHO_T}$RANLIB" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - -fi -if test -z "$ac_cv_prog_RANLIB"; then - ac_ct_RANLIB=$RANLIB - # Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test -n "$ac_ct_RANLIB"; then - ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_ac_ct_RANLIB="ranlib" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - -fi -fi -ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB -if test -n "$ac_ct_RANLIB"; then - { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 -echo "${ECHO_T}$ac_ct_RANLIB" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - if test "x$ac_ct_RANLIB" = x; then - RANLIB=":" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&5 -echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools -whose name does not start with the host triplet. If you think this -configuration is useful to you, please write to autoconf@gnu.org." >&2;} -ac_tool_warned=yes ;; -esac - RANLIB=$ac_ct_RANLIB - fi -else - RANLIB="$ac_cv_prog_RANLIB" -fi - -# Extract the first word of "perl", so it can be a program name with args. -set dummy perl; ac_word=$2 -{ echo "$as_me:$LINENO: checking for $ac_word" >&5 -echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; } -if test "${ac_cv_path_PERL+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - case $PERL in - [\\/]* | ?:[\\/]*) - ac_cv_path_PERL="$PERL" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_PERL="$as_dir/$ac_word$ac_exec_ext" - echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done -done -IFS=$as_save_IFS - - ;; -esac -fi -PERL=$ac_cv_path_PERL -if test -n "$PERL"; then - { echo "$as_me:$LINENO: result: $PERL" >&5 -echo "${ECHO_T}$PERL" >&6; } -else - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } -fi - - - - - - - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -{ echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 -echo $ECHO_N "checking how to run the C++ preprocessor... $ECHO_C" >&6; } -if test -z "$CXXCPP"; then - if test "${ac_cv_prog_CXXCPP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Double quotes because CXXCPP needs to be expanded - for CXXCPP in "$CXX -E" "/lib/cpp" - do - ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - break -fi - - done - ac_cv_prog_CXXCPP=$CXXCPP - -fi - CXXCPP=$ac_cv_prog_CXXCPP -else - ac_cv_prog_CXXCPP=$CXXCPP -fi -{ echo "$as_me:$LINENO: result: $CXXCPP" >&5 -echo "${ECHO_T}$CXXCPP" >&6; } -ac_preproc_ok=false -for ac_cxx_preproc_warn_flag in '' yes -do - # Use a header file that comes with gcc, so configuring glibc - # with a fresh cross-compiler works. - # Prefer to if __STDC__ is defined, since - # exists even on freestanding compilers. - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. "Syntax error" is here to catch this case. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#ifdef __STDC__ -# include -#else -# include -#endif - Syntax error -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then - : -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Broken: fails on valid input. -continue -fi - -rm -f conftest.err conftest.$ac_ext - - # OK, works on sane cases. Now check whether nonexistent headers - # can be detected and how. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -_ACEOF -if { (ac_try="$ac_cpp conftest.$ac_ext" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } >/dev/null && { - test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || - test ! -s conftest.err - }; then - # Broken: success on invalid input. -continue -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - # Passes both tests. -ac_preproc_ok=: -break -fi - -rm -f conftest.err conftest.$ac_ext - -done -# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. -rm -f conftest.err conftest.$ac_ext -if $ac_preproc_ok; then - : -else - { { echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&5 -echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check -See \`config.log' for more details." >&2;} - { (exit 1); exit 1; }; } -fi - -ac_ext=cpp -ac_cpp='$CXXCPP $CPPFLAGS' -ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' -ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' -ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - - -{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 -echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; } -if test "${ac_cv_path_GREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - # Extract the first word of "grep ggrep" to use in msg output -if test -z "$GREP"; then -set dummy grep ggrep; ac_prog_name=$2 -if test "${ac_cv_path_GREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_path_GREP_found=false -# Loop through the user's path and test for each of PROGNAME-LIST -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in grep ggrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue - # Check for GNU ac_path_GREP and select it if it is found. - # Check for GNU $ac_path_GREP -case `"$ac_path_GREP" --version 2>&1` in -*GNU*) - ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; -*) - ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - echo 'GREP' >> "conftest.nl" - "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_GREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_GREP="$ac_path_GREP" - ac_path_GREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - - $ac_path_GREP_found && break 3 - done -done - -done -IFS=$as_save_IFS - - -fi - -GREP="$ac_cv_path_GREP" -if test -z "$GREP"; then - { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } -fi - -else - ac_cv_path_GREP=$GREP -fi - - -fi -{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 -echo "${ECHO_T}$ac_cv_path_GREP" >&6; } - GREP="$ac_cv_path_GREP" - - -{ echo "$as_me:$LINENO: checking for egrep" >&5 -echo $ECHO_N "checking for egrep... $ECHO_C" >&6; } -if test "${ac_cv_path_EGREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 - then ac_cv_path_EGREP="$GREP -E" - else - # Extract the first word of "egrep" to use in msg output -if test -z "$EGREP"; then -set dummy egrep; ac_prog_name=$2 -if test "${ac_cv_path_EGREP+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - ac_path_EGREP_found=false -# Loop through the user's path and test for each of PROGNAME-LIST -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_prog in egrep; do - for ac_exec_ext in '' $ac_executable_extensions; do - ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" - { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue - # Check for GNU ac_path_EGREP and select it if it is found. - # Check for GNU $ac_path_EGREP -case `"$ac_path_EGREP" --version 2>&1` in -*GNU*) - ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; -*) - ac_count=0 - echo $ECHO_N "0123456789$ECHO_C" >"conftest.in" - while : - do - cat "conftest.in" "conftest.in" >"conftest.tmp" - mv "conftest.tmp" "conftest.in" - cp "conftest.in" "conftest.nl" - echo 'EGREP' >> "conftest.nl" - "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break - diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break - ac_count=`expr $ac_count + 1` - if test $ac_count -gt ${ac_path_EGREP_max-0}; then - # Best one so far, save it but keep looking for a better one - ac_cv_path_EGREP="$ac_path_EGREP" - ac_path_EGREP_max=$ac_count - fi - # 10*(2^10) chars as input seems more than enough - test $ac_count -gt 10 && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out;; -esac - - - $ac_path_EGREP_found && break 3 - done -done - -done -IFS=$as_save_IFS - - -fi - -EGREP="$ac_cv_path_EGREP" -if test -z "$EGREP"; then - { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 -echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} - { (exit 1); exit 1; }; } -fi - -else - ac_cv_path_EGREP=$EGREP -fi - - - fi -fi -{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 -echo "${ECHO_T}$ac_cv_path_EGREP" >&6; } - EGREP="$ac_cv_path_EGREP" - - -{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5 -echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; } -if test "${ac_cv_header_stdc+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#include -#include - -int -main () -{ - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_header_stdc=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_header_stdc=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "memchr" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - -_ACEOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - $EGREP "free" >/dev/null 2>&1; then - : -else - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. - if test "$cross_compiling" = yes; then - : -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include -#include -#if ((' ' & 0x0FF) == 0x020) -# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#else -# define ISLOWER(c) \ - (('a' <= (c) && (c) <= 'i') \ - || ('j' <= (c) && (c) <= 'r') \ - || ('s' <= (c) && (c) <= 'z')) -# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) -#endif - -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int -main () -{ - int i; - for (i = 0; i < 256; i++) - if (XOR (islower (i), ISLOWER (i)) - || toupper (i) != TOUPPER (i)) - return 2; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - : -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -ac_cv_header_stdc=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi - - -fi -fi -{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 -echo "${ECHO_T}$ac_cv_header_stdc" >&6; } -if test $ac_cv_header_stdc = yes; then - -cat >>confdefs.h <<\_ACEOF -#define STDC_HEADERS 1 -_ACEOF - -fi - -# On IRIX 5.3, sys/types and inttypes.h are conflicting. - - - - - - - - - -for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ - inttypes.h stdint.h unistd.h -do -as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_header" >&5 -echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; } -if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - -#include <$ac_header> -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - eval "$as_ac_Header=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_Header=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -ac_res=`eval echo '${'$as_ac_Header'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_Header'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 -_ACEOF - -fi - -done - - -{ echo "$as_me:$LINENO: checking for int" >&5 -echo $ECHO_N "checking for int... $ECHO_C" >&6; } -if test "${ac_cv_type_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default -typedef int ac__type_new_; -int -main () -{ -if ((ac__type_new_ *) 0) - return 0; -if (sizeof (ac__type_new_)) - return 0; - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_type_int=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_type_int=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_type_int" >&5 -echo "${ECHO_T}$ac_cv_type_int" >&6; } - -# The cast to long int works around a bug in the HP C Compiler -# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects -# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. -# This bug is HP SR number 8606223364. -{ echo "$as_me:$LINENO: checking size of int" >&5 -echo $ECHO_N "checking size of int... $ECHO_C" >&6; } -if test "${ac_cv_sizeof_int+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - if test "$cross_compiling" = yes; then - # Depending upon the size, compute the lo and hi bounds. -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=0 ac_mid=0 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr $ac_mid + 1` - if test $ac_lo -le $ac_mid; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) < 0)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=-1 ac_mid=-1 - while :; do - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) >= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_lo=$ac_mid; break -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_hi=`expr '(' $ac_mid ')' - 1` - if test $ac_mid -le $ac_hi; then - ac_lo= ac_hi= - break - fi - ac_mid=`expr 2 '*' $ac_mid` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - done -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo= ac_hi= -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -# Binary search between lo and hi bounds. -while test "x$ac_lo" != "x$ac_hi"; do - ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -int -main () -{ -static int test_array [1 - 2 * !(((long int) (sizeof (ac__type_sizeof_))) <= $ac_mid)]; -test_array [0] = 0 - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_hi=$ac_mid -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_lo=`expr '(' $ac_mid ')' + 1` -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -done -case $ac_lo in -?*) ac_cv_sizeof_int=$ac_lo;; -'') if test "$ac_cv_type_int" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_int=0 - fi ;; -esac -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -$ac_includes_default - typedef int ac__type_sizeof_; -static long int longval () { return (long int) (sizeof (ac__type_sizeof_)); } -static unsigned long int ulongval () { return (long int) (sizeof (ac__type_sizeof_)); } -#include -#include -int -main () -{ - - FILE *f = fopen ("conftest.val", "w"); - if (! f) - return 1; - if (((long int) (sizeof (ac__type_sizeof_))) < 0) - { - long int i = longval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%ld\n", i); - } - else - { - unsigned long int i = ulongval (); - if (i != ((long int) (sizeof (ac__type_sizeof_)))) - return 1; - fprintf (f, "%lu\n", i); - } - return ferror (f) || fclose (f) != 0; - - ; - return 0; -} -_ACEOF -rm -f conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { ac_try='./conftest$ac_exeext' - { (case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_try") 2>&5 - ac_status=$? - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); }; }; then - ac_cv_sizeof_int=`cat conftest.val` -else - echo "$as_me: program exited with status $ac_status" >&5 -echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - -( exit $ac_status ) -if test "$ac_cv_type_int" = yes; then - { { echo "$as_me:$LINENO: error: cannot compute sizeof (int) -See \`config.log' for more details." >&5 -echo "$as_me: error: cannot compute sizeof (int) -See \`config.log' for more details." >&2;} - { (exit 77); exit 77; }; } - else - ac_cv_sizeof_int=0 - fi -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext -fi -rm -f conftest.val -fi -{ echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 -echo "${ECHO_T}$ac_cv_sizeof_int" >&6; } - - - -cat >>confdefs.h <<_ACEOF -#define SIZEOF_INT $ac_cv_sizeof_int -_ACEOF - - - -if test $ac_cv_sizeof_int -lt 4; then - { { echo "$as_me:$LINENO: error: only 32 bit or better CPUs are supported" >&5 -echo "$as_me: error: only 32 bit or better CPUs are supported" >&2;} - { (exit 1); exit 1; }; } -fi - -{ echo "$as_me:$LINENO: checking for working bool" >&5 -echo $ECHO_N "checking for working bool... $ECHO_C" >&6; } -if test "${ac_cv_cxx_bool+set}" = set; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ - -int -main () -{ - -bool flag; - - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - ac_cv_cxx_bool=yes -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - ac_cv_cxx_bool=no -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ echo "$as_me:$LINENO: result: $ac_cv_cxx_bool" >&5 -echo "${ECHO_T}$ac_cv_cxx_bool" >&6; } - -if test $ac_cv_cxx_bool = no; then - RESID_HAVE_BOOL=0 -else - RESID_HAVE_BOOL=1 -fi - -if test x"$MSSE" = "x-msse"; then - RESID_USE_SSE=1 - - -if true; then - USE_SSE_TRUE= - USE_SSE_FALSE='#' -else - USE_SSE_TRUE='#' - USE_SSE_FALSE= -fi - -else - RESID_USE_SSE=0 - - -if false; then - USE_SSE_TRUE= - USE_SSE_FALSE='#' -else - USE_SSE_TRUE='#' - USE_SSE_FALSE= -fi - -fi - - - - - - - -for ac_func in logf expf -do -as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` -{ echo "$as_me:$LINENO: checking for $ac_func" >&5 -echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6; } -if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then - echo $ECHO_N "(cached) $ECHO_C" >&6 -else - cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -/* Define $ac_func to an innocuous variant, in case declares $ac_func. - For example, HP-UX 11i declares gettimeofday. */ -#define $ac_func innocuous_$ac_func - -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. - Prefer to if __STDC__ is defined, since - exists even on freestanding compilers. */ - -#ifdef __STDC__ -# include -#else -# include -#endif - -#undef $ac_func - -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char $ac_func (); -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined __stub_$ac_func || defined __stub___$ac_func -choke me -#endif - -int -main () -{ -return $ac_func (); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext conftest$ac_exeext -if { (ac_try="$ac_link" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_link") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest$ac_exeext && - $as_test_x conftest$ac_exeext; then - eval "$as_ac_var=yes" -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - eval "$as_ac_var=no" -fi - -rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ - conftest$ac_exeext conftest.$ac_ext -fi -ac_res=`eval echo '${'$as_ac_var'}'` - { echo "$as_me:$LINENO: result: $ac_res" >&5 -echo "${ECHO_T}$ac_res" >&6; } -if test `eval echo '${'$as_ac_var'}'` = yes; then - cat >>confdefs.h <<_ACEOF -#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 -_ACEOF - -fi -done - - -{ echo "$as_me:$LINENO: checking if the logf prototype is present" >&5 -echo $ECHO_N "checking if the logf prototype is present... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #include -int -main () -{ -printf("%d",logf); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - HAVE_LOGF_PROTOTYPE=1 - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - HAVE_LOGF_PROTOTYPE=0 - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - -{ echo "$as_me:$LINENO: checking if the expf prototype is present" >&5 -echo $ECHO_N "checking if the expf prototype is present... $ECHO_C" >&6; } -cat >conftest.$ac_ext <<_ACEOF -/* confdefs.h. */ -_ACEOF -cat confdefs.h >>conftest.$ac_ext -cat >>conftest.$ac_ext <<_ACEOF -/* end confdefs.h. */ -#include - #include -int -main () -{ -printf("%d",expf); - ; - return 0; -} -_ACEOF -rm -f conftest.$ac_objext -if { (ac_try="$ac_compile" -case "(($ac_try" in - *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; - *) ac_try_echo=$ac_try;; -esac -eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 - (eval "$ac_compile") 2>conftest.er1 - ac_status=$? - grep -v '^ *+' conftest.er1 >conftest.err - rm -f conftest.er1 - cat conftest.err >&5 - echo "$as_me:$LINENO: \$? = $ac_status" >&5 - (exit $ac_status); } && { - test -z "$ac_cxx_werror_flag" || - test ! -s conftest.err - } && test -s conftest.$ac_objext; then - { echo "$as_me:$LINENO: result: yes" >&5 -echo "${ECHO_T}yes" >&6; } - HAVE_EXPF_PROTOTYPE=1 - -else - echo "$as_me: failed program was:" >&5 -sed 's/^/| /' conftest.$ac_ext >&5 - - { echo "$as_me:$LINENO: result: no" >&5 -echo "${ECHO_T}no" >&6; } - HAVE_EXPF_PROTOTYPE=0 - -fi - -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext - - - - -ac_config_files="$ac_config_files Makefile siddefs-fp.h" - -cat >confcache <<\_ACEOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs, see configure's option --config-cache. -# It is not useful on other systems. If it contains results you don't -# want to keep, you may remove or edit it. -# -# config.status only pays attention to the cache file if you give it -# the --recheck option to rerun configure. -# -# `ac_cv_env_foo' variables (set or unset) will be overridden when -# loading this file, other *unset* `ac_cv_foo' will be assigned the -# following values. - -_ACEOF - -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, we kill variables containing newlines. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -( - for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do - eval ac_val=\$$ac_var - case $ac_val in #( - *${as_nl}*) - case $ac_var in #( - *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5 -echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;; - esac - case $ac_var in #( - _ | IFS | as_nl) ;; #( - *) $as_unset $ac_var ;; - esac ;; - esac - done - - (set) 2>&1 | - case $as_nl`(ac_space=' '; set) 2>&1` in #( - *${as_nl}ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote - # substitution turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - "s/'/'\\\\''/g; - s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" - ;; #( - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" - ;; - esac | - sort -) | - sed ' - /^ac_cv_env_/b end - t clear - :clear - s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ - t end - s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ - :end' >>confcache -if diff "$cache_file" confcache >/dev/null 2>&1; then :; else - if test -w "$cache_file"; then - test "x$cache_file" != "x/dev/null" && - { echo "$as_me:$LINENO: updating cache $cache_file" >&5 -echo "$as_me: updating cache $cache_file" >&6;} - cat confcache >$cache_file - else - { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 -echo "$as_me: not updating unwritable cache $cache_file" >&6;} - fi -fi -rm -f confcache - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Transform confdefs.h into DEFS. -# Protect against shell expansion while executing Makefile rules. -# Protect against Makefile macro expansion. -# -# If the first sed substitution is executed (which looks for macros that -# take arguments), then branch to the quote section. Otherwise, -# look for a macro that doesn't take arguments. -ac_script=' -t clear -:clear -s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g -t quote -s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g -t quote -b any -:quote -s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g -s/\[/\\&/g -s/\]/\\&/g -s/\$/$$/g -H -:any -${ - g - s/^\n// - s/\n/ /g - p -} -' -DEFS=`sed -n "$ac_script" confdefs.h` - - -ac_libobjs= -ac_ltlibobjs= -for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue - # 1. Remove the extension, and $U if already installed. - ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' - ac_i=`echo "$ac_i" | sed "$ac_script"` - # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR - # will be set to the directory where LIBOBJS objects are built. - ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" - ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' -done -LIBOBJS=$ac_libobjs - -LTLIBOBJS=$ac_ltlibobjs - - -if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"AMDEP\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${USE_SSE_TRUE}" && test -z "${USE_SSE_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"USE_SSE\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"USE_SSE\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi -if test -z "${USE_SSE_TRUE}" && test -z "${USE_SSE_FALSE}"; then - { { echo "$as_me:$LINENO: error: conditional \"USE_SSE\" was never defined. -Usually this means the macro was only invoked conditionally." >&5 -echo "$as_me: error: conditional \"USE_SSE\" was never defined. -Usually this means the macro was only invoked conditionally." >&2;} - { (exit 1); exit 1; }; } -fi - -: ${CONFIG_STATUS=./config.status} -ac_clean_files_save=$ac_clean_files -ac_clean_files="$ac_clean_files $CONFIG_STATUS" -{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 -echo "$as_me: creating $CONFIG_STATUS" >&6;} -cat >$CONFIG_STATUS <<_ACEOF -#! $SHELL -# Generated by $as_me. -# Run this file to recreate the current configuration. -# Compiler output produced by configure, useful for debugging -# configure, is in config.log if it exists. - -debug=false -ac_cs_recheck=false -ac_cs_silent=false -SHELL=\${CONFIG_SHELL-$SHELL} -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -## --------------------- ## -## M4sh Initialization. ## -## --------------------- ## - -# Be more Bourne compatible -DUALCASE=1; export DUALCASE # for MKS sh -if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then - emulate sh - NULLCMD=: - # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which - # is contrary to our usage. Disable this feature. - alias -g '${1+"$@"}'='"$@"' - setopt NO_GLOB_SUBST -else - case `(set -o) 2>/dev/null` in - *posix*) set -o posix ;; -esac - -fi - - - - -# PATH needs CR -# Avoid depending upon Character Ranges. -as_cr_letters='abcdefghijklmnopqrstuvwxyz' -as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' -as_cr_Letters=$as_cr_letters$as_cr_LETTERS -as_cr_digits='0123456789' -as_cr_alnum=$as_cr_Letters$as_cr_digits - -# The user is always right. -if test "${PATH_SEPARATOR+set}" != set; then - echo "#! /bin/sh" >conf$$.sh - echo "exit 0" >>conf$$.sh - chmod +x conf$$.sh - if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then - PATH_SEPARATOR=';' - else - PATH_SEPARATOR=: - fi - rm -f conf$$.sh -fi - -# Support unset when possible. -if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then - as_unset=unset -else - as_unset=false -fi - - -# IFS -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent editors from complaining about space-tab. -# (If _AS_PATH_WALK were called with IFS unset, it would disable word -# splitting by setting IFS to empty value.) -as_nl=' -' -IFS=" "" $as_nl" - -# Find who we are. Look in the path if we contain no directory separator. -case $0 in - *[\\/]* ) as_myself=$0 ;; - *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break -done -IFS=$as_save_IFS - - ;; -esac -# We did not find ourselves, most probably we were run as `sh COMMAND' -# in which case we are not to be found in the path. -if test "x$as_myself" = x; then - as_myself=$0 -fi -if test ! -f "$as_myself"; then - echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 - { (exit 1); exit 1; } -fi - -# Work around bugs in pre-3.0 UWIN ksh. -for as_var in ENV MAIL MAILPATH -do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var -done -PS1='$ ' -PS2='> ' -PS4='+ ' - -# NLS nuisances. -for as_var in \ - LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ - LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ - LC_TELEPHONE LC_TIME -do - if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then - eval $as_var=C; export $as_var - else - ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var - fi -done - -# Required to use basename. -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then - as_basename=basename -else - as_basename=false -fi - - -# Name of the executable. -as_me=`$as_basename -- "$0" || -$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ - X"$0" : 'X\(//\)$' \| \ - X"$0" : 'X\(/\)' \| . 2>/dev/null || -echo X/"$0" | - sed '/^.*\/\([^/][^/]*\)\/*$/{ - s//\1/ - q - } - /^X\/\(\/\/\)$/{ - s//\1/ - q - } - /^X\/\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - -# CDPATH. -$as_unset CDPATH - - - - as_lineno_1=$LINENO - as_lineno_2=$LINENO - test "x$as_lineno_1" != "x$as_lineno_2" && - test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { - - # Create $as_me.lineno as a copy of $as_myself, but with $LINENO - # uniformly replaced by the line number. The first 'sed' inserts a - # line-number line after each line using $LINENO; the second 'sed' - # does the real work. The second script uses 'N' to pair each - # line-number line with the line containing $LINENO, and appends - # trailing '-' during substitution so that $LINENO is not a special - # case at line end. - # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the - # scripts with optimization help from Paolo Bonzini. Blame Lee - # E. McMahon (1931-1989) for sed's syntax. :-) - sed -n ' - p - /[$]LINENO/= - ' <$as_myself | - sed ' - s/[$]LINENO.*/&-/ - t lineno - b - :lineno - N - :loop - s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ - t loop - s/-\n.*// - ' >$as_me.lineno && - chmod +x "$as_me.lineno" || - { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 - { (exit 1); exit 1; }; } - - # Don't try to exec as it changes $[0], causing all sort of problems - # (the dirname of $[0] is not the place where we might find the - # original and so on. Autoconf is especially sensitive to this). - . "./$as_me.lineno" - # Exit status is that of the last command. - exit -} - - -if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then - as_dirname=dirname -else - as_dirname=false -fi - -ECHO_C= ECHO_N= ECHO_T= -case `echo -n x` in --n*) - case `echo 'x\c'` in - *c*) ECHO_T=' ';; # ECHO_T is single tab character. - *) ECHO_C='\c';; - esac;; -*) - ECHO_N='-n';; -esac - -if expr a : '\(a\)' >/dev/null 2>&1 && - test "X`expr 00001 : '.*\(...\)'`" = X001; then - as_expr=expr -else - as_expr=false -fi - -rm -f conf$$ conf$$.exe conf$$.file -if test -d conf$$.dir; then - rm -f conf$$.dir/conf$$.file -else - rm -f conf$$.dir - mkdir conf$$.dir -fi -echo >conf$$.file -if ln -s conf$$.file conf$$ 2>/dev/null; then - as_ln_s='ln -s' - # ... but there are two gotchas: - # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. - # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. - # In both cases, we have to default to `cp -p'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -p' -elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln -else - as_ln_s='cp -p' -fi -rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file -rmdir conf$$.dir 2>/dev/null - -if mkdir -p . 2>/dev/null; then - as_mkdir_p=: -else - test -d ./-p && rmdir ./-p - as_mkdir_p=false -fi - -if test -x / >/dev/null 2>&1; then - as_test_x='test -x' -else - if ls -dL / >/dev/null 2>&1; then - as_ls_L_option=L - else - as_ls_L_option= - fi - as_test_x=' - eval sh -c '\'' - if test -d "$1"; then - test -d "$1/."; - else - case $1 in - -*)set "./$1";; - esac; - case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in - ???[sx]*):;;*)false;;esac;fi - '\'' sh - ' -fi -as_executable_p=$as_test_x - -# Sed expression to map a string onto a valid CPP name. -as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" - -# Sed expression to map a string onto a valid variable name. -as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" - - -exec 6>&1 - -# Save the log message, to keep $[0] and so on meaningful, and to -# report actual input values of CONFIG_FILES etc. instead of their -# values after options handling. -ac_log=" -This file was extended by $as_me, which was -generated by GNU Autoconf 2.61. Invocation command line was - - CONFIG_FILES = $CONFIG_FILES - CONFIG_HEADERS = $CONFIG_HEADERS - CONFIG_LINKS = $CONFIG_LINKS - CONFIG_COMMANDS = $CONFIG_COMMANDS - $ $0 $@ - -on `(hostname || uname -n) 2>/dev/null | sed 1q` -" - -_ACEOF - -cat >>$CONFIG_STATUS <<_ACEOF -# Files that config.status was made for. -config_files="$ac_config_files" -config_commands="$ac_config_commands" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -ac_cs_usage="\ -\`$as_me' instantiates files from templates according to the -current configuration. - -Usage: $0 [OPTIONS] [FILE]... - - -h, --help print this help, then exit - -V, --version print version number and configuration settings, then exit - -q, --quiet do not print progress messages - -d, --debug don't remove temporary files - --recheck update $as_me by reconfiguring in the same conditions - --file=FILE[:TEMPLATE] - instantiate the configuration file FILE - -Configuration files: -$config_files - -Configuration commands: -$config_commands - -Report bugs to ." - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -ac_cs_version="\\ -config.status -configured by $0, generated by GNU Autoconf 2.61, - with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" - -Copyright (C) 2006 Free Software Foundation, Inc. -This config.status script is free software; the Free Software Foundation -gives unlimited permission to copy, distribute and modify it." - -ac_pwd='$ac_pwd' -srcdir='$srcdir' -INSTALL='$INSTALL' -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -# If no file are specified by the user, then we need to provide default -# value. By we need to know if files were specified by the user. -ac_need_defaults=: -while test $# != 0 -do - case $1 in - --*=*) - ac_option=`expr "X$1" : 'X\([^=]*\)='` - ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` - ac_shift=: - ;; - *) - ac_option=$1 - ac_optarg=$2 - ac_shift=shift - ;; - esac - - case $ac_option in - # Handling of the options. - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - ac_cs_recheck=: ;; - --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) - echo "$ac_cs_version"; exit ;; - --debug | --debu | --deb | --de | --d | -d ) - debug=: ;; - --file | --fil | --fi | --f ) - $ac_shift - CONFIG_FILES="$CONFIG_FILES $ac_optarg" - ac_need_defaults=false;; - --he | --h | --help | --hel | -h ) - echo "$ac_cs_usage"; exit ;; - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil | --si | --s) - ac_cs_silent=: ;; - - # This is an error. - -*) { echo "$as_me: error: unrecognized option: $1 -Try \`$0 --help' for more information." >&2 - { (exit 1); exit 1; }; } ;; - - *) ac_config_targets="$ac_config_targets $1" - ac_need_defaults=false ;; - - esac - shift -done - -ac_configure_extra_args= - -if $ac_cs_silent; then - exec 6>/dev/null - ac_configure_extra_args="$ac_configure_extra_args --silent" -fi - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -if \$ac_cs_recheck; then - echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 - CONFIG_SHELL=$SHELL - export CONFIG_SHELL - exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion -fi - -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -exec 5>>config.log -{ - echo - sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX -## Running $as_me. ## -_ASBOX - echo "$ac_log" -} >&5 - -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF -# -# INIT-COMMANDS -# -AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" - -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF - -# Handling of arguments. -for ac_config_target in $ac_config_targets -do - case $ac_config_target in - "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; - "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; - "siddefs-fp.h") CONFIG_FILES="$CONFIG_FILES siddefs-fp.h" ;; - - *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 -echo "$as_me: error: invalid argument: $ac_config_target" >&2;} - { (exit 1); exit 1; }; };; - esac -done - - -# If the user did not use the arguments to specify the items to instantiate, -# then the envvar interface is used. Set only those that are not. -# We use the long form for the default assignment because of an extremely -# bizarre bug on SunOS 4.1.3. -if $ac_need_defaults; then - test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files - test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands -fi - -# Have a temporary directory for convenience. Make it in the build tree -# simply because there is no reason against having it here, and in addition, -# creating and moving files from /tmp can sometimes cause problems. -# Hook for its removal unless debugging. -# Note that there is a small window in which the directory will not be cleaned: -# after its creation but before its name has been assigned to `$tmp'. -$debug || -{ - tmp= - trap 'exit_status=$? - { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status -' 0 - trap '{ (exit 1); exit 1; }' 1 2 13 15 -} -# Create a (secure) tmp directory for tmp files. - -{ - tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && - test -n "$tmp" && test -d "$tmp" -} || -{ - tmp=./conf$$-$RANDOM - (umask 077 && mkdir "$tmp") -} || -{ - echo "$me: cannot create a temporary directory in ." >&2 - { (exit 1); exit 1; } -} - -# -# Set up the sed scripts for CONFIG_FILES section. -# - -# No need to generate the scripts if there are no CONFIG_FILES. -# This happens for instance when ./config.status config.h -if test -n "$CONFIG_FILES"; then - -_ACEOF - - - -ac_delim='%!_!# ' -for ac_last_try in false false false false false :; do - cat >conf$$subs.sed <<_ACEOF -SHELL!$SHELL$ac_delim -PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim -PACKAGE_NAME!$PACKAGE_NAME$ac_delim -PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim -PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim -PACKAGE_STRING!$PACKAGE_STRING$ac_delim -PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim -exec_prefix!$exec_prefix$ac_delim -prefix!$prefix$ac_delim -program_transform_name!$program_transform_name$ac_delim -bindir!$bindir$ac_delim -sbindir!$sbindir$ac_delim -libexecdir!$libexecdir$ac_delim -datarootdir!$datarootdir$ac_delim -datadir!$datadir$ac_delim -sysconfdir!$sysconfdir$ac_delim -sharedstatedir!$sharedstatedir$ac_delim -localstatedir!$localstatedir$ac_delim -includedir!$includedir$ac_delim -oldincludedir!$oldincludedir$ac_delim -docdir!$docdir$ac_delim -infodir!$infodir$ac_delim -htmldir!$htmldir$ac_delim -dvidir!$dvidir$ac_delim -pdfdir!$pdfdir$ac_delim -psdir!$psdir$ac_delim -libdir!$libdir$ac_delim -localedir!$localedir$ac_delim -mandir!$mandir$ac_delim -DEFS!$DEFS$ac_delim -ECHO_C!$ECHO_C$ac_delim -ECHO_N!$ECHO_N$ac_delim -ECHO_T!$ECHO_T$ac_delim -LIBS!$LIBS$ac_delim -build_alias!$build_alias$ac_delim -host_alias!$host_alias$ac_delim -target_alias!$target_alias$ac_delim -INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim -INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim -INSTALL_DATA!$INSTALL_DATA$ac_delim -CYGPATH_W!$CYGPATH_W$ac_delim -PACKAGE!$PACKAGE$ac_delim -VERSION!$VERSION$ac_delim -ACLOCAL!$ACLOCAL$ac_delim -AUTOCONF!$AUTOCONF$ac_delim -AUTOMAKE!$AUTOMAKE$ac_delim -AUTOHEADER!$AUTOHEADER$ac_delim -MAKEINFO!$MAKEINFO$ac_delim -install_sh!$install_sh$ac_delim -STRIP!$STRIP$ac_delim -INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim -mkdir_p!$mkdir_p$ac_delim -AWK!$AWK$ac_delim -SET_MAKE!$SET_MAKE$ac_delim -am__leading_dot!$am__leading_dot$ac_delim -AMTAR!$AMTAR$ac_delim -am__tar!$am__tar$ac_delim -am__untar!$am__untar$ac_delim -RESID_INLINE!$RESID_INLINE$ac_delim -CXX!$CXX$ac_delim -CXXFLAGS!$CXXFLAGS$ac_delim -LDFLAGS!$LDFLAGS$ac_delim -CPPFLAGS!$CPPFLAGS$ac_delim -ac_ct_CXX!$ac_ct_CXX$ac_delim -EXEEXT!$EXEEXT$ac_delim -OBJEXT!$OBJEXT$ac_delim -DEPDIR!$DEPDIR$ac_delim -am__include!$am__include$ac_delim -am__quote!$am__quote$ac_delim -AMDEP_TRUE!$AMDEP_TRUE$ac_delim -AMDEP_FALSE!$AMDEP_FALSE$ac_delim -AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim -CXXDEPMODE!$CXXDEPMODE$ac_delim -am__fastdepCXX_TRUE!$am__fastdepCXX_TRUE$ac_delim -am__fastdepCXX_FALSE!$am__fastdepCXX_FALSE$ac_delim -AR!$AR$ac_delim -RANLIB!$RANLIB$ac_delim -PERL!$PERL$ac_delim -CXXCPP!$CXXCPP$ac_delim -GREP!$GREP$ac_delim -EGREP!$EGREP$ac_delim -USE_SSE_TRUE!$USE_SSE_TRUE$ac_delim -USE_SSE_FALSE!$USE_SSE_FALSE$ac_delim -RESID_HAVE_BOOL!$RESID_HAVE_BOOL$ac_delim -RESID_USE_SSE!$RESID_USE_SSE$ac_delim -HAVE_LOGF_PROTOTYPE!$HAVE_LOGF_PROTOTYPE$ac_delim -HAVE_EXPF_PROTOTYPE!$HAVE_EXPF_PROTOTYPE$ac_delim -LIBOBJS!$LIBOBJS$ac_delim -LTLIBOBJS!$LTLIBOBJS$ac_delim -_ACEOF - - if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 89; then - break - elif $ac_last_try; then - { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 -echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} - { (exit 1); exit 1; }; } - else - ac_delim="$ac_delim!$ac_delim _$ac_delim!! " - fi -done - -ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed` -if test -n "$ac_eof"; then - ac_eof=`echo "$ac_eof" | sort -nru | sed 1q` - ac_eof=`expr $ac_eof + 1` -fi - -cat >>$CONFIG_STATUS <<_ACEOF -cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end -_ACEOF -sed ' -s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g -s/^/s,@/; s/!/@,|#_!!_#|/ -:n -t n -s/'"$ac_delim"'$/,g/; t -s/$/\\/; p -N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n -' >>$CONFIG_STATUS >$CONFIG_STATUS <<_ACEOF -:end -s/|#_!!_#|//g -CEOF$ac_eof -_ACEOF - - -# VPATH may cause trouble with some makes, so we remove $(srcdir), -# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and -# trailing colons and then remove the whole line if VPATH becomes empty -# (actually we leave an empty line to preserve line numbers). -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=/{ -s/:*\$(srcdir):*/:/ -s/:*\${srcdir}:*/:/ -s/:*@srcdir@:*/:/ -s/^\([^=]*=[ ]*\):*/\1/ -s/:*$// -s/^[^=]*=[ ]*$// -}' -fi - -cat >>$CONFIG_STATUS <<\_ACEOF -fi # test -n "$CONFIG_FILES" - - -for ac_tag in :F $CONFIG_FILES :C $CONFIG_COMMANDS -do - case $ac_tag in - :[FHLC]) ac_mode=$ac_tag; continue;; - esac - case $ac_mode$ac_tag in - :[FHL]*:*);; - :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5 -echo "$as_me: error: Invalid tag $ac_tag." >&2;} - { (exit 1); exit 1; }; };; - :[FH]-) ac_tag=-:-;; - :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; - esac - ac_save_IFS=$IFS - IFS=: - set x $ac_tag - IFS=$ac_save_IFS - shift - ac_file=$1 - shift - - case $ac_mode in - :L) ac_source=$1;; - :[FH]) - ac_file_inputs= - for ac_f - do - case $ac_f in - -) ac_f="$tmp/stdin";; - *) # Look for the file first in the build tree, then in the source tree - # (if the path is not absolute). The absolute path cannot be DOS-style, - # because $ac_f cannot contain `:'. - test -f "$ac_f" || - case $ac_f in - [\\/$]*) false;; - *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; - esac || - { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 -echo "$as_me: error: cannot find input file: $ac_f" >&2;} - { (exit 1); exit 1; }; };; - esac - ac_file_inputs="$ac_file_inputs $ac_f" - done - - # Let's still pretend it is `configure' which instantiates (i.e., don't - # use $as_me), people would be surprised to read: - # /* config.h. Generated by config.status. */ - configure_input="Generated from "`IFS=: - echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure." - if test x"$ac_file" != x-; then - configure_input="$ac_file. $configure_input" - { echo "$as_me:$LINENO: creating $ac_file" >&5 -echo "$as_me: creating $ac_file" >&6;} - fi - - case $ac_tag in - *:-:* | *:-) cat >"$tmp/stdin";; - esac - ;; - esac - - ac_dir=`$as_dirname -- "$ac_file" || -$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$ac_file" : 'X\(//\)[^/]' \| \ - X"$ac_file" : 'X\(//\)$' \| \ - X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || -echo X"$ac_file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir="$ac_dir" - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - ac_builddir=. - -case "$ac_dir" in -.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; -*) - ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` - # A ".." for each directory in $ac_dir_suffix. - ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'` - case $ac_top_builddir_sub in - "") ac_top_builddir_sub=. ac_top_build_prefix= ;; - *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; - esac ;; -esac -ac_abs_top_builddir=$ac_pwd -ac_abs_builddir=$ac_pwd$ac_dir_suffix -# for backward compatibility: -ac_top_builddir=$ac_top_build_prefix - -case $srcdir in - .) # We are building in place. - ac_srcdir=. - ac_top_srcdir=$ac_top_builddir_sub - ac_abs_top_srcdir=$ac_pwd ;; - [\\/]* | ?:[\\/]* ) # Absolute name. - ac_srcdir=$srcdir$ac_dir_suffix; - ac_top_srcdir=$srcdir - ac_abs_top_srcdir=$srcdir ;; - *) # Relative name. - ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix - ac_top_srcdir=$ac_top_build_prefix$srcdir - ac_abs_top_srcdir=$ac_pwd/$srcdir ;; -esac -ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix - - - case $ac_mode in - :F) - # - # CONFIG_FILE - # - - case $INSTALL in - [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; - *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; - esac -_ACEOF - -cat >>$CONFIG_STATUS <<\_ACEOF -# If the template does not know about datarootdir, expand it. -# FIXME: This hack should be removed a few years after 2.60. -ac_datarootdir_hack=; ac_datarootdir_seen= - -case `sed -n '/datarootdir/ { - p - q -} -/@datadir@/p -/@docdir@/p -/@infodir@/p -/@localedir@/p -/@mandir@/p -' $ac_file_inputs` in -*datarootdir*) ac_datarootdir_seen=yes;; -*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) - { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 -echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} -_ACEOF -cat >>$CONFIG_STATUS <<_ACEOF - ac_datarootdir_hack=' - s&@datadir@&$datadir&g - s&@docdir@&$docdir&g - s&@infodir@&$infodir&g - s&@localedir@&$localedir&g - s&@mandir@&$mandir&g - s&\\\${datarootdir}&$datarootdir&g' ;; -esac -_ACEOF - -# Neutralize VPATH when `$srcdir' = `.'. -# Shell code in configure.ac might set extrasub. -# FIXME: do we really want to maintain this feature? -cat >>$CONFIG_STATUS <<_ACEOF - sed "$ac_vpsub -$extrasub -_ACEOF -cat >>$CONFIG_STATUS <<\_ACEOF -:t -/@[a-zA-Z_][a-zA-Z_0-9]*@/!b -s&@configure_input@&$configure_input&;t t -s&@top_builddir@&$ac_top_builddir_sub&;t t -s&@srcdir@&$ac_srcdir&;t t -s&@abs_srcdir@&$ac_abs_srcdir&;t t -s&@top_srcdir@&$ac_top_srcdir&;t t -s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t -s&@builddir@&$ac_builddir&;t t -s&@abs_builddir@&$ac_abs_builddir&;t t -s&@abs_top_builddir@&$ac_abs_top_builddir&;t t -s&@INSTALL@&$ac_INSTALL&;t t -$ac_datarootdir_hack -" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out - -test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && - { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && - { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && - { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&5 -echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' -which seems to be undefined. Please make sure it is defined." >&2;} - - rm -f "$tmp/stdin" - case $ac_file in - -) cat "$tmp/out"; rm -f "$tmp/out";; - *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;; - esac - ;; - - - :C) { echo "$as_me:$LINENO: executing $ac_file commands" >&5 -echo "$as_me: executing $ac_file commands" >&6;} - ;; - esac - - - case $ac_file$ac_mode in - "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do - # Strip MF so we end up with the name of the file. - mf=`echo "$mf" | sed -e 's/:.*$//'` - # Check whether this is an Automake generated Makefile or not. - # We used to match only the files named `Makefile.in', but - # some people rename them; so instead we look at the file content. - # Grep'ing the first line is not enough: some people post-process - # each Makefile.in and add a new line on top of each file to say so. - # So let's grep whole file. - if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then - dirpart=`$as_dirname -- "$mf" || -$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$mf" : 'X\(//\)[^/]' \| \ - X"$mf" : 'X\(//\)$' \| \ - X"$mf" : 'X\(/\)' \| . 2>/dev/null || -echo X"$mf" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - else - continue - fi - # Extract the definition of DEPDIR, am__include, and am__quote - # from the Makefile without running `make'. - DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` - test -z "$DEPDIR" && continue - am__include=`sed -n 's/^am__include = //p' < "$mf"` - test -z "am__include" && continue - am__quote=`sed -n 's/^am__quote = //p' < "$mf"` - # When using ansi2knr, U may be empty or an underscore; expand it - U=`sed -n 's/^U = //p' < "$mf"` - # Find all dependency output files, they are included files with - # $(DEPDIR) in their names. We invoke sed twice because it is the - # simplest approach to changing $(DEPDIR) to its actual value in the - # expansion. - for file in `sed -n " - s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ - sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do - # Make sure the directory exists. - test -f "$dirpart/$file" && continue - fdir=`$as_dirname -- "$file" || -$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$file" : 'X\(//\)[^/]' \| \ - X"$file" : 'X\(//\)$' \| \ - X"$file" : 'X\(/\)' \| . 2>/dev/null || -echo X"$file" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - { as_dir=$dirpart/$fdir - case $as_dir in #( - -*) as_dir=./$as_dir;; - esac - test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { - as_dirs= - while :; do - case $as_dir in #( - *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #( - *) as_qdir=$as_dir;; - esac - as_dirs="'$as_qdir' $as_dirs" - as_dir=`$as_dirname -- "$as_dir" || -$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ - X"$as_dir" : 'X\(//\)[^/]' \| \ - X"$as_dir" : 'X\(//\)$' \| \ - X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || -echo X"$as_dir" | - sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ - s//\1/ - q - } - /^X\(\/\/\)[^/].*/{ - s//\1/ - q - } - /^X\(\/\/\)$/{ - s//\1/ - q - } - /^X\(\/\).*/{ - s//\1/ - q - } - s/.*/./; q'` - test -d "$as_dir" && break - done - test -z "$as_dirs" || eval "mkdir $as_dirs" - } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 -echo "$as_me: error: cannot create directory $as_dir" >&2;} - { (exit 1); exit 1; }; }; } - # echo "creating $dirpart/$file" - echo '# dummy' > "$dirpart/$file" - done -done - ;; - - esac -done # for ac_tag - - -{ (exit 0); exit 0; } -_ACEOF -chmod +x $CONFIG_STATUS -ac_clean_files=$ac_clean_files_save - - -# configure is writing to config.log, and then calls config.status. -# config.status does its own redirection, appending to config.log. -# Unfortunately, on DOS this fails, as config.log is still kept open -# by configure, so config.status won't be able to write to it; its -# output is simply discarded. So we exec the FD to /dev/null, -# effectively closing config.log, so it can be properly (re)opened and -# appended to by config.status. When coming back to configure, we -# need to make the FD available again. -if test "$no_create" != yes; then - ac_cs_success=: - ac_config_status_args= - test "$silent" = yes && - ac_config_status_args="$ac_config_status_args --quiet" - exec 5>/dev/null - $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false - exec 5>>config.log - # Use ||, not &&, to avoid exiting from the if with $? = 1, which - # would make configure fail if this is the last instruction. - $ac_cs_success || { (exit 1); exit 1; } -fi - diff --git a/src/sound/resid-fp/configure.in b/src/sound/resid-fp/configure.in deleted file mode 100644 index f4b3b5731..000000000 --- a/src/sound/resid-fp/configure.in +++ /dev/null @@ -1,166 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(sid.h) - -dnl Use Automake -AM_INIT_AUTOMAKE(resid, 0.16vice) -LTVERSION=5:0:0 - -dnl Use C++ for tests. -AC_LANG_CPLUSPLUS - -dnl Enable inlining. -AC_ARG_ENABLE(inline, -[ --enable-inline enable inlining of functions [default=yes]]) -AC_ARG_ENABLE(sse, -[ --enable-sse enable the use of SSE [default=yes]]) - -if test "$enable_inline" != no; then - RESID_INLINE=inline -else - RESID_INLINE= -fi - -AC_SUBST(RESID_INLINE) - -dnl Checks for programs. -AC_PROG_CXX - -dnl Set CXXFLAGS for g++. Use -msse if supported. -if test x"$enable_sse" != "xno"; then - if test "$GXX" = yes; then - if test "$ac_test_CXXFLAGS" != set; then - CXXFLAGS="-g -Wall -O2 -msse" - AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works]) - AC_TRY_COMPILE([], - [int test;], - [ AC_MSG_RESULT(yes) - MSSE="-msse" - ], - [ AC_MSG_RESULT(no) - MSSE="" - ]) - fi - fi -else - MSSE="" -fi - -dnl Set CXXFLAGS for g++. Use -fno-exceptions if supported. -if test "$GXX" = yes; then - if test "$ac_test_CXXFLAGS" != set; then - CXXFLAGS="-g -Wall -O2 $MSSE -fno-exceptions" - AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works]) - AC_TRY_COMPILE([], - [int test;], - [ AC_MSG_RESULT(yes) - NO_EXCEPTIONS="-fno-exceptions" ], - [ AC_MSG_RESULT(no) - NO_EXCEPTIONS="" - ]) - fi -fi - -dnl Set CXXFLAGS for g++. Use -fno-pic if supported. -if test "$GXX" = yes; then - if test "$ac_test_CXXFLAGS" != set; then - CXXFLAGS="-g -Wall -O2 $MSSE -fno-exceptions $NO_EXCEPTIONS -fno-pic" - AC_MSG_CHECKING([whether the C++ compiler ($CXX $CXXFLAGS $LDFLAGS) works]) - AC_TRY_COMPILE([], - [int test;], - [ AC_MSG_RESULT(yes) - NO_PIC="-fno-pic" ], - [ AC_MSG_RESULT(no) - NO_PIC="" - ]) - fi -fi - -CXXFLAGS="-g -Wall -O2 $MSSE $NO_EXCEPTIONS $NO_PIC" -if test x"$MSSE" = "x-msse"; then - AC_MSG_CHECKING([if the xmmintrin.h include can be used]) - AC_TRY_COMPILE([#include ], - [int test;], - [ AC_MSG_RESULT(yes) - ], - [ AC_MSG_RESULT(no) - MSSE="" - ]) - CXXFLAGS="-g -Wall -O2 $NO_EXCEPTIONS $NO_PIC" -fi - -AC_CHECK_PROG(AR, ar, ar, ar) -AC_PROG_RANLIB -AC_PATH_PROG(PERL, perl) - -dnl Libtool - -dnl AC_DISABLE_SHARED -dnl AM_PROG_LIBTOOL -dnl AC_SUBST(LIBTOOL_DEPS) -dnl AC_SUBST(LTVERSION) - -dnl Checks for libraries. - -dnl Checks for header files. - -dnl Checks for typedefs, structures, and compiler characteristics. -AC_CHECK_SIZEOF(int, 4) - -if test $ac_cv_sizeof_int -lt 4; then - AC_MSG_ERROR([only 32 bit or better CPUs are supported]) -fi - -AC_CACHE_CHECK([for working bool], ac_cv_cxx_bool, -[AC_TRY_COMPILE(, -[ -bool flag; -], -ac_cv_cxx_bool=yes, ac_cv_cxx_bool=no)]) - -if test $ac_cv_cxx_bool = no; then - RESID_HAVE_BOOL=0 -else - RESID_HAVE_BOOL=1 -fi - -if test x"$MSSE" = "x-msse"; then - RESID_USE_SSE=1 - AM_CONDITIONAL(USE_SSE, true) -else - RESID_USE_SSE=0 - AM_CONDITIONAL(USE_SSE, false) -fi - -AC_SUBST(RESID_HAVE_BOOL) -AC_SUBST(RESID_USE_SSE) - -dnl Checks for library functions. - -AC_CHECK_FUNCS(logf expf) - -AC_MSG_CHECKING([if the logf prototype is present]) -AC_TRY_COMPILE([#include - #include ], - [printf("%d",logf);], - [ AC_MSG_RESULT(yes) - HAVE_LOGF_PROTOTYPE=1 - ], - [ AC_MSG_RESULT(no) - HAVE_LOGF_PROTOTYPE=0 - ]) - -AC_MSG_CHECKING([if the expf prototype is present]) -AC_TRY_COMPILE([#include - #include ], - [printf("%d",expf);], - [ AC_MSG_RESULT(yes) - HAVE_EXPF_PROTOTYPE=1 - ], - [ AC_MSG_RESULT(no) - HAVE_EXPF_PROTOTYPE=0 - ]) - -AC_SUBST(HAVE_LOGF_PROTOTYPE) -AC_SUBST(HAVE_EXPF_PROTOTYPE) - -AC_OUTPUT(Makefile siddefs-fp.h) diff --git a/src/sound/resid-fp/convolve-sse.cc b/src/sound/resid-fp/convolve-sse.cc deleted file mode 100644 index daf3979f2..000000000 --- a/src/sound/resid-fp/convolve-sse.cc +++ /dev/null @@ -1,76 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- -#include -#include "sid.h" - -#if (RESID_USE_SSE==1) - -#include - -float convolve_sse(const float *a, const float *b, int n) -{ - float out = 0.f; - __m128 out4 = { 0, 0, 0, 0 }; - - /* examine if we can use aligned loads on both pointers */ - int diff = (int) (a - b) & 0xf; - /* long cast is no-op for x86-32, but x86-64 gcc needs 64 bit intermediate - * to convince compiler we mean this. */ - unsigned int a_align = (unsigned int) (uintptr_t) a & 0xf; - - /* advance if necessary. We can't let n fall < 0, so no while (n --). */ - while (n > 0 && a_align != 0 && a_align != 16) { - out += (*(a ++)) * (*(b ++)); - --n; - a_align += 4; - } - - int n4 = n / 4; - if (diff == 0) { - for (int i = 0; i < n4; i ++) { - out4 = _mm_add_ps(out4, _mm_mul_ps(_mm_load_ps(a), _mm_load_ps(b))); - a += 4; - b += 4; - } - } else { - /* XXX loadu is 4x slower than load, at least. We could at 4x memory - * use prepare versions of b aligned for any a alignment. We could - * also issue aligned loads and shuffle the halves at each iteration. - * Initial results indicate only very small improvements. */ - for (int i = 0; i < n4; i ++) { - out4 = _mm_add_ps(out4, _mm_mul_ps(_mm_load_ps(a), _mm_loadu_ps(b))); - a += 4; - b += 4; - } - } - - out4 = _mm_add_ps(_mm_movehl_ps(out4, out4), out4); - out4 = _mm_add_ss(_mm_shuffle_ps(out4, out4, 1), out4); - float out_tmp; - _mm_store_ss(&out_tmp, out4); - out += out_tmp; - - n &= 3; - - while (n --) - out += (*(a ++)) * (*(b ++)); - - return out; -} -#endif diff --git a/src/sound/resid-fp/convolve.cc b/src/sound/resid-fp/convolve.cc deleted file mode 100644 index b028ace86..000000000 --- a/src/sound/resid-fp/convolve.cc +++ /dev/null @@ -1,27 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -float convolve(const float *a, const float *b, int n) -{ - float out = 0.f; - while (n --) - out += (*(a ++)) * (*(b ++)); - return out; -} - diff --git a/src/sound/resid-fp/envelope.cc b/src/sound/resid-fp/envelope.cc deleted file mode 100644 index 5417adc43..000000000 --- a/src/sound/resid-fp/envelope.cc +++ /dev/null @@ -1,254 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __ENVELOPE_CC__ -#include "envelope.h" - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -EnvelopeGeneratorFP::EnvelopeGeneratorFP() -{ - reset(); -} - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void EnvelopeGeneratorFP::reset() -{ - envelope_counter = 0; - - attack = 0; - decay = 0; - sustain = 0; - release = 0; - - gate = 0; - - rate_counter = 0; - exponential_counter = 0; - exponential_counter_period = 1; - - state = RELEASE; - rate_period = rate_counter_period[release]; - hold_zero = true; -} - - -// Rate counter periods are calculated from the Envelope Rates table in -// the Programmer's Reference Guide. The rate counter period is the number of -// cycles between each increment of the envelope counter. -// The rates have been verified by sampling ENV3. -// -// The rate counter is a 16 bit register which is incremented each cycle. -// When the counter reaches a specific comparison value, the envelope counter -// is incremented (attack) or decremented (decay/release) and the -// counter is zeroed. -// -// NB! Sampling ENV3 shows that the calculated values are not exact. -// It may seem like most calculated values have been rounded (.5 is rounded -// down) and 1 has beed added to the result. A possible explanation for this -// is that the SID designers have used the calculated values directly -// as rate counter comparison values, not considering a one cycle delay to -// zero the counter. This would yield an actual period of comparison value + 1. -// -// The time of the first envelope count can not be exactly controlled, except -// possibly by resetting the chip. Because of this we cannot do cycle exact -// sampling and must devise another method to calculate the rate counter -// periods. -// -// The exact rate counter periods can be determined e.g. by counting the number -// of cycles from envelope level 1 to envelope level 129, and dividing the -// number of cycles by 128. CIA1 timer A and B in linked mode can perform -// the cycle count. This is the method used to find the rates below. -// -// To avoid the ADSR delay bug, sampling of ENV3 should be done using -// sustain = release = 0. This ensures that the attack state will not lower -// the current rate counter period. -// -// The ENV3 sampling code below yields a maximum timing error of 14 cycles. -// lda #$01 -// l1: cmp $d41c -// bne l1 -// ... -// lda #$ff -// l2: cmp $d41c -// bne l2 -// -// This yields a maximum error for the calculated rate period of 14/128 cycles. -// The described method is thus sufficient for exact calculation of the rate -// periods. -// -reg16 EnvelopeGeneratorFP::rate_counter_period[] = { - 9, // 2ms*1.0MHz/256 = 7.81 - 32, // 8ms*1.0MHz/256 = 31.25 - 63, // 16ms*1.0MHz/256 = 62.50 - 95, // 24ms*1.0MHz/256 = 93.75 - 149, // 38ms*1.0MHz/256 = 148.44 - 220, // 56ms*1.0MHz/256 = 218.75 - 267, // 68ms*1.0MHz/256 = 265.63 - 313, // 80ms*1.0MHz/256 = 312.50 - 392, // 100ms*1.0MHz/256 = 390.63 - 977, // 250ms*1.0MHz/256 = 976.56 - 1954, // 500ms*1.0MHz/256 = 1953.13 - 3126, // 800ms*1.0MHz/256 = 3125.00 - 3907, // 1 s*1.0MHz/256 = 3906.25 - 11720, // 3 s*1.0MHz/256 = 11718.75 - 19532, // 5 s*1.0MHz/256 = 19531.25 - 31251 // 8 s*1.0MHz/256 = 31250.00 -}; - - -// For decay and release, the clock to the envelope counter is sequentially -// divided by 1, 2, 4, 8, 16, 30, 1 to create a piece-wise linear approximation -// of an exponential. The exponential counter period is loaded at the envelope -// counter values 255, 93, 54, 26, 14, 6, 0. The period can be different for the -// same envelope counter value, depending on whether the envelope has been -// rising (attack -> release) or sinking (decay/release). -// -// Since it is not possible to reset the rate counter (the test bit has no -// influence on the envelope generator whatsoever) a method must be devised to -// do cycle exact sampling of ENV3 to do the investigation. This is possible -// with knowledge of the rate period for A=0, found above. -// -// The CPU can be synchronized with ENV3 by first synchronizing with the rate -// counter by setting A=0 and wait in a carefully timed loop for the envelope -// counter _not_ to change for 9 cycles. We can then wait for a specific value -// of ENV3 with another timed loop to fully synchronize with ENV3. -// -// At the first period when an exponential counter period larger than one -// is used (decay or relase), one extra cycle is spent before the envelope is -// decremented. The envelope output is then delayed one cycle until the state -// is changed to attack. Now one cycle less will be spent before the envelope -// is incremented, and the situation is normalized. -// The delay is probably caused by the comparison with the exponential counter, -// and does not seem to affect the rate counter. This has been verified by -// timing 256 consecutive complete envelopes with A = D = R = 1, S = 0, using -// CIA1 timer A and B in linked mode. If the rate counter is not affected the -// period of each complete envelope is -// (255 + 162*1 + 39*2 + 28*4 + 12*8 + 8*16 + 6*30)*32 = 756*32 = 32352 -// which corresponds exactly to the timed value divided by the number of -// complete envelopes. -// NB! This one cycle delay is not modeled. - - -// From the sustain levels it follows that both the low and high 4 bits of the -// envelope counter are compared to the 4-bit sustain value. -// This has been verified by sampling ENV3. -// -reg8 EnvelopeGeneratorFP::sustain_level[] = { - 0x00, - 0x11, - 0x22, - 0x33, - 0x44, - 0x55, - 0x66, - 0x77, - 0x88, - 0x99, - 0xaa, - 0xbb, - 0xcc, - 0xdd, - 0xee, - 0xff, -}; - - -// ---------------------------------------------------------------------------- -// Register functions. -// ---------------------------------------------------------------------------- -void EnvelopeGeneratorFP::writeCONTROL_REG(reg8 control) -{ - reg8 gate_next = control & 0x01; - - // The rate counter is never reset, thus there will be a delay before the - // envelope counter starts counting up (attack) or down (release). - - // Gate bit on: Start attack, decay, sustain. - if (!gate && gate_next) { - state = ATTACK; - update_rate_period(rate_counter_period[attack]); - - // Switching to attack state unlocks the zero freeze. - hold_zero = false; - } - // Gate bit off: Start release. - else if (gate && !gate_next) { - state = RELEASE; - update_rate_period(rate_counter_period[release]); - } - - gate = gate_next; -} - -void EnvelopeGeneratorFP::writeATTACK_DECAY(reg8 attack_decay) -{ - attack = (attack_decay >> 4) & 0x0f; - decay = attack_decay & 0x0f; - if (state == ATTACK) { - update_rate_period(rate_counter_period[attack]); - } - else if (state == DECAY_SUSTAIN) { - update_rate_period(rate_counter_period[decay]); - } -} - -void EnvelopeGeneratorFP::writeSUSTAIN_RELEASE(reg8 sustain_release) -{ - sustain = (sustain_release >> 4) & 0x0f; - release = sustain_release & 0x0f; - if (state == RELEASE) { - update_rate_period(rate_counter_period[release]); - } -} - -reg8 EnvelopeGeneratorFP::readENV() -{ - return output(); -} - -void EnvelopeGeneratorFP::update_rate_period(reg16 newperiod) -{ - rate_period = newperiod; - - /* The ADSR counter is XOR shift register with 0x7fff unique values. - * If the rate_period is adjusted to a value already seen in this cycle, - * the register will wrap around. This is known as the ADSR delay bug. - * - * To simplify the hot path calculation, we simulate this through observing - * that we add the 0x7fff cycle delay by changing the rate_counter variable - * directly. This takes care of the 99 % common case. However, playroutine - * could make multiple consequtive rate_period adjustments, in which case we - * need to cancel the previous adjustment. */ - - /* if the new period exeecds 0x7fff, we need to wrap */ - if (rate_period - rate_counter > 0x7fff) - rate_counter += 0x7fff; - - /* simulate 0x7fff wraparound, if the period-to-be-written - * is less than the current value. */ - if (rate_period <= rate_counter) - rate_counter -= 0x7fff; - - /* at this point it should be impossible for - * rate_counter >= rate_period. If it is, there is a bug... */ -} diff --git a/src/sound/resid-fp/envelope.h b/src/sound/resid-fp/envelope.h deleted file mode 100644 index af0764ccd..000000000 --- a/src/sound/resid-fp/envelope.h +++ /dev/null @@ -1,174 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __ENVELOPE_H__ -#define __ENVELOPE_H__ - -#include "siddefs-fp.h" - -// ---------------------------------------------------------------------------- -// A 15 bit counter is used to implement the envelope rates, in effect -// dividing the clock to the envelope counter by the currently selected rate -// period. -// In addition, another counter is used to implement the exponential envelope -// decay, in effect further dividing the clock to the envelope counter. -// The period of this counter is set to 1, 2, 4, 8, 16, 30 at the envelope -// counter values 255, 93, 54, 26, 14, 6, respectively. -// ---------------------------------------------------------------------------- -class EnvelopeGeneratorFP -{ -public: - EnvelopeGeneratorFP(); - - enum State { ATTACK, DECAY_SUSTAIN, RELEASE }; - - RESID_INLINE void clock(); - void reset(); - - void writeCONTROL_REG(reg8); - void writeATTACK_DECAY(reg8); - void writeSUSTAIN_RELEASE(reg8); - reg8 readENV(); - - // 8-bit envelope output. - RESID_INLINE reg8 output(); - -protected: - void update_rate_period(reg16 period); - - int rate_counter; - int rate_period; - reg8 exponential_counter; - reg8 exponential_counter_period; - reg8 envelope_counter; - bool hold_zero; - - reg4 attack; - reg4 decay; - reg4 sustain; - reg4 release; - - reg8 gate; - - State state; - - // Lookup table to convert from attack, decay, or release value to rate - // counter period. - static reg16 rate_counter_period[]; - - // The 16 selectable sustain levels. - static reg8 sustain_level[]; - -friend class SIDFP; -}; - - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -RESID_INLINE -void EnvelopeGeneratorFP::clock() -{ - if (++ rate_counter != rate_period) - return; - - rate_counter = 0; - - // The first envelope step in the attack state also resets the exponential - // counter. This has been verified by sampling ENV3. - // - if (state == ATTACK || ++exponential_counter == exponential_counter_period) - { - exponential_counter = 0; - - // Check whether the envelope counter is frozen at zero. - if (hold_zero) { - return; - } - - switch (state) { - case ATTACK: - // The envelope counter can flip from 0xff to 0x00 by changing state to - // release, then to attack. The envelope counter is then frozen at - // zero; to unlock this situation the state must be changed to release, - // then to attack. This has been verified by sampling ENV3. - // - ++envelope_counter &= 0xff; - if (envelope_counter == 0xff) { - state = DECAY_SUSTAIN; - update_rate_period(rate_counter_period[decay]); - } - break; - case DECAY_SUSTAIN: - if (envelope_counter != sustain_level[sustain]) { - --envelope_counter; - } - break; - case RELEASE: - // The envelope counter can flip from 0x00 to 0xff by changing state to - // attack, then to release. The envelope counter will then continue - // counting down in the release state. - // This has been verified by sampling ENV3. - // NB! The operation below requires two's complement integer. - // - --envelope_counter &= 0xff; - break; - } - - // Check for change of exponential counter period. - switch (envelope_counter) { - case 0xff: - exponential_counter_period = 1; - break; - case 0x5d: - exponential_counter_period = 2; - break; - case 0x36: - exponential_counter_period = 4; - break; - case 0x1a: - exponential_counter_period = 8; - break; - case 0x0e: - exponential_counter_period = 16; - break; - case 0x06: - exponential_counter_period = 30; - break; - case 0x00: - exponential_counter_period = 1; - - // When the envelope counter is changed to zero, it is frozen at zero. - // This has been verified by sampling ENV3. - hold_zero = true; - break; - } - } -} - -// ---------------------------------------------------------------------------- -// Read the envelope generator output. -// ---------------------------------------------------------------------------- -RESID_INLINE -reg8 EnvelopeGeneratorFP::output() -{ - return envelope_counter; -} - -#endif // not __ENVELOPE_H__ diff --git a/src/sound/resid-fp/extfilt.cc b/src/sound/resid-fp/extfilt.cc deleted file mode 100644 index 777a23ee3..000000000 --- a/src/sound/resid-fp/extfilt.cc +++ /dev/null @@ -1,94 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __EXTFILT_CC__ -#include "extfilt.h" - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -ExternalFilterFP::ExternalFilterFP() -{ - reset(); - enable_filter(true); - set_chip_model(MOS6581FP); - set_clock_frequency(1e6f); - set_sampling_parameter(15915.6f); -} - - -// ---------------------------------------------------------------------------- -// Enable filter. -// ---------------------------------------------------------------------------- -void ExternalFilterFP::enable_filter(bool enable) -{ - enabled = enable; -} - -// ---------------------------------------------------------------------------- -// Setup of the external filter sampling parameters. -// ---------------------------------------------------------------------------- -void ExternalFilterFP::set_clock_frequency(float clock) -{ - clock_frequency = clock; - _set_sampling_parameter(); -} - -void ExternalFilterFP::set_sampling_parameter(float freq) -{ - pass_frequency = freq; - _set_sampling_parameter(); -} - -void ExternalFilterFP::_set_sampling_parameter() -{ - // Low-pass: R = 10kOhm, C = 1000pF; w0l = 1/RC = 1/(1e4*1e-9) = 100000 - // High-pass: R = 1kOhm, C = 10uF; w0h = 1/RC = 1/(1e3*1e-5) = 100 - w0hp = 100.f / clock_frequency; - w0lp = pass_frequency * 2.f * M_PI_f / clock_frequency; -} - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void ExternalFilterFP::set_chip_model(chip_model model) -{ - if (model == MOS6581FP) { - // Approximate the DC output level to be removed if the external - // filter is turned off. (0x800 - wave_zero + voice DC) * maxenv * voices - // - extin offset... - mixer_DC = (-0x600 + 0x800) * 0xff * 3 - 0x20000; - } - else { - // No DC offsets in the MOS8580. - mixer_DC = 0; - } -} - - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void ExternalFilterFP::reset() -{ - // State of filter. - Vlp = 0; - Vhp = 0; - Vo = 0; -} diff --git a/src/sound/resid-fp/extfilt.h b/src/sound/resid-fp/extfilt.h deleted file mode 100644 index b0e04d3b8..000000000 --- a/src/sound/resid-fp/extfilt.h +++ /dev/null @@ -1,120 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __EXTFILT_H__ -#define __EXTFILT_H__ - -#include - -#include "siddefs-fp.h" - -// ---------------------------------------------------------------------------- -// The audio output stage in a Commodore 64 consists of two STC networks, -// a low-pass filter with 3-dB frequency 16kHz followed by a high-pass -// filter with 3-dB frequency 16Hz (the latter provided an audio equipment -// input impedance of 1kOhm). -// The STC networks are connected with a BJT supposedly meant to act as -// a unity gain buffer, which is not really how it works. A more elaborate -// model would include the BJT, however DC circuit analysis yields BJT -// base-emitter and emitter-base impedances sufficiently low to produce -// additional low-pass and high-pass 3dB-frequencies in the order of hundreds -// of kHz. This calls for a sampling frequency of several MHz, which is far -// too high for practical use. -// ---------------------------------------------------------------------------- -class ExternalFilterFP -{ -public: - ExternalFilterFP(); - - void enable_filter(bool enable); - void set_sampling_parameter(float pass_freq); - void set_chip_model(chip_model model); - void set_clock_frequency(float); - - RESID_INLINE void clock(float Vi); - void reset(); - - // Audio output (20 bits). - RESID_INLINE float output(); - -private: - void _set_sampling_parameter(); - void nuke_denormals(); - - // Filter enabled. - bool enabled; - - // Maximum mixer DC offset. - float mixer_DC; - - // Relevant clocks - float clock_frequency, pass_frequency; - - // State of filters. - float Vlp; // lowpass - float Vhp; // highpass - float Vo; - - // Cutoff frequencies. - float w0lp; - float w0hp; - -friend class SIDFP; -}; - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -RESID_INLINE -void ExternalFilterFP::clock(float Vi) -{ - // This is handy for testing. - if (! enabled) { - // Remove maximum DC level since there is no filter to do it. - Vlp = Vhp = 0.f; - Vo = Vi - mixer_DC; - return; - } - - float dVlp = w0lp * (Vi - Vlp); - float dVhp = w0hp * (Vlp - Vhp); - Vo = Vlp - Vhp; - Vlp += dVlp; - Vhp += dVhp; -} - -// ---------------------------------------------------------------------------- -// Audio output (19.5 bits). -// ---------------------------------------------------------------------------- -RESID_INLINE -float ExternalFilterFP::output() -{ - return Vo; -} - -RESID_INLINE -void ExternalFilterFP::nuke_denormals() -{ - if (Vhp > -1e-12f && Vhp < 1e-12f) - Vhp = 0; - if (Vlp > -1e-12f && Vlp < 1e-12f) - Vlp = 0; -} - -#endif // not __EXTFILT_H__ diff --git a/src/sound/resid-fp/filter.cc b/src/sound/resid-fp/filter.cc deleted file mode 100644 index c327fadec..000000000 --- a/src/sound/resid-fp/filter.cc +++ /dev/null @@ -1,194 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- -// Filter distortion code written by Antti S. Lankila 2007 - 2008. - -#define __FILTER_CC__ -#include "filter.h" -#include "sid.h" - -#ifndef HAVE_LOGF_PROTOTYPE -extern float logf(float val); -#endif - -#ifndef HAVE_EXPF_PROTOTYPE -extern float expf(float val); -#endif - -#ifndef HAVE_LOGF -float logf(float val) -{ - return (float)log((double)val); -} -#endif - -#ifndef HAVE_EXPF -float expf(float val) -{ - return (float)exp((double)val); -} -#endif - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -FilterFP::FilterFP() -{ - model = (chip_model) 0; // neither 6581/8580; init time only - enable_filter(true); - /* approximate; sid.cc calls us when set_sampling_parameters() occurs. */ - set_clock_frequency(1e6f); - /* these parameters are a work-in-progress. */ - set_distortion_properties(2.5e-3f, 1536.f, 1e-4f); - /* sound similar to alankila6581r4ar3789 */ - set_type3_properties(1.40e6f, 1.47e8f, 1.0059f, 1.55e4f); - /* sound similar to trurl8580r5_3691 */ - set_type4_properties(6.55f, 20.f); - reset(); - set_chip_model(MOS6581FP); -} - - -// ---------------------------------------------------------------------------- -// Enable filter. -// ---------------------------------------------------------------------------- -void FilterFP::enable_filter(bool enable) -{ - enabled = enable; -} - - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void FilterFP::set_chip_model(chip_model model) -{ - this->model = model; - set_Q(); - set_w0(); -} - -/* dist_CT eliminates 1/x at hot spot */ -void FilterFP::set_clock_frequency(float clock) { - clock_frequency = clock; - calculate_helpers(); -} - -void FilterFP::set_distortion_properties(float r, float p, float cft) -{ - distortion_rate = r; - distortion_point = p; - /* baseresistance is used to determine material resistivity later */ - distortion_cf_threshold = cft; - calculate_helpers(); -} - -void FilterFP::set_type4_properties(float k, float b) -{ - type4_k = k; - type4_b = b; -} - -void FilterFP::set_type3_properties(float br, float o, float s, float mfr) -{ - type3_baseresistance = br; - type3_offset = o; - type3_steepness = -logf(s); /* s^x to e^(x*ln(s)), 1/e^x == e^-x. */ - type3_minimumfetresistance = mfr; -} - -void FilterFP::calculate_helpers() -{ - if (clock_frequency != 0.f) - distortion_CT = 1.f / (sidcaps_6581 * clock_frequency); - set_w0(); -} - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void FilterFP::reset() -{ - fc = 0; - res = filt = voice3off = hp_bp_lp = 0; - vol = 0; - volf = Vhp = Vbp = Vlp = 0; - set_w0(); - set_Q(); -} - -// ---------------------------------------------------------------------------- -// Register functions. -// ---------------------------------------------------------------------------- -void FilterFP::writeFC_LO(reg8 fc_lo) -{ - fc = (fc & 0x7f8) | (fc_lo & 0x007); - set_w0(); -} - -void FilterFP::writeFC_HI(reg8 fc_hi) -{ - fc = ((fc_hi << 3) & 0x7f8) | (fc & 0x007); - set_w0(); -} - -void FilterFP::writeRES_FILT(reg8 res_filt) -{ - res = (res_filt >> 4) & 0x0f; - set_Q(); - - filt = res_filt & 0x0f; -} - -void FilterFP::writeMODE_VOL(reg8 mode_vol) -{ - voice3off = mode_vol & 0x80; - - hp_bp_lp = (mode_vol >> 4) & 0x07; - - vol = mode_vol & 0x0f; - volf = (float) vol / 15.f; -} - -// Set filter cutoff frequency. -void FilterFP::set_w0() -{ - if (model == MOS6581FP) { - /* div once by extra kinkiness because I fitted the type3 eq with that variant. */ - float type3_fc_kink = SIDFP::kinked_dac(fc, kinkiness, 11) / kinkiness; - type3_fc_kink_exp = type3_offset * expf(type3_fc_kink * type3_steepness); - if (distortion_rate != 0.f) { - type3_fc_distortion_offset_hp = (distortion_point - type3_fc_kink) * (0.5f) / distortion_rate; - type3_fc_distortion_offset_bp = type3_fc_distortion_offset_hp; - } - else { - type3_fc_distortion_offset_bp = 9e9f; - type3_fc_distortion_offset_hp = 9e9f; - } - } - if (model == MOS8580FP) { - type4_w0_cache = type4_w0(); - } -} - -// Set filter resonance. -void FilterFP::set_Q() -{ - float Q = res / 15.f; - _1_div_Q = 1.f / (0.707f + Q * 1.5f); -} diff --git a/src/sound/resid-fp/filter.h b/src/sound/resid-fp/filter.h deleted file mode 100644 index 9ca254564..000000000 --- a/src/sound/resid-fp/filter.h +++ /dev/null @@ -1,383 +0,0 @@ -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- -// Filter distortion code written by Antti S. Lankila 2007 - 2008. - -#ifndef __FILTER_H__ -#define __FILTER_H__ - -#include -#include "siddefs-fp.h" - -// ---------------------------------------------------------------------------- -// The SID filter is modeled with a two-integrator-loop biquadratic filter, -// which has been confirmed by Bob Yannes to be the actual circuit used in -// the SID chip. -// -// Measurements show that excellent emulation of the SID filter is achieved, -// except when high resonance is combined with high sustain levels. -// In this case the SID op-amps are performing less than ideally and are -// causing some peculiar behavior of the SID filter. This however seems to -// have more effect on the overall amplitude than on the color of the sound. -// -// The theory for the filter circuit can be found in "Microelectric Circuits" -// by Adel S. Sedra and Kenneth C. Smith. -// The circuit is modeled based on the explanation found there except that -// an additional inverter is used in the feedback from the bandpass output, -// allowing the summer op-amp to operate in single-ended mode. This yields -// inverted filter outputs with levels independent of Q, which corresponds with -// the results obtained from a real SID. -// -// We have been able to model the summer and the two integrators of the circuit -// to form components of an IIR filter. -// Vhp is the output of the summer, Vbp is the output of the first integrator, -// and Vlp is the output of the second integrator in the filter circuit. -// -// According to Bob Yannes, the active stages of the SID filter are not really -// op-amps. Rather, simple NMOS inverters are used. By biasing an inverter -// into its region of quasi-linear operation using a feedback resistor from -// input to output, a MOS inverter can be made to act like an op-amp for -// small signals centered around the switching threshold. -// -// Qualified guesses at SID filter schematics are depicted below. -// -// SID filter -// ---------- -// -// ----------------------------------------------- -// | | -// | ---Rq-- | -// | | | | -// | --------------|--R-----[A>--|--R-----[A>--| -// | | | | -// vi -----R1-- | | | -// -// vhp vbp vlp -// -// -// vi - input voltage -// vhp - highpass output -// vbp - bandpass output -// vlp - lowpass output -// [A> - op-amp -// R1 - summer resistor -// Rq - resistor array controlling resonance (4 resistors) -// R - NMOS FET voltage controlled resistor controlling cutoff frequency -// Rs - shunt resitor -// C - capacitor -// -// -// -// SID integrator -// -------------- -// -// V+ -// -// | -// | -// -----| -// | | -// | ||-- -// -|| -// ---C--- ||-> -// | | | -// |---Rs-----------|---- vo -// | | -// | ||-- -// vi ---- -----|------------|| -// | ^ | ||-> -// |___| | | -// ----- | | -// | | | -// |---R2-- | -// | -// R1 V- -// | -// | -// -// Vw -// -// ---------------------------------------------------------------------------- -class FilterFP -{ -public: - FilterFP(); - - void enable_filter(bool enable); - void set_chip_model(chip_model model); - void set_distortion_properties(float, float, float); - void set_type3_properties(float, float, float, float); - void set_type4_properties(float, float); - void set_clock_frequency(float); - - RESID_INLINE - float clock(float voice1, float voice2, float voice3, - float ext_in); - void reset(); - - // Write registers. - void writeFC_LO(reg8); - void writeFC_HI(reg8); - void writeRES_FILT(reg8); - void writeMODE_VOL(reg8); - -private: - void set_Q(); - void set_w0(); - float type3_w0(const float source, const float offset); - float type4_w0(); - void calculate_helpers(); - void nuke_denormals(); - - // Filter enabled. - bool enabled; - - // 6581/8580 filter model (XXX: we should specialize in separate classes) - chip_model model; - - // Filter cutoff frequency. - reg12 fc; - - // Filter resonance. - reg8 res; - - // Selects which inputs to route through filter. - reg8 filt; - - // Switch voice 3 off. - reg8 voice3off; - - // Highpass, bandpass, and lowpass filter modes. - reg8 hp_bp_lp; - - // Output master volume. - reg4 vol; - float volf; /* avoid integer-to-float conversion at output */ - - // clock - float clock_frequency; - - /* Distortion params for Type3 */ - float distortion_rate, distortion_point, distortion_cf_threshold; - - /* Type3 params. */ - float type3_baseresistance, type3_offset, type3_steepness, type3_minimumfetresistance; - - /* Type4 params */ - float type4_k, type4_b; - - // State of filter. - float Vhp, Vbp, Vlp; - - /* Resonance/Distortion/Type3/Type4 helpers. */ - float type4_w0_cache, _1_div_Q, type3_fc_kink_exp, distortion_CT, - type3_fc_distortion_offset_bp, type3_fc_distortion_offset_hp; - -friend class SIDFP; -}; - -// ---------------------------------------------------------------------------- -// Inline functions. -// The following functions are defined inline because they are called every -// time a sample is calculated. -// ---------------------------------------------------------------------------- - -/* kinkiness of DAC: - * some chips have more, some less. We should make this tunable. */ -const float kinkiness = 0.966f; -const float sidcaps_6581 = 470e-12f; -const float outputleveldifference_lp_bp = 1.4f; -const float outputleveldifference_bp_hp = 1.2f; - -RESID_INLINE -static float fastexp(float val) { - typedef union { - int i; - float f; - } conv; - - conv tmp; - - /* single precision fp has 1 + 8 + 23 bits, exponent bias is 127. - * It therefore follows that we need to shift left by 23 bits, and to - * calculate exp(x) instead of pow(2, x) we divide the power by ln(2). */ - const float a = (1 << 23) / M_LN2_f; - /* The other factor corrects for the exponent bias so that 2^0 = 1. */ - const float b = (1 << 23) * 127; - /* According to "A Fast, Compact Approximation of the Exponential Function" - * by Nicol N. Schraudolph, 60801.48 yields the minimum RMS error for the - * piecewise-linear approximation when using doubles (20 bits residual). - * We have 23 bits, so we scale this value by 8. */ - const float c = 60801.48f * 8.f + 0.5f; - - /* Parenthesis are important: C standard disallows folding subtraction. - * Unfortunately GCC appears to generate a write to memory rather than - * handle this conversion entirely in registers. */ - tmp.i = (int)(a * val + (b - c)); - return tmp.f; -} - -RESID_INLINE -float FilterFP::type3_w0(const float source, const float distoffset) -{ - /* The distortion appears to be the result of MOSFET entering saturation - * mode. The conductance of a FET is proportional to: - * - * ohmic = 2 * (Vgs - Vt) * Vds - Vds^2 - * saturation = (Vgs - Vt)^2 - * - * The FET switches to saturation mode when Vgs - Vt < Vds. - * - * In the circuit, the Vgs is mixed with the Vds signal, which gives - * (Vgs + Vds) / 2 as the gate voltage. Doing the substitutions we get: - * - * ohmic = 2 * ((Vgs + Vds) / 2 - Vt) * Vds - Vds^2 = (Vgs - Vt) * Vds - * saturation = ((Vgs + Vds) / 2 - Vt)^2 - * - * Therefore: once the Vds crosses a threshold given by the gate and - * threshold FET conductance begins to increase faster. The exact shape - * for this effect is a parabola. - * - * The scaling term here tries to match the FC control level with - * the signal level in simulation. On the chip, the FC control is - * biased by forcing its highest DAC bit in the 1 position, thus - * limiting the electrical range to half. Therefore one can guess that - * the real FC range is half of the full voice range. - * - * On the simulation, FC goes to 2047 and the voices to 4095 * 255. - * If the FC control was intact, then the scaling factor would be - * 1/512. (Simulation voices are 512 times "louder" intrinsically.) - * As the real chip's FC has reduced range, the scaling required to - * match levels is 1/256. */ - - float fetresistance = type3_fc_kink_exp; - if (source > distoffset) { - const float dist = source - distoffset; - fetresistance *= fastexp(dist * type3_steepness * distortion_rate); - } - const float dynamic_resistance = type3_minimumfetresistance + fetresistance; - - /* 2 parallel resistors */ - const float _1_div_resistance = (type3_baseresistance + dynamic_resistance) / (type3_baseresistance * dynamic_resistance); - /* 1.f / (clock * caps * resistance) */ - return distortion_CT * _1_div_resistance; -} - -RESID_INLINE -float FilterFP::type4_w0() -{ - const float freq = type4_k * fc + type4_b; - return 2.f * M_PI_f * freq / clock_frequency; -} - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -RESID_INLINE -float FilterFP::clock(float voice1, - float voice2, - float voice3, - float ext_in) -{ - /* Avoid denormal numbers by using small offsets from 0 */ - float Vi = 0.f, Vnf = 0.f, Vf = 0.f; - - // Route voices into or around filter. - ((filt & 1) ? Vi : Vnf) += voice1; - ((filt & 2) ? Vi : Vnf) += voice2; - // NB! Voice 3 is not silenced by voice3off if it is routed through - // the filter. - if (filt & 4) - Vi += voice3; - else if (! voice3off) - Vnf += voice3; - ((filt & 8) ? Vi : Vnf) += ext_in; - - if (! enabled) - return (Vnf - Vi) * volf; - - if (hp_bp_lp & 1) - Vf += Vlp; - if (hp_bp_lp & 2) - Vf += Vbp; - if (hp_bp_lp & 4) - Vf += Vhp; - - if (model == MOS6581FP) { - float diff1, diff2; - - Vhp = Vbp * _1_div_Q * (1.f/outputleveldifference_bp_hp) - Vlp * (1.f/outputleveldifference_bp_hp) - Vi * 0.5f; - - /* the input summer mixing, or something like it... */ - diff1 = (Vlp - Vbp) * distortion_cf_threshold; - diff2 = (Vhp - Vbp) * distortion_cf_threshold; - Vlp -= diff1; - Vbp += diff1; - Vbp += diff2; - Vhp -= diff2; - - /* Model output strip mixing. Doing it now that HP state - * variable modifying still makes some difference. - * (Phase error, though.) */ - if (hp_bp_lp & 1) - Vlp += (Vf + Vnf - Vlp) * distortion_cf_threshold; - if (hp_bp_lp & 2) - Vbp += (Vf + Vnf - Vbp) * distortion_cf_threshold; - if (hp_bp_lp & 4) - Vhp += (Vf + Vnf - Vhp) * distortion_cf_threshold; - - /* Simulating the exponential VCR that the FET block is... */ - Vlp -= Vbp * type3_w0(Vbp, type3_fc_distortion_offset_bp); - Vbp -= Vhp * type3_w0(Vhp, type3_fc_distortion_offset_hp) * outputleveldifference_bp_hp; - - /* Tuned based on Fred Gray's Break Thru. It is probably not a hard - * discontinuity but a saturation effect... */ - if (Vnf > 3.2e6f) - Vnf = 3.2e6f; - - Vf += Vnf + Vlp * (outputleveldifference_lp_bp - 1.f); - } else { - /* On the 8580, BP appears mixed in phase with the rest. */ - Vhp = -Vbp * _1_div_Q - Vlp - Vi; - Vlp += Vbp * type4_w0_cache; - Vbp += Vhp * type4_w0_cache; - - Vf += Vnf; - } - - return Vf * volf; -} - -RESID_INLINE -void FilterFP::nuke_denormals() -{ - /* We could use the flush-to-zero flag or denormals-are-zero on systems - * where compiling with -msse and -mfpmath=sse is acceptable. Since this - * doesn't include general VICE builds, we do this instead. */ - if (Vbp > -1e-12f && Vbp < 1e-12f) - Vbp = 0; - if (Vlp > -1e-12f && Vlp < 1e-12f) - Vlp = 0; -} - -#endif // not __FILTER_H__ diff --git a/src/sound/resid-fp/pot.cc b/src/sound/resid-fp/pot.cc deleted file mode 100644 index 4cd85a5c3..000000000 --- a/src/sound/resid-fp/pot.cc +++ /dev/null @@ -1,26 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "pot.h" - -reg8 PotentiometerFP::readPOT() -{ - // NB! Not modeled. - return 0xff; -} diff --git a/src/sound/resid-fp/pot.h b/src/sound/resid-fp/pot.h deleted file mode 100644 index e1deeabda..000000000 --- a/src/sound/resid-fp/pot.h +++ /dev/null @@ -1,31 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __POT_H__ -#define __POT_H__ - -#include "siddefs-fp.h" - -class PotentiometerFP -{ -public: - reg8 readPOT(); -}; - -#endif diff --git a/src/sound/resid-fp/resample/Resampler.h b/src/sound/resid-fp/resample/Resampler.h new file mode 100644 index 000000000..904f65458 --- /dev/null +++ b/src/sound/resid-fp/resample/Resampler.h @@ -0,0 +1,86 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2020 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef RESAMPLER_H +#define RESAMPLER_H + +#include + +#include "../sidcxx11.h" + +#include "../siddefs-fp.h" + +namespace reSIDfp +{ + +/** + * Abstraction of a resampling process. Given enough input, produces output. + * Constructors take additional arguments that configure these objects. + */ +class Resampler +{ +protected: + inline short softClip(int x) const + { + constexpr int threshold = 28000; + if (likely(x < threshold)) + return x; + + constexpr double t = threshold / 32768.; + constexpr double a = 1. - t; + constexpr double b = 1. / a; + + double value = static_cast(x - threshold) / 32768.; + value = t + a * tanh(b * value); + return static_cast(value * 32768.); + } + + virtual int output() const = 0; + + Resampler() {} + +public: + virtual ~Resampler() {} + + /** + * Input a sample into resampler. Output "true" when resampler is ready with new sample. + * + * @param sample input sample + * @return true when a sample is ready + */ + virtual bool input(int sample) = 0; + + /** + * Output a sample from resampler. + * + * @return resampled sample + */ + short getOutput() const + { + return softClip(output()); + } + + virtual void reset() = 0; +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/resample/SincResampler.cpp b/src/sound/resid-fp/resample/SincResampler.cpp new file mode 100644 index 000000000..df7d8af83 --- /dev/null +++ b/src/sound/resid-fp/resample/SincResampler.cpp @@ -0,0 +1,397 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2020 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include "SincResampler.h" + +#include +#include +#include +#include +#include + +#include "../siddefs-fp.h" + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef HAVE_EMMINTRIN_H +# include +#elif defined HAVE_MMINTRIN_H +# include +#elif defined(HAVE_ARM_NEON_H) +# include +#endif + +namespace reSIDfp +{ + +typedef std::map fir_cache_t; + +/// Cache for the expensive FIR table computation results. +fir_cache_t FIR_CACHE; + +/// Maximum error acceptable in I0 is 1e-6, or ~96 dB. +const double I0E = 1e-6; + +const int BITS = 16; + +/** + * Compute the 0th order modified Bessel function of the first kind. + * This function is originally from resample-1.5/filterkit.c by J. O. Smith. + * It is used to build the Kaiser window for resampling. + * + * @param x evaluate I0 at x + * @return value of I0 at x. + */ +double I0(double x) +{ + double sum = 1.; + double u = 1.; + double n = 1.; + const double halfx = x / 2.; + + do + { + const double temp = halfx / n; + u *= temp * temp; + sum += u; + n += 1.; + } + while (u >= I0E * sum); + + return sum; +} + +/** + * Calculate convolution with sample and sinc. + * + * @param a sample buffer input + * @param b sinc buffer + * @param bLength length of the sinc buffer + * @return convolved result + */ +int convolve(const short* a, const short* b, int bLength) +{ +#ifdef HAVE_EMMINTRIN_H + int out = 0; + + const uintptr_t offset = (uintptr_t)(a) & 0x0f; + + // check for aligned accesses + if (offset == ((uintptr_t)(b) & 0x0f)) + { + if (offset) + { + const int l = (0x10 - offset)/2; + + for (int i = 0; i < l; i++) + { + out += *a++ * *b++; + } + + bLength -= offset; + } + + __m128i acc = _mm_setzero_si128(); + + const int n = bLength / 8; + + for (int i = 0; i < n; i++) + { + const __m128i tmp = _mm_madd_epi16(*(__m128i*)a, *(__m128i*)b); + acc = _mm_add_epi16(acc, tmp); + a += 8; + b += 8; + } + + __m128i vsum = _mm_add_epi32(acc, _mm_srli_si128(acc, 8)); + vsum = _mm_add_epi32(vsum, _mm_srli_si128(vsum, 4)); + out += _mm_cvtsi128_si32(vsum); + + bLength &= 7; + } +#elif defined HAVE_MMINTRIN_H + __m64 acc = _mm_setzero_si64(); + + const int n = bLength / 4; + + for (int i = 0; i < n; i++) + { + const __m64 tmp = _mm_madd_pi16(*(__m64*)a, *(__m64*)b); + acc = _mm_add_pi16(acc, tmp); + a += 4; + b += 4; + } + + int out = _mm_cvtsi64_si32(acc) + _mm_cvtsi64_si32(_mm_srli_si64(acc, 32)); + _mm_empty(); + + bLength &= 3; +#elif defined(HAVE_ARM_NEON_H) +#if (defined(__arm64__) && defined(__APPLE__)) || defined(__aarch64__) + int32x4_t acc1Low = vdupq_n_s32(0); + int32x4_t acc1High = vdupq_n_s32(0); + int32x4_t acc2Low = vdupq_n_s32(0); + int32x4_t acc2High = vdupq_n_s32(0); + + const int n = bLength / 16; + + for (int i = 0; i < n; i++) + { + int16x8_t v11 = vld1q_s16(a); + int16x8_t v12 = vld1q_s16(a + 8); + int16x8_t v21 = vld1q_s16(b); + int16x8_t v22 = vld1q_s16(b + 8); + + acc1Low = vmlal_s16(acc1Low, vget_low_s16(v11), vget_low_s16(v21)); + acc1High = vmlal_high_s16(acc1High, v11, v21); + acc2Low = vmlal_s16(acc2Low, vget_low_s16(v12), vget_low_s16(v22)); + acc2High = vmlal_high_s16(acc2High, v12, v22); + + a += 16; + b += 16; + } + + bLength &= 15; + + if (bLength >= 8) + { + int16x8_t v1 = vld1q_s16(a); + int16x8_t v2 = vld1q_s16(b); + + acc1Low = vmlal_s16(acc1Low, vget_low_s16(v1), vget_low_s16(v2)); + acc1High = vmlal_high_s16(acc1High, v1, v2); + + a += 8; + b += 8; + } + + bLength &= 7; + + if (bLength >= 4) + { + int16x4_t v1 = vld1_s16(a); + int16x4_t v2 = vld1_s16(b); + + acc1Low = vmlal_s16(acc1Low, v1, v2); + + a += 4; + b += 4; + } + + int32x4_t accSumsNeon = vaddq_s32(acc1Low, acc1High); + accSumsNeon = vaddq_s32(accSumsNeon, acc2Low); + accSumsNeon = vaddq_s32(accSumsNeon, acc2High); + + int out = vaddvq_s32(accSumsNeon); + + bLength &= 3; +#else + int32x4_t acc = vdupq_n_s32(0); + + const int n = bLength / 4; + + for (int i = 0; i < n; i++) + { + const int16x4_t h_vec = vld1_s16(a); + const int16x4_t x_vec = vld1_s16(b); + acc = vmlal_s16(acc, h_vec, x_vec); + a += 4; + b += 4; + } + + int out = vgetq_lane_s32(acc, 0) + + vgetq_lane_s32(acc, 1) + + vgetq_lane_s32(acc, 2) + + vgetq_lane_s32(acc, 3); + + bLength &= 3; +#endif +#else + int out = 0; +#endif + + for (int i = 0; i < bLength; i++) + { + out += *a++ * *b++; + } + + return (out + (1 << 14)) >> 15; +} + +int SincResampler::fir(int subcycle) +{ + // Find the first of the nearest fir tables close to the phase + int firTableFirst = (subcycle * firRES >> 10); + const int firTableOffset = (subcycle * firRES) & 0x3ff; + + // Find firN most recent samples, plus one extra in case the FIR wraps. + int sampleStart = sampleIndex - firN + RINGSIZE - 1; + + const int v1 = convolve(sample + sampleStart, (*firTable)[firTableFirst], firN); + + // Use next FIR table, wrap around to first FIR table using + // previous sample. + if (unlikely(++firTableFirst == firRES)) + { + firTableFirst = 0; + ++sampleStart; + } + + const int v2 = convolve(sample + sampleStart, (*firTable)[firTableFirst], firN); + + // Linear interpolation between the sinc tables yields good + // approximation for the exact value. + return v1 + (firTableOffset * (v2 - v1) >> 10); +} + +SincResampler::SincResampler(double clockFrequency, double samplingFrequency, double highestAccurateFrequency) : + sampleIndex(0), + cyclesPerSample(static_cast(clockFrequency / samplingFrequency * 1024.)), + sampleOffset(0), + outputValue(0) +{ + // 16 bits -> -96dB stopband attenuation. + const double A = -20. * log10(1.0 / (1 << BITS)); + // A fraction of the bandwidth is allocated to the transition band, which we double + // because we design the filter to transition halfway at nyquist. + const double dw = (1. - 2.*highestAccurateFrequency / samplingFrequency) * M_PI * 2.; + + // For calculation of beta and N see the reference for the kaiserord + // function in the MATLAB Signal Processing Toolbox: + // http://www.mathworks.com/help/signal/ref/kaiserord.html + const double beta = 0.1102 * (A - 8.7); + const double I0beta = I0(beta); + const double cyclesPerSampleD = clockFrequency / samplingFrequency; + + { + // The filter order will maximally be 124 with the current constraints. + // N >= (96.33 - 7.95)/(2 * pi * 2.285 * (maxfreq - passbandfreq) >= 123 + // The filter order is equal to the number of zero crossings, i.e. + // it should be an even number (sinc is symmetric with respect to x = 0). + int N = static_cast((A - 7.95) / (2.285 * dw) + 0.5); + N += N & 1; + + // The filter length is equal to the filter order + 1. + // The filter length must be an odd number (sinc is symmetric with respect to + // x = 0). + firN = static_cast(N * cyclesPerSampleD) + 1; + firN |= 1; + + // Check whether the sample ring buffer would overflow. + assert(firN < RINGSIZE); + + // Error is bounded by err < 1.234 / L^2, so L = sqrt(1.234 / (2^-16)) = sqrt(1.234 * 2^16). + firRES = static_cast(ceil(sqrt(1.234 * (1 << BITS)) / cyclesPerSampleD)); + + // firN*firRES represent the total resolution of the sinc sampling. JOS + // recommends a length of 2^BITS, but we don't quite use that good a filter. + // The filter test program indicates that the filter performs well, though. + } + + // Create the map key + std::ostringstream o; + o << firN << "," << firRES << "," << cyclesPerSampleD; + const std::string firKey = o.str(); + fir_cache_t::iterator lb = FIR_CACHE.lower_bound(firKey); + + // The FIR computation is expensive and we set sampling parameters often, but + // from a very small set of choices. Thus, caching is used to speed initialization. + if (lb != FIR_CACHE.end() && !(FIR_CACHE.key_comp()(firKey, lb->first))) + { + firTable = &(lb->second); + } + else + { + // Allocate memory for FIR tables. + matrix_t tempTable(firRES, firN); +#ifdef HAVE_CXX11 + firTable = &(FIR_CACHE.emplace_hint(lb, fir_cache_t::value_type(firKey, tempTable))->second); +#else + firTable = &(FIR_CACHE.insert(lb, fir_cache_t::value_type(firKey, tempTable))->second); +#endif + + // The cutoff frequency is midway through the transition band, in effect the same as nyquist. + const double wc = M_PI; + + // Calculate the sinc tables. + const double scale = 32768.0 * wc / cyclesPerSampleD / M_PI; + + // we're not interested in the fractional part + // so use int division before converting to double + const int tmp = firN / 2; + const double firN_2 = static_cast(tmp); + + for (int i = 0; i < firRES; i++) + { + const double jPhase = (double) i / firRES + firN_2; + + for (int j = 0; j < firN; j++) + { + const double x = j - jPhase; + + const double xt = x / firN_2; + const double kaiserXt = fabs(xt) < 1. ? I0(beta * sqrt(1. - xt * xt)) / I0beta : 0.; + + const double wt = wc * x / cyclesPerSampleD; + const double sincWt = fabs(wt) >= 1e-8 ? sin(wt) / wt : 1.; + + (*firTable)[i][j] = static_cast(scale * sincWt * kaiserXt); + } + } + } +} + +bool SincResampler::input(int input) +{ + bool ready = false; + + /* + * Clip the input as it may overflow the 16 bit range. + * + * Approximate measured input ranges: + * 6581: [-24262,+25080] (Kawasaki_Synthesizer_Demo) + * 8580: [-21514,+35232] (64_Forever, Drum_Fool) + */ + sample[sampleIndex] = sample[sampleIndex + RINGSIZE] = softClip(input); + sampleIndex = (sampleIndex + 1) & (RINGSIZE - 1); + + if (sampleOffset < 1024) + { + outputValue = fir(sampleOffset); + ready = true; + sampleOffset += cyclesPerSample; + } + + sampleOffset -= 1024; + + return ready; +} + +void SincResampler::reset() +{ + memset(sample, 0, sizeof(sample)); + sampleOffset = 0; +} + +} // namespace reSIDfp diff --git a/src/sound/resid-fp/resample/SincResampler.h b/src/sound/resid-fp/resample/SincResampler.h new file mode 100644 index 000000000..7502d96fd --- /dev/null +++ b/src/sound/resid-fp/resample/SincResampler.h @@ -0,0 +1,114 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2013 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef SINCRESAMPLER_H +#define SINCRESAMPLER_H + +#include "Resampler.h" + +#include +#include + +#include "../array.h" + +#include "../sidcxx11.h" + +namespace reSIDfp +{ + +/** + * This is the theoretically correct (and computationally intensive) audio sample generation. + * The samples are generated by resampling to the specified sampling frequency. + * The work rate is inversely proportional to the percentage of the bandwidth + * allocated to the filter transition band. + * + * This implementation is based on the paper "A Flexible Sampling-Rate Conversion Method", + * by J. O. Smith and P. Gosset, or rather on the expanded tutorial on the + * [Digital Audio Resampling Home Page](http://www-ccrma.stanford.edu/~jos/resample/). + * + * By building shifted FIR tables with samples according to the sampling frequency, + * this implementation dramatically reduces the computational effort in the + * filter convolutions, without any loss of accuracy. + * The filter convolutions are also vectorizable on current hardware. + */ +class SincResampler final : public Resampler +{ +private: + /// Size of the ring buffer, must be a power of 2 + static const int RINGSIZE = 2048; + +private: + /// Table of the fir filter coefficients + matrix_t* firTable; + + int sampleIndex; + + /// Filter resolution + int firRES; + + /// Filter length + int firN; + + const int cyclesPerSample; + + int sampleOffset; + + int outputValue; + + short sample[RINGSIZE * 2]; + +private: + int fir(int subcycle); + +public: + /** + * Use a clock freqency of 985248Hz for PAL C64, 1022730Hz for NTSC C64. + * The default end of passband frequency is pass_freq = 0.9*sample_freq/2 + * for sample frequencies up to ~ 44.1kHz, and 20kHz for higher sample frequencies. + * + * For resampling, the ratio between the clock frequency and the sample frequency + * is limited as follows: 125*clock_freq/sample_freq < 16384 + * E.g. provided a clock frequency of ~ 1MHz, the sample frequency + * can not be set lower than ~ 8kHz. + * A lower sample frequency would make the resampling code overfill its 16k sample ring buffer. + * + * The end of passband frequency is also limited: pass_freq <= 0.9*sample_freq/2 + * + * E.g. for a 44.1kHz sampling rate the end of passband frequency is limited + * to slightly below 20kHz. This constraint ensures that the FIR table is not overfilled. + * + * @param clockFrequency System clock frequency at Hz + * @param samplingFrequency Desired output sampling rate + * @param highestAccurateFrequency + */ + SincResampler(double clockFrequency, double samplingFrequency, double highestAccurateFrequency); + + bool input(int input) override; + + int output() const override { return outputValue; } + + void reset() override; +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/resample/TwoPassSincResampler.h b/src/sound/resid-fp/resample/TwoPassSincResampler.h new file mode 100644 index 000000000..81659193a --- /dev/null +++ b/src/sound/resid-fp/resample/TwoPassSincResampler.h @@ -0,0 +1,83 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2015 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef TWOPASSSINCRESAMPLER_H +#define TWOPASSSINCRESAMPLER_H + +#include + +#include + +#include "Resampler.h" +#include "SincResampler.h" + +#include "../sidcxx11.h" + +namespace reSIDfp +{ + +/** + * Compose a more efficient SINC from chaining two other SINCs. + */ +class TwoPassSincResampler final : public Resampler +{ +private: + std::unique_ptr const s1; + std::unique_ptr const s2; + +private: + TwoPassSincResampler(double clockFrequency, double samplingFrequency, double highestAccurateFrequency, double intermediateFrequency) : + s1(new SincResampler(clockFrequency, intermediateFrequency, highestAccurateFrequency)), + s2(new SincResampler(intermediateFrequency, samplingFrequency, highestAccurateFrequency)) + {} + +public: + // Named constructor + static TwoPassSincResampler* create(double clockFrequency, double samplingFrequency, double highestAccurateFrequency) + { + // Calculation according to Laurent Ganier. It evaluates to about 120 kHz at typical settings. + // Some testing around the chosen value seems to confirm that this does work. + double const intermediateFrequency = 2. * highestAccurateFrequency + + sqrt(2. * highestAccurateFrequency * clockFrequency + * (samplingFrequency - 2. * highestAccurateFrequency) / samplingFrequency); + return new TwoPassSincResampler(clockFrequency, samplingFrequency, highestAccurateFrequency, intermediateFrequency); + } + + bool input(int sample) override + { + return s1->input(sample) && s2->input(s1->output()); + } + + int output() const override + { + return s2->output(); + } + + void reset() override + { + s1->reset(); + s2->reset(); + } +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/resample/ZeroOrderResampler.h b/src/sound/resid-fp/resample/ZeroOrderResampler.h new file mode 100644 index 000000000..2bc80cded --- /dev/null +++ b/src/sound/resid-fp/resample/ZeroOrderResampler.h @@ -0,0 +1,88 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2013 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#ifndef ZEROORDER_RESAMPLER_H +#define ZEROORDER_RESAMPLER_H + +#include "Resampler.h" + +#include "../sidcxx11.h" + +namespace reSIDfp +{ + +/** + * Return sample with linear interpolation. + * + * @author Antti Lankila + */ +class ZeroOrderResampler final : public Resampler +{ + +private: + /// Last sample + int cachedSample; + + /// Number of cycles per sample + const int cyclesPerSample; + + int sampleOffset; + + /// Calculated sample + int outputValue; + +public: + ZeroOrderResampler(double clockFrequency, double samplingFrequency) : + cachedSample(0), + cyclesPerSample(static_cast(clockFrequency / samplingFrequency * 1024.)), + sampleOffset(0), + outputValue(0) {} + + bool input(int sample) override + { + bool ready = false; + + if (sampleOffset < 1024) + { + outputValue = cachedSample + (sampleOffset * (sample - cachedSample) >> 10); + ready = true; + sampleOffset += cyclesPerSample; + } + + sampleOffset -= 1024; + + cachedSample = sample; + + return ready; + } + + int output() const override { return outputValue; } + + void reset() override + { + sampleOffset = 0; + cachedSample = 0; + } +}; + +} // namespace reSIDfp + +#endif diff --git a/src/sound/resid-fp/resample/test.cpp b/src/sound/resid-fp/resample/test.cpp new file mode 100644 index 000000000..b229e9e4d --- /dev/null +++ b/src/sound/resid-fp/resample/test.cpp @@ -0,0 +1,91 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2012-2013 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +#include +#include +#include +#include +#include +#include + +#include "../siddefs-fp.h" + +#include "Resampler.h" +#include "TwoPassSincResampler.h" + +#if __cplusplus < 201103L +# define unique_ptr auto_ptr +#endif + +/** + * Simple sin waveform in, power output measurement function. + * It would be far better to use FFT. + */ +int main(int, const char*[]) +{ + const double RATE = 985248.4; + const int RINGSIZE = 2048; + + std::unique_ptr r(reSIDfp::TwoPassSincResampler::create(RATE, 48000.0, 20000.0)); + + std::map results; + clock_t start = clock(); + + for (double freq = 1000.; freq < RATE / 2.; freq *= 1.01) + { + /* prefill resampler buffer */ + int k = 0; + double omega = 2 * M_PI * freq / RATE; + + for (int j = 0; j < RINGSIZE; j ++) + { + int signal = static_cast(32768.0 * sin(k++ * omega) * sqrt(2)); + r->input(signal); + } + + int n = 0; + float pwr = 0; + + /* Now, during measurement stage, put 100 cycles of waveform through filter. */ + for (int j = 0; j < 100000; j ++) + { + int signal = static_cast(32768.0 * sin(k++ * omega) * sqrt(2)); + + if (r->input(signal)) + { + float out = r->output(); + pwr += out * out; + n += 1; + } + } + + results.insert(std::make_pair(freq, 10 * log10(pwr / n))); + } + + clock_t end = clock(); + + for (std::map::iterator it = results.begin(); it != results.end(); ++it) + { + std::cout << std::fixed << std::setprecision(0) << std::setw(6) << (*it).first << " Hz " << (*it).second << " dB" << std::endl; + } + + std::cout << "Filtering time " << (end - start) * 1000. / CLOCKS_PER_SEC << " ms" << std::endl; +} diff --git a/src/sound/resid-fp/samp2src.pl b/src/sound/resid-fp/samp2src.pl deleted file mode 100644 index fc6398382..000000000 --- a/src/sound/resid-fp/samp2src.pl +++ /dev/null @@ -1,65 +0,0 @@ -#! /usr/bin/perl -w -# --------------------------------------------------------------------------- -# This file is part of reSID, a MOS6581 SID emulator engine. -# Copyright (C) 2004 Dag Lem -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -# --------------------------------------------------------------------------- - -use strict; - -die("Usage: samp2src name data-in src-out\n") unless @ARGV == 3; -my ($name, $in, $out) = @ARGV; - -open(F, "<$in") or die($!); -local $/ = undef; -my $data = ; -close(F) or die($!); - -open(F, ">$out") or die($!); - -print F <<\EOF; -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -EOF - -print F "#include \"wave.h\"\n\nreg8 WaveformGeneratorFP::$name\[\] =\n{\n"; - -for (my $i = 0; $i < length($data); $i += 8) { - print F sprintf("/* 0x%03x: */ ", $i), map(sprintf(" 0x%02x,", $_), unpack("C*", substr($data, $i, 8))), "\n"; -} - -print F "};\n"; - -close(F) or die($!); - -exit(0); diff --git a/src/sound/resid-fp/sid.cc b/src/sound/resid-fp/sid.cc deleted file mode 100644 index ad72d9d51..000000000 --- a/src/sound/resid-fp/sid.cc +++ /dev/null @@ -1,946 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "sid.h" -#include -#include - -extern float convolve(const float *a, const float *b, int n); -extern float convolve_sse(const float *a, const float *b, int n); - -enum host_cpu_feature { - HOST_CPU_MMX=1, HOST_CPU_SSE=2, HOST_CPU_SSE2=4, HOST_CPU_SSE3=8 -}; - -/* This code is appropriate for 32-bit and 64-bit x86 CPUs. */ -#if defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || (defined(_M_X64) && !(defined(_MSC_VER) && !defined(__clang__))) - -struct cpu_x86_regs_s { - unsigned int eax; - unsigned int ebx; - unsigned int ecx; - unsigned int edx; -}; -typedef struct cpu_x86_regs_s cpu_x86_regs_t; - -static cpu_x86_regs_t get_cpuid_regs(unsigned int index) -{ - cpu_x86_regs_t retval; - -#if defined(_MSC_VER) && !defined(__clang__) /* MSVC assembly */ - __asm { - mov eax, [index] - cpuid - mov [retval.eax], eax - mov [retval.ebx], ebx - mov [retval.ecx], ecx - mov [retval.edx], edx - } -#else /* GNU assembly */ - asm("movl %1, %%eax; cpuid; movl %%eax, %0;" - : "=m" (retval.eax) - : "r" (index) - : "eax", "ebx", "ecx", "edx"); - asm("movl %1, %%eax; cpuid; movl %%ebx, %0;" - : "=m" (retval.ebx) - : "r" (index) - : "eax", "ebx", "ecx", "edx"); - asm("movl %1, %%eax; cpuid; movl %%ecx, %0;" - : "=m" (retval.ecx) - : "r" (index) - : "eax", "ebx", "ecx", "edx"); - asm("movl %1, %%eax; cpuid; movl %%edx, %0;" - : "=m" (retval.edx) - : "r" (index) - : "eax", "ebx", "ecx", "edx"); -#endif - - return retval; -} - -static int host_cpu_features_by_cpuid(void) -{ - cpu_x86_regs_t regs = get_cpuid_regs(1); - - int features = 0; - if (regs.edx & (1 << 23)) - features |= HOST_CPU_MMX; - if (regs.edx & (1 << 25)) - features |= HOST_CPU_SSE; - if (regs.edx & (1 << 26)) - features |= HOST_CPU_SSE2; - if (regs.ecx & (1 << 0)) - features |= HOST_CPU_SSE3; - - return features; -} - -#if (RESID_USE_SSE==1) -static int host_cpu_features(void) -{ - static int features = 0; - static int features_detected = 0; -/* 32-bit only */ -#if defined(__i386__) || (defined(_MSC_VER) && defined(_M_IX86)) - unsigned long temp1, temp2; -#endif - - if (features_detected) - return features; - features_detected = 1; - -#if defined(_MSC_VER) && defined(_M_IX86) /* MSVC compatible assembly appropriate for 32-bit Windows */ - /* see if we are dealing with a cpu that has the cpuid instruction */ - __asm { - pushf - pop eax - mov [temp1], eax - xor eax, 0x200000 - push eax - popf - pushf - pop eax - mov [temp2], eax - push [temp1] - popf - } -#endif -#if defined(__i386__) /* GNU assembly */ - asm("pushfl; popl %%eax; movl %%eax, %0; xorl $0x200000, %%eax; pushl %%eax; popfl; pushfl; popl %%eax; movl %%eax, %1; pushl %0; popfl " - : "=r" (temp1), - "=r" (temp2) - : - : "eax"); -#endif -#if defined(__i386__) || (defined(_MSC_VER) && defined(_M_IX86)) - temp1 &= 0x200000; - temp2 &= 0x200000; - if (temp1 == temp2) { - /* no cpuid support, so we can't test for SSE availability -> false */ - return 0; - } -#endif - - /* find the highest supported cpuid function, returned in %eax */ - if (get_cpuid_regs(0).eax < 1) { - /* no cpuid 1 function, we can't test for features -> no features */ - return 0; - } - - features = host_cpu_features_by_cpuid(); - return features; -} - -#else /* !__x86_64__ && !__i386__ && !_MSC_VER */ -static int host_cpu_features(void) -{ - return 0; -} -#endif -#endif - -float SIDFP::kinked_dac(const int x, const float nonlinearity, const int max) -{ - float value = 0.f; - - int bit = 1; - float weight = 1.f; - const float dir = 2.0f * nonlinearity; - for (int i = 0; i < max; i ++) { - if (x & bit) - value += weight; - bit <<= 1; - weight *= dir; - } - - return value / (weight / nonlinearity) * (1 << max); -} - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -SIDFP::SIDFP() -{ -#if (RESID_USE_SSE==1) - can_use_sse = (host_cpu_features() & HOST_CPU_SSE) != 0; -#else - can_use_sse = false; -#endif - - // Initialize pointers. - sample = 0; - fir = 0; - - voice[0].set_sync_source(&voice[2]); - voice[1].set_sync_source(&voice[0]); - voice[2].set_sync_source(&voice[1]); - - set_sampling_parameters(985248, SAMPLE_INTERPOLATE, 44100); - - bus_value = 0; - bus_value_ttl = 0; - - input(0); -} - - -// ---------------------------------------------------------------------------- -// Destructor. -// ---------------------------------------------------------------------------- -SIDFP::~SIDFP() -{ - delete[] sample; - delete[] fir; -} - - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void SIDFP::set_chip_model(chip_model model) -{ - for (int i = 0; i < 3; i++) { - voice[i].set_chip_model(model); - } - - filter.set_chip_model(model); - extfilt.set_chip_model(model); -} - -/* nonlinear DAC support, set 1 for 8580 / no effect, about 0.96 otherwise */ -void SIDFP::set_voice_nonlinearity(float nl) -{ - for (int i = 0; i < 3; i++) { - voice[i].set_nonlinearity(nl); - } -} - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void SIDFP::reset() -{ - for (int i = 0; i < 3; i++) { - voice[i].reset(); - } - filter.reset(); - extfilt.reset(); - - bus_value = 0; - bus_value_ttl = 0; -} - - -// ---------------------------------------------------------------------------- -// Write 16-bit sample to audio input. -// NB! The caller is responsible for keeping the value within 16 bits. -// Note that to mix in an external audio signal, the signal should be -// resampled to 1MHz first to avoid sampling noise. -// ---------------------------------------------------------------------------- -void SIDFP::input(int sample) -{ - // Voice outputs are 20 bits. Scale up to match three voices in order - // to facilitate simulation of the MOS8580 "digi boost" hardware hack. - ext_in = (float) ( (sample << 4) * 3 ); -} - -float SIDFP::output() -{ - const float range = 1 << 15; - return extfilt.output() / (4095.f * 255.f * 3.f * 1.5f / range); -} - -// ---------------------------------------------------------------------------- -// Read registers. -// -// Reading a write only register returns the last byte written to any SID -// register. The individual bits in this value start to fade down towards -// zero after a few cycles. All bits reach zero within approximately -// $2000 - $4000 cycles. -// It has been claimed that this fading happens in an orderly fashion, however -// sampling of write only registers reveals that this is not the case. -// NB! This is not correctly modeled. -// The actual use of write only registers has largely been made in the belief -// that all SID registers are readable. To support this belief the read -// would have to be done immediately after a write to the same register -// (remember that an intermediate write to another register would yield that -// value instead). With this in mind we return the last value written to -// any SID register for $2000 cycles without modeling the bit fading. -// ---------------------------------------------------------------------------- -reg8 SIDFP::read(reg8 offset) -{ - switch (offset) { - case 0x19: - return potx.readPOT(); - case 0x1a: - return poty.readPOT(); - case 0x1b: - return voice[2].wave.readOSC(); - case 0x1c: - return voice[2].envelope.readENV(); - default: - return bus_value; - } -} - - -// ---------------------------------------------------------------------------- -// Write registers. -// ---------------------------------------------------------------------------- -void SIDFP::write(reg8 offset, reg8 value) -{ - bus_value = value; - bus_value_ttl = 0x4000; - - switch (offset) { - case 0x00: - voice[0].wave.writeFREQ_LO(value); - break; - case 0x01: - voice[0].wave.writeFREQ_HI(value); - break; - case 0x02: - voice[0].wave.writePW_LO(value); - break; - case 0x03: - voice[0].wave.writePW_HI(value); - break; - case 0x04: - voice[0].writeCONTROL_REG(value); - break; - case 0x05: - voice[0].envelope.writeATTACK_DECAY(value); - break; - case 0x06: - voice[0].envelope.writeSUSTAIN_RELEASE(value); - break; - case 0x07: - voice[1].wave.writeFREQ_LO(value); - break; - case 0x08: - voice[1].wave.writeFREQ_HI(value); - break; - case 0x09: - voice[1].wave.writePW_LO(value); - break; - case 0x0a: - voice[1].wave.writePW_HI(value); - break; - case 0x0b: - voice[1].writeCONTROL_REG(value); - break; - case 0x0c: - voice[1].envelope.writeATTACK_DECAY(value); - break; - case 0x0d: - voice[1].envelope.writeSUSTAIN_RELEASE(value); - break; - case 0x0e: - voice[2].wave.writeFREQ_LO(value); - break; - case 0x0f: - voice[2].wave.writeFREQ_HI(value); - break; - case 0x10: - voice[2].wave.writePW_LO(value); - break; - case 0x11: - voice[2].wave.writePW_HI(value); - break; - case 0x12: - voice[2].writeCONTROL_REG(value); - break; - case 0x13: - voice[2].envelope.writeATTACK_DECAY(value); - break; - case 0x14: - voice[2].envelope.writeSUSTAIN_RELEASE(value); - break; - case 0x15: - filter.writeFC_LO(value); - break; - case 0x16: - filter.writeFC_HI(value); - break; - case 0x17: - filter.writeRES_FILT(value); - break; - case 0x18: - filter.writeMODE_VOL(value); - break; - default: - break; - } -} - - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -SIDFP::State::State() -{ - int i; - - for (i = 0; i < 0x20; i++) { - sid_register[i] = 0; - } - - bus_value = 0; - bus_value_ttl = 0; - - for (i = 0; i < 3; i++) { - accumulator[i] = 0; - shift_register[i] = 0x7ffff8; - rate_counter[i] = 0; - rate_counter_period[i] = 9; - exponential_counter[i] = 0; - exponential_counter_period[i] = 1; - envelope_counter[i] = 0; - envelope_state[i] = EnvelopeGeneratorFP::RELEASE; - hold_zero[i] = true; - } -} - - -// ---------------------------------------------------------------------------- -// Read state. -// ---------------------------------------------------------------------------- -SIDFP::State SIDFP::read_state() -{ - State state; - int i, j; - - for (i = 0, j = 0; i < 3; i++, j += 7) { - WaveformGeneratorFP& wave = voice[i].wave; - EnvelopeGeneratorFP& envelope = voice[i].envelope; - state.sid_register[j + 0] = wave.freq & 0xff; - state.sid_register[j + 1] = wave.freq >> 8; - state.sid_register[j + 2] = wave.pw & 0xff; - state.sid_register[j + 3] = wave.pw >> 8; - state.sid_register[j + 4] = - (wave.waveform << 4) - | (wave.test ? 0x08 : 0) - | (wave.ring_mod ? 0x04 : 0) - | (wave.sync ? 0x02 : 0) - | (envelope.gate ? 0x01 : 0); - state.sid_register[j + 5] = (envelope.attack << 4) | envelope.decay; - state.sid_register[j + 6] = (envelope.sustain << 4) | envelope.release; - } - - state.sid_register[j++] = filter.fc & 0x007; - state.sid_register[j++] = filter.fc >> 3; - state.sid_register[j++] = (filter.res << 4) | filter.filt; - state.sid_register[j++] = - (filter.voice3off ? 0x80 : 0) - | (filter.hp_bp_lp << 4) - | filter.vol; - - // These registers are superfluous, but included for completeness. - for (; j < 0x1d; j++) { - state.sid_register[j] = read(j); - } - for (; j < 0x20; j++) { - state.sid_register[j] = 0; - } - - state.bus_value = bus_value; - state.bus_value_ttl = bus_value_ttl; - - for (i = 0; i < 3; i++) { - state.accumulator[i] = voice[i].wave.accumulator; - state.shift_register[i] = voice[i].wave.shift_register; - state.rate_counter[i] = voice[i].envelope.rate_counter; - state.rate_counter_period[i] = voice[i].envelope.rate_period; - state.exponential_counter[i] = voice[i].envelope.exponential_counter; - state.exponential_counter_period[i] = voice[i].envelope.exponential_counter_period; - state.envelope_counter[i] = voice[i].envelope.envelope_counter; - state.envelope_state[i] = voice[i].envelope.state; - state.hold_zero[i] = voice[i].envelope.hold_zero; - } - - return state; -} - - -// ---------------------------------------------------------------------------- -// Write state. -// ---------------------------------------------------------------------------- -void SIDFP::write_state(const State& state) -{ - int i; - - for (i = 0; i <= 0x18; i++) { - write(i, state.sid_register[i]); - } - - bus_value = state.bus_value; - bus_value_ttl = state.bus_value_ttl; - - for (i = 0; i < 3; i++) { - voice[i].wave.accumulator = state.accumulator[i]; - voice[i].wave.shift_register = state.shift_register[i]; - voice[i].envelope.rate_counter = state.rate_counter[i]; - voice[i].envelope.rate_period = state.rate_counter_period[i]; - voice[i].envelope.exponential_counter = state.exponential_counter[i]; - voice[i].envelope.exponential_counter_period = state.exponential_counter_period[i]; - voice[i].envelope.envelope_counter = state.envelope_counter[i]; - voice[i].envelope.state = state.envelope_state[i]; - voice[i].envelope.hold_zero = state.hold_zero[i]; - } -} - - -// ---------------------------------------------------------------------------- -// Enable filter. -// ---------------------------------------------------------------------------- -void SIDFP::enable_filter(bool enable) -{ - filter.enable_filter(enable); -} - - -// ---------------------------------------------------------------------------- -// Enable external filter. -// ---------------------------------------------------------------------------- -void SIDFP::enable_external_filter(bool enable) -{ - extfilt.enable_filter(enable); -} - - -// ---------------------------------------------------------------------------- -// I0() computes the 0th order modified Bessel function of the first kind. -// This function is originally from resample-1.5/filterkit.c by J. O. Smith. -// ---------------------------------------------------------------------------- -double SIDFP::I0(double x) -{ - // Max error acceptable in I0 could be 1e-6, which gives that 96 dB already. - // I'm overspecify these errors to get a beautiful FFT dump of the FIR. - const double I0e = 1e-10; - - double sum, u, halfx, temp; - int n; - - sum = u = n = 1; - halfx = x/2.0; - - do { - temp = halfx/n++; - u *= temp*temp; - sum += u; - } while (u >= I0e*sum); - - return sum; -} - - -// ---------------------------------------------------------------------------- -// Setting of SID sampling parameters. -// -// Use a clock freqency of 985248Hz for PAL C64, 1022730Hz for NTSC C64. -// The default end of passband frequency is pass_freq = 0.9*sample_freq/2 -// for sample frequencies up to ~ 44.1kHz, and 20kHz for higher sample -// frequencies. -// -// For resampling, the ratio between the clock frequency and the sample -// frequency is limited as follows: -// 125*clock_freq/sample_freq < 16384 -// E.g. provided a clock frequency of ~ 1MHz, the sample frequency can not -// be set lower than ~ 8kHz. A lower sample frequency would make the -// resampling code overfill its 16k sample ring buffer. -// -// The end of passband frequency is also limited: -// pass_freq <= 0.9*sample_freq/2 - -// E.g. for a 44.1kHz sampling rate the end of passband frequency is limited -// to slightly below 20kHz. This constraint ensures that the FIR table is -// not overfilled. -// ---------------------------------------------------------------------------- -bool SIDFP::set_sampling_parameters(float clock_freq, sampling_method method, - float sample_freq, float pass_freq) -{ - clock_frequency = clock_freq; - sampling = method; - - filter.set_clock_frequency(clock_freq); - extfilt.set_clock_frequency(clock_freq); - adjust_sampling_frequency(sample_freq); - - sample_offset = 0; - sample_prev = 0; - - // FIR initialization is only necessary for resampling. - if (method != SAMPLE_RESAMPLE_INTERPOLATE) - { - delete[] sample; - delete[] fir; - sample = 0; - fir = 0; - return true; - } - - const int bits = 16; - - if (pass_freq > 20000) - pass_freq = 20000; - if (2*pass_freq/sample_freq > 0.9) - pass_freq = 0.9f*sample_freq/2; - - // 16 bits -> -96dB stopband attenuation. - const double A = -20*log10(1.0/(1 << bits)); - - // For calculation of beta and N see the reference for the kaiserord - // function in the MATLAB Signal Processing Toolbox: - // http://www.mathworks.com/access/helpdesk/help/toolbox/signal/kaiserord.html - const double beta = 0.1102*(A - 8.7); - const double I0beta = I0(beta); - - double f_samples_per_cycle = sample_freq/clock_freq; - double f_cycles_per_sample = clock_freq/sample_freq; - - /* This code utilizes the fact that aliasing back to 20 kHz from - * sample_freq/2 is inaudible. This allows us to define a passband - * wider than normally. We might also consider aliasing back to pass_freq, - * but as this can be less than 20 kHz, it might become audible... */ - double aliasing_allowance = sample_freq / 2 - 20000; - if (aliasing_allowance < 0) - aliasing_allowance = 0; - - double transition_bandwidth = sample_freq/2 - pass_freq + aliasing_allowance; - { - /* Filter order according to Kaiser's paper. */ - - int N = (int) ((A - 7.95)/(2 * M_PI * 2.285 * transition_bandwidth/sample_freq) + 0.5); - N += N & 1; - - // The filter length is equal to the filter order + 1. - // The filter length must be an odd number (sinc is symmetric about x = 0). - fir_N = int(N*f_cycles_per_sample) + 1; - fir_N |= 1; - - // Check whether the sample ring buffer would overfill. - if (fir_N > RINGSIZE - 1) - return false; - - /* Error is bound by 1.234 / L^2 */ - fir_RES = (int) (sqrt(1.234 * (1 << bits)) / f_cycles_per_sample + 0.5); - } - - // Allocate memory for FIR tables. - delete[] fir; - fir = new float[fir_N*fir_RES]; - - // The cutoff frequency is midway through the transition band. - double wc = (pass_freq + transition_bandwidth/2) / sample_freq * M_PI * 2; - - // Calculate fir_RES FIR tables for linear interpolation. - for (int i = 0; i < fir_RES; i++) { - double j_offset = double(i)/fir_RES; - // Calculate FIR table. This is the sinc function, weighted by the - // Kaiser window. - for (int j = 0; j < fir_N; j ++) { - double jx = j - fir_N/2. - j_offset; - double wt = wc*jx/f_cycles_per_sample; - double temp = jx/(fir_N/2); - double Kaiser = - fabs(temp) <= 1 ? I0(beta*sqrt(1 - temp*temp))/I0beta : 0; - double sincwt = - fabs(wt) >= 1e-8 ? sin(wt)/wt : 1; - fir[i * fir_N + j] = (float) (f_samples_per_cycle*wc/M_PI*sincwt*Kaiser); - } - } - - // Allocate sample buffer. - if (!sample) { - sample = new float[RINGSIZE*2]; - } - // Clear sample buffer. - for (int j = 0; j < RINGSIZE*2; j++) { - sample[j] = 0; - } - sample_index = 0; - - return true; -} - -// ---------------------------------------------------------------------------- -// Adjustment of SID sampling frequency. -// -// In some applications, e.g. a C64 emulator, it can be desirable to -// synchronize sound with a timer source. This is supported by adjustment of -// the SID sampling frequency. -// -// NB! Adjustment of the sampling frequency may lead to noticeable shifts in -// frequency, and should only be used for interactive applications. Note also -// that any adjustment of the sampling frequency will change the -// characteristics of the resampling filter, since the filter is not rebuilt. -// ---------------------------------------------------------------------------- -void SIDFP::adjust_sampling_frequency(float sample_freq) -{ - cycles_per_sample = clock_frequency/sample_freq; -} - -void SIDFP::age_bus_value(cycle_count n) { - if (bus_value_ttl != 0) { - bus_value_ttl -= n; - if (bus_value_ttl <= 0) { - bus_value = 0; - bus_value_ttl = 0; - } - } -} - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -void SIDFP::clock() -{ - int i; - - // Clock amplitude modulators. - for (i = 0; i < 3; i++) { - voice[i].envelope.clock(); - } - - // Clock oscillators. - for (i = 0; i < 3; i++) { - voice[i].wave.clock(); - } - - // Synchronize oscillators. - for (i = 0; i < 3; i++) { - voice[i].wave.synchronize(); - } - - // Clock filter. - extfilt.clock(filter.clock(voice[0].output(), voice[1].output(), voice[2].output(), ext_in)); -} - -// ---------------------------------------------------------------------------- -// SID clocking with audio sampling. -// Fixpoint arithmetics is used. -// -// The example below shows how to clock the SID a specified amount of cycles -// while producing audio output: -// -// while (delta_t) { -// bufindex += sid.clock(delta_t, buf + bufindex, buflength - bufindex); -// write(dsp, buf, bufindex*2); -// bufindex = 0; -// } -// -// ---------------------------------------------------------------------------- -int SIDFP::clock(cycle_count& delta_t, short* buf, int n, int interleave) -{ - /* XXX I assume n is generally large enough for delta_t here... */ - age_bus_value(delta_t); - int res; - switch (sampling) { - default: - case SAMPLE_INTERPOLATE: - res = clock_interpolate(delta_t, buf, n, interleave); - break; - case SAMPLE_RESAMPLE_INTERPOLATE: - res = clock_resample_interpolate(delta_t, buf, n, interleave); - break; - } - - filter.nuke_denormals(); - extfilt.nuke_denormals(); - - return res; -} - -// ---------------------------------------------------------------------------- -// SID clocking with audio sampling - cycle based with linear sample -// interpolation. -// -// Here the chip is clocked every cycle. This yields higher quality -// sound since the samples are linearly interpolated, and since the -// external filter attenuates frequencies above 16kHz, thus reducing -// sampling noise. -// ---------------------------------------------------------------------------- -RESID_INLINE -int SIDFP::clock_interpolate(cycle_count& delta_t, short* buf, int n, - int interleave) -{ - int s = 0; - int i; - - for (;;) { - float next_sample_offset = sample_offset + cycles_per_sample; - int delta_t_sample = (int) next_sample_offset; - if (delta_t_sample > delta_t) { - break; - } - if (s >= n) { - return s; - } - for (i = 0; i < delta_t_sample - 1; i++) { - clock(); - } - if (i < delta_t_sample) { - sample_prev = output(); - clock(); - } - - delta_t -= delta_t_sample; - sample_offset = next_sample_offset - delta_t_sample; - - float sample_now = output(); - int v = (int)(sample_prev + (sample_offset * (sample_now - sample_prev))); - // Saturated arithmetics to guard against 16 bit sample overflow. - const int half = 1 << 15; - if (v >= half) { - v = half - 1; - } - else if (v < -half) { - v = -half; - } - buf[s++*interleave] = v; - sample_prev = sample_now; - } - - for (i = 0; i < delta_t - 1; i++) { - clock(); - } - if (i < delta_t) { - sample_prev = output(); - clock(); - } - sample_offset -= delta_t; - delta_t = 0; - return s; -} - -// ---------------------------------------------------------------------------- -// SID clocking with audio sampling - cycle based with audio resampling. -// -// This is the theoretically correct (and computationally intensive) audio -// sample generation. The samples are generated by resampling to the specified -// sampling frequency. The work rate is inversely proportional to the -// percentage of the bandwidth allocated to the filter transition band. -// -// This implementation is based on the paper "A Flexible Sampling-Rate -// Conversion Method", by J. O. Smith and P. Gosset, or rather on the -// expanded tutorial on the "Digital Audio Resampling Home Page": -// http://www-ccrma.stanford.edu/~jos/resample/ -// -// By building shifted FIR tables with samples according to the -// sampling frequency, this implementation dramatically reduces the -// computational effort in the filter convolutions, without any loss -// of accuracy. The filter convolutions are also vectorizable on -// current hardware. -// -// Further possible optimizations are: -// * An equiripple filter design could yield a lower filter order, see -// http://www.mwrf.com/Articles/ArticleID/7229/7229.html -// * The Convolution Theorem could be used to bring the complexity of -// convolution down from O(n*n) to O(n*log(n)) using the Fast Fourier -// Transform, see http://en.wikipedia.org/wiki/Convolution_theorem -// * Simply resampling in two steps can also yield computational -// savings, since the transition band will be wider in the first step -// and the required filter order is thus lower in this step. -// Laurent Ganier has found the optimal intermediate sampling frequency -// to be (via derivation of sum of two steps): -// 2 * pass_freq + sqrt [ 2 * pass_freq * orig_sample_freq -// * (dest_sample_freq - 2 * pass_freq) / dest_sample_freq ] -// -// NB! the result of right shifting negative numbers is really -// implementation dependent in the C++ standard. -// ---------------------------------------------------------------------------- -RESID_INLINE -int SIDFP::clock_resample_interpolate(cycle_count& delta_t, short* buf, int n, - int interleave) -{ - int s = 0; - - for (;;) { - float next_sample_offset = sample_offset + cycles_per_sample; - /* full clocks left to next sample */ - int delta_t_sample = (int) next_sample_offset; - if (delta_t_sample > delta_t || s >= n) - break; - - /* clock forward delta_t_sample samples */ - for (int i = 0; i < delta_t_sample; i++) { - clock(); - sample[sample_index] = sample[sample_index + RINGSIZE] = output(); - ++ sample_index; - sample_index &= RINGSIZE - 1; - } - delta_t -= delta_t_sample; - - /* Phase of the sample in terms of clock, [0 .. 1[. */ - sample_offset = next_sample_offset - (float) delta_t_sample; - - /* find the first of the nearest fir tables close to the phase */ - float fir_offset_rmd = sample_offset * fir_RES; - int fir_offset = (int) fir_offset_rmd; - /* [0 .. 1[ */ - fir_offset_rmd -= (float) fir_offset; - - /* find fir_N most recent samples, plus one extra in case the FIR wraps. */ - float* sample_start = sample + sample_index - fir_N + RINGSIZE - 1; - - float v1 = -#if (RESID_USE_SSE==1) - can_use_sse ? convolve_sse(sample_start, fir + fir_offset*fir_N, fir_N) : -#endif - convolve(sample_start, fir + fir_offset*fir_N, fir_N); - - // Use next FIR table, wrap around to first FIR table using - // previous sample. - if (++ fir_offset == fir_RES) { - fir_offset = 0; - ++ sample_start; - } - float v2 = -#if (RESID_USE_SSE==1) - can_use_sse ? convolve_sse(sample_start, fir + fir_offset*fir_N, fir_N) : -#endif - convolve(sample_start, fir + fir_offset*fir_N, fir_N); - - // Linear interpolation between the sinc tables yields good approximation - // for the exact value. - int v = (int) (v1 + fir_offset_rmd * (v2 - v1)); - - // Saturated arithmetics to guard against 16 bit sample overflow. - const int half = 1 << 15; - if (v >= half) { - v = half - 1; - } - else if (v < -half) { - v = -half; - } - - buf[s ++ * interleave] = v; - } - - /* clock forward delta_t samples */ - for (int i = 0; i < delta_t; i++) { - clock(); - sample[sample_index] = sample[sample_index + RINGSIZE] = output(); - ++ sample_index; - sample_index &= RINGSIZE - 1; - } - sample_offset -= (float) delta_t; - delta_t = 0; - return s; -} diff --git a/src/sound/resid-fp/sid.h b/src/sound/resid-fp/sid.h index 5180898fb..05ad83c3b 100644 --- a/src/sound/resid-fp/sid.h +++ b/src/sound/resid-fp/sid.h @@ -1,130 +1,372 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2011-2016 Leandro Nini + * Copyright 2007-2010 Antti Lankila + * Copyright 2004 Dag Lem + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ -#ifndef __SID_FP_H__ -#define __SID_FP_H__ +#ifndef SIDFP_H +#define SIDFP_H + +#include #include "siddefs-fp.h" -#include "voice.h" -#include "filter.h" -#include "extfilt.h" -#include "pot.h" -class SIDFP +#include "sidcxx11.h" + +namespace reSIDfp { + +class Filter; +class Filter6581; +class Filter8580; +class ExternalFilter; +class Potentiometer; +class Voice; +class Resampler; + +/** + * SID error exception. + */ +class SIDError +{ +private: + const char* message; + public: - SIDFP(); - ~SIDFP(); - - static float kinked_dac(const int x, const float nonlinearity, const int bits); - bool sse_enabled() { return can_use_sse; } - - void set_chip_model(chip_model model); - FilterFP& get_filter() { return filter; } - void enable_filter(bool enable); - void enable_external_filter(bool enable); - bool set_sampling_parameters(float clock_freq, sampling_method method, - float sample_freq, float pass_freq = -1); - void adjust_sampling_frequency(float sample_freq); - void set_voice_nonlinearity(float nonlinearity); - - void clock(); - int clock(cycle_count& delta_t, short* buf, int n, int interleave = 1); - void reset(); - - // Read/write registers. - reg8 read(reg8 offset); - void write(reg8 offset, reg8 value); - - // Read/write state. - class State - { - public: - State(); - - char sid_register[0x20]; - - reg8 bus_value; - cycle_count bus_value_ttl; - - reg24 accumulator[3]; - reg24 shift_register[3]; - reg16 rate_counter[3]; - reg16 rate_counter_period[3]; - reg16 exponential_counter[3]; - reg16 exponential_counter_period[3]; - reg8 envelope_counter[3]; - EnvelopeGeneratorFP::State envelope_state[3]; - bool hold_zero[3]; - }; - - State read_state(); - void write_state(const State& state); - - // 16-bit input (EXT IN). - void input(int sample); - - // output in range -32768 .. 32767, not clipped (AUDIO OUT) - float output(); - -protected: - static double I0(double x); - RESID_INLINE int clock_interpolate(cycle_count& delta_t, short* buf, int n, - int interleave); - RESID_INLINE int clock_resample_interpolate(cycle_count& delta_t, short* buf, - int n, int interleave); - RESID_INLINE void age_bus_value(cycle_count); - - VoiceFP voice[3]; - FilterFP filter; - ExternalFilterFP extfilt; - PotentiometerFP potx; - PotentiometerFP poty; - - reg8 bus_value; - cycle_count bus_value_ttl; - - float clock_frequency; - - // External audio input. - float ext_in; - - enum { RINGSIZE = 16384 }; - - // Sampling variables. - sampling_method sampling; - float cycles_per_sample; - float sample_offset; - int sample_index; - int fir_N; - int fir_RES; - - // Linear interpolation helper - float sample_prev; - - // Ring buffer with overflow for contiguous storage of RINGSIZE samples. - float* sample; - - // FIR_RES filter tables (FIR_N*FIR_RES). - float* fir; - - bool can_use_sse; + SIDError(const char* msg) : + message(msg) {} + const char* getMessage() const { return message; } }; -#endif // not __SID_H__ +/** + * MOS6581/MOS8580 emulation. + */ +class SID +{ +private: + /// Currently active filter + Filter* filter; + + /// Filter used, if model is set to 6581 + std::unique_ptr const filter6581; + + /// Filter used, if model is set to 8580 + std::unique_ptr const filter8580; + + /** + * External filter that provides high-pass and low-pass filtering + * to adjust sound tone slightly. + */ + std::unique_ptr const externalFilter; + + /// Resampler used by audio generation code. + std::unique_ptr resampler; + + /// Paddle X register support + std::unique_ptr const potX; + + /// Paddle Y register support + std::unique_ptr const potY; + + /// SID voices + std::unique_ptr voice[3]; + + /// Time to live for the last written value + int busValueTtl; + + /// Current chip model's bus value TTL + int modelTTL; + + /// Time until #voiceSync must be run. + unsigned int nextVoiceSync; + + /// Currently active chip model. + ChipModel model; + + /// Last written value + unsigned char busValue; + + /// Flags for muted channels + bool muted[3]; + + /** + * Emulated nonlinearity of the envelope DAC. + * + * @See Dac + */ + float envDAC[256]; + + /** + * Emulated nonlinearity of the oscillator DAC. + * + * @See Dac + */ + float oscDAC[4096]; + +private: + /** + * Age the bus value and zero it if it's TTL has expired. + * + * @param n the number of cycles + */ + void ageBusValue(unsigned int n); + + /** + * Get output sample. + * + * @return the output sample + */ + int output() const; + + /** + * Calculate the numebr of cycles according to current parameters + * that it takes to reach sync. + * + * @param sync whether to do the actual voice synchronization + */ + void voiceSync(bool sync); + +public: + SID(); + ~SID(); + + /** + * Set chip model. + * + * @param model chip model to use + * @throw SIDError + */ + void setChipModel(ChipModel model); + + /** + * Get currently emulated chip model. + */ + ChipModel getChipModel() const { return model; } + + /** + * SID reset. + */ + void reset(); + + /** + * 16-bit input (EXT IN). Write 16-bit sample to audio input. NB! The caller + * is responsible for keeping the value within 16 bits. Note that to mix in + * an external audio signal, the signal should be resampled to 1MHz first to + * avoid sampling noise. + * + * @param value input level to set + */ + void input(int value); + + /** + * Read registers. + * + * Reading a write only register returns the last char written to any SID register. + * The individual bits in this value start to fade down towards zero after a few cycles. + * All bits reach zero within approximately $2000 - $4000 cycles. + * It has been claimed that this fading happens in an orderly fashion, + * however sampling of write only registers reveals that this is not the case. + * NOTE: This is not correctly modeled. + * The actual use of write only registers has largely been made + * in the belief that all SID registers are readable. + * To support this belief the read would have to be done immediately + * after a write to the same register (remember that an intermediate write + * to another register would yield that value instead). + * With this in mind we return the last value written to any SID register + * for $2000 cycles without modeling the bit fading. + * + * @param offset SID register to read + * @return value read from chip + */ + unsigned char read(int offset); + + /** + * Write registers. + * + * @param offset chip register to write + * @param value value to write + */ + void write(int offset, unsigned char value); + + /** + * SID voice muting. + * + * @param channel channel to modify + * @param enable is muted? + */ + void mute(int channel, bool enable) { muted[channel] = enable; } + + /** + * Setting of SID sampling parameters. + * + * Use a clock freqency of 985248Hz for PAL C64, 1022730Hz for NTSC C64. + * The default end of passband frequency is pass_freq = 0.9*sample_freq/2 + * for sample frequencies up to ~ 44.1kHz, and 20kHz for higher sample frequencies. + * + * For resampling, the ratio between the clock frequency and the sample frequency + * is limited as follows: 125*clock_freq/sample_freq < 16384 + * E.g. provided a clock frequency of ~ 1MHz, the sample frequency can not be set + * lower than ~ 8kHz. A lower sample frequency would make the resampling code + * overfill its 16k sample ring buffer. + * + * The end of passband frequency is also limited: pass_freq <= 0.9*sample_freq/2 + * + * E.g. for a 44.1kHz sampling rate the end of passband frequency + * is limited to slightly below 20kHz. + * This constraint ensures that the FIR table is not overfilled. + * + * @param clockFrequency System clock frequency at Hz + * @param method sampling method to use + * @param samplingFrequency Desired output sampling rate + * @param highestAccurateFrequency + * @throw SIDError + */ + void setSamplingParameters(double clockFrequency, SamplingMethod method, double samplingFrequency, double highestAccurateFrequency); + + /** + * Clock SID forward using chosen output sampling algorithm. + * + * @param cycles c64 clocks to clock + * @param buf audio output buffer + * @return number of samples produced + */ + int clock(unsigned int cycles, short* buf); + + /** + * Clock SID forward with no audio production. + * + * _Warning_: + * You can't mix this method of clocking with the audio-producing + * clock() because components that don't affect OSC3/ENV3 are not + * emulated. + * + * @param cycles c64 clocks to clock. + */ + void clockSilent(unsigned int cycles); + + /** + * Set filter curve parameter for 6581 model. + * + * @see Filter6581::setFilterCurve(double) + */ + void setFilter6581Curve(double filterCurve); + + /** + * Set filter curve parameter for 8580 model. + * + * @see Filter8580::setFilterCurve(double) + */ + void setFilter8580Curve(double filterCurve); + + /** + * Enable filter emulation. + * + * @param enable false to turn off filter emulation + */ + void enableFilter(bool enable); +}; + +} // namespace reSIDfp + +#if RESID_INLINING || defined(SID_CPP) + +#include + +#include "Filter.h" +#include "ExternalFilter.h" +#include "Voice.h" +#include "resample/Resampler.h" + +namespace reSIDfp +{ + +RESID_INLINE +void SID::ageBusValue(unsigned int n) +{ + if (likely(busValueTtl != 0)) + { + busValueTtl -= n; + + if (unlikely(busValueTtl <= 0)) + { + busValue = 0; + busValueTtl = 0; + } + } +} + +RESID_INLINE +int SID::output() const +{ + const int v1 = voice[0]->output(voice[2]->wave()); + const int v2 = voice[1]->output(voice[0]->wave()); + const int v3 = voice[2]->output(voice[1]->wave()); + + return externalFilter->clock(filter->clock(v1, v2, v3)); +} + + +RESID_INLINE +int SID::clock(unsigned int cycles, short* buf) +{ + ageBusValue(cycles); + int s = 0; + + while (cycles != 0) + { + unsigned int delta_t = std::min(nextVoiceSync, cycles); + + if (likely(delta_t > 0)) + { + for (unsigned int i = 0; i < delta_t; i++) + { + // clock waveform generators + voice[0]->wave()->clock(); + voice[1]->wave()->clock(); + voice[2]->wave()->clock(); + + // clock envelope generators + voice[0]->envelope()->clock(); + voice[1]->envelope()->clock(); + voice[2]->envelope()->clock(); + + if (unlikely(resampler->input(output()))) + { + buf[s++] = resampler->getOutput(); + } + } + + cycles -= delta_t; + nextVoiceSync -= delta_t; + } + + if (unlikely(nextVoiceSync == 0)) + { + voiceSync(true); + } + } + + return s; +} + +} // namespace reSIDfp + +#endif + +#endif diff --git a/src/sound/resid-fp/sidcxx11.h b/src/sound/resid-fp/sidcxx11.h new file mode 100644 index 000000000..96380be77 --- /dev/null +++ b/src/sound/resid-fp/sidcxx11.h @@ -0,0 +1,58 @@ +/* + * This file is part of libsidplayfp, a SID player engine. + * + * Copyright 2014-2022 Leandro Nini + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef SIDCXX_H +#define SIDCXX_H + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#define HAVE_CXX11 true + + +#ifdef HAVE_CXX17 +# define HAVE_CXX14 +# define MAYBE_UNUSED [[ maybe_unused ]] +#else +# define MAYBE_UNUSED +#endif + +#ifdef HAVE_CXX14 +# define HAVE_CXX11 +# define MAKE_UNIQUE(type, ...) std::make_unique(__VA_ARGS__) +#else +# define MAKE_UNIQUE(type, ...) std::unique_ptr(new type(__VA_ARGS__)) +#endif + +#ifndef HAVE_CXX11 +# define nullptr 0 +# define override +# define final +# define unique_ptr auto_ptr +# define DEFAULT {} +# define DELETE {} +#else +# define DEFAULT = default +# define DELETE = delete +#endif + + +#endif diff --git a/src/sound/resid-fp/siddefs-fp.h b/src/sound/resid-fp/siddefs-fp.h index fb10d5dff..7061e3a85 100644 --- a/src/sound/resid-fp/siddefs-fp.h +++ b/src/sound/resid-fp/siddefs-fp.h @@ -14,75 +14,49 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // --------------------------------------------------------------------------- -#ifndef __SIDDEFS_FP_H__ -#define __SIDDEFS_FP_H__ +#ifndef SIDDEFS_FP_H +#define SIDDEFS_FP_H + +// Compilation configuration. +#define RESID_BRANCH_HINTS true + +// Compiler specifics. +#define HAVE_BUILTIN_EXPECT true #ifndef M_PI -#define M_PI 3.14159265358979323846 -#define M_PI_f 3.14159265358979323846f +# define M_PI 3.14159265358979323846 +#endif + +// Branch prediction macros, lifted off the Linux kernel. +#if RESID_BRANCH_HINTS && HAVE_BUILTIN_EXPECT +# define likely(x) __builtin_expect(!!(x), 1) +# define unlikely(x) __builtin_expect(!!(x), 0) #else -#define M_PI_f ((float) M_PI) +# define likely(x) (x) +# define unlikely(x) (x) #endif -#ifndef M_LN2 -#define M_LN2 0.69314718055994530942 -#define M_LN2_f 0.69314718055994530942f -#else -#define M_LN2_f ((float) M_LN2) -#endif +namespace reSIDfp { -// Define bool, true, and false for C++ compilers that lack these keywords. -#define RESID_HAVE_BOOL 1 +typedef enum { MOS6581=1, MOS8580 } ChipModel; -#if !RESID_HAVE_BOOL -typedef int bool; -const bool true = 1; -const bool false = 0; -#endif - -// We could have used the smallest possible data type for each SID register, -// however this would give a slower engine because of data type conversions. -// An int is assumed to be at least 32 bits (necessary in the types reg24, -// cycle_count, and sound_sample). GNU does not support 16-bit machines -// (GNU Coding Standards: Portability between CPUs), so this should be -// a valid assumption. - -typedef unsigned int reg4; -typedef unsigned int reg8; -typedef unsigned int reg12; -typedef unsigned int reg16; -typedef unsigned int reg24; - -typedef int cycle_count; - -enum chip_model { MOS6581FP=1, MOS8580FP }; - -enum sampling_method { SAMPLE_INTERPOLATE=1, SAMPLE_RESAMPLE_INTERPOLATE }; +typedef enum { DECIMATE=1, RESAMPLE } SamplingMethod; +} extern "C" { #ifndef __VERSION_CC__ -extern const char* resid_version_string; +extern const char* residfp_version_string; #else -const char* resid_version_string = VERSION; +const char* residfp_version_string = VERSION; #endif } // Inlining on/off. +#define RESID_INLINING true #define RESID_INLINE inline -#if defined(__SSE__) || (defined(_M_IX86_FP ) && _M_IX86_FP >= 1) || defined(_M_X64) -#define RESID_USE_SSE 1 -#else -#define RESID_USE_SSE 0 -#endif - -#define HAVE_LOGF -#define HAVE_EXPF -#define HAVE_LOGF_PROTOTYPE -#define HAVE_EXPF_PROTOTYPE - -#endif // not __SIDDEFS_H__ +#endif // SIDDEFS_FP_H diff --git a/src/sound/resid-fp/siddefs-fp.h.in b/src/sound/resid-fp/siddefs-fp.h.in index ec44b3619..4c31ffb46 100644 --- a/src/sound/resid-fp/siddefs-fp.h.in +++ b/src/sound/resid-fp/siddefs-fp.h.in @@ -14,74 +14,49 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // --------------------------------------------------------------------------- -#ifndef __SIDDEFS_FP_H__ -#define __SIDDEFS_FP_H__ +#ifndef SIDDEFS_FP_H +#define SIDDEFS_FP_H + +// Compilation configuration. +#define RESID_BRANCH_HINTS @RESID_BRANCH_HINTS@ + +// Compiler specifics. +#define HAVE_BUILTIN_EXPECT @HAVE_BUILTIN_EXPECT@ #ifndef M_PI -#define M_PI 3.14159265358979323846 -#define M_PI_f 3.14159265358979323846f +# define M_PI 3.14159265358979323846 +#endif + +// Branch prediction macros, lifted off the Linux kernel. +#if RESID_BRANCH_HINTS && HAVE_BUILTIN_EXPECT +# define likely(x) __builtin_expect(!!(x), 1) +# define unlikely(x) __builtin_expect(!!(x), 0) #else -#define M_PI_f ((float) M_PI) +# define likely(x) (x) +# define unlikely(x) (x) #endif -#ifndef M_LN2 -#define M_LN2 0.69314718055994530942 -#define M_LN2_f 0.69314718055994530942f -#else -#define M_LN2_f ((float) M_LN2) -#endif +namespace reSIDfp { -// Define bool, true, and false for C++ compilers that lack these keywords. -#define RESID_HAVE_BOOL @RESID_HAVE_BOOL@ +typedef enum { MOS6581=1, MOS8580 } ChipModel; -#if !RESID_HAVE_BOOL -typedef int bool; -const bool true = 1; -const bool false = 0; -#endif - -// We could have used the smallest possible data type for each SID register, -// however this would give a slower engine because of data type conversions. -// An int is assumed to be at least 32 bits (necessary in the types reg24, -// cycle_count, and sound_sample). GNU does not support 16-bit machines -// (GNU Coding Standards: Portability between CPUs), so this should be -// a valid assumption. - -typedef unsigned int reg4; -typedef unsigned int reg8; -typedef unsigned int reg12; -typedef unsigned int reg16; -typedef unsigned int reg24; - -typedef int cycle_count; - -enum chip_model { MOS6581FP=1, MOS8580FP }; - -enum sampling_method { SAMPLE_INTERPOLATE=1, SAMPLE_RESAMPLE_INTERPOLATE }; +typedef enum { DECIMATE=1, RESAMPLE } SamplingMethod; +} extern "C" { #ifndef __VERSION_CC__ -extern const char* resid_version_string; +extern const char* residfp_version_string; #else -const char* resid_version_string = VERSION; +const char* residfp_version_string = "@PACKAGE_VERSION@"; #endif } // Inlining on/off. +#define RESID_INLINING @RESID_INLINING@ #define RESID_INLINE @RESID_INLINE@ -#define RESID_USE_SSE @RESID_USE_SSE@ - -#if @HAVE_LOGF_PROTOTYPE@ -#define HAVE_LOGF_PROTOTYPE -#endif - -#if @HAVE_EXPF_PROTOTYPE@ -#define HAVE_EXPF_PROTOTYPE -#endif - -#endif // not __SIDDEFS_H__ +#endif // SIDDEFS_FP_H diff --git a/src/sound/resid-fp/version.cc b/src/sound/resid-fp/version.cc index fe9d4595f..3ed8b4490 100644 --- a/src/sound/resid-fp/version.cc +++ b/src/sound/resid-fp/version.cc @@ -14,7 +14,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // --------------------------------------------------------------------------- #define __VERSION_CC__ diff --git a/src/sound/resid-fp/voice.cc b/src/sound/resid-fp/voice.cc deleted file mode 100644 index 18c36cc71..000000000 --- a/src/sound/resid-fp/voice.cc +++ /dev/null @@ -1,102 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __VOICE_CC__ -#include "voice.h" -#include "sid.h" - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -VoiceFP::VoiceFP() -{ - nonlinearity = 1.f; - set_chip_model(MOS6581FP); -} - -/* Keep this at 1.f for 8580, there are no 6581-only codepaths in this file! */ -void VoiceFP::set_nonlinearity(float nl) -{ - nonlinearity = nl; - calculate_dac_tables(); -} - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void VoiceFP::set_chip_model(chip_model model) -{ - wave.set_chip_model(model); - - if (model == MOS6581FP) { - /* there is some level from each voice even if the env is down and osc - * is stopped. You can hear this by routing a voice into filter (filter - * should be kept disabled for this) as the master level changes. This - * tunable affects the volume of digis. */ - voice_DC = 0x800 * 0xff; - /* In 8580 the waveforms seem well centered, but on the 6581 there is some - * offset change as envelope grows, indicating that the waveforms are not - * perfectly centered. I estimate the value ~ 0x600 for my R4AR, and ReSID - * has used another measurement technique and got 0x380. */ - wave_zero = 0x600; - calculate_dac_tables(); - } - else { - /* 8580 is thought to be perfect, apart from small negative offset due to - * ext-in mixing, I think. */ - voice_DC = 0; - wave_zero = 0x800; - calculate_dac_tables(); - } -} - -void VoiceFP::calculate_dac_tables() -{ - int i; - for (i = 0; i < 256; i ++) - env_dac[i] = SIDFP::kinked_dac(i, nonlinearity, 8); - for (i = 0; i < 4096; i ++) - voice_dac[i] = SIDFP::kinked_dac(i, nonlinearity, 12) - wave_zero; -} - -// ---------------------------------------------------------------------------- -// Set sync source. -// ---------------------------------------------------------------------------- -void VoiceFP::set_sync_source(VoiceFP* source) -{ - wave.set_sync_source(&source->wave); -} - -// ---------------------------------------------------------------------------- -// Register functions. -// ---------------------------------------------------------------------------- -void VoiceFP::writeCONTROL_REG(reg8 control) -{ - wave.writeCONTROL_REG(control); - envelope.writeCONTROL_REG(control); -} - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void VoiceFP::reset() -{ - wave.reset(); - envelope.reset(); -} diff --git a/src/sound/resid-fp/voice.h b/src/sound/resid-fp/voice.h deleted file mode 100644 index 3a9e3fc95..000000000 --- a/src/sound/resid-fp/voice.h +++ /dev/null @@ -1,73 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __VOICE_H__ -#define __VOICE_H__ - -#include "siddefs-fp.h" -#include "wave.h" -#include "envelope.h" - -class VoiceFP -{ -public: - VoiceFP(); - - void set_chip_model(chip_model model); - void set_sync_source(VoiceFP*); - void reset(); - - void writeCONTROL_REG(reg8); - - // Amplitude modulated waveform output. - // Range [-2048*255, 2047*255]. - RESID_INLINE float output(); - - void set_nonlinearity(float nl); -protected: - void calculate_dac_tables(); - - WaveformGeneratorFP wave; - EnvelopeGeneratorFP envelope; - - // Multiplying D/A DC offset. - float voice_DC, wave_zero, nonlinearity; - - float env_dac[256]; - float voice_dac[4096]; -friend class SIDFP; -}; - -// ---------------------------------------------------------------------------- -// Amplitude modulated waveform output. -// Ideal range [-2048*255, 2047*255]. -// ---------------------------------------------------------------------------- - -RESID_INLINE -float VoiceFP::output() -{ - unsigned int w = wave.output(); - unsigned int e = envelope.output(); - float _w = voice_dac[w]; - float _e = env_dac[e]; - - return _w * _e + voice_DC; -} - -#endif // not __VOICE_H__ diff --git a/src/sound/resid-fp/wave.cc b/src/sound/resid-fp/wave.cc deleted file mode 100644 index 018c4e2be..000000000 --- a/src/sound/resid-fp/wave.cc +++ /dev/null @@ -1,151 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#define __WAVE_CC__ -#include "wave.h" - -// ---------------------------------------------------------------------------- -// Constructor. -// ---------------------------------------------------------------------------- -WaveformGeneratorFP::WaveformGeneratorFP() -{ - sync_source = this; - - set_chip_model(MOS6581FP); - - reset(); -} - - -// ---------------------------------------------------------------------------- -// Set sync source. -// ---------------------------------------------------------------------------- -void WaveformGeneratorFP::set_sync_source(WaveformGeneratorFP* source) -{ - sync_source = source; - source->sync_dest = this; -} - - -// ---------------------------------------------------------------------------- -// Set chip model. -// ---------------------------------------------------------------------------- -void WaveformGeneratorFP::set_chip_model(chip_model model) -{ - if (model == MOS6581FP) { - wave__ST = wave6581__ST; - wave_P_T = wave6581_P_T; - wave_PS_ = wave6581_PS_; - wave_PST = wave6581_PST; - } - else { - wave__ST = wave8580__ST; - wave_P_T = wave8580_P_T; - wave_PS_ = wave8580_PS_; - wave_PST = wave8580_PST; - } -} - - -// ---------------------------------------------------------------------------- -// Register functions. -// ---------------------------------------------------------------------------- -void WaveformGeneratorFP::writeFREQ_LO(reg8 freq_lo) -{ - freq = (freq & 0xff00) | (freq_lo & 0x00ff); -} - -void WaveformGeneratorFP::writeFREQ_HI(reg8 freq_hi) -{ - freq = ((freq_hi << 8) & 0xff00) | (freq & 0x00ff); -} - -/* The original form was (acc >> 12) >= pw, where truth value is not affected - * by the contents of the low 12 bits. Therefore the lowest bits must be zero - * in the new formulation acc >= (pw << 12). */ -void WaveformGeneratorFP::writePW_LO(reg8 pw_lo) -{ - pw = (pw & 0xf00) | (pw_lo & 0x0ff); - pw_acc_scale = pw << 12; -} - -void WaveformGeneratorFP::writePW_HI(reg8 pw_hi) -{ - pw = ((pw_hi << 8) & 0xf00) | (pw & 0x0ff); - pw_acc_scale = pw << 12; -} - -void WaveformGeneratorFP::writeCONTROL_REG(reg8 control) -{ - waveform = (control >> 4) & 0x0f; - ring_mod = control & 0x04; - sync = control & 0x02; - - reg8 test_next = control & 0x08; - - /* SounDemoN found out that test bit can be used to control the noise - * register. Hear the result in Bojojoing.sid. */ - - // testbit set. invert bit 19 and write it to bit 1 - if (test_next && !test) { - accumulator = 0; - reg24 bit19 = (shift_register >> 19) & 1; - shift_register = (shift_register & 0x7ffffd) | ((bit19^1) << 1); - noise_overwrite_delay = 200000; /* 200 ms, probably too generous? */ - } - // Test bit cleared. - // The accumulator starts counting, and the shift register is reset to - // the value 0x7ffff8. - else if (!test_next && test) { - reg24 bit0 = ((shift_register >> 22) ^ (shift_register >> 17)) & 0x1; - shift_register <<= 1; - shift_register |= bit0; - } - // clear output bits of shift register if noise and other waveforms - // are selected simultaneously - if (waveform > 8) { - shift_register &= 0x7fffff^(1<<22)^(1<<20)^(1<<16)^(1<<13)^(1<<11)^(1<<7)^(1<<4)^(1<<2); - } - - test = test_next; - - /* update noise anyway, just in case the above paths triggered */ - noise_output_cached = outputN___(); -} - -reg8 WaveformGeneratorFP::readOSC() -{ - return output() >> 4; -} - -// ---------------------------------------------------------------------------- -// SID reset. -// ---------------------------------------------------------------------------- -void WaveformGeneratorFP::reset() -{ - accumulator = 0; - previous = 0; - shift_register = 0x7ffffc; - freq = 0; - pw = 0; - pw_acc_scale = 0; - test = 0; - writeCONTROL_REG(0); - msb_rising = false; -} diff --git a/src/sound/resid-fp/wave.h b/src/sound/resid-fp/wave.h deleted file mode 100644 index 64684228b..000000000 --- a/src/sound/resid-fp/wave.h +++ /dev/null @@ -1,457 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#ifndef __WAVE_H__ -#define __WAVE_H__ - -#include "siddefs-fp.h" - -// ---------------------------------------------------------------------------- -// A 24 bit accumulator is the basis for waveform generation. FREQ is added to -// the lower 16 bits of the accumulator each cycle. -// The accumulator is set to zero when TEST is set, and starts counting -// when TEST is cleared. -// The noise waveform is taken from intermediate bits of a 23 bit shift -// register. This register is clocked by bit 19 of the accumulator. -// ---------------------------------------------------------------------------- -class WaveformGeneratorFP -{ -public: - WaveformGeneratorFP(); - - void set_sync_source(WaveformGeneratorFP*); - void set_chip_model(chip_model model); - - RESID_INLINE void clock(); - RESID_INLINE void synchronize(); - void reset(); - - void writeFREQ_LO(reg8); - void writeFREQ_HI(reg8); - void writePW_LO(reg8); - void writePW_HI(reg8); - void writeCONTROL_REG(reg8); - reg8 readOSC(); - - // 12-bit waveform output. - RESID_INLINE reg12 output(); - -protected: - const WaveformGeneratorFP* sync_source; - WaveformGeneratorFP* sync_dest; - - // Tell whether the accumulator MSB was set high on this cycle. - bool msb_rising; - - reg24 accumulator; - reg24 shift_register; - reg12 previous, noise_output_cached; - int noise_overwrite_delay; - - // Fout = (Fn*Fclk/16777216)Hz - reg16 freq; - // PWout = (PWn/40.95)%, also the same << 12 for direct comparison against acc - reg12 pw; reg24 pw_acc_scale; - - // The control register right-shifted 4 bits; used for output function - // table lookup. - reg8 waveform; - - // The remaining control register bits. - reg8 test; - reg8 ring_mod; - reg8 sync; - // The gate bit is handled by the EnvelopeGenerator. - - // 16 possible combinations of waveforms. - RESID_INLINE reg12 output___T(); - RESID_INLINE reg12 output__S_(); - RESID_INLINE reg12 output__ST(); - RESID_INLINE reg12 output_P__(); - RESID_INLINE reg12 output_P_T(); - RESID_INLINE reg12 output_PS_(); - RESID_INLINE reg12 output_PST(); - RESID_INLINE reg12 outputN___(); - RESID_INLINE reg12 outputN__T(); - RESID_INLINE reg12 outputN_S_(); - RESID_INLINE reg12 outputN_ST(); - RESID_INLINE reg12 outputNP__(); - RESID_INLINE reg12 outputNP_T(); - RESID_INLINE reg12 outputNPS_(); - RESID_INLINE reg12 outputNPST(); - - // Sample data for combinations of waveforms. - static reg8 wave6581__ST[]; - static reg8 wave6581_P_T[]; - static reg8 wave6581_PS_[]; - static reg8 wave6581_PST[]; - - static reg8 wave8580__ST[]; - static reg8 wave8580_P_T[]; - static reg8 wave8580_PS_[]; - static reg8 wave8580_PST[]; - - reg8* wave__ST; - reg8* wave_P_T; - reg8* wave_PS_; - reg8* wave_PST; - -friend class VoiceFP; -friend class SIDFP; -}; - -// ---------------------------------------------------------------------------- -// SID clocking - 1 cycle. -// ---------------------------------------------------------------------------- -RESID_INLINE -void WaveformGeneratorFP::clock() -{ - /* no digital operation if test bit is set. Only emulate analog fade. */ - if (test) { - if (noise_overwrite_delay != 0) { - if (-- noise_overwrite_delay == 0) { - shift_register |= 0x7ffffc; - noise_output_cached = outputN___(); - } - } - return; - } - - reg24 accumulator_prev = accumulator; - - // Calculate new accumulator value; - accumulator += freq; - accumulator &= 0xffffff; - - // Check whether the MSB became set high. This is used for synchronization. - msb_rising = !(accumulator_prev & 0x800000) && (accumulator & 0x800000); - - // Shift noise register once for each time accumulator bit 19 is set high. - if (!(accumulator_prev & 0x080000) && (accumulator & 0x080000)) { - reg24 bit0 = ((shift_register >> 22) ^ (shift_register >> 17)) & 0x1; - shift_register <<= 1; - // optimization: fall into the bit bucket - //shift_register &= 0x7fffff; - shift_register |= bit0; - - /* since noise changes relatively infrequently, we'll avoid the relatively - * expensive bit shuffling at output time. */ - noise_output_cached = outputN___(); - } - - // clear output bits of shift register if noise and other waveforms - // are selected simultaneously - if (waveform > 8) { - shift_register &= 0x7fffff^(1<<22)^(1<<20)^(1<<16)^(1<<13)^(1<<11)^(1<<7)^(1<<4)^(1<<2); - noise_output_cached = outputN___(); - } -} - -// ---------------------------------------------------------------------------- -// Synchronize oscillators. -// This must be done after all the oscillators have been clock()'ed since the -// oscillators operate in parallel. -// Note that the oscillators must be clocked exactly on the cycle when the -// MSB is set high for hard sync to operate correctly. See SID::clock(). -// ---------------------------------------------------------------------------- -RESID_INLINE -void WaveformGeneratorFP::synchronize() -{ - // A special case occurs when a sync source is synced itself on the same - // cycle as when its MSB is set high. In this case the destination will - // not be synced. This has been verified by sampling OSC3. - if (msb_rising && sync_dest->sync && !(sync && sync_source->msb_rising)) { - sync_dest->accumulator = 0; - } -} - - -// ---------------------------------------------------------------------------- -// Output functions. -// NB! The output from SID 8580 is delayed one cycle compared to SID 6581, -// this is not modeled. -// ---------------------------------------------------------------------------- - -// Triangle: -// The upper 12 bits of the accumulator are used. -// The MSB is used to create the falling edge of the triangle by inverting -// the lower 11 bits. The MSB is thrown away and the lower 11 bits are -// left-shifted (half the resolution, full amplitude). -// Ring modulation substitutes the MSB with MSB EOR sync_source MSB. -// -RESID_INLINE -reg12 WaveformGeneratorFP::output___T() -{ - reg24 msb = (ring_mod ? accumulator ^ sync_source->accumulator : accumulator) - & 0x800000; - return ((msb ? ~accumulator : accumulator) >> 11) & 0xfff; -} - -// Sawtooth: -// The output is identical to the upper 12 bits of the accumulator. -// -RESID_INLINE -reg12 WaveformGeneratorFP::output__S_() -{ - return accumulator >> 12; -} - -// Pulse: -// The upper 12 bits of the accumulator are used. -// These bits are compared to the pulse width register by a 12 bit digital -// comparator; output is either all one or all zero bits. -// NB! The output is actually delayed one cycle after the compare. -// This is not modeled. -// -// The test bit, when set to one, holds the pulse waveform output at 0xfff -// regardless of the pulse width setting. -// -RESID_INLINE -reg12 WaveformGeneratorFP::output_P__() -{ - return (test || accumulator >= pw_acc_scale) ? 0xfff : 0x000; -} - -// Noise: -// The noise output is taken from intermediate bits of a 23-bit shift register -// which is clocked by bit 19 of the accumulator. -// NB! The output is actually delayed 2 cycles after bit 19 is set high. -// This is not modeled. -// -// Operation: Calculate EOR result, shift register, set bit 0 = result. -// -// ----------------------->--------------------- -// | | -// ----EOR---- | -// | | | -// 2 2 2 1 1 1 1 1 1 1 1 1 1 | -// Register bits: 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 <--- -// | | | | | | | | -// OSC3 bits : 7 6 5 4 3 2 1 0 -// -// Since waveform output is 12 bits the output is left-shifted 4 times. -// -RESID_INLINE -reg12 WaveformGeneratorFP::outputN___() -{ - return - ((shift_register & 0x400000) >> 11) | - ((shift_register & 0x100000) >> 10) | - ((shift_register & 0x010000) >> 7) | - ((shift_register & 0x002000) >> 5) | - ((shift_register & 0x000800) >> 4) | - ((shift_register & 0x000080) >> 1) | - ((shift_register & 0x000010) << 1) | - ((shift_register & 0x000004) << 2); -} - -// Combined waveforms: -// By combining waveforms, the bits of each waveform are effectively short -// circuited. A zero bit in one waveform will result in a zero output bit -// (thus the infamous claim that the waveforms are AND'ed). -// However, a zero bit in one waveform will also affect the neighboring bits -// in the output. The reason for this has not been determined. -// -// Example: -// -// 1 1 -// Bit # 1 0 9 8 7 6 5 4 3 2 1 0 -// ----------------------- -// Sawtooth 0 0 0 1 1 1 1 1 1 0 0 0 -// -// Triangle 0 0 1 1 1 1 1 1 0 0 0 0 -// -// AND 0 0 0 1 1 1 1 1 0 0 0 0 -// -// Output 0 0 0 0 1 1 1 0 0 0 0 0 -// -// -// This behavior would be quite difficult to model exactly, since the SID -// in this case does not act as a digital state machine. Tests show that minor -// (1 bit) differences can actually occur in the output from otherwise -// identical samples from OSC3 when waveforms are combined. To further -// complicate the situation the output changes slightly with time (more -// neighboring bits are successively set) when the 12-bit waveform -// registers are kept unchanged. -// -// It is probably possible to come up with a valid model for the -// behavior, however this would be far too slow for practical use since it -// would have to be based on the mutual influence of individual bits. -// -// The output is instead approximated by using the upper bits of the -// accumulator as an index to look up the combined output in a table -// containing actual combined waveform samples from OSC3. -// These samples are 8 bit, so 4 bits of waveform resolution is lost. -// All OSC3 samples are taken with FREQ=0x1000, adding a 1 to the upper 12 -// bits of the accumulator each cycle for a sample period of 4096 cycles. -// -// Sawtooth+Triangle: -// The sawtooth output is used to look up an OSC3 sample. -// -// Pulse+Triangle: -// The triangle output is right-shifted and used to look up an OSC3 sample. -// The sample is output if the pulse output is on. -// The reason for using the triangle output as the index is to handle ring -// modulation. Only the first half of the sample is used, which should be OK -// since the triangle waveform has half the resolution of the accumulator. -// -// Pulse+Sawtooth: -// The sawtooth output is used to look up an OSC3 sample. -// The sample is output if the pulse output is on. -// -// Pulse+Sawtooth+Triangle: -// The sawtooth output is used to look up an OSC3 sample. -// The sample is output if the pulse output is on. -// -RESID_INLINE -reg12 WaveformGeneratorFP::output__ST() -{ - return wave__ST[output__S_()] << 4; -} - -RESID_INLINE -reg12 WaveformGeneratorFP::output_P_T() -{ - /* ring modulation does something odd with this waveform. But I don't know - * how to emulate it. */ - return (wave_P_T[output___T() >> 1] << 4) & output_P__(); -} - -RESID_INLINE -reg12 WaveformGeneratorFP::output_PS_() -{ - return (wave_PS_[output__S_()] << 4) & output_P__(); -} - -RESID_INLINE -reg12 WaveformGeneratorFP::output_PST() -{ - return (wave_PST[output__S_()] << 4) & output_P__(); -} - -// Combined waveforms including noise: -// All waveform combinations including noise output zero after a few cycles. -// NB! The effects of such combinations are not fully explored. It is claimed -// that the shift register may be filled with zeroes and locked up, which -// seems to be true. -// We have not attempted to model this behavior, suffice to say that -// there is very little audible output from waveform combinations including -// noise. We hope that nobody is actually using it. -// -RESID_INLINE -reg12 WaveformGeneratorFP::outputN__T() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGeneratorFP::outputN_S_() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGeneratorFP::outputN_ST() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGeneratorFP::outputNP__() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGeneratorFP::outputNP_T() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGeneratorFP::outputNPS_() -{ - return 0; -} - -RESID_INLINE -reg12 WaveformGeneratorFP::outputNPST() -{ - return 0; -} - -// ---------------------------------------------------------------------------- -// Select one of 16 possible combinations of waveforms. -// ---------------------------------------------------------------------------- -RESID_INLINE -reg12 WaveformGeneratorFP::output() -{ - switch (waveform) { - case 0x1: - previous = output___T(); - break; - case 0x2: - previous = output__S_(); - break; - case 0x3: - previous = output__ST(); - break; - case 0x4: - previous = output_P__(); - break; - case 0x5: - previous = output_P_T(); - break; - case 0x6: - previous = output_PS_(); - break; - case 0x7: - previous = output_PST(); - break; - case 0x8: - previous = noise_output_cached; - break; - case 0x9: - previous = outputN__T(); - break; - case 0xa: - previous = outputN_S_(); - break; - case 0xb: - previous = outputN_ST(); - break; - case 0xc: - previous = outputNP__(); - break; - case 0xd: - previous = outputNP_T(); - break; - case 0xe: - previous = outputNPS_(); - break; - case 0xf: - previous = outputNPST(); - break; - default: - break; - } - return previous; -} - -#endif // not __WAVE_H__ diff --git a/src/sound/resid-fp/wave6581_PST.cc b/src/sound/resid-fp/wave6581_PST.cc deleted file mode 100644 index 19d2126ef..000000000 --- a/src/sound/resid-fp/wave6581_PST.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGeneratorFP::wave6581_PST[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, -/* 0x7f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, -/* 0x7f8: */ 0x00, 0x00, 0x00, 0x78, 0x78, 0x7e, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, -/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, -/* 0xff8: */ 0x00, 0x00, 0x00, 0x78, 0x78, 0x7e, 0x7f, 0x7f, -}; diff --git a/src/sound/resid-fp/wave6581_PST.dat b/src/sound/resid-fp/wave6581_PST.dat deleted file mode 100644 index 5afe75e22e10a8f0ea80f90eade17858e9123946..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZP=1*0J_8UiCV1nftu$4C7=8UiCQ1QeitHeg_2sHmu`uZQwSsnHM^4S|st0;Bc+ P$cyt)ACKG+z^MNL_wxn! diff --git a/src/sound/resid-fp/wave6581_PS_.cc b/src/sound/resid-fp/wave6581_PS_.cc deleted file mode 100644 index bf133e542..000000000 --- a/src/sound/resid-fp/wave6581_PS_.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGeneratorFP::wave6581_PS_[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, -/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3f, -/* 0x3f8: */ 0x00, 0x30, 0x38, 0x3f, 0x3e, 0x3f, 0x3f, 0x3f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, -/* 0x5f8: */ 0x00, 0x40, 0x40, 0x5f, 0x5c, 0x5f, 0x5f, 0x5f, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6b, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x6d, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x6e, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x6f, -/* 0x6f8: */ 0x00, 0x60, 0x60, 0x6f, 0x60, 0x6f, 0x6f, 0x6f, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x738: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x60, 0x73, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x758: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x75, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x768: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x76, -/* 0x770: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x77, -/* 0x778: */ 0x00, 0x70, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x798: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x79, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x70, 0x70, 0x7a, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7b, -/* 0x7b8: */ 0x40, 0x70, 0x70, 0x7b, 0x78, 0x7b, 0x7b, 0x7b, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7c, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7d, -/* 0x7d8: */ 0x40, 0x70, 0x78, 0x7d, 0x78, 0x7d, 0x7d, 0x7d, -/* 0x7e0: */ 0x00, 0x40, 0x40, 0x78, 0x60, 0x78, 0x78, 0x7e, -/* 0x7e8: */ 0x60, 0x78, 0x78, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, -/* 0x7f0: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, -/* 0x7f8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x1f, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2f, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x3f, -/* 0xbf8: */ 0x00, 0x30, 0x38, 0x3f, 0x3e, 0x3f, 0x3f, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5d, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x5f, -/* 0xdf8: */ 0x00, 0x40, 0x40, 0x5f, 0x5c, 0x5f, 0x5f, 0x5f, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6b, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x6d, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x6e, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x6f, -/* 0xef8: */ 0x00, 0x60, 0x60, 0x6f, 0x60, 0x6f, 0x6f, 0x6f, -/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x60, 0x73, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x60, 0x60, 0x75, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x76, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x77, -/* 0xf78: */ 0x00, 0x70, 0x70, 0x77, 0x70, 0x77, 0x77, 0x77, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x79, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x70, 0x70, 0x7a, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7b, -/* 0xfb8: */ 0x40, 0x70, 0x70, 0x7b, 0x78, 0x7b, 0x7b, 0x7b, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x70, 0x7c, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7d, -/* 0xfd8: */ 0x40, 0x70, 0x78, 0x7d, 0x78, 0x7d, 0x7d, 0x7d, -/* 0xfe0: */ 0x00, 0x40, 0x40, 0x78, 0x60, 0x78, 0x78, 0x7e, -/* 0xfe8: */ 0x60, 0x78, 0x78, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, -/* 0xff0: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7c, 0x7f, 0x7f, 0x7f, -/* 0xff8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, -}; diff --git a/src/sound/resid-fp/wave6581_PS_.dat b/src/sound/resid-fp/wave6581_PS_.dat deleted file mode 100644 index ea2fb9c5397c69f7cfcb23df61182876a599071f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZP=*?@h3z0XXc{S@kFlBdvqO0`qyeg;Mg9iUI4eoD2QQ)qxS0sXdU@^%oufjxtP zg}t4lp2c^Cy!2V#S0kormx2doFAzo4Lsfq|ib zp`f7Jp`f6;qPn^oDqjE -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGeneratorFP::wave6581_P_T[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x38, 0x3f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x5f, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x378: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x60, 0x6f, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x70, 0x77, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x70, 0x40, 0x70, 0x70, 0x7b, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x70, -/* 0x3e8: */ 0x00, 0x40, 0x40, 0x70, 0x60, 0x70, 0x78, 0x7d, -/* 0x3f0: */ 0x00, 0x40, 0x60, 0x78, 0x60, 0x78, 0x78, 0x7e, -/* 0x3f8: */ 0x70, 0x7c, 0x7c, 0x7f, 0x7e, 0x7f, 0x7f, 0x7f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x9f, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x578: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xa0, 0xaf, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, -/* 0x5b8: */ 0x00, 0x80, 0x80, 0xa0, 0x80, 0xa0, 0xb0, 0xb7, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xa0, -/* 0x5d8: */ 0x00, 0x80, 0x80, 0xa0, 0x80, 0xb0, 0xb0, 0xbb, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xb0, -/* 0x5e8: */ 0x80, 0x80, 0x80, 0xb0, 0x80, 0xb0, 0xb8, 0xbd, -/* 0x5f0: */ 0x80, 0x80, 0x80, 0xb8, 0xa0, 0xb8, 0xb8, 0xbe, -/* 0x5f8: */ 0xa0, 0xb8, 0xbc, 0xbf, 0xbe, 0xbf, 0xbf, 0xbf, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x670: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x678: */ 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x698: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0xc0, 0xc0, -/* 0x6b8: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd7, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0x6d0: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, -/* 0x6d8: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd0, 0xdb, -/* 0x6e0: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xd0, -/* 0x6e8: */ 0x80, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd8, 0xdd, -/* 0x6f0: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd8, 0xd8, 0xde, -/* 0x6f8: */ 0xc0, 0xd8, 0xdc, 0xdf, 0xdc, 0xdf, 0xdf, 0xdf, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x718: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x728: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x730: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x738: */ 0x80, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe7, -/* 0x740: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0xc0, -/* 0x748: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x750: */ 0x00, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xe0, -/* 0x758: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xeb, -/* 0x760: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0x768: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xed, -/* 0x770: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, 0xe8, 0xee, -/* 0x778: */ 0xe0, 0xe8, 0xec, 0xef, 0xec, 0xef, 0xef, 0xef, -/* 0x780: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0x788: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xf0, -/* 0x790: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, -/* 0x798: */ 0xc0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf3, -/* 0x7a0: */ 0x80, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xf0, -/* 0x7a8: */ 0xc0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf5, -/* 0x7b0: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf6, -/* 0x7b8: */ 0xf0, 0xf0, 0xf4, 0xf7, 0xf4, 0xf7, 0xf7, 0xf7, -/* 0x7c0: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, -/* 0x7c8: */ 0xe0, 0xe0, 0xe0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf9, -/* 0x7d0: */ 0xe0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xfa, -/* 0x7d8: */ 0xf0, 0xf8, 0xf8, 0xfb, 0xf8, 0xfb, 0xfb, 0xfb, -/* 0x7e0: */ 0xe0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xfc, 0xfc, -/* 0x7e8: */ 0xf8, 0xfc, 0xfc, 0xfd, 0xfc, 0xfd, 0xfd, 0xfd, -/* 0x7f0: */ 0xf8, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0x7f8: */ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -/* 0x800: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, -/* 0x808: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xf8, -/* 0x810: */ 0xfd, 0xfd, 0xfd, 0xfc, 0xfd, 0xfc, 0xfc, 0xf8, -/* 0x818: */ 0xfc, 0xfc, 0xfc, 0xf0, 0xf8, 0xf0, 0xf0, 0xe0, -/* 0x820: */ 0xfb, 0xfb, 0xfb, 0xf8, 0xfb, 0xf8, 0xf8, 0xf0, -/* 0x828: */ 0xfa, 0xf8, 0xf8, 0xf0, 0xf8, 0xf0, 0xf0, 0xe0, -/* 0x830: */ 0xf9, 0xf8, 0xf8, 0xf0, 0xf8, 0xf0, 0xe0, 0xe0, -/* 0x838: */ 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, -/* 0x840: */ 0xf7, 0xf7, 0xf7, 0xf4, 0xf7, 0xf4, 0xf0, 0xf0, -/* 0x848: */ 0xf6, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, -/* 0x850: */ 0xf5, 0xf0, 0xf0, 0xe0, 0xf0, 0xe0, 0xe0, 0xc0, -/* 0x858: */ 0xf0, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xc0, 0x80, -/* 0x860: */ 0xf3, 0xf0, 0xf0, 0xe0, 0xf0, 0xe0, 0xe0, 0xc0, -/* 0x868: */ 0xf0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, -/* 0x870: */ 0xf0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, -/* 0x878: */ 0xc0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0x880: */ 0xef, 0xef, 0xef, 0xec, 0xef, 0xec, 0xe8, 0xe0, -/* 0x888: */ 0xee, 0xe8, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, -/* 0x890: */ 0xed, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, -/* 0x898: */ 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, -/* 0x8a0: */ 0xeb, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, -/* 0x8a8: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x8b0: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x8b8: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0xe7, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xc0, 0x80, -/* 0x8c8: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x8d0: */ 0xe0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x8d8: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0xe0, 0xc0, 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x900: */ 0xdf, 0xdf, 0xdf, 0xdc, 0xdf, 0xdc, 0xd8, 0xc0, -/* 0x908: */ 0xde, 0xd8, 0xd8, 0xc0, 0xd8, 0xc0, 0xc0, 0xc0, -/* 0x910: */ 0xdd, 0xd8, 0xd0, 0xc0, 0xd0, 0xc0, 0xc0, 0x80, -/* 0x918: */ 0xd0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x920: */ 0xdb, 0xd0, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, -/* 0x928: */ 0xc0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x00, -/* 0x930: */ 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0x938: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0xd7, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, -/* 0x948: */ 0xc0, 0xc0, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x950: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x958: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x968: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x980: */ 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x00, -/* 0x988: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x990: */ 0xc0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0xc0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c0: */ 0xc0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa00: */ 0xbf, 0xbf, 0xbf, 0xbe, 0xbf, 0xbc, 0xbc, 0xa0, -/* 0xa08: */ 0xbe, 0xbc, 0xb8, 0xa0, 0xb8, 0xa0, 0x80, 0x80, -/* 0xa10: */ 0xbd, 0xb8, 0xb0, 0x80, 0xb0, 0x80, 0x80, 0x80, -/* 0xa18: */ 0xb0, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0xa20: */ 0xbb, 0xb0, 0xb0, 0x80, 0xa0, 0x80, 0x80, 0x00, -/* 0xa28: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xa30: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0xb7, 0xb0, 0xa0, 0x80, 0xa0, 0x80, 0x80, 0x00, -/* 0xa48: */ 0xa0, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa80: */ 0xaf, 0xa0, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x00, -/* 0xa88: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb00: */ 0x9f, 0x90, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb80: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc00: */ 0x7f, 0x7f, 0x7f, 0x7e, 0x7f, 0x7c, 0x7c, 0x70, -/* 0xc08: */ 0x7e, 0x7c, 0x78, 0x60, 0x78, 0x60, 0x60, 0x00, -/* 0xc10: */ 0x7d, 0x78, 0x78, 0x60, 0x70, 0x40, 0x40, 0x00, -/* 0xc18: */ 0x70, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x7b, 0x78, 0x70, 0x40, 0x70, 0x40, 0x00, 0x00, -/* 0xc28: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x77, 0x70, 0x70, 0x00, 0x60, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc80: */ 0x6f, 0x60, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd00: */ 0x5f, 0x58, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe00: */ 0x3f, 0x3c, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xff8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/src/sound/resid-fp/wave6581_P_T.dat b/src/sound/resid-fp/wave6581_P_T.dat deleted file mode 100644 index 1cc8874da796bf210ffddb17d0382a86763bcc81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZP=1tT{E6fEpVuICvX7#tkp>Fj?8sC^(hfgvFwAIir?fz%<(B|teKI)Ndfpd8AF zQ6O;;8$=g46ckj0I1CI91q==j1qlTewG0jk6$up;bpy|2^$__1BO55RnUH>T zc^Dr=H#9Uf%pWlOLAEbgu%3YZAa^2^G&F$t4Gawp3qZJG!G`TnNrX59144eohTRMd z3?Q2}G&D49XxOl0Z$m@Fjs-h*>|3y7&;EV;_wR@5Czm>aS7Sp1vOLILAU=d{XgF}- zz=88<`a%8x34v&cIuH-!ClH31*TB$l-~d?nfeY6m(hOkrAR`$X8o+X3`3o0rL-`jP z4ji~};KGf&2SD_V8}|;}xO4x`{rmT!`e78v91t5sgN%Cs;()>sYR&@~-EiQ*g98s9 zJcr4_#9{P-0|y>Fc<|sg$Pf@4%zN%)&9zkmGx{Tssn^XJE(KY#!H{rmUFpMMbW9|b_f{{8v!_wV07f5FQCeE9LnJ2QC~q&;Y_9^KM_b0Cot-?I8Yv1F%d8(#^nd9V`t>at+`_2vP&G1B5{; z(D^WNkQ@k~2biD5C-vKG>8qtP-8$$ stT;a*0jwXU4n|{DOasCA2nPm`oghpD;|INw_BIBC-i@OUq+JLA09r(7w*UYD diff --git a/src/sound/resid-fp/wave6581__ST.cc b/src/sound/resid-fp/wave6581__ST.cc deleted file mode 100644 index d193550f2..000000000 --- a/src/sound/resid-fp/wave6581__ST.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGeneratorFP::wave6581__ST[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -/* 0x3f8: */ 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x3f, 0x3f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0x7e8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0x7f0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, -/* 0x7f8: */ 0x3e, 0x3e, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -/* 0xbf8: */ 0x1e, 0x1e, 0x1e, 0x1e, 0x1f, 0x1f, 0x3f, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xf00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0xfe8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0xff0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, -/* 0xff8: */ 0x3e, 0x3e, 0x3f, 0x3f, 0x7f, 0x7f, 0x7f, 0x7f, -}; diff --git a/src/sound/resid-fp/wave6581__ST.dat b/src/sound/resid-fp/wave6581__ST.dat deleted file mode 100644 index 2e5d9872c4c49b4edaa126cdad13263d54bd916b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZP=P{7Pgq4kWE=x1kVXQxCz0|Ns^_A@XHod5aw`1ttw`S~gIKZV){&i^2XkHq+w zfdV->IXQWGdwWng3>+Sfe+t8%?D7Yi|K%yPpF-`U@lRm@5{!QfG++Y-c6Rpm_4W1j z6xvUr_R;vKFaQb0KQ8m3`G2(j#}z=tiIW}v5aa2e{-M>s%xL}3z%UZqe~@&?zyQtv ZqxC;5K**y9ef~$Q{w<)@zYVPZ2LK$87##or diff --git a/src/sound/resid-fp/wave8580_PST.cc b/src/sound/resid-fp/wave8580_PST.cc deleted file mode 100644 index 51ae21612..000000000 --- a/src/sound/resid-fp/wave8580_PST.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGeneratorFP::wave8580_PST[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x70, -/* 0x7f0: */ 0x60, 0x20, 0x70, 0x70, 0x70, 0x70, 0x70, 0x78, -/* 0x7f8: */ 0x78, 0x78, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1e, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xdf8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x8c, 0x9f, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe80: */ 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, -/* 0xe88: */ 0x80, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xea0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xea8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xeb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xeb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xec0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xec8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xed0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xed8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xee0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xee8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0xef0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xef8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, -/* 0xf00: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf08: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf10: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf18: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf20: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf28: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf30: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf38: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf40: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf48: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf50: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf58: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf68: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0xf70: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, -/* 0xf80: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf88: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf90: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf98: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xfa0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xfa8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xfb0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, -/* 0xfb8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfc0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfc8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfd0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfd8: */ 0xf0, 0xf0, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfe0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfe8: */ 0xf8, 0xf8, 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0xff0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, -/* 0xff8: */ 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -}; diff --git a/src/sound/resid-fp/wave8580_PST.dat b/src/sound/resid-fp/wave8580_PST.dat deleted file mode 100644 index 22706cf250b5c0e602bdd8db33b83aed623b1c82..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZP=1*0J_8UiCV1ms7m$4C7=8UiCP1QZGq6be9~qN1Xvrmn8Oe&mJ0sEh diff --git a/src/sound/resid-fp/wave8580_PS_.cc b/src/sound/resid-fp/wave8580_PS_.cc deleted file mode 100644 index e33a2cee5..000000000 --- a/src/sound/resid-fp/wave8580_PS_.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGeneratorFP::wave8580_PS_[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x1f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3b, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, -/* 0x3f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, -/* 0x3f8: */ 0x00, 0x0c, 0x1c, 0x3f, 0x1e, 0x3f, 0x3f, 0x3f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5e, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, -/* 0x5f8: */ 0x00, 0x00, 0x00, 0x5f, 0x0c, 0x5f, 0x5f, 0x5f, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6e, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, -/* 0x6f8: */ 0x00, 0x40, 0x40, 0x6f, 0x40, 0x6f, 0x6f, 0x6f, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x61, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x768: */ 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x40, 0x70, -/* 0x770: */ 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x70, -/* 0x778: */ 0x40, 0x60, 0x60, 0x77, 0x60, 0x77, 0x77, 0x77, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x60, -/* 0x798: */ 0x00, 0x40, 0x40, 0x60, 0x40, 0x60, 0x60, 0x79, -/* 0x7a0: */ 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x60, -/* 0x7a8: */ 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x78, -/* 0x7b0: */ 0x40, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, -/* 0x7b8: */ 0x60, 0x70, 0x70, 0x78, 0x70, 0x79, 0x7b, 0x7b, -/* 0x7c0: */ 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x70, -/* 0x7c8: */ 0x60, 0x60, 0x60, 0x70, 0x60, 0x70, 0x70, 0x7c, -/* 0x7d0: */ 0x60, 0x70, 0x70, 0x70, 0x70, 0x70, 0x70, 0x7c, -/* 0x7d8: */ 0x70, 0x78, 0x78, 0x7c, 0x78, 0x7c, 0x7c, 0x7d, -/* 0x7e0: */ 0x70, 0x78, 0x78, 0x78, 0x78, 0x78, 0x78, 0x7c, -/* 0x7e8: */ 0x78, 0x7c, 0x7c, 0x7e, 0x7c, 0x7e, 0x7e, 0x7e, -/* 0x7f0: */ 0x7c, 0x7c, 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, -/* 0x7f8: */ 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x8d, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x8e, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x8f, -/* 0x9f8: */ 0x80, 0x80, 0x80, 0x9f, 0x80, 0x9f, 0x9f, 0x9f, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x87, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x83, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -/* 0xad8: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, -/* 0xae0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xae8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x84, -/* 0xaf0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x87, -/* 0xaf8: */ 0x80, 0x80, 0x80, 0x87, 0x80, 0x8f, 0xaf, 0xaf, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0x80, -/* 0xb28: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x83, -/* 0xb40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, -/* 0xb60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, -/* 0xb70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, -/* 0xb78: */ 0x80, 0x80, 0x80, 0xa0, 0x80, 0xa3, 0xb7, 0xb7, -/* 0xb80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb1, -/* 0xba0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xba8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb0, -/* 0xbb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xb0, -/* 0xbb8: */ 0x80, 0xa0, 0xa0, 0xb0, 0xa0, 0xb8, 0xb9, 0xbb, -/* 0xbc0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, -/* 0xbc8: */ 0x80, 0x80, 0x80, 0xa0, 0x80, 0xa0, 0xa0, 0xb8, -/* 0xbd0: */ 0x80, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xb8, -/* 0xbd8: */ 0xa0, 0xb0, 0xb0, 0xb8, 0xb0, 0xbc, 0xbc, 0xbd, -/* 0xbe0: */ 0xa0, 0xb0, 0xb0, 0xb0, 0xb0, 0xb8, 0xb8, 0xbc, -/* 0xbe8: */ 0xb0, 0xb8, 0xb8, 0xbc, 0xb8, 0xbc, 0xbe, 0xbe, -/* 0xbf0: */ 0xb8, 0xbc, 0xbc, 0xbe, 0xbc, 0xbe, 0xbe, 0xbf, -/* 0xbf8: */ 0xbe, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, -/* 0xc10: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc18: */ 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc28: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, -/* 0xc40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc7, -/* 0xc80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xc98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xca0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xca8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xcb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xcb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc3, -/* 0xcc0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xcc8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xcd0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xcd8: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc1, -/* 0xce0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xce8: */ 0x80, 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xcf0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc7, -/* 0xcf8: */ 0xc0, 0xc0, 0xc0, 0xc7, 0xc0, 0xcf, 0xcf, 0xcf, -/* 0xd00: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xd08: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xd10: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xd18: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xd20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xd28: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xd30: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0xd38: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc3, -/* 0xd40: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0xd48: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, -/* 0xd50: */ 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd58: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, -/* 0xd60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd68: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd70: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd78: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc1, 0xc7, 0xd7, -/* 0xd80: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd88: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd90: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xd98: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xda0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xda8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, -/* 0xdb0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, -/* 0xdb8: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd8, 0xdb, -/* 0xdc0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xdc8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd8, -/* 0xdd0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd8, -/* 0xdd8: */ 0xc0, 0xc0, 0xc0, 0xd8, 0xd0, 0xd8, 0xd8, 0xdd, -/* 0xde0: */ 0xc0, 0xc0, 0xc0, 0xd0, 0xc0, 0xd0, 0xd0, 0xdc, -/* 0xde8: */ 0xd0, 0xd8, 0xd8, 0xdc, 0xd8, 0xdc, 0xdc, 0xde, -/* 0xdf0: */ 0xd8, 0xdc, 0xdc, 0xde, 0xdc, 0xde, 0xde, 0xdf, -/* 0xdf8: */ 0xde, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, 0xdf, -/* 0xe00: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe08: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe10: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe18: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe20: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe28: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe30: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe38: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe3, -/* 0xe40: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe48: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xe50: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0xe58: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe1, -/* 0xe60: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0xe68: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xe70: */ 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xe78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe1, 0xe3, 0xe7, -/* 0xe80: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0xe88: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0xe90: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0xe98: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xea0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xea8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xeb0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xeb8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xeb, -/* 0xec0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xec8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xed0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xed8: */ 0xe0, 0xe0, 0xe0, 0xe8, 0xe0, 0xe8, 0xe8, 0xed, -/* 0xee0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xec, -/* 0xee8: */ 0xe0, 0xe0, 0xe0, 0xec, 0xe8, 0xec, 0xec, 0xee, -/* 0xef0: */ 0xe8, 0xe8, 0xe8, 0xec, 0xec, 0xee, 0xee, 0xef, -/* 0xef8: */ 0xec, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, 0xef, -/* 0xf00: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf08: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf10: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf18: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, -/* 0xf20: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, -/* 0xf28: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xe0, 0xf0, 0xf0, 0xf0, -/* 0xf30: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf38: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf3, -/* 0xf40: */ 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf48: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf50: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf58: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf5, -/* 0xf60: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf68: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, 0xf4, 0xf6, -/* 0xf70: */ 0xf0, 0xf0, 0xf0, 0xf4, 0xf0, 0xf4, 0xf6, 0xf7, -/* 0xf78: */ 0xf4, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, 0xf7, 0xf7, -/* 0xf80: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, -/* 0xf88: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf8, 0xf8, 0xf8, -/* 0xf90: */ 0xf0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf8, -/* 0xf98: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf9, -/* 0xfa0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfa8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xfa, -/* 0xfb0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xfb, -/* 0xfb8: */ 0xf8, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, 0xfb, 0xfb, -/* 0xfc0: */ 0xf8, 0xf8, 0xf8, 0xfc, 0xf8, 0xfc, 0xfc, 0xfc, -/* 0xfc8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0xfd0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, -/* 0xfd8: */ 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, 0xfd, 0xfd, -/* 0xfe0: */ 0xfc, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0xfe8: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0xff0: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -/* 0xff8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -}; diff --git a/src/sound/resid-fp/wave8580_PS_.dat b/src/sound/resid-fp/wave8580_PS_.dat deleted file mode 100644 index 9a20a9eee6211222f5b21d98b9223e5aa1b3891c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZP=Sinr7^^6qi=ciCVrP|pkG=Na};SV2nc6kczr&K#3_Y*RokbeCBXJDi>{t1{* z$oUN71XbWyV2xjz!4^&44$8M@;E}PHv$wa0@&}3{6n})=MQQjCbo^7A|G5bS5Eq(! z9F!l=z`zjC6CV$vp+aO)l!m`MS+*iHIU|@@S*d8Ec~E{ngM&l9LwbUYAR}KY6~jB0K~4VsjI82si~=} ztFNyI;rjae|1gUOh#u(t-%p{xDNX14jeds;QaaXP;U%`$6Jhu?CPR0v|*$v9Jyvzm7!| zpU?%UB#6Fn;KGgDP(F;h0cC*b8y9ZexO?EhfeQyNT)1=L#*I5S?%cTt!guc7yMOOK z1VGi3OFhP+@xg%u2Ob=F@Zcd-9?XC6-~mVsL_zSw$Ip@F4}jz$`XKUz$=7(4ym;{9 z#apQSn+Fdbym|5F&AS&bK;*mkZ{9-yR2~=g0V)BaKRo#G0Ze~DfX@#efJ6}jXsoX& z{4Za=efaR<%ZD%DzJK}l?K=oS<$r+bA3s3!j}JfK;3u2~Vf=znKYsuC_3JkX{P^+X Y&yPPC;P0P5fBu5NpFjUlz<)FV00fcV761SM diff --git a/src/sound/resid-fp/wave8580_P_T.cc b/src/sound/resid-fp/wave8580_P_T.cc deleted file mode 100644 index 206a91728..000000000 --- a/src/sound/resid-fp/wave8580_P_T.cc +++ /dev/null @@ -1,536 +0,0 @@ -// --------------------------------------------------------------------------- -// This file is part of reSID, a MOS6581 SID emulator engine. -// Copyright (C) 2004 Dag Lem -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGeneratorFP::wave8580_P_T[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x00, 0x00, 0x00, 0x1c, 0x00, 0x3c, 0x3f, 0x3f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x5e, 0x5f, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x378: */ 0x00, 0x00, 0x00, 0x40, 0x40, 0x60, 0x60, 0x6f, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x40, 0x60, -/* 0x3b8: */ 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x70, 0x77, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, -/* 0x3c8: */ 0x40, 0x40, 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, -/* 0x3d0: */ 0x40, 0x40, 0x40, 0x60, 0x60, 0x60, 0x60, 0x70, -/* 0x3d8: */ 0x60, 0x60, 0x60, 0x70, 0x70, 0x70, 0x78, 0x7b, -/* 0x3e0: */ 0x60, 0x60, 0x60, 0x70, 0x60, 0x70, 0x70, 0x70, -/* 0x3e8: */ 0x70, 0x70, 0x70, 0x78, 0x78, 0x78, 0x78, 0x7c, -/* 0x3f0: */ 0x78, 0x78, 0x78, 0x7c, 0x78, 0x7c, 0x7c, 0x7e, -/* 0x3f8: */ 0x7c, 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x4d8: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x4e8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x4f0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x4f8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x8e, 0x9f, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, -/* 0x530: */ 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x538: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x540: */ 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, -/* 0x548: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x550: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x558: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x560: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x568: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x570: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x578: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xaf, -/* 0x580: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x588: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x590: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x598: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5a0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5a8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5b0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5b8: */ 0x80, 0x80, 0x80, 0xa0, 0xa0, 0xa0, 0xa0, 0xb7, -/* 0x5c0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x5c8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, -/* 0x5d0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xa0, 0xa0, -/* 0x5d8: */ 0xa0, 0xa0, 0xa0, 0xb0, 0xa0, 0xb0, 0xb0, 0xbb, -/* 0x5e0: */ 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xb0, 0xb0, -/* 0x5e8: */ 0xa0, 0xb0, 0xb0, 0xb8, 0xb0, 0xb8, 0xb8, 0xbc, -/* 0x5f0: */ 0xb0, 0xb8, 0xb8, 0xb8, 0xb8, 0xbc, 0xbc, 0xbe, -/* 0x5f8: */ 0xbc, 0xbc, 0xbe, 0xbf, 0xbe, 0xbf, 0xbf, 0xbf, -/* 0x600: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x608: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x610: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x618: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x620: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x628: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x630: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x638: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0x640: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x648: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x650: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, -/* 0x658: */ 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x660: */ 0x80, 0x80, 0x80, 0xc0, 0x80, 0xc0, 0xc0, 0xc0, -/* 0x668: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x670: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x678: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xcf, -/* 0x680: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0xc0, 0xc0, -/* 0x688: */ 0xc0, 0x80, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x690: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x698: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6a0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6a8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6b0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6b8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd7, -/* 0x6c0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6c8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6d0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x6d8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, 0xd0, 0xd9, -/* 0x6e0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xd0, -/* 0x6e8: */ 0xc0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd8, 0xd8, 0xdc, -/* 0x6f0: */ 0xd0, 0xd0, 0xd8, 0xd8, 0xd8, 0xdc, 0xdc, 0xde, -/* 0x6f8: */ 0xdc, 0xdc, 0xde, 0xdf, 0xde, 0xdf, 0xdf, 0xdf, -/* 0x700: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x708: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x710: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x718: */ 0xc0, 0xc0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0x720: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe0, -/* 0x728: */ 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x730: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x738: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe7, -/* 0x740: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x748: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x750: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x758: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, -/* 0x760: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x768: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe8, 0xec, -/* 0x770: */ 0xe0, 0xe0, 0xe0, 0xe8, 0xe8, 0xe8, 0xec, 0xee, -/* 0x778: */ 0xec, 0xec, 0xec, 0xee, 0xee, 0xef, 0xef, 0xef, -/* 0x780: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x788: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, -/* 0x790: */ 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x798: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x7a0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x7a8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, -/* 0x7b0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf4, -/* 0x7b8: */ 0xf0, 0xf4, 0xf4, 0xf6, 0xf6, 0xf7, 0xf7, 0xf7, -/* 0x7c0: */ 0xf0, 0xf0, 0xf0, 0xf8, 0xf0, 0xf8, 0xf8, 0xf8, -/* 0x7c8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0x7d0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0x7d8: */ 0xf8, 0xf8, 0xf8, 0xfa, 0xfa, 0xfb, 0xfb, 0xfb, -/* 0x7e0: */ 0xf8, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0x7e8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfd, 0xfd, 0xfd, -/* 0x7f0: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0x7f8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -/* 0x800: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -/* 0x808: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, -/* 0x810: */ 0xfd, 0xfd, 0xfd, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0x818: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xf8, -/* 0x820: */ 0xfb, 0xfb, 0xfb, 0xfa, 0xfa, 0xf8, 0xf8, 0xf8, -/* 0x828: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0x830: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0x838: */ 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x840: */ 0xf7, 0xf7, 0xf7, 0xf6, 0xf6, 0xf4, 0xf4, 0xf0, -/* 0x848: */ 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x850: */ 0xf4, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x858: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x860: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0x868: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, -/* 0x870: */ 0xf0, 0xf0, 0xf0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x878: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x880: */ 0xef, 0xef, 0xef, 0xee, 0xee, 0xec, 0xec, 0xe8, -/* 0x888: */ 0xee, 0xec, 0xe8, 0xe8, 0xe8, 0xe0, 0xe0, 0xe0, -/* 0x890: */ 0xec, 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x898: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8a0: */ 0xe8, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8a8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8b0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8b8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8c0: */ 0xe7, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8c8: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0x8d0: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, -/* 0x8d8: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x8e0: */ 0xe0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x8e8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x8f0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x8f8: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x900: */ 0xdf, 0xdf, 0xdf, 0xde, 0xdf, 0xde, 0xdc, 0xdc, -/* 0x908: */ 0xde, 0xdc, 0xdc, 0xd8, 0xd8, 0xd8, 0xd0, 0xd0, -/* 0x910: */ 0xdc, 0xd8, 0xd8, 0xd0, 0xd0, 0xd0, 0xd0, 0xc0, -/* 0x918: */ 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x920: */ 0xd9, 0xd0, 0xd0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x928: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x930: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x938: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x940: */ 0xd7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x948: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x950: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x958: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x960: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x968: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x970: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, -/* 0x978: */ 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x980: */ 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x988: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x990: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0x998: */ 0xc0, 0xc0, 0xc0, 0x80, 0xc0, 0x80, 0x80, 0x80, -/* 0x9a0: */ 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0x80, 0x80, -/* 0x9a8: */ 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9b0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9b8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9c0: */ 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9c8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9d0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9d8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9e0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9e8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9f0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0x9f8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa00: */ 0xbf, 0xbf, 0xbf, 0xbe, 0xbf, 0xbe, 0xbc, 0xbc, -/* 0xa08: */ 0xbe, 0xbc, 0xbc, 0xb8, 0xb8, 0xb8, 0xb8, 0xb0, -/* 0xa10: */ 0xbc, 0xb8, 0xb8, 0xb0, 0xb8, 0xb0, 0xb0, 0xb0, -/* 0xa18: */ 0xb0, 0xb0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, 0xa0, -/* 0xa20: */ 0xbb, 0xb0, 0xb0, 0xa0, 0xb0, 0xa0, 0xa0, 0xa0, -/* 0xa28: */ 0xa0, 0xa0, 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa30: */ 0xa0, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa38: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa40: */ 0xb7, 0xb0, 0xa0, 0xa0, 0xa0, 0x80, 0x80, 0x80, -/* 0xa48: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa50: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa58: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa60: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa68: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa70: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa78: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa80: */ 0xaf, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xa98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xaa0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xaa8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xab0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xab8: */ 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xac8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, -/* 0xad0: */ 0x80, 0x80, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb00: */ 0x9f, 0x9e, 0x88, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb08: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb10: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xb18: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x80, 0x80, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb80: */ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc00: */ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7e, 0x7e, 0x7c, -/* 0xc08: */ 0x7e, 0x7c, 0x7c, 0x78, 0x7c, 0x78, 0x78, 0x78, -/* 0xc10: */ 0x7c, 0x78, 0x78, 0x78, 0x78, 0x70, 0x70, 0x70, -/* 0xc18: */ 0x78, 0x70, 0x70, 0x60, 0x70, 0x60, 0x60, 0x60, -/* 0xc20: */ 0x7b, 0x78, 0x70, 0x70, 0x70, 0x60, 0x60, 0x60, -/* 0xc28: */ 0x70, 0x60, 0x60, 0x60, 0x60, 0x40, 0x40, 0x40, -/* 0xc30: */ 0x60, 0x60, 0x60, 0x40, 0x40, 0x40, 0x40, 0x40, -/* 0xc38: */ 0x40, 0x40, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x77, 0x70, 0x60, 0x60, 0x60, 0x60, 0x40, 0x40, -/* 0xc48: */ 0x60, 0x40, 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x40, 0x40, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc80: */ 0x6f, 0x64, 0x60, 0x40, 0x40, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd00: */ 0x5f, 0x5e, 0x4c, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe00: */ 0x3f, 0x3f, 0x3e, 0x00, 0x1c, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xea8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xeb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xec8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xed8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xee8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xef8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf00: */ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xf98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xfe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xff0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xff8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; diff --git a/src/sound/resid-fp/wave8580_P_T.dat b/src/sound/resid-fp/wave8580_P_T.dat deleted file mode 100644 index 5423dd9ac0a80527813e1c85b3b5b60fd0ffe753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZP=*?@fndtZjZ#@>De`=5be90Q1m^zWD^~hnWXb)&MdR-8hi>AaQh)iR7;*QXMvB3l=O`upLce z0fY~dTCickh7G&HtOXlD>>V3+?AWtm$BrF4_UzfWXV1R<`}XhO4^dApdEfvJod+5k z4uC;JL&E_m6U;{=&O`JcIDk(PnjU2Cbz}|(`@)5rP_YXKE?l^9;l_c2Od0l0F`)f0K|EK0iI)spbES|~mO{{069|Iq+c z_|MckkZ3dGYSe zix;54dIKVmRG@K@WFSoJ5pduDJmTO{2#rZJ>i+%v_wIvI!<{=fZrr$V;SPwnaN)oO zsJfdMU@WKr8ihXrqA5mjL0JNv^v@&2&{++j%monyWg@V03<8vMFa${u*uQ`OzWt!m zV9y><$*^J1jvX6zYybgB$*~($bU>J3Q=tV6m<=MfZ&p(REnFlJ|L3|Jm)dR8<$^=uODhOQ+EI}keiC!YDz^e?@ z2B@#AtEsE0fi?~*Dk=&J3MvW;z>SD%5C`0dfHy8cEe#N605wL+K`jkXYXmF;YSe&4 v5mut|5aKXaeo6wQQ3Dg8GaVo2LuVTYmv#2`b__Cu%Sm)~%}DM5f&v- -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 2 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -// --------------------------------------------------------------------------- - -#include "wave.h" - -reg8 WaveformGeneratorFP::wave8580__ST[] = -{ -/* 0x000: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x008: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x010: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x018: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x020: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x028: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x030: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x038: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x040: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x048: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x050: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x058: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x060: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x068: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x070: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x078: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x080: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x088: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x090: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x098: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x0f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x100: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x108: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x110: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x118: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x120: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x128: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x130: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x138: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x140: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x148: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x150: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x158: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x160: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x168: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x170: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x178: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x180: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x188: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x190: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x198: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x1f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, -/* 0x200: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x208: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x210: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x218: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x220: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x228: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x230: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x238: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x240: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x248: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x250: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x258: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x260: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x268: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x270: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x278: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x280: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x288: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x290: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x298: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x2f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x300: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x308: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x310: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x318: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x320: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x328: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x330: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x338: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x340: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x348: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x350: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x358: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x360: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x368: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x370: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x378: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x380: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x388: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x390: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x398: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x3c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x3f0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -/* 0x3f8: */ 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, -/* 0x400: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x408: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x410: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x418: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x420: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x428: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x430: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x438: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x440: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x448: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x450: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x458: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x460: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x468: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x470: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x478: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x480: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x488: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x490: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x498: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x4f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x500: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x508: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x510: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x518: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x520: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x528: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x530: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x538: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x540: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x548: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x550: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x558: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x560: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x568: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x570: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x578: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x580: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x588: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x590: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x598: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x5f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x1f, -/* 0x600: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x608: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x610: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x618: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x620: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x628: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x630: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x638: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x640: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x648: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x650: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x658: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x660: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x668: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x670: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x678: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x680: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x688: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x690: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x698: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x6f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x700: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x708: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x710: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x718: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x720: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x728: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x730: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x738: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x740: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x748: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x750: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x758: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x760: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x768: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x770: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x778: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x780: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x788: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x790: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x798: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0x7c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x7e0: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0x7e8: */ 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, -/* 0x7f0: */ 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3e, -/* 0x7f8: */ 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, -/* 0x800: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x808: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x810: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x818: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x820: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x828: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x830: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x838: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x840: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x848: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x850: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x858: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x860: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x868: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x870: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x878: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x880: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x888: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x890: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x898: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x8f8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0x900: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x908: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x910: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x918: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x920: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x928: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x930: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x938: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x940: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x948: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x950: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x958: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x960: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x968: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x970: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x978: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0x980: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x988: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x990: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x998: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9a8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9b8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9c8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9d8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9e8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0x9f8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x0f, 0x0f, -/* 0xa00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xa80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xa98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaa8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xab8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xac8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xad8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xae8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xaf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xb00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xb80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xb98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xba8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xbc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbe8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xbf0: */ 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, -/* 0xbf8: */ 0x1e, 0x1e, 0x1f, 0x1f, 0x1f, 0x1f, 0x3f, 0x3f, -/* 0xc00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xc80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xc98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xca8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xce8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xcf8: */ 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, -/* 0xd00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd78: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, -/* 0xd80: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd88: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd90: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xd98: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xda8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdb8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, -/* 0xdc0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdc8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdd8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xde8: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf0: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xdf8: */ 0x0e, 0x0e, 0x0e, 0x0e, 0x0f, 0x0f, 0x1f, 0x1f, -/* 0xe00: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe08: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe10: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe18: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe20: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe28: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe30: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe38: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe40: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe48: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe50: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe58: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe60: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe68: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe70: */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -/* 0xe78: */ 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x83, 0x83, -/* 0xe80: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe88: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe90: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xe98: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xea0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xea8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xeb0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xeb8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xec0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xec8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xed0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xed8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xee0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xee8: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xef0: */ 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, -/* 0xef8: */ 0x80, 0x80, 0x80, 0x80, 0x87, 0x87, 0x87, 0x8f, -/* 0xf00: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0xf08: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf10: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf18: */ 0xe0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, -/* 0xf20: */ 0xc0, 0xe0, 0xe0, 0xc0, 0xc0, 0xe0, 0xe0, 0xe0, -/* 0xf28: */ 0xe0, 0xe0, 0xe0, 0xc0, 0xe0, 0xc0, 0xe0, 0xe0, -/* 0xf30: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf38: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf40: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf48: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf50: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf58: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf60: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf68: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf70: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, -/* 0xf78: */ 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe3, 0xe3, -/* 0xf80: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf88: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf90: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xf98: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfa0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfa8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfb0: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, -/* 0xfb8: */ 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf1, -/* 0xfc0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfc8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfd0: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfd8: */ 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, -/* 0xfe0: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0xfe8: */ 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, -/* 0xff0: */ 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, -/* 0xff8: */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, -}; diff --git a/src/sound/resid-fp/wave8580__ST.dat b/src/sound/resid-fp/wave8580__ST.dat deleted file mode 100644 index f30002ceb01ae93d2da7b9e91431a0616a25861a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4096 zcmZP=P{7PQkk+%av$GGR{R|8P=YKvvK0bbae*Tf_e~`b2LHsj<{6PwqfdV->c`zVF zFZI<9T>1z3Wf;Ui$Qxu~X#STcOEc9pjmAHPK}j(GTc80O2(YV%0t)S?Q2S{7Qy73` zYlr6l(fXh45Tu4iiqk*A{EzNRX!S1xssHWm(dFsOr`Z1#Id>S;|0KshEWjZ7Uw%OA z{|1KU=7s?T?d|RT2Oc~)aNxlM5P1L$psWXA&H<1d2!mBT04oGBsf8au{y-V{_=5oW Mg9iRV!G9 diff --git a/src/sound/snd_resid.cc b/src/sound/snd_resid.cpp similarity index 62% rename from src/sound/snd_resid.cc rename to src/sound/snd_resid.cpp index 94bbcd591..d7082e47e 100644 --- a/src/sound/snd_resid.cc +++ b/src/sound/snd_resid.cpp @@ -9,9 +9,11 @@ #define RESID_FREQ 48000 +using reSIDfp::SID; + typedef struct psid_t { /* resid sid implementation */ - SIDFP *sid; + SID *sid; int16_t last_sample; } psid_t; @@ -23,42 +25,33 @@ sid_init(void) #if 0 psid_t *psid; #endif - sampling_method method = SAMPLE_INTERPOLATE; - float cycles_per_sec = 14318180.0 / 16.0; + reSIDfp::SamplingMethod method = reSIDfp::DECIMATE; + float cycles_per_sec = 14318180.0 / 16.0; psid = new psid_t; #if 0 - psid = (psid_t *)malloc(sizeof(sound_t)); + psid = (psid_t *) malloc(sizeof(sound_t)); #endif - psid->sid = new SIDFP; + psid->sid = new SID; - psid->sid->set_chip_model(MOS8580FP); - - psid->sid->set_voice_nonlinearity(1.0f); - psid->sid->get_filter().set_distortion_properties(0.f, 0.f, 0.f); - psid->sid->get_filter().set_type4_properties(6.55f, 20.0f); - - psid->sid->enable_filter(true); - psid->sid->enable_external_filter(true); + psid->sid->setChipModel(reSIDfp::MOS8580); + psid->sid->enableFilter(true); psid->sid->reset(); for (uint8_t c = 0; c < 32; c++) psid->sid->write(c, 0); - if (!psid->sid->set_sampling_parameters(cycles_per_sec, method, - (float) RESID_FREQ, 0.9 * (float) RESID_FREQ / 2.0)) { + try { + psid->sid->setSamplingParameters(cycles_per_sec, method, (float) RESID_FREQ, 0.9 * (float) RESID_FREQ / 2.0); + } catch (reSIDfp::SIDError) { #if 0 printf("reSID failed!\n"); #endif } - psid->sid->set_chip_model(MOS6581FP); - psid->sid->set_voice_nonlinearity(0.96f); - psid->sid->get_filter().set_distortion_properties(3.7e-3f, 2048.f, 1.2e-4f); - + psid->sid->setChipModel(reSIDfp::MOS6581); psid->sid->input(0); - psid->sid->get_filter().set_type3_properties(1.33e6f, 2.2e9f, 1.0056f, 7e3f); return (void *) psid; } @@ -117,7 +110,7 @@ static void fillbuf2(int &count, int16_t *buf, int len) { int c; - c = psid->sid->clock(count, buf, len, 1); + c = psid->sid->clock(count, buf); if (!c) *buf = psid->last_sample; psid->last_sample = *buf; From ec4fbc60b4de960656cdf38a25c5a7e4f0412d0a Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 14 Jul 2024 23:58:29 +0200 Subject: [PATCH 069/624] BT48x sanity checking, fixes #4607. --- src/video/vid_bt48x_ramdac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_bt48x_ramdac.c b/src/video/vid_bt48x_ramdac.c index 91ddce956..6b0ec300b 100644 --- a/src/video/vid_bt48x_ramdac.c +++ b/src/video/vid_bt48x_ramdac.c @@ -420,7 +420,7 @@ bt48x_hwcursor_draw(svga_t *svga, int displine) comb = (b0 | (b1 << 1)); y_pos = displine; - x_pos = offset + svga->x_add; + x_pos = (offset + svga->x_add) & 2047; p = buffer32->line[y_pos]; if (offset >= svga->dac_hwcursor_latch.x) { From d455e3dbc01342ceece507d84fe5db7d15f1547f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 14 Jul 2024 18:11:26 -0400 Subject: [PATCH 070/624] resid: We support C++14 --- src/sound/resid-fp/config.h | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/sound/resid-fp/config.h diff --git a/src/sound/resid-fp/config.h b/src/sound/resid-fp/config.h new file mode 100644 index 000000000..0eeba8dee --- /dev/null +++ b/src/sound/resid-fp/config.h @@ -0,0 +1 @@ +#define HAVE_CXX14 From e7989601f95b0ced3b343d270bb0b9f2267e3d78 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 14 Jul 2024 18:27:24 -0400 Subject: [PATCH 071/624] Fix compile warnings in residfp --- src/sound/resid-fp/FilterModelConfig6581.cpp | 14 +++++++------- src/sound/resid-fp/FilterModelConfig8580.cpp | 10 +++++----- src/sound/resid-fp/WaveformCalculator.cpp | 4 ++++ 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/sound/resid-fp/FilterModelConfig6581.cpp b/src/sound/resid-fp/FilterModelConfig6581.cpp index 7a80802e9..143b9e91c 100644 --- a/src/sound/resid-fp/FilterModelConfig6581.cpp +++ b/src/sound/resid-fp/FilterModelConfig6581.cpp @@ -131,9 +131,9 @@ FilterModelConfig6581::FilterModelConfig6581() : vmax); #endif - #pragma omp parallel sections +// #pragma omp parallel sections { - #pragma omp section +// #pragma omp section { #ifdef _OPENMP OpAmp opampModel( @@ -167,7 +167,7 @@ FilterModelConfig6581::FilterModelConfig6581() : } } - #pragma omp section +// #pragma omp section { #ifdef _OPENMP OpAmp opampModel( @@ -199,7 +199,7 @@ FilterModelConfig6581::FilterModelConfig6581() : } } - #pragma omp section +// #pragma omp section { #ifdef _OPENMP OpAmp opampModel( @@ -230,7 +230,7 @@ FilterModelConfig6581::FilterModelConfig6581() : } } - #pragma omp section +// #pragma omp section { #ifdef _OPENMP OpAmp opampModel( @@ -261,7 +261,7 @@ FilterModelConfig6581::FilterModelConfig6581() : } } - #pragma omp section +// #pragma omp section { const double nVddt = N16 * (Vddt - vmin); @@ -275,7 +275,7 @@ FilterModelConfig6581::FilterModelConfig6581() : } } - #pragma omp section +// #pragma omp section { // EKV model: // diff --git a/src/sound/resid-fp/FilterModelConfig8580.cpp b/src/sound/resid-fp/FilterModelConfig8580.cpp index fe294d8ce..e838a366c 100644 --- a/src/sound/resid-fp/FilterModelConfig8580.cpp +++ b/src/sound/resid-fp/FilterModelConfig8580.cpp @@ -143,9 +143,9 @@ FilterModelConfig8580::FilterModelConfig8580() : vmax); #endif - #pragma omp parallel sections +// #pragma omp parallel sections { - #pragma omp section +// #pragma omp section { #ifdef _OPENMP OpAmp opampModel( @@ -179,7 +179,7 @@ FilterModelConfig8580::FilterModelConfig8580() : } } - #pragma omp section +// #pragma omp section { #ifdef _OPENMP OpAmp opampModel( @@ -211,7 +211,7 @@ FilterModelConfig8580::FilterModelConfig8580() : } } - #pragma omp section +// #pragma omp section { #ifdef _OPENMP OpAmp opampModel( @@ -242,7 +242,7 @@ FilterModelConfig8580::FilterModelConfig8580() : } } - #pragma omp section +// #pragma omp section { #ifdef _OPENMP OpAmp opampModel( diff --git a/src/sound/resid-fp/WaveformCalculator.cpp b/src/sound/resid-fp/WaveformCalculator.cpp index f72cf93b7..74a93cce5 100644 --- a/src/sound/resid-fp/WaveformCalculator.cpp +++ b/src/sound/resid-fp/WaveformCalculator.cpp @@ -68,15 +68,19 @@ static float exponentialDistance(float distance, int i) return pow(distance, -i); } +#if 0 MAYBE_UNUSED static float linearDistance(float distance, int i) { return 1.f / (1.f + i * distance); } +#endif +#if 0 MAYBE_UNUSED static float quadraticDistance(float distance, int i) { return 1.f / (1.f + (i*i) * distance); } +#endif /// Calculate triangle waveform static unsigned int triXor(unsigned int val) From f4d57a8411737521615e3b1cf2126fc61fc326a7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 9 Jul 2024 08:18:48 -0400 Subject: [PATCH 072/624] Some formatting in snd_opl_nuked.c --- src/sound/snd_opl_nuked.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 95b61638e..1cc2bba9b 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -322,10 +322,10 @@ static const uint8_t kslshift[4] = { // envelope generator constants static const uint8_t eg_incstep[4][4] = { - {0, 0, 0, 0}, - { 1, 0, 0, 0}, - { 1, 0, 1, 0}, - { 1, 1, 1, 0} + { 0, 0, 0, 0 }, + { 1, 0, 0, 0 }, + { 1, 0, 1, 0 }, + { 1, 1, 1, 0 } }; // address decoding @@ -500,7 +500,8 @@ static const env_sinfunc env_sin[8] = { static void env_update_ksl(slot_t *slot) { - int16_t ksl = (kslrom[slot->chan->f_num >> 6] << 2) - ((0x08 - slot->chan->block) << 5); + int16_t ksl = (kslrom[slot->chan->f_num >> 6] << 2) + - ((0x08 - slot->chan->block) << 5); if (ksl < 0) ksl = 0; @@ -524,7 +525,8 @@ env_calc(slot_t *slot) uint8_t eg_off; uint8_t reset = 0; - slot->eg_out = slot->eg_rout + (slot->reg_tl << 2) + (slot->eg_ksl >> kslshift[slot->reg_ksl]) + *slot->trem; + slot->eg_out = slot->eg_rout + (slot->reg_tl << 2) + + (slot->eg_ksl >> kslshift[slot->reg_ksl]) + *slot->trem; if (slot->key && slot->eg_gen == envelope_gen_num_release) { reset = 1; reg_rate = slot->reg_ar; @@ -702,7 +704,9 @@ phase_generate(slot_t *slot) dev->rm_tc_bit5 = (phase >> 5) & 1; } if (dev->rhy & 0x20) { - rm_xor = (dev->rm_hh_bit2 ^ dev->rm_hh_bit7) | (dev->rm_hh_bit3 ^ dev->rm_tc_bit5) | (dev->rm_tc_bit3 ^ dev->rm_tc_bit5); + rm_xor = (dev->rm_hh_bit2 ^ dev->rm_hh_bit7) + | (dev->rm_hh_bit3 ^ dev->rm_tc_bit5) + | (dev->rm_tc_bit3 ^ dev->rm_tc_bit5); switch (slot->slot_num) { case 13: // hh @@ -714,7 +718,8 @@ phase_generate(slot_t *slot) break; case 16: // sd - slot->pg_phase_out = (dev->rm_hh_bit8 << 9) | ((dev->rm_hh_bit8 ^ (noise & 1)) << 8); + slot->pg_phase_out = (dev->rm_hh_bit8 << 9) + | ((dev->rm_hh_bit8 ^ (noise & 1)) << 8); break; case 17: // tc @@ -991,7 +996,8 @@ channel_write_a0(chan_t *ch, uint8_t data) return; ch->f_num = (ch->f_num & 0x300) | data; - ch->ksv = (ch->block << 1) | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); + ch->ksv = (ch->block << 1) + | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); env_update_ksl(ch->slots[0]); env_update_ksl(ch->slots[1]); @@ -1013,7 +1019,8 @@ channel_write_b0(chan_t *ch, uint8_t data) ch->f_num = (ch->f_num & 0xff) | ((data & 0x03) << 8); ch->block = (data >> 2) & 0x07; - ch->ksv = (ch->block << 1) | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); + ch->ksv = (ch->block << 1) + | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); env_update_ksl(ch->slots[0]); env_update_ksl(ch->slots[1]); From 4f020f9a834a51aac7bb59138458eaeb7be08c96 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 9 Jul 2024 08:19:37 -0400 Subject: [PATCH 073/624] Update Nuke.YKT's copyright date --- src/sound/snd_opl_nuked.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 1cc2bba9b..b1c30ef31 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -35,7 +35,7 @@ * * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2016-2020 Miran Grca. - * Copyright 2013-2018 Alexey Khokholov (Nuke.YKT) + * Copyright 2013-2020 Alexey Khokholov (Nuke.YKT) */ #include #include From 24b39c9c8fe6522ab4f2b99f21c4bd5f6e6f74f3 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 8 Jul 2024 19:43:25 -0400 Subject: [PATCH 074/624] Move stuff around to accomodate nukedopl update --- src/sound/snd_opl_nuked.c | 219 +++++++++++++++++++------------------- 1 file changed, 112 insertions(+), 107 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index b1c30ef31..d8c8a948c 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -804,114 +804,10 @@ slot_calc_fb(slot_t *slot) slot->prout = slot->out; } +// Channel + static void -channel_setup_alg(chan_t *ch) -{ - if (ch->chtype == ch_drum) { - if (ch->ch_num == 7 || ch->ch_num == 8) { - ch->slots[0]->mod = &ch->dev->zeromod; - ch->slots[1]->mod = &ch->dev->zeromod; - return; - } - - switch (ch->alg & 0x01) { - case 0x00: - ch->slots[0]->mod = &ch->slots[0]->fbmod; - ch->slots[1]->mod = &ch->slots[0]->out; - break; - - case 0x01: - ch->slots[0]->mod = &ch->slots[0]->fbmod; - ch->slots[1]->mod = &ch->dev->zeromod; - break; - - default: - break; - } - return; - } - - if (ch->alg & 0x08) - return; - - if (ch->alg & 0x04) { - ch->pair->out[0] = &ch->dev->zeromod; - ch->pair->out[1] = &ch->dev->zeromod; - ch->pair->out[2] = &ch->dev->zeromod; - ch->pair->out[3] = &ch->dev->zeromod; - - switch (ch->alg & 0x03) { - case 0x00: - ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; - ch->pair->slots[1]->mod = &ch->pair->slots[0]->out; - ch->slots[0]->mod = &ch->pair->slots[1]->out; - ch->slots[1]->mod = &ch->slots[0]->out; - ch->out[0] = &ch->slots[1]->out; - ch->out[1] = &ch->dev->zeromod; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; - break; - - case 0x01: - ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; - ch->pair->slots[1]->mod = &ch->pair->slots[0]->out; - ch->slots[0]->mod = &ch->dev->zeromod; - ch->slots[1]->mod = &ch->slots[0]->out; - ch->out[0] = &ch->pair->slots[1]->out; - ch->out[1] = &ch->slots[1]->out; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; - break; - - case 0x02: - ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; - ch->pair->slots[1]->mod = &ch->dev->zeromod; - ch->slots[0]->mod = &ch->pair->slots[1]->out; - ch->slots[1]->mod = &ch->slots[0]->out; - ch->out[0] = &ch->pair->slots[0]->out; - ch->out[1] = &ch->slots[1]->out; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; - break; - - case 0x03: - ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; - ch->pair->slots[1]->mod = &ch->dev->zeromod; - ch->slots[0]->mod = &ch->pair->slots[1]->out; - ch->slots[1]->mod = &ch->dev->zeromod; - ch->out[0] = &ch->pair->slots[0]->out; - ch->out[1] = &ch->slots[0]->out; - ch->out[2] = &ch->slots[1]->out; - ch->out[3] = &ch->dev->zeromod; - break; - - default: - break; - } - } else - switch (ch->alg & 0x01) { - case 0x00: - ch->slots[0]->mod = &ch->slots[0]->fbmod; - ch->slots[1]->mod = &ch->slots[0]->out; - ch->out[0] = &ch->slots[1]->out; - ch->out[1] = &ch->dev->zeromod; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; - break; - - case 0x01: - ch->slots[0]->mod = &ch->slots[0]->fbmod; - ch->slots[1]->mod = &ch->dev->zeromod; - ch->out[0] = &ch->slots[0]->out; - ch->out[1] = &ch->slots[1]->out; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; - break; - - default: - break; - } -} +channel_setup_alg(chan_t *ch); static void channel_update_rhythm(nuked_t *dev, uint8_t data) @@ -1035,6 +931,115 @@ channel_write_b0(chan_t *ch, uint8_t data) } } +static void +channel_setup_alg(chan_t *ch) +{ + if (ch->chtype == ch_drum) { + if (ch->ch_num == 7 || ch->ch_num == 8) { + ch->slots[0]->mod = &ch->dev->zeromod; + ch->slots[1]->mod = &ch->dev->zeromod; + return; + } + + switch (ch->alg & 0x01) { + case 0x00: + ch->slots[0]->mod = &ch->slots[0]->fbmod; + ch->slots[1]->mod = &ch->slots[0]->out; + break; + + case 0x01: + ch->slots[0]->mod = &ch->slots[0]->fbmod; + ch->slots[1]->mod = &ch->dev->zeromod; + break; + + default: + break; + } + return; + } + + if (ch->alg & 0x08) + return; + + if (ch->alg & 0x04) { + ch->pair->out[0] = &ch->dev->zeromod; + ch->pair->out[1] = &ch->dev->zeromod; + ch->pair->out[2] = &ch->dev->zeromod; + ch->pair->out[3] = &ch->dev->zeromod; + + switch (ch->alg & 0x03) { + case 0x00: + ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; + ch->pair->slots[1]->mod = &ch->pair->slots[0]->out; + ch->slots[0]->mod = &ch->pair->slots[1]->out; + ch->slots[1]->mod = &ch->slots[0]->out; + ch->out[0] = &ch->slots[1]->out; + ch->out[1] = &ch->dev->zeromod; + ch->out[2] = &ch->dev->zeromod; + ch->out[3] = &ch->dev->zeromod; + break; + + case 0x01: + ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; + ch->pair->slots[1]->mod = &ch->pair->slots[0]->out; + ch->slots[0]->mod = &ch->dev->zeromod; + ch->slots[1]->mod = &ch->slots[0]->out; + ch->out[0] = &ch->pair->slots[1]->out; + ch->out[1] = &ch->slots[1]->out; + ch->out[2] = &ch->dev->zeromod; + ch->out[3] = &ch->dev->zeromod; + break; + + case 0x02: + ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; + ch->pair->slots[1]->mod = &ch->dev->zeromod; + ch->slots[0]->mod = &ch->pair->slots[1]->out; + ch->slots[1]->mod = &ch->slots[0]->out; + ch->out[0] = &ch->pair->slots[0]->out; + ch->out[1] = &ch->slots[1]->out; + ch->out[2] = &ch->dev->zeromod; + ch->out[3] = &ch->dev->zeromod; + break; + + case 0x03: + ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; + ch->pair->slots[1]->mod = &ch->dev->zeromod; + ch->slots[0]->mod = &ch->pair->slots[1]->out; + ch->slots[1]->mod = &ch->dev->zeromod; + ch->out[0] = &ch->pair->slots[0]->out; + ch->out[1] = &ch->slots[0]->out; + ch->out[2] = &ch->slots[1]->out; + ch->out[3] = &ch->dev->zeromod; + break; + + default: + break; + } + } else + switch (ch->alg & 0x01) { + case 0x00: + ch->slots[0]->mod = &ch->slots[0]->fbmod; + ch->slots[1]->mod = &ch->slots[0]->out; + ch->out[0] = &ch->slots[1]->out; + ch->out[1] = &ch->dev->zeromod; + ch->out[2] = &ch->dev->zeromod; + ch->out[3] = &ch->dev->zeromod; + break; + + case 0x01: + ch->slots[0]->mod = &ch->slots[0]->fbmod; + ch->slots[1]->mod = &ch->dev->zeromod; + ch->out[0] = &ch->slots[0]->out; + ch->out[1] = &ch->slots[1]->out; + ch->out[2] = &ch->dev->zeromod; + ch->out[3] = &ch->dev->zeromod; + break; + + default: + break; + } +} + static void channel_write_c0(chan_t *ch, uint8_t data) { From 3bc9d82f67cb6526bd87478b7ac2a7a16d97fbb7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 8 Jul 2024 21:14:02 -0400 Subject: [PATCH 075/624] get rid of left shift Co-Authored-By: nukeykt --- src/sound/snd_opl_nuked.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index d8c8a948c..b1540a94c 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -612,7 +612,7 @@ env_calc(slot_t *slot) if (!slot->eg_rout) slot->eg_gen = envelope_gen_num_decay; else if (slot->key && shift > 0 && rate_hi != 0x0f) - eg_inc = ((~slot->eg_rout) << shift) >> 4; + eg_inc = ~slot->eg_rout >> (4 - shift); break; case envelope_gen_num_decay: From 39e6b0fb2afefe4ee5fb80f1da04102177628a66 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 8 Jul 2024 23:06:54 -0400 Subject: [PATCH 076/624] Factor out repeated structure accesses into local variables Co-Authored-By: Evan Ramos <1585791+hendricks266@users.noreply.github.com> --- src/sound/snd_opl_nuked.c | 163 ++++++++++++++++++++++---------------- 1 file changed, 94 insertions(+), 69 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index b1540a94c..baeb9da47 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -1239,88 +1239,108 @@ nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) nuked_t *dev = (nuked_t *) priv; uint64_t time1; uint64_t time2; + wrbuf_t *writebuf; + uint32_t writebuf_last; - if (dev->wrbuf[dev->wrbuf_last].reg & 0x0200) { - nuked_write_reg(dev, dev->wrbuf[dev->wrbuf_last].reg & 0x01ff, - dev->wrbuf[dev->wrbuf_last].data); + writebuf_last = dev->wrbuf_last; + writebuf = &dev->wrbuf[writebuf_last]; - dev->wrbuf_cur = (dev->wrbuf_last + 1) % WRBUF_SIZE; - dev->wrbuf_samplecnt = dev->wrbuf[dev->wrbuf_last].time; + if (writebuf->reg & 0x0200) { + nuked_write_reg(dev, writebuf->reg & 0x01ff, writebuf->data); + + dev->wrbuf_cur = (writebuf_last + 1) % WRBUF_SIZE; + dev->wrbuf_samplecnt = writebuf->time; } - dev->wrbuf[dev->wrbuf_last].reg = reg | 0x0200; - dev->wrbuf[dev->wrbuf_last].data = val; - time1 = dev->wrbuf_lasttime + WRBUF_DELAY; - time2 = dev->wrbuf_samplecnt; + writebuf->reg = reg | 0x0200; + writebuf->data = val; + time1 = dev->wrbuf_lasttime + WRBUF_DELAY; + time2 = dev->wrbuf_samplecnt; if (time1 < time2) time1 = time2; - dev->wrbuf[dev->wrbuf_last].time = time1; - dev->wrbuf_lasttime = time1; - dev->wrbuf_last = (dev->wrbuf_last + 1) % WRBUF_SIZE; + writebuf->time = time1; + dev->wrbuf_lasttime = time1; + dev->wrbuf_last = (writebuf_last + 1) % WRBUF_SIZE; } void nuked_generate(void *priv, int32_t *bufp) { nuked_t *dev = (nuked_t *) priv; - int16_t accm; - int16_t shift = 0; - uint8_t i; - uint8_t j; + slot_t *slot; + chan_t *ch; + wrbuf_t *writebuf; + int16_t **out; + int32_t mix; + int16_t accm; + int16_t shift = 0; + uint8_t i; + uint8_t j; bufp[1] = dev->mixbuff[1]; for (i = 0; i < 15; i++) { - slot_calc_fb(&dev->slot[i]); - env_calc(&dev->slot[i]); - phase_generate(&dev->slot[i]); - slot_generate(&dev->slot[i]); + slot = &dev->slot[i]; + slot_calc_fb(slot); + env_calc(slot); + phase_generate(slot); + slot_generate(slot); } - dev->mixbuff[0] = 0; + mix = 0; for (i = 0; i < 18; i++) { - accm = 0; - + ch = &dev->chan[i]; + out = ch->out; for (j = 0; j < 4; j++) - accm += *dev->chan[i].out[j]; + accm += *out[j]; - dev->mixbuff[0] += (int16_t) (accm & dev->chan[i].cha); + mix += (int16_t) (accm & ch->cha); } + + dev->mixbuff[0] = mix; + for (i = 15; i < 18; i++) { - slot_calc_fb(&dev->slot[i]); - env_calc(&dev->slot[i]); - phase_generate(&dev->slot[i]); - slot_generate(&dev->slot[i]); + slot = &dev->slot[i]; + slot_calc_fb(slot); + env_calc(slot); + phase_generate(slot); + slot_generate(slot); } bufp[0] = dev->mixbuff[0]; for (i = 18; i < 33; i++) { - slot_calc_fb(&dev->slot[i]); - env_calc(&dev->slot[i]); - phase_generate(&dev->slot[i]); - slot_generate(&dev->slot[i]); + slot = &dev->slot[i]; + slot_calc_fb(slot); + env_calc(slot); + phase_generate(slot); + slot_generate(slot); } - dev->mixbuff[1] = 0; + mix = 0; for (i = 0; i < 18; i++) { + ch = &dev->chan[i]; + out = ch->out; accm = 0; for (j = 0; j < 4; j++) - accm += *dev->chan[i].out[j]; + accm += *out[j]; - dev->mixbuff[1] += (int16_t) (accm & dev->chan[i].chb); + mix += (int16_t) (accm & ch->chb); } + dev->mixbuff[1] = mix; + for (i = 33; i < 36; i++) { - slot_calc_fb(&dev->slot[i]); - env_calc(&dev->slot[i]); - phase_generate(&dev->slot[i]); - slot_generate(&dev->slot[i]); + slot = &dev->slot[i]; + slot_calc_fb(slot); + env_calc(slot); + phase_generate(slot); + slot_generate(slot); } if ((dev->timer & 0x3f) == 0x3f) @@ -1359,14 +1379,13 @@ nuked_generate(void *priv, int32_t *bufp) dev->eg_state ^= 1; - while (dev->wrbuf[dev->wrbuf_cur].time <= dev->wrbuf_samplecnt) { - if (!(dev->wrbuf[dev->wrbuf_cur].reg & 0x200)) + while (writebuf = &dev->wrbuf[dev->wrbuf_cur], writebuf->time <= dev->wrbuf_samplecnt) { + if (!(writebuf->reg & 0x200)) break; - dev->wrbuf[dev->wrbuf_cur].reg &= 0x01ff; + writebuf->reg &= 0x01ff; - nuked_write_reg(dev, dev->wrbuf[dev->wrbuf_cur].reg, - dev->wrbuf[dev->wrbuf_cur].data); + nuked_write_reg(dev, writebuf->reg, writebuf->data); dev->wrbuf_cur = (dev->wrbuf_cur + 1) % WRBUF_SIZE; } @@ -1415,42 +1434,48 @@ nuked_generate_stream(nuked_t *dev, int32_t *sndptr, uint32_t num) void nuked_init(nuked_t *dev, uint32_t samplerate) { + slot_t *slot; + chan_t *ch; uint8_t i; + uint8_t local_ch_slot; memset(dev, 0x00, sizeof(nuked_t)); for (i = 0; i < 36; i++) { - dev->slot[i].dev = dev; - dev->slot[i].mod = &dev->zeromod; - dev->slot[i].eg_rout = 0x01ff; - dev->slot[i].eg_out = 0x01ff; - dev->slot[i].eg_gen = envelope_gen_num_release; - dev->slot[i].trem = (uint8_t *) &dev->zeromod; - dev->slot[i].slot_num = i; + slot = &dev->slot[i]; + slot->dev = dev; + slot->mod = &dev->zeromod; + slot->eg_rout = 0x01ff; + slot->eg_out = 0x01ff; + slot->eg_gen = envelope_gen_num_release; + slot->trem = (uint8_t *) &dev->zeromod; + slot->slot_num = i; } for (i = 0; i < 18; i++) { - dev->chan[i].slots[0] = &dev->slot[ch_slot[i]]; - dev->chan[i].slots[1] = &dev->slot[ch_slot[i] + 3]; - dev->slot[ch_slot[i]].chan = &dev->chan[i]; - dev->slot[ch_slot[i] + 3].chan = &dev->chan[i]; + ch = &dev->chan[i]; + local_ch_slot = ch_slot[i]; + ch->slots[0] = &dev->slot[local_ch_slot]; + ch->slots[1] = &dev->slot[local_ch_slot + 3]; + dev->slot[local_ch_slot].chan = ch; + dev->slot[local_ch_slot + 3].chan = ch; if ((i % 9) < 3) - dev->chan[i].pair = &dev->chan[i + 3]; + ch->pair = &dev->chan[i + 3]; else if ((i % 9) < 6) - dev->chan[i].pair = &dev->chan[i - 3]; + ch->pair = &dev->chan[i - 3]; - dev->chan[i].dev = dev; - dev->chan[i].out[0] = &dev->zeromod; - dev->chan[i].out[1] = &dev->zeromod; - dev->chan[i].out[2] = &dev->zeromod; - dev->chan[i].out[3] = &dev->zeromod; - dev->chan[i].chtype = ch_2op; - dev->chan[i].cha = 0xffff; - dev->chan[i].chb = 0xffff; - dev->chan[i].ch_num = i; + ch->dev = dev; + ch->out[0] = &dev->zeromod; + ch->out[1] = &dev->zeromod; + ch->out[2] = &dev->zeromod; + ch->out[3] = &dev->zeromod; + ch->chtype = ch_2op; + ch->cha = 0xffff; + ch->chb = 0xffff; + ch->ch_num = i; - channel_setup_alg(&dev->chan[i]); + channel_setup_alg(ch); } dev->noise = 1; @@ -1684,4 +1709,4 @@ const fm_drv_t nuked_opl_drv = { &nuked_drv_set_do_cycles, NULL, NULL, -}; \ No newline at end of file +}; From e6466c4d252c4b9d6a91da9c98a43183f32d2eb3 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 9 Jul 2024 22:40:24 -0400 Subject: [PATCH 077/624] Unroll accumulator loops Co-Authored-By: Evan Ramos <1585791+hendricks266@users.noreply.github.com> --- src/sound/snd_opl_nuked.c | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index baeb9da47..23da37a07 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -1277,7 +1277,6 @@ nuked_generate(void *priv, int32_t *bufp) int16_t accm; int16_t shift = 0; uint8_t i; - uint8_t j; bufp[1] = dev->mixbuff[1]; @@ -1294,9 +1293,7 @@ nuked_generate(void *priv, int32_t *bufp) for (i = 0; i < 18; i++) { ch = &dev->chan[i]; out = ch->out; - for (j = 0; j < 4; j++) - accm += *out[j]; - + accm = *out[0] + *out[1] + *out[2] + *out[3]; mix += (int16_t) (accm & ch->cha); } @@ -1325,11 +1322,7 @@ nuked_generate(void *priv, int32_t *bufp) for (i = 0; i < 18; i++) { ch = &dev->chan[i]; out = ch->out; - accm = 0; - - for (j = 0; j < 4; j++) - accm += *out[j]; - + accm = *out[0] + *out[1] + *out[2] + *out[3]; mix += (int16_t) (accm & ch->chb); } From 6332fd0b5ef4651f2e66bbf1b7b167b1b17705c6 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 9 Jul 2024 22:46:13 -0400 Subject: [PATCH 078/624] Factor slot loop bodies in nuked_generate into process_slot Co-Authored-By: Evan Ramos <1585791+hendricks266@users.noreply.github.com> --- src/sound/snd_opl_nuked.c | 45 ++++++++++++++------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 23da37a07..6134910b9 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -1265,11 +1265,18 @@ nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) dev->wrbuf_last = (writebuf_last + 1) % WRBUF_SIZE; } +static void process_slot(slot_t *slot) +{ + slot_calc_fb(slot); + env_calc(slot); + phase_generate(slot); + slot_generate(slot); +} + void nuked_generate(void *priv, int32_t *bufp) { nuked_t *dev = (nuked_t *) priv; - slot_t *slot; chan_t *ch; wrbuf_t *writebuf; int16_t **out; @@ -1280,13 +1287,8 @@ nuked_generate(void *priv, int32_t *bufp) bufp[1] = dev->mixbuff[1]; - for (i = 0; i < 15; i++) { - slot = &dev->slot[i]; - slot_calc_fb(slot); - env_calc(slot); - phase_generate(slot); - slot_generate(slot); - } + for (i = 0; i < 15; i++) + process_slot(&dev->slot[i]); mix = 0; @@ -1299,23 +1301,13 @@ nuked_generate(void *priv, int32_t *bufp) dev->mixbuff[0] = mix; - for (i = 15; i < 18; i++) { - slot = &dev->slot[i]; - slot_calc_fb(slot); - env_calc(slot); - phase_generate(slot); - slot_generate(slot); - } + for (i = 15; i < 18; i++) + process_slot(&dev->slot[i]); bufp[0] = dev->mixbuff[0]; - for (i = 18; i < 33; i++) { - slot = &dev->slot[i]; - slot_calc_fb(slot); - env_calc(slot); - phase_generate(slot); - slot_generate(slot); - } + for (i = 18; i < 33; i++) + process_slot(&dev->slot[i]); mix = 0; @@ -1328,13 +1320,8 @@ nuked_generate(void *priv, int32_t *bufp) dev->mixbuff[1] = mix; - for (i = 33; i < 36; i++) { - slot = &dev->slot[i]; - slot_calc_fb(slot); - env_calc(slot); - phase_generate(slot); - slot_generate(slot); - } + for (i = 33; i < 36; i++) + process_slot(&dev->slot[i]); if ((dev->timer & 0x3f) == 0x3f) dev->tremolopos = (dev->tremolopos + 1) % 210; From 87cdb6ac2892aa3e5a9525d7c21ea595f8ae131d Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 9 Jul 2024 23:15:51 -0400 Subject: [PATCH 079/624] Add toggle to disable uneven L/R sample timing quirk Co-Authored-By: Evan Ramos <1585791+hendricks266@users.noreply.github.com> --- src/sound/snd_opl_nuked.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 6134910b9..9468622f4 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -51,6 +51,11 @@ #include <86box/device.h> #include <86box/snd_opl.h> +/* Quirk: Some FM channels are output one sample later on the left side than the right. */ +#ifndef OPL_QUIRK_CHANNELSAMPLEDELAY +#define OPL_QUIRK_CHANNELSAMPLEDELAY 1 +#endif + #define WRBUF_SIZE 1024 #define WRBUF_DELAY 1 #define RSM_FRAC 10 @@ -1287,7 +1292,11 @@ nuked_generate(void *priv, int32_t *bufp) bufp[1] = dev->mixbuff[1]; +#if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 0; i < 15; i++) +#else + for (i = 0; i < 36; i++) +#endif process_slot(&dev->slot[i]); mix = 0; @@ -1301,13 +1310,17 @@ nuked_generate(void *priv, int32_t *bufp) dev->mixbuff[0] = mix; +#if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 15; i < 18; i++) process_slot(&dev->slot[i]); +#endif bufp[0] = dev->mixbuff[0]; +#if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 18; i < 33; i++) process_slot(&dev->slot[i]); +#endif mix = 0; @@ -1320,8 +1333,10 @@ nuked_generate(void *priv, int32_t *bufp) dev->mixbuff[1] = mix; +#if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 33; i < 36; i++) process_slot(&dev->slot[i]); +#endif if ((dev->timer & 0x3f) == 0x3f) dev->tremolopos = (dev->tremolopos + 1) % 210; From 996e5cc7847a8a36a0d76fa4db1828e05650142d Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 10 Jul 2024 02:23:19 -0400 Subject: [PATCH 080/624] Add stereo extension Co-Authored-By: Evan Ramos <1585791+hendricks266@users.noreply.github.com> Co-Authored-By: nukeykt --- src/sound/snd_opl_nuked.c | 80 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 9468622f4..59f9104f3 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -51,9 +51,21 @@ #include <86box/device.h> #include <86box/snd_opl.h> + +#ifndef OPL_ENABLE_STEREOEXT +#define OPL_ENABLE_STEREOEXT 0 +#endif + +#if OPL_ENABLE_STEREOEXT +#ifndef _USE_MATH_DEFINES +#define _USE_MATH_DEFINES 1 +#endif +#include +#endif + /* Quirk: Some FM channels are output one sample later on the left side than the right. */ #ifndef OPL_QUIRK_CHANNELSAMPLEDELAY -#define OPL_QUIRK_CHANNELSAMPLEDELAY 1 +#define OPL_QUIRK_CHANNELSAMPLEDELAY (!OPL_ENABLE_STEREOEXT) #endif #define WRBUF_SIZE 1024 @@ -124,6 +136,10 @@ typedef struct chan { struct chan *pair; struct chip *dev; int16_t *out[4]; +#if OPL_ENABLE_STEREOEXT + int32_t leftpan; + int32_t rightpan; +#endif uint8_t chtype; uint16_t f_num; uint8_t block; @@ -168,6 +184,10 @@ typedef struct chip { uint8_t rm_tc_bit3; uint8_t rm_tc_bit5; +#if OPL_ENABLE_STEREOEXT + uint8_t stereoext; +#endif + // OPL3L int32_t rateratio; int32_t samplecnt; @@ -343,6 +363,15 @@ static const uint8_t ch_slot[18] = { 0, 1, 2, 6, 7, 8, 12, 13, 14, 18, 19, 20, 24, 25, 26, 30, 31, 32 }; +#if OPL_ENABLE_STEREOEXT +/* + stereo extension panning table +*/ + +static int32_t panpot_lut[256]; +static uint8_t panpot_lut_build = 0; +#endif + // Envelope generator typedef int16_t (*env_sinfunc)(uint16_t phase, uint16_t envelope); typedef void (*env_genfunc)(slot_t *slot); @@ -1071,8 +1100,26 @@ channel_write_c0(chan_t *ch, uint8_t data) ch->chb = ((data >> 5) & 0x01) ? ~0 : 0; } else ch->cha = ch->chb = (uint16_t) ~0; + +#if OPL_ENABLE_STEREOEXT + if (!ch->dev->stereoext) { + ch->leftpan = ch->cha << 16; + ch->rightpan = ch->chb << 16; + } +#endif } +#if OPL_ENABLE_STEREOEXT +static void +channel_write_d0(chan_t *ch, uint8_t data) +{ + if (ch->dev->stereoext) { + ch->leftpan = panpot_lut[data ^ 0xff]; + ch->rightpan = panpot_lut[data]; + } +} +#endif + static void channel_key_on(chan_t *ch) { @@ -1162,6 +1209,9 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) case 0x05: dev->newm = val & 0x01; +#if OPL_ENABLE_STEREOEXT + dev->stereoext = (val >> 1) & 0x01; +#endif break; default: @@ -1227,6 +1277,13 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) channel_write_c0(&dev->chan[9 * high + (regm & 0x0f)], val); break; +#if OPL_ENABLE_STEREOEXT + case 0xd0: + if ((regm & 0x0f) < 9) + channel_write_d0(&dev->chan[9 * high + (regm & 0x0f)], val); + break; +#endif + case 0xe0: case 0xf0: if (ad_slot[regm & 0x1f] >= 0) @@ -1305,7 +1362,11 @@ nuked_generate(void *priv, int32_t *bufp) ch = &dev->chan[i]; out = ch->out; accm = *out[0] + *out[1] + *out[2] + *out[3]; +#if OPL_ENABLE_STEREOEXT + mix += (int16_t)((accm * ch->leftpan) >> 16); +#else mix += (int16_t) (accm & ch->cha); +#endif } dev->mixbuff[0] = mix; @@ -1328,7 +1389,11 @@ nuked_generate(void *priv, int32_t *bufp) ch = &dev->chan[i]; out = ch->out; accm = *out[0] + *out[1] + *out[2] + *out[3]; +#if OPL_ENABLE_STEREOEXT + mix += (int16_t)((accm * ch->leftpan) >> 16); +#else mix += (int16_t) (accm & ch->chb); +#endif } dev->mixbuff[1] = mix; @@ -1468,6 +1533,10 @@ nuked_init(nuked_t *dev, uint32_t samplerate) ch->chtype = ch_2op; ch->cha = 0xffff; ch->chb = 0xffff; +#if OPL_ENABLE_STEREOEXT + ch->leftpan = 0x10000; + ch->rightpan = 0x10000; +#endif ch->ch_num = i; channel_setup_alg(ch); @@ -1477,6 +1546,15 @@ nuked_init(nuked_t *dev, uint32_t samplerate) dev->rateratio = (samplerate << RSM_FRAC) / 49716; dev->tremoloshift = 4; dev->vibshift = 1; + + +#if OPL_ENABLE_STEREOEXT + if (!panpot_lut_build) { + for (int32_t i = 0; i < 256; i++) + panpot_lut[i] = (int32_t)(sin(i * M_PI / 512.0) * 65536.0); + panpot_lut_build = 1; + } +#endif } static void From e5aa36919bf62cb51dd06e720e769ce95fab51e8 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 10 Jul 2024 04:11:26 -0400 Subject: [PATCH 081/624] Allow replacement of the sin() function used to populate the panning table Co-Authored-By: Evan Ramos <1585791+hendricks266@users.noreply.github.com> --- src/sound/snd_opl_nuked.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 59f9104f3..e990ba460 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -56,11 +56,13 @@ #define OPL_ENABLE_STEREOEXT 0 #endif -#if OPL_ENABLE_STEREOEXT +#if OPL_ENABLE_STEREOEXT && !defined OPL_SIN #ifndef _USE_MATH_DEFINES #define _USE_MATH_DEFINES 1 #endif #include +// input: [0, 256), output: [0, 65536] +#define OPL_SIN(x) ((int32_t)(sin((x) * M_PI / 512.0) * 65536.0)) #endif /* Quirk: Some FM channels are output one sample later on the left side than the right. */ @@ -1551,7 +1553,7 @@ nuked_init(nuked_t *dev, uint32_t samplerate) #if OPL_ENABLE_STEREOEXT if (!panpot_lut_build) { for (int32_t i = 0; i < 256; i++) - panpot_lut[i] = (int32_t)(sin(i * M_PI / 512.0) * 65536.0); + panpot_lut[i] = OPL_SIN(i); panpot_lut_build = 1; } #endif From 0646a322e18606196cb1df03931ea1e0cab14bef Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 10 Jul 2024 04:52:06 -0400 Subject: [PATCH 082/624] Add 4-channel output support Co-Authored-By: Kagamiin --- src/sound/snd_opl_nuked.c | 111 +++++++++++++++++++++++++++++--------- 1 file changed, 86 insertions(+), 25 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index e990ba460..03c7a6b01 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -151,6 +151,8 @@ typedef struct chan { uint8_t ksv; uint16_t cha; uint16_t chb; + uint16_t chc; + uint16_t chd; uint8_t ch_num; } chan_t; @@ -178,7 +180,7 @@ typedef struct chip { uint8_t tremoloshift; uint32_t noise; int16_t zeromod; - int32_t mixbuff[2]; + int32_t mixbuff[4]; uint8_t rm_hh_bit2; uint8_t rm_hh_bit3; uint8_t rm_hh_bit7; @@ -193,8 +195,8 @@ typedef struct chip { // OPL3L int32_t rateratio; int32_t samplecnt; - int32_t oldsamples[2]; - int32_t samples[2]; + int32_t oldsamples[4]; + int32_t samples[4]; uint64_t wrbuf_samplecnt; uint32_t wrbuf_cur; @@ -1077,10 +1079,8 @@ channel_setup_alg(chan_t *ch) } static void -channel_write_c0(chan_t *ch, uint8_t data) +channel_update_alg(chan_t *ch) { - ch->fb = (data & 0x0e) >> 1; - ch->con = data & 0x01; ch->alg = ch->con; if (ch->dev->newm) { @@ -1096,12 +1096,24 @@ channel_write_c0(chan_t *ch, uint8_t data) channel_setup_alg(ch); } else channel_setup_alg(ch); +} + +static void +channel_write_c0(chan_t *ch, uint8_t data) +{ + ch->fb = (data & 0x0e) >> 1; + ch->con = data & 0x01; if (ch->dev->newm) { ch->cha = ((data >> 4) & 0x01) ? ~0 : 0; ch->chb = ((data >> 5) & 0x01) ? ~0 : 0; - } else + ch->chc = ((data >> 6) & 0x01) ? ~0 : 0; + ch->chd = ((data >> 7) & 0x01) ? ~0 : 0; + } else { ch->cha = ch->chb = (uint16_t) ~0; + // TODO: Verify on real chip if DAC2 output is disabled in compat mode + ch->chc = ch->chd = 0; + } #if OPL_ENABLE_STEREOEXT if (!ch->dev->stereoext) { @@ -1174,9 +1186,12 @@ channel_set_4op(nuked_t *dev, uint8_t data) if ((data >> bit) & 0x01) { dev->chan[chnum].chtype = ch_4op; dev->chan[chnum + 3].chtype = ch_4op2; + channel_update_alg(&dev->chan[chnum]); } else { dev->chan[chnum].chtype = ch_2op; dev->chan[chnum + 3].chtype = ch_2op; + channel_update_alg(&dev->chan[chnum]); + channel_update_alg(&dev->chan[chnum + 3]); } } } @@ -1337,19 +1352,20 @@ static void process_slot(slot_t *slot) slot_generate(slot); } -void -nuked_generate(void *priv, int32_t *bufp) +inline void +nuked_generate_4ch(void *priv, int32_t *buf4) { nuked_t *dev = (nuked_t *) priv; chan_t *ch; wrbuf_t *writebuf; int16_t **out; - int32_t mix; + int32_t mix[2]; int16_t accm; int16_t shift = 0; uint8_t i; - bufp[1] = dev->mixbuff[1]; + buf4[1] = dev->mixbuff[1]; + buf4[3] = dev->mixbuff[3]; #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 0; i < 15; i++) @@ -1358,47 +1374,52 @@ nuked_generate(void *priv, int32_t *bufp) #endif process_slot(&dev->slot[i]); - mix = 0; + mix[0] = mix[1] = 0; for (i = 0; i < 18; i++) { ch = &dev->chan[i]; out = ch->out; accm = *out[0] + *out[1] + *out[2] + *out[3]; #if OPL_ENABLE_STEREOEXT - mix += (int16_t)((accm * ch->leftpan) >> 16); + mix[0] += (int16_t)((accm * ch->leftpan) >> 16); #else - mix += (int16_t) (accm & ch->cha); + mix[0] += (int16_t) (accm & ch->cha); #endif + mix[1] += (int16_t) (accm & ch->chc); } - dev->mixbuff[0] = mix; + dev->mixbuff[0] = mix[0]; + dev->mixbuff[2] = mix[1]; #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 15; i < 18; i++) process_slot(&dev->slot[i]); #endif - bufp[0] = dev->mixbuff[0]; + buf4[0] = dev->mixbuff[0]; + buf4[2] = dev->mixbuff[2]; #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 18; i < 33; i++) process_slot(&dev->slot[i]); #endif - mix = 0; + mix[0] = mix[1] = 0; for (i = 0; i < 18; i++) { ch = &dev->chan[i]; out = ch->out; accm = *out[0] + *out[1] + *out[2] + *out[3]; #if OPL_ENABLE_STEREOEXT - mix += (int16_t)((accm * ch->leftpan) >> 16); + mix[0] += (int16_t)((accm * ch->leftpan) >> 16); #else - mix += (int16_t) (accm & ch->chb); + mix[0] += (int16_t) (accm & ch->chb); #endif + mix[1] += (int16_t) (accm & ch->chd); } - dev->mixbuff[1] = mix; + dev->mixbuff[1] = mix[0]; + dev->mixbuff[3] = mix[1]; #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 33; i < 36; i++) @@ -1455,26 +1476,50 @@ nuked_generate(void *priv, int32_t *bufp) dev->wrbuf_samplecnt++; } +void nuked_generate(nuked_t *dev, int32_t *buf4) +{ + int32_t samples[4]; + nuked_generate_4ch(dev, samples); + buf4[0] = samples[0]; + buf4[1] = samples[1]; +} + void -nuked_generate_resampled(nuked_t *dev, int32_t *bufp) +nuked_generate_4ch_resampled(nuked_t *dev, int16_t *buf4) { while (dev->samplecnt >= dev->rateratio) { dev->oldsamples[0] = dev->samples[0]; dev->oldsamples[1] = dev->samples[1]; - nuked_generate(dev, dev->samples); + dev->oldsamples[2] = dev->samples[2]; + dev->oldsamples[3] = dev->samples[3]; + nuked_generate_4ch(dev, dev->samples); dev->samplecnt -= dev->rateratio; } - bufp[0] = (int32_t) ((dev->oldsamples[0] * (dev->rateratio - dev->samplecnt) + buf4[0] = (int32_t) ((dev->oldsamples[0] * (dev->rateratio - dev->samplecnt) + dev->samples[0] * dev->samplecnt) / dev->rateratio); - bufp[1] = (int32_t) ((dev->oldsamples[1] * (dev->rateratio - dev->samplecnt) + buf4[1] = (int32_t) ((dev->oldsamples[1] * (dev->rateratio - dev->samplecnt) + dev->samples[1] * dev->samplecnt) / dev->rateratio); + buf4[2] = (int32_t) ((dev->oldsamples[2] * (dev->rateratio - dev->samplecnt) + + dev->samples[2] * dev->samplecnt) + / dev->rateratio); + buf4[3] = (int32_t) ((dev->oldsamples[3] * (dev->rateratio - dev->samplecnt) + + dev->samples[3] * dev->samplecnt) + / dev->rateratio); dev->samplecnt += 1 << RSM_FRAC; } +void nuked_generate_resampled(nuked_t *dev, int16_t *buf4) +{ + int16_t samples[4]; + nuked_generate_4ch_resampled(dev, samples); + buf4[0] = samples[0]; + buf4[1] = samples[1]; +} + void nuked_generate_raw(nuked_t *dev, int32_t *bufp) { @@ -1484,10 +1529,26 @@ nuked_generate_raw(nuked_t *dev, int32_t *bufp) bufp[1] = (int32_t) dev->samples[1]; } +void +nuked_generate_4ch_stream(nuked_t *dev, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples) +{ + int16_t samples[4]; + + for (uint_fast32_t i = 0; i < numsamples; i++) { + nuked_generate_4ch_resampled(dev, samples); + sndptr1[0] = samples[0]; + sndptr1[1] = samples[1]; + sndptr2[0] = samples[2]; + sndptr2[1] = samples[3]; + sndptr1 += 2; + sndptr2 += 2; + } +} + void nuked_generate_stream(nuked_t *dev, int32_t *sndptr, uint32_t num) { - for (uint32_t i = 0; i < num; i++) { + for (uint_fast32_t i = 0; i < num; i++) { nuked_generate_raw(dev, sndptr); sndptr += 2; } From b5b5353d46837dcb9d20c9a8716df0118012dd27 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 10 Jul 2024 06:53:48 -0400 Subject: [PATCH 083/624] Use only unsigned literals inside array index math expressions Avoids OOBs as detected by UBSan Co-Authored-By: Evan Ramos <1585791+hendricks266@users.noreply.github.com> --- src/sound/snd_opl_nuked.c | 88 +++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 03c7a6b01..a64dc196b 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -386,7 +386,7 @@ env_calc_exp(uint32_t level) if (level > 0x1fff) level = 0x1fff; - return ((exprom[level & 0xff] << 1) >> (level >> 8)); + return ((exprom[level & 0xffu] << 1) >> (level >> 8)); } static int16_t @@ -401,9 +401,9 @@ env_calc_sin0(uint16_t phase, uint16_t env) neg = 0xffff; if (phase & 0x0100) - out = logsinrom[(phase & 0xff) ^ 0xff]; + out = logsinrom[(phase & 0xffu) ^ 0xffu]; else - out = logsinrom[phase & 0xff]; + out = logsinrom[phase & 0xffu]; return (env_calc_exp(out + (env << 3)) ^ neg); } @@ -418,9 +418,9 @@ env_calc_sin1(uint16_t phase, uint16_t env) if (phase & 0x0200) out = 0x1000; else if (phase & 0x0100) - out = logsinrom[(phase & 0xff) ^ 0xff]; + out = logsinrom[(phase & 0xffu) ^ 0xffu]; else - out = logsinrom[phase & 0xff]; + out = logsinrom[phase & 0xffu]; return (env_calc_exp(out + (env << 3))); } @@ -433,9 +433,9 @@ env_calc_sin2(uint16_t phase, uint16_t env) phase &= 0x03ff; if (phase & 0x0100) - out = logsinrom[(phase & 0xff) ^ 0xff]; + out = logsinrom[(phase & 0xffu) ^ 0xffu]; else - out = logsinrom[phase & 0xff]; + out = logsinrom[phase & 0xffu]; return (env_calc_exp(out + (env << 3))); } @@ -450,7 +450,7 @@ env_calc_sin3(uint16_t phase, uint16_t env) if (phase & 0x0100) out = 0x1000; else - out = logsinrom[phase & 0xff]; + out = logsinrom[phase & 0xffu]; return (env_calc_exp(out + (env << 3))); } @@ -469,9 +469,9 @@ env_calc_sin4(uint16_t phase, uint16_t env) if (phase & 0x0200) out = 0x1000; else if (phase & 0x80) - out = logsinrom[((phase ^ 0xff) << 1) & 0xff]; + out = logsinrom[((phase ^ 0xffu) << 1u) & 0xffu]; else - out = logsinrom[(phase << 1) & 0xff]; + out = logsinrom[(phase << 1u) & 0xffu]; return (env_calc_exp(out + (env << 3)) ^ neg); } @@ -486,9 +486,9 @@ env_calc_sin5(uint16_t phase, uint16_t env) if (phase & 0x0200) out = 0x1000; else if (phase & 0x80) - out = logsinrom[((phase ^ 0xff) << 1) & 0xff]; + out = logsinrom[((phase ^ 0xffu) << 1u) & 0xffu]; else - out = logsinrom[(phase << 1) & 0xff]; + out = logsinrom[(phase << 1u) & 0xffu]; return (env_calc_exp(out + (env << 3))); } @@ -538,7 +538,7 @@ static const env_sinfunc env_sin[8] = { static void env_update_ksl(slot_t *slot) { - int16_t ksl = (kslrom[slot->chan->f_num >> 6] << 2) + int16_t ksl = (kslrom[slot->chan->f_num >> 6u] << 2) - ((0x08 - slot->chan->block) << 5); if (ksl < 0) @@ -622,7 +622,7 @@ env_calc(slot_t *slot) break; } } else { - shift = (rate_hi & 0x03) + eg_incstep[rate_lo][slot->dev->timer & 0x03]; + shift = (rate_hi & 0x03) + eg_incstep[rate_lo][slot->dev->timer & 0x03u]; if (shift & 0x04) shift = 0x03; if (!shift) @@ -1128,7 +1128,7 @@ static void channel_write_d0(chan_t *ch, uint8_t data) { if (ch->dev->stereoext) { - ch->leftpan = panpot_lut[data ^ 0xff]; + ch->leftpan = panpot_lut[data ^ 0xffu]; ch->rightpan = panpot_lut[data]; } } @@ -1184,14 +1184,14 @@ channel_set_4op(nuked_t *dev, uint8_t data) chnum += 9 - 3; if ((data >> bit) & 0x01) { - dev->chan[chnum].chtype = ch_4op; - dev->chan[chnum + 3].chtype = ch_4op2; + dev->chan[chnum].chtype = ch_4op; + dev->chan[chnum + 3u].chtype = ch_4op2; channel_update_alg(&dev->chan[chnum]); } else { - dev->chan[chnum].chtype = ch_2op; - dev->chan[chnum + 3].chtype = ch_2op; + dev->chan[chnum].chtype = ch_2op; + dev->chan[chnum + 3u].chtype = ch_2op; channel_update_alg(&dev->chan[chnum]); - channel_update_alg(&dev->chan[chnum + 3]); + channel_update_alg(&dev->chan[chnum + 3u]); } } } @@ -1247,31 +1247,31 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) case 0x20: case 0x30: - if (ad_slot[regm & 0x1f] >= 0) - slot_write_20(&dev->slot[18 * high + ad_slot[regm & 0x1f]], val); + if (ad_slot[regm & 0x1fu] >= 0) + slot_write_20(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x40: case 0x50: - if (ad_slot[regm & 0x1f] >= 0) - slot_write_40(&dev->slot[18 * high + ad_slot[regm & 0x1f]], val); + if (ad_slot[regm & 0x1fu] >= 0) + slot_write_40(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x60: case 0x70: - if (ad_slot[regm & 0x1f] >= 0) - slot_write_60(&dev->slot[18 * high + ad_slot[regm & 0x1f]], val); + if (ad_slot[regm & 0x1fu] >= 0) + slot_write_60(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x80: case 0x90: - if (ad_slot[regm & 0x1f] >= 0) - slot_write_80(&dev->slot[18 * high + ad_slot[regm & 0x1f]], val); + if (ad_slot[regm & 0x1fu] >= 0) + slot_write_80(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0xa0: if ((regm & 0x0f) < 9) - channel_write_a0(&dev->chan[9 * high + (regm & 0x0f)], val); + channel_write_a0(&dev->chan[9u * high + (regm & 0x0fu)], val); break; case 0xb0: @@ -1280,31 +1280,31 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) dev->vibshift = ((val >> 6) & 0x01) ^ 1; channel_update_rhythm(dev, val); } else if ((regm & 0x0f) < 9) { - channel_write_b0(&dev->chan[9 * high + (regm & 0x0f)], val); + channel_write_b0(&dev->chan[9u * high + (regm & 0x0fu)], val); if (val & 0x20) - channel_key_on(&dev->chan[9 * high + (regm & 0x0f)]); + channel_key_on(&dev->chan[9u * high + (regm & 0x0fu)]); else - channel_key_off(&dev->chan[9 * high + (regm & 0x0f)]); + channel_key_off(&dev->chan[9u * high + (regm & 0x0fu)]); } break; case 0xc0: if ((regm & 0x0f) < 9) - channel_write_c0(&dev->chan[9 * high + (regm & 0x0f)], val); + channel_write_c0(&dev->chan[9u * high + (regm & 0x0fu)], val); break; #if OPL_ENABLE_STEREOEXT case 0xd0: if ((regm & 0x0f) < 9) - channel_write_d0(&dev->chan[9 * high + (regm & 0x0f)], val); + channel_write_d0(&dev->chan[9u * high + (regm & 0x0fu)], val); break; #endif case 0xe0: case 0xf0: - if (ad_slot[regm & 0x1f] >= 0) - slot_write_e0(&dev->slot[18 * high + ad_slot[regm & 0x1f]], val); + if (ad_slot[regm & 0x1fu] >= 0) + slot_write_e0(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; default: @@ -1576,17 +1576,17 @@ nuked_init(nuked_t *dev, uint32_t samplerate) } for (i = 0; i < 18; i++) { - ch = &dev->chan[i]; - local_ch_slot = ch_slot[i]; - ch->slots[0] = &dev->slot[local_ch_slot]; - ch->slots[1] = &dev->slot[local_ch_slot + 3]; - dev->slot[local_ch_slot].chan = ch; - dev->slot[local_ch_slot + 3].chan = ch; + ch = &dev->chan[i]; + local_ch_slot = ch_slot[i]; + ch->slots[0] = &dev->slot[local_ch_slot]; + ch->slots[1] = &dev->slot[local_ch_slot + 3u]; + dev->slot[local_ch_slot].chan = ch; + dev->slot[local_ch_slot + 3u].chan = ch; if ((i % 9) < 3) - ch->pair = &dev->chan[i + 3]; + ch->pair = &dev->chan[i + 3u]; else if ((i % 9) < 6) - ch->pair = &dev->chan[i - 3]; + ch->pair = &dev->chan[i - 3u]; ch->dev = dev; ch->out[0] = &dev->zeromod; From 5efc896a440b573109dbcce53354ed7d3fd2e52e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 10 Jul 2024 07:05:29 -0400 Subject: [PATCH 084/624] snd_opl_nuked.c: Fixed the uint64_t comparison issue UINT64_C macro added because of comparison issues in some cases. Co-Authored-By: Vitaly Novichkov <6751442+wohlstand@users.noreply.github.com> Co-Authored-By: nukeykt --- src/sound/snd_opl_nuked.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index a64dc196b..c8dfe7609 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -1451,7 +1451,7 @@ nuked_generate_4ch(void *priv, int32_t *buf4) } if (dev->eg_timerrem || dev->eg_state) { - if (dev->eg_timer == 0xfffffffff) { + if (dev->eg_timer == UINT64_C(0xfffffffff)) { dev->eg_timer = 0; dev->eg_timerrem = 1; } else { From 5209e949ad66a9fa2eb20d7cd33fef4b01801f18 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 10 Jul 2024 07:13:25 -0400 Subject: [PATCH 085/624] Fixed conflict with Qt because of global "slots" macro Co-Authored-By: Vitaly Novichkov <6751442+wohlstand@users.noreply.github.com> Co-Authored-By: nukeykt --- src/sound/snd_opl_nuked.c | 176 +++++++++++++++++++------------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index c8dfe7609..5449ebbd2 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -134,7 +134,7 @@ typedef struct slot { } slot_t; typedef struct chan { - slot_t *slots[2]; + slot_t *slotz[2]; // Don't use "slots" keyword to avoid conflict with Qt applications struct chan *pair; struct chip *dev; int16_t *out[4]; @@ -860,18 +860,18 @@ channel_update_rhythm(nuked_t *dev, uint8_t data) ch6 = &dev->chan[6]; ch7 = &dev->chan[7]; ch8 = &dev->chan[8]; - ch6->out[0] = &ch6->slots[1]->out; - ch6->out[1] = &ch6->slots[1]->out; + ch6->out[0] = &ch6->slotz[1]->out; + ch6->out[1] = &ch6->slotz[1]->out; ch6->out[2] = &dev->zeromod; ch6->out[3] = &dev->zeromod; - ch7->out[0] = &ch7->slots[0]->out; - ch7->out[1] = &ch7->slots[0]->out; - ch7->out[2] = &ch7->slots[1]->out; - ch7->out[3] = &ch7->slots[1]->out; - ch8->out[0] = &ch8->slots[0]->out; - ch8->out[1] = &ch8->slots[0]->out; - ch8->out[2] = &ch8->slots[1]->out; - ch8->out[3] = &ch8->slots[1]->out; + ch7->out[0] = &ch7->slotz[0]->out; + ch7->out[1] = &ch7->slotz[0]->out; + ch7->out[2] = &ch7->slotz[1]->out; + ch7->out[3] = &ch7->slotz[1]->out; + ch8->out[0] = &ch8->slotz[0]->out; + ch8->out[1] = &ch8->slotz[0]->out; + ch8->out[2] = &ch8->slotz[1]->out; + ch8->out[3] = &ch8->slotz[1]->out; for (chnum = 6; chnum < 9; chnum++) dev->chan[chnum].chtype = ch_drum; @@ -882,43 +882,43 @@ channel_update_rhythm(nuked_t *dev, uint8_t data) // hh if (dev->rhy & 0x01) - env_key_on(ch7->slots[0], egk_drum); + env_key_on(ch7->slotz[0], egk_drum); else - env_key_off(ch7->slots[0], egk_drum); + env_key_off(ch7->slotz[0], egk_drum); // tc if (dev->rhy & 0x02) - env_key_on(ch8->slots[1], egk_drum); + env_key_on(ch8->slotz[1], egk_drum); else - env_key_off(ch8->slots[1], egk_drum); + env_key_off(ch8->slotz[1], egk_drum); // tom if (dev->rhy & 0x04) - env_key_on(ch8->slots[0], egk_drum); + env_key_on(ch8->slotz[0], egk_drum); else - env_key_off(ch8->slots[0], egk_drum); + env_key_off(ch8->slotz[0], egk_drum); // sd if (dev->rhy & 0x08) - env_key_on(ch7->slots[1], egk_drum); + env_key_on(ch7->slotz[1], egk_drum); else - env_key_off(ch7->slots[1], egk_drum); + env_key_off(ch7->slotz[1], egk_drum); // bd if (dev->rhy & 0x10) { - env_key_on(ch6->slots[0], egk_drum); - env_key_on(ch6->slots[1], egk_drum); + env_key_on(ch6->slotz[0], egk_drum); + env_key_on(ch6->slotz[1], egk_drum); } else { - env_key_off(ch6->slots[0], egk_drum); - env_key_off(ch6->slots[1], egk_drum); + env_key_off(ch6->slotz[0], egk_drum); + env_key_off(ch6->slotz[1], egk_drum); } } else { for (chnum = 6; chnum < 9; chnum++) { dev->chan[chnum].chtype = ch_2op; channel_setup_alg(&dev->chan[chnum]); - env_key_off(dev->chan[chnum].slots[0], egk_drum); - env_key_off(dev->chan[chnum].slots[1], egk_drum); + env_key_off(dev->chan[chnum].slotz[0], egk_drum); + env_key_off(dev->chan[chnum].slotz[1], egk_drum); } } } @@ -933,15 +933,15 @@ channel_write_a0(chan_t *ch, uint8_t data) ch->ksv = (ch->block << 1) | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); - env_update_ksl(ch->slots[0]); - env_update_ksl(ch->slots[1]); + env_update_ksl(ch->slotz[0]); + env_update_ksl(ch->slotz[1]); if (ch->dev->newm && ch->chtype == ch_4op) { ch->pair->f_num = ch->f_num; ch->pair->ksv = ch->ksv; - env_update_ksl(ch->pair->slots[0]); - env_update_ksl(ch->pair->slots[1]); + env_update_ksl(ch->pair->slotz[0]); + env_update_ksl(ch->pair->slotz[1]); } } @@ -956,16 +956,16 @@ channel_write_b0(chan_t *ch, uint8_t data) ch->ksv = (ch->block << 1) | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); - env_update_ksl(ch->slots[0]); - env_update_ksl(ch->slots[1]); + env_update_ksl(ch->slotz[0]); + env_update_ksl(ch->slotz[1]); if (ch->dev->newm && ch->chtype == ch_4op) { ch->pair->f_num = ch->f_num; ch->pair->block = ch->block; ch->pair->ksv = ch->ksv; - env_update_ksl(ch->pair->slots[0]); - env_update_ksl(ch->pair->slots[1]); + env_update_ksl(ch->pair->slotz[0]); + env_update_ksl(ch->pair->slotz[1]); } } @@ -974,20 +974,20 @@ channel_setup_alg(chan_t *ch) { if (ch->chtype == ch_drum) { if (ch->ch_num == 7 || ch->ch_num == 8) { - ch->slots[0]->mod = &ch->dev->zeromod; - ch->slots[1]->mod = &ch->dev->zeromod; + ch->slotz[0]->mod = &ch->dev->zeromod; + ch->slotz[1]->mod = &ch->dev->zeromod; return; } switch (ch->alg & 0x01) { case 0x00: - ch->slots[0]->mod = &ch->slots[0]->fbmod; - ch->slots[1]->mod = &ch->slots[0]->out; + ch->slotz[0]->mod = &ch->slotz[0]->fbmod; + ch->slotz[1]->mod = &ch->slotz[0]->out; break; case 0x01: - ch->slots[0]->mod = &ch->slots[0]->fbmod; - ch->slots[1]->mod = &ch->dev->zeromod; + ch->slotz[0]->mod = &ch->slotz[0]->fbmod; + ch->slotz[1]->mod = &ch->dev->zeromod; break; default: @@ -1007,46 +1007,46 @@ channel_setup_alg(chan_t *ch) switch (ch->alg & 0x03) { case 0x00: - ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; - ch->pair->slots[1]->mod = &ch->pair->slots[0]->out; - ch->slots[0]->mod = &ch->pair->slots[1]->out; - ch->slots[1]->mod = &ch->slots[0]->out; - ch->out[0] = &ch->slots[1]->out; + ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; + ch->pair->slotz[1]->mod = &ch->pair->slotz[0]->out; + ch->slotz[0]->mod = &ch->pair->slotz[1]->out; + ch->slotz[1]->mod = &ch->slotz[0]->out; + ch->out[0] = &ch->slotz[1]->out; ch->out[1] = &ch->dev->zeromod; ch->out[2] = &ch->dev->zeromod; ch->out[3] = &ch->dev->zeromod; break; case 0x01: - ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; - ch->pair->slots[1]->mod = &ch->pair->slots[0]->out; - ch->slots[0]->mod = &ch->dev->zeromod; - ch->slots[1]->mod = &ch->slots[0]->out; - ch->out[0] = &ch->pair->slots[1]->out; - ch->out[1] = &ch->slots[1]->out; + ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; + ch->pair->slotz[1]->mod = &ch->pair->slotz[0]->out; + ch->slotz[0]->mod = &ch->dev->zeromod; + ch->slotz[1]->mod = &ch->slotz[0]->out; + ch->out[0] = &ch->pair->slotz[1]->out; + ch->out[1] = &ch->slotz[1]->out; ch->out[2] = &ch->dev->zeromod; ch->out[3] = &ch->dev->zeromod; break; case 0x02: - ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; - ch->pair->slots[1]->mod = &ch->dev->zeromod; - ch->slots[0]->mod = &ch->pair->slots[1]->out; - ch->slots[1]->mod = &ch->slots[0]->out; - ch->out[0] = &ch->pair->slots[0]->out; - ch->out[1] = &ch->slots[1]->out; + ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; + ch->pair->slotz[1]->mod = &ch->dev->zeromod; + ch->slotz[0]->mod = &ch->pair->slotz[1]->out; + ch->slotz[1]->mod = &ch->slotz[0]->out; + ch->out[0] = &ch->pair->slotz[0]->out; + ch->out[1] = &ch->slotz[1]->out; ch->out[2] = &ch->dev->zeromod; ch->out[3] = &ch->dev->zeromod; break; case 0x03: - ch->pair->slots[0]->mod = &ch->pair->slots[0]->fbmod; - ch->pair->slots[1]->mod = &ch->dev->zeromod; - ch->slots[0]->mod = &ch->pair->slots[1]->out; - ch->slots[1]->mod = &ch->dev->zeromod; - ch->out[0] = &ch->pair->slots[0]->out; - ch->out[1] = &ch->slots[0]->out; - ch->out[2] = &ch->slots[1]->out; + ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; + ch->pair->slotz[1]->mod = &ch->dev->zeromod; + ch->slotz[0]->mod = &ch->pair->slotz[1]->out; + ch->slotz[1]->mod = &ch->dev->zeromod; + ch->out[0] = &ch->pair->slotz[0]->out; + ch->out[1] = &ch->slotz[0]->out; + ch->out[2] = &ch->slotz[1]->out; ch->out[3] = &ch->dev->zeromod; break; @@ -1056,19 +1056,19 @@ channel_setup_alg(chan_t *ch) } else switch (ch->alg & 0x01) { case 0x00: - ch->slots[0]->mod = &ch->slots[0]->fbmod; - ch->slots[1]->mod = &ch->slots[0]->out; - ch->out[0] = &ch->slots[1]->out; + ch->slotz[0]->mod = &ch->slotz[0]->fbmod; + ch->slotz[1]->mod = &ch->slotz[0]->out; + ch->out[0] = &ch->slotz[1]->out; ch->out[1] = &ch->dev->zeromod; ch->out[2] = &ch->dev->zeromod; ch->out[3] = &ch->dev->zeromod; break; case 0x01: - ch->slots[0]->mod = &ch->slots[0]->fbmod; - ch->slots[1]->mod = &ch->dev->zeromod; - ch->out[0] = &ch->slots[0]->out; - ch->out[1] = &ch->slots[1]->out; + ch->slotz[0]->mod = &ch->slotz[0]->fbmod; + ch->slotz[1]->mod = &ch->dev->zeromod; + ch->out[0] = &ch->slotz[0]->out; + ch->out[1] = &ch->slotz[1]->out; ch->out[2] = &ch->dev->zeromod; ch->out[3] = &ch->dev->zeromod; break; @@ -1139,17 +1139,17 @@ channel_key_on(chan_t *ch) { if (ch->dev->newm) { if (ch->chtype == ch_4op) { - env_key_on(ch->slots[0], egk_norm); - env_key_on(ch->slots[1], egk_norm); - env_key_on(ch->pair->slots[0], egk_norm); - env_key_on(ch->pair->slots[1], egk_norm); + env_key_on(ch->slotz[0], egk_norm); + env_key_on(ch->slotz[1], egk_norm); + env_key_on(ch->pair->slotz[0], egk_norm); + env_key_on(ch->pair->slotz[1], egk_norm); } else if (ch->chtype == ch_2op || ch->chtype == ch_drum) { - env_key_on(ch->slots[0], egk_norm); - env_key_on(ch->slots[1], egk_norm); + env_key_on(ch->slotz[0], egk_norm); + env_key_on(ch->slotz[1], egk_norm); } } else { - env_key_on(ch->slots[0], egk_norm); - env_key_on(ch->slots[1], egk_norm); + env_key_on(ch->slotz[0], egk_norm); + env_key_on(ch->slotz[1], egk_norm); } } @@ -1158,17 +1158,17 @@ channel_key_off(chan_t *ch) { if (ch->dev->newm) { if (ch->chtype == ch_4op) { - env_key_off(ch->slots[0], egk_norm); - env_key_off(ch->slots[1], egk_norm); - env_key_off(ch->pair->slots[0], egk_norm); - env_key_off(ch->pair->slots[1], egk_norm); + env_key_off(ch->slotz[0], egk_norm); + env_key_off(ch->slotz[1], egk_norm); + env_key_off(ch->pair->slotz[0], egk_norm); + env_key_off(ch->pair->slotz[1], egk_norm); } else if (ch->chtype == ch_2op || ch->chtype == ch_drum) { - env_key_off(ch->slots[0], egk_norm); - env_key_off(ch->slots[1], egk_norm); + env_key_off(ch->slotz[0], egk_norm); + env_key_off(ch->slotz[1], egk_norm); } } else { - env_key_off(ch->slots[0], egk_norm); - env_key_off(ch->slots[1], egk_norm); + env_key_off(ch->slotz[0], egk_norm); + env_key_off(ch->slotz[1], egk_norm); } } @@ -1578,8 +1578,8 @@ nuked_init(nuked_t *dev, uint32_t samplerate) for (i = 0; i < 18; i++) { ch = &dev->chan[i]; local_ch_slot = ch_slot[i]; - ch->slots[0] = &dev->slot[local_ch_slot]; - ch->slots[1] = &dev->slot[local_ch_slot + 3u]; + ch->slotz[0] = &dev->slot[local_ch_slot]; + ch->slotz[1] = &dev->slot[local_ch_slot + 3u]; dev->slot[local_ch_slot].chan = ch; dev->slot[local_ch_slot + 3u].chan = ch; From 56f50f4ebe1ab479e15361a25e9c14724bee07bc Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 12 Jul 2024 00:46:30 -0400 Subject: [PATCH 086/624] Fix the envelope generator Co-Authored-By: nukeykt --- src/sound/snd_opl_nuked.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 5449ebbd2..2bc6c2a67 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -170,6 +170,7 @@ typedef struct chip { uint8_t eg_timerrem; uint8_t eg_state; uint8_t eg_add; + uint64_t eg_timer_lo; uint8_t newm; uint8_t nts; uint8_t rhy; @@ -622,7 +623,7 @@ env_calc(slot_t *slot) break; } } else { - shift = (rate_hi & 0x03) + eg_incstep[rate_lo][slot->dev->timer & 0x03u]; + shift = (rate_hi & 0x03) + eg_incstep[rate_lo][slot->dev->eg_timer_lo]; if (shift & 0x04) shift = 0x03; if (!shift) @@ -1438,16 +1439,16 @@ nuked_generate_4ch(void *priv, int32_t *buf4) dev->vibpos = (dev->vibpos + 1) & 7; dev->timer++; - dev->eg_add = 0; - if (dev->eg_timer) { - while (shift < 36 && ((dev->eg_timer >> shift) & 1) == 0) + if (dev->eg_state) { + while (shift < 13 && ((dev->eg_timer >> shift) & 1) == 0) shift++; if (shift > 12) dev->eg_add = 0; else dev->eg_add = shift + 1; + dev->eg_timer_lo = (uint8_t) (dev->eg_timer & 0x3u); } if (dev->eg_timerrem || dev->eg_state) { From 2f097d2fe65a08d0958c27fcd6267148fde690ee Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 12 Jul 2024 19:34:24 -0400 Subject: [PATCH 087/624] reorganise snd_opl_nuked.c to closer match upstream --- src/sound/snd_opl_nuked.c | 376 +++++++++++++++++++------------------- 1 file changed, 190 insertions(+), 186 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 2bc6c2a67..7527c5206 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -1197,6 +1197,195 @@ channel_set_4op(nuked_t *dev, uint8_t data) } } +static void +process_slot(slot_t *slot) +{ + slot_calc_fb(slot); + env_calc(slot); + phase_generate(slot); + slot_generate(slot); +} + +inline void +nuked_generate_4ch(void *priv, int32_t *buf4) +{ + nuked_t *dev = (nuked_t *) priv; + chan_t *ch; + wrbuf_t *writebuf; + int16_t **out; + int32_t mix[2]; + int16_t accm; + int16_t shift = 0; + uint8_t i; + + buf4[1] = dev->mixbuff[1]; + buf4[3] = dev->mixbuff[3]; + +#if OPL_QUIRK_CHANNELSAMPLEDELAY + for (i = 0; i < 15; i++) +#else + for (i = 0; i < 36; i++) +#endif + process_slot(&dev->slot[i]); + + mix[0] = mix[1] = 0; + + for (i = 0; i < 18; i++) { + ch = &dev->chan[i]; + out = ch->out; + accm = *out[0] + *out[1] + *out[2] + *out[3]; +#if OPL_ENABLE_STEREOEXT + mix[0] += (int32_t) ((accm * ch->leftpan) >> 16); +#else + mix[0] += (int32_t) (accm & ch->cha); +#endif + mix[1] += (int32_t) (accm & ch->chc); + } + + dev->mixbuff[0] = mix[0]; + dev->mixbuff[2] = mix[1]; + +#if OPL_QUIRK_CHANNELSAMPLEDELAY + for (i = 15; i < 18; i++) + process_slot(&dev->slot[i]); +#endif + + buf4[0] = dev->mixbuff[0]; + buf4[2] = dev->mixbuff[2]; + +#if OPL_QUIRK_CHANNELSAMPLEDELAY + for (i = 18; i < 33; i++) + process_slot(&dev->slot[i]); +#endif + + mix[0] = mix[1] = 0; + + for (i = 0; i < 18; i++) { + ch = &dev->chan[i]; + out = ch->out; + accm = *out[0] + *out[1] + *out[2] + *out[3]; +#if OPL_ENABLE_STEREOEXT + mix[0] += (int32_t) ((accm * ch->rightpan) >> 16); +#else + mix[0] += (int32_t) (accm & ch->chb); +#endif + mix[1] += (int32_t) (accm & ch->chd); + } + + dev->mixbuff[1] = mix[0]; + dev->mixbuff[3] = mix[1]; + +#if OPL_QUIRK_CHANNELSAMPLEDELAY + for (i = 33; i < 36; i++) + process_slot(&dev->slot[i]); +#endif + + if ((dev->timer & 0x3f) == 0x3f) + dev->tremolopos = (dev->tremolopos + 1) % 210; + + if (dev->tremolopos < 105) + dev->tremolo = dev->tremolopos >> dev->tremoloshift; + else + dev->tremolo = (210 - dev->tremolopos) >> dev->tremoloshift; + + if ((dev->timer & 0x03ff) == 0x03ff) + dev->vibpos = (dev->vibpos + 1) & 7; + + dev->timer++; + + if (dev->eg_state) { + while (shift < 13 && ((dev->eg_timer >> shift) & 1) == 0) + shift++; + + if (shift > 12) + dev->eg_add = 0; + else + dev->eg_add = shift + 1; + + dev->eg_timer_lo = (uint8_t) (dev->eg_timer & 0x3u); + } + + if (dev->eg_timerrem || dev->eg_state) { + if (dev->eg_timer == UINT64_C(0xfffffffff)) { + dev->eg_timer = 0; + dev->eg_timerrem = 1; + } else { + dev->eg_timer++; + dev->eg_timerrem = 0; + } + } + + dev->eg_state ^= 1; + + while (writebuf = &dev->wrbuf[dev->wrbuf_cur], writebuf->time <= dev->wrbuf_samplecnt) { + if (!(writebuf->reg & 0x200)) + break; + + writebuf->reg &= 0x01ff; + + nuked_write_reg(dev, writebuf->reg, writebuf->data); + + dev->wrbuf_cur = (dev->wrbuf_cur + 1) % WRBUF_SIZE; + } + + dev->wrbuf_samplecnt++; +} + +void +nuked_generate(nuked_t *dev, int32_t *buf) +{ + int32_t samples[4]; + nuked_generate_4ch(dev, samples); + buf[0] = samples[0]; + buf[1] = samples[1]; +} + +void +nuked_generate_4ch_resampled(nuked_t *dev, int32_t *buf4) +{ + while (dev->samplecnt >= dev->rateratio) { + dev->oldsamples[0] = dev->samples[0]; + dev->oldsamples[1] = dev->samples[1]; + dev->oldsamples[2] = dev->samples[2]; + dev->oldsamples[3] = dev->samples[3]; + nuked_generate_4ch(dev, dev->samples); + dev->samplecnt -= dev->rateratio; + } + + buf4[0] = (int32_t) ((dev->oldsamples[0] * (dev->rateratio - dev->samplecnt) + + dev->samples[0] * dev->samplecnt) + / dev->rateratio); + buf4[1] = (int32_t) ((dev->oldsamples[1] * (dev->rateratio - dev->samplecnt) + + dev->samples[1] * dev->samplecnt) + / dev->rateratio); + buf4[2] = (int32_t) ((dev->oldsamples[2] * (dev->rateratio - dev->samplecnt) + + dev->samples[2] * dev->samplecnt) + / dev->rateratio); + buf4[3] = (int32_t) ((dev->oldsamples[3] * (dev->rateratio - dev->samplecnt) + + dev->samples[3] * dev->samplecnt) + / dev->rateratio); + + dev->samplecnt += 1 << RSM_FRAC; +} + +void +nuked_generate_resampled(nuked_t *dev, int16_t *buf4) +{ + int16_t samples[4]; + nuked_generate_4ch_resampled(dev, samples); + buf4[0] = samples[0]; + buf4[1] = samples[1]; +} + +void +nuked_generate_raw(nuked_t *dev, int32_t *bufp) +{ + nuked_generate(dev, dev->samples); + + bufp[0] = (int32_t) dev->samples[0]; + bufp[1] = (int32_t) dev->samples[1]; +} + uint16_t nuked_write_addr(void *priv, uint16_t port, uint8_t val) { @@ -1345,191 +1534,6 @@ nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) dev->wrbuf_last = (writebuf_last + 1) % WRBUF_SIZE; } -static void process_slot(slot_t *slot) -{ - slot_calc_fb(slot); - env_calc(slot); - phase_generate(slot); - slot_generate(slot); -} - -inline void -nuked_generate_4ch(void *priv, int32_t *buf4) -{ - nuked_t *dev = (nuked_t *) priv; - chan_t *ch; - wrbuf_t *writebuf; - int16_t **out; - int32_t mix[2]; - int16_t accm; - int16_t shift = 0; - uint8_t i; - - buf4[1] = dev->mixbuff[1]; - buf4[3] = dev->mixbuff[3]; - -#if OPL_QUIRK_CHANNELSAMPLEDELAY - for (i = 0; i < 15; i++) -#else - for (i = 0; i < 36; i++) -#endif - process_slot(&dev->slot[i]); - - mix[0] = mix[1] = 0; - - for (i = 0; i < 18; i++) { - ch = &dev->chan[i]; - out = ch->out; - accm = *out[0] + *out[1] + *out[2] + *out[3]; -#if OPL_ENABLE_STEREOEXT - mix[0] += (int16_t)((accm * ch->leftpan) >> 16); -#else - mix[0] += (int16_t) (accm & ch->cha); -#endif - mix[1] += (int16_t) (accm & ch->chc); - } - - dev->mixbuff[0] = mix[0]; - dev->mixbuff[2] = mix[1]; - -#if OPL_QUIRK_CHANNELSAMPLEDELAY - for (i = 15; i < 18; i++) - process_slot(&dev->slot[i]); -#endif - - buf4[0] = dev->mixbuff[0]; - buf4[2] = dev->mixbuff[2]; - -#if OPL_QUIRK_CHANNELSAMPLEDELAY - for (i = 18; i < 33; i++) - process_slot(&dev->slot[i]); -#endif - - mix[0] = mix[1] = 0; - - for (i = 0; i < 18; i++) { - ch = &dev->chan[i]; - out = ch->out; - accm = *out[0] + *out[1] + *out[2] + *out[3]; -#if OPL_ENABLE_STEREOEXT - mix[0] += (int16_t)((accm * ch->leftpan) >> 16); -#else - mix[0] += (int16_t) (accm & ch->chb); -#endif - mix[1] += (int16_t) (accm & ch->chd); - } - - dev->mixbuff[1] = mix[0]; - dev->mixbuff[3] = mix[1]; - -#if OPL_QUIRK_CHANNELSAMPLEDELAY - for (i = 33; i < 36; i++) - process_slot(&dev->slot[i]); -#endif - - if ((dev->timer & 0x3f) == 0x3f) - dev->tremolopos = (dev->tremolopos + 1) % 210; - - if (dev->tremolopos < 105) - dev->tremolo = dev->tremolopos >> dev->tremoloshift; - else - dev->tremolo = (210 - dev->tremolopos) >> dev->tremoloshift; - - if ((dev->timer & 0x03ff) == 0x03ff) - dev->vibpos = (dev->vibpos + 1) & 7; - - dev->timer++; - - if (dev->eg_state) { - while (shift < 13 && ((dev->eg_timer >> shift) & 1) == 0) - shift++; - - if (shift > 12) - dev->eg_add = 0; - else - dev->eg_add = shift + 1; - dev->eg_timer_lo = (uint8_t) (dev->eg_timer & 0x3u); - } - - if (dev->eg_timerrem || dev->eg_state) { - if (dev->eg_timer == UINT64_C(0xfffffffff)) { - dev->eg_timer = 0; - dev->eg_timerrem = 1; - } else { - dev->eg_timer++; - dev->eg_timerrem = 0; - } - } - - dev->eg_state ^= 1; - - while (writebuf = &dev->wrbuf[dev->wrbuf_cur], writebuf->time <= dev->wrbuf_samplecnt) { - if (!(writebuf->reg & 0x200)) - break; - - writebuf->reg &= 0x01ff; - - nuked_write_reg(dev, writebuf->reg, writebuf->data); - - dev->wrbuf_cur = (dev->wrbuf_cur + 1) % WRBUF_SIZE; - } - - dev->wrbuf_samplecnt++; -} - -void nuked_generate(nuked_t *dev, int32_t *buf4) -{ - int32_t samples[4]; - nuked_generate_4ch(dev, samples); - buf4[0] = samples[0]; - buf4[1] = samples[1]; -} - -void -nuked_generate_4ch_resampled(nuked_t *dev, int16_t *buf4) -{ - while (dev->samplecnt >= dev->rateratio) { - dev->oldsamples[0] = dev->samples[0]; - dev->oldsamples[1] = dev->samples[1]; - dev->oldsamples[2] = dev->samples[2]; - dev->oldsamples[3] = dev->samples[3]; - nuked_generate_4ch(dev, dev->samples); - dev->samplecnt -= dev->rateratio; - } - - buf4[0] = (int32_t) ((dev->oldsamples[0] * (dev->rateratio - dev->samplecnt) - + dev->samples[0] * dev->samplecnt) - / dev->rateratio); - buf4[1] = (int32_t) ((dev->oldsamples[1] * (dev->rateratio - dev->samplecnt) - + dev->samples[1] * dev->samplecnt) - / dev->rateratio); - buf4[2] = (int32_t) ((dev->oldsamples[2] * (dev->rateratio - dev->samplecnt) - + dev->samples[2] * dev->samplecnt) - / dev->rateratio); - buf4[3] = (int32_t) ((dev->oldsamples[3] * (dev->rateratio - dev->samplecnt) - + dev->samples[3] * dev->samplecnt) - / dev->rateratio); - - dev->samplecnt += 1 << RSM_FRAC; -} - -void nuked_generate_resampled(nuked_t *dev, int16_t *buf4) -{ - int16_t samples[4]; - nuked_generate_4ch_resampled(dev, samples); - buf4[0] = samples[0]; - buf4[1] = samples[1]; -} - -void -nuked_generate_raw(nuked_t *dev, int32_t *bufp) -{ - nuked_generate(dev, dev->samples); - - bufp[0] = (int32_t) dev->samples[0]; - bufp[1] = (int32_t) dev->samples[1]; -} - void nuked_generate_4ch_stream(nuked_t *dev, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples) { @@ -1550,7 +1554,7 @@ void nuked_generate_stream(nuked_t *dev, int32_t *sndptr, uint32_t num) { for (uint_fast32_t i = 0; i < num; i++) { - nuked_generate_raw(dev, sndptr); + nuked_generate_resampled(dev, sndptr); sndptr += 2; } } From f68e7d3eaebe2ead5227bd71a808740587a5edb9 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 12 Jul 2024 20:22:01 -0400 Subject: [PATCH 088/624] Nuked: env -> envelope --- src/sound/snd_opl_nuked.c | 148 +++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 74 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 7527c5206..9db7f086e 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -18,7 +18,7 @@ * siliconpr0n.org(John McMaster, digshadow): * YMF262 and VRC VII decaps and die shots. * - * Version: 1.8.0 + * Version: 1.8 * * Translation from C++ into C done by Miran Grca. * @@ -378,11 +378,11 @@ static uint8_t panpot_lut_build = 0; #endif // Envelope generator -typedef int16_t (*env_sinfunc)(uint16_t phase, uint16_t envelope); -typedef void (*env_genfunc)(slot_t *slot); +typedef int16_t (*envelope_sinfunc)(uint16_t phase, uint16_t envelope); +typedef void (*envelope_genfunc)(slot_t *slot); static int16_t -env_calc_exp(uint32_t level) +envelope_calc_exp(uint32_t level) { if (level > 0x1fff) level = 0x1fff; @@ -391,7 +391,7 @@ env_calc_exp(uint32_t level) } static int16_t -env_calc_sin0(uint16_t phase, uint16_t env) +envelope_calc_sin0(uint16_t phase, uint16_t envelope) { uint16_t out = 0; uint16_t neg = 0; @@ -406,11 +406,11 @@ env_calc_sin0(uint16_t phase, uint16_t env) else out = logsinrom[phase & 0xffu]; - return (env_calc_exp(out + (env << 3)) ^ neg); + return (envelope_calc_exp(out + (envelope << 3)) ^ neg); } static int16_t -env_calc_sin1(uint16_t phase, uint16_t env) +envelope_calc_sin1(uint16_t phase, uint16_t envelope) { uint16_t out = 0; @@ -423,11 +423,11 @@ env_calc_sin1(uint16_t phase, uint16_t env) else out = logsinrom[phase & 0xffu]; - return (env_calc_exp(out + (env << 3))); + return (envelope_calc_exp(out + (envelope << 3))); } static int16_t -env_calc_sin2(uint16_t phase, uint16_t env) +envelope_calc_sin2(uint16_t phase, uint16_t envelope) { uint16_t out = 0; @@ -438,11 +438,11 @@ env_calc_sin2(uint16_t phase, uint16_t env) else out = logsinrom[phase & 0xffu]; - return (env_calc_exp(out + (env << 3))); + return (envelope_calc_exp(out + (envelope << 3))); } static int16_t -env_calc_sin3(uint16_t phase, uint16_t env) +envelope_calc_sin3(uint16_t phase, uint16_t envelope) { uint16_t out = 0; @@ -453,11 +453,11 @@ env_calc_sin3(uint16_t phase, uint16_t env) else out = logsinrom[phase & 0xffu]; - return (env_calc_exp(out + (env << 3))); + return (envelope_calc_exp(out + (envelope << 3))); } static int16_t -env_calc_sin4(uint16_t phase, uint16_t env) +envelope_calc_sin4(uint16_t phase, uint16_t envelope) { uint16_t out = 0; uint16_t neg = 0; @@ -474,11 +474,11 @@ env_calc_sin4(uint16_t phase, uint16_t env) else out = logsinrom[(phase << 1u) & 0xffu]; - return (env_calc_exp(out + (env << 3)) ^ neg); + return (envelope_calc_exp(out + (envelope << 3)) ^ neg); } static int16_t -env_calc_sin5(uint16_t phase, uint16_t env) +envelope_calc_sin5(uint16_t phase, uint16_t envelope) { uint16_t out = 0; @@ -491,11 +491,11 @@ env_calc_sin5(uint16_t phase, uint16_t env) else out = logsinrom[(phase << 1u) & 0xffu]; - return (env_calc_exp(out + (env << 3))); + return (envelope_calc_exp(out + (envelope << 3))); } static int16_t -env_calc_sin6(uint16_t phase, uint16_t env) +envelope_calc_sin6(uint16_t phase, uint16_t envelope) { uint16_t neg = 0; @@ -504,11 +504,11 @@ env_calc_sin6(uint16_t phase, uint16_t env) if (phase & 0x0200) neg = 0xffff; - return (env_calc_exp(env << 3) ^ neg); + return (envelope_calc_exp(envelope << 3) ^ neg); } static int16_t -env_calc_sin7(uint16_t phase, uint16_t env) +envelope_calc_sin7(uint16_t phase, uint16_t envelope) { uint16_t out = 0; uint16_t neg = 0; @@ -522,22 +522,22 @@ env_calc_sin7(uint16_t phase, uint16_t env) out = phase << 3; - return (env_calc_exp(out + (env << 3)) ^ neg); + return (envelope_calc_exp(out + (envelope << 3)) ^ neg); } -static const env_sinfunc env_sin[8] = { - env_calc_sin0, - env_calc_sin1, - env_calc_sin2, - env_calc_sin3, - env_calc_sin4, - env_calc_sin5, - env_calc_sin6, - env_calc_sin7 +static const envelope_sinfunc envelope_sin[8] = { + envelope_calc_sin0, + envelope_calc_sin1, + envelope_calc_sin2, + envelope_calc_sin3, + envelope_calc_sin4, + envelope_calc_sin5, + envelope_calc_sin6, + envelope_calc_sin7 }; static void -env_update_ksl(slot_t *slot) +envelope_update_ksl(slot_t *slot) { int16_t ksl = (kslrom[slot->chan->f_num >> 6u] << 2) - ((0x08 - slot->chan->block) << 5); @@ -549,7 +549,7 @@ env_update_ksl(slot_t *slot) } static void -env_calc(slot_t *slot) +envelope_calc(slot_t *slot) { uint8_t nonzero; uint8_t rate; @@ -681,13 +681,13 @@ env_calc(slot_t *slot) } static void -env_key_on(slot_t *slot, uint8_t type) +envelope_key_on(slot_t *slot, uint8_t type) { slot->key |= type; } static void -env_key_off(slot_t *slot, uint8_t type) +envelope_key_off(slot_t *slot, uint8_t type) { slot->key &= ~type; } @@ -795,7 +795,7 @@ slot_write_40(slot_t *slot, uint8_t data) slot->reg_ksl = (data >> 6) & 0x03; slot->reg_tl = data & 0x3f; - env_update_ksl(slot); + envelope_update_ksl(slot); } static void @@ -828,7 +828,7 @@ slot_write_e0(slot_t *slot, uint8_t data) static void slot_generate(slot_t *slot) { - slot->out = env_sin[slot->reg_wf](slot->pg_phase_out + *slot->mod, + slot->out = envelope_sin[slot->reg_wf](slot->pg_phase_out + *slot->mod, slot->eg_out); } @@ -883,43 +883,43 @@ channel_update_rhythm(nuked_t *dev, uint8_t data) // hh if (dev->rhy & 0x01) - env_key_on(ch7->slotz[0], egk_drum); + envelope_key_on(ch7->slotz[0], egk_drum); else - env_key_off(ch7->slotz[0], egk_drum); + envelope_key_off(ch7->slotz[0], egk_drum); // tc if (dev->rhy & 0x02) - env_key_on(ch8->slotz[1], egk_drum); + envelope_key_on(ch8->slotz[1], egk_drum); else - env_key_off(ch8->slotz[1], egk_drum); + envelope_key_off(ch8->slotz[1], egk_drum); // tom if (dev->rhy & 0x04) - env_key_on(ch8->slotz[0], egk_drum); + envelope_key_on(ch8->slotz[0], egk_drum); else - env_key_off(ch8->slotz[0], egk_drum); + envelope_key_off(ch8->slotz[0], egk_drum); // sd if (dev->rhy & 0x08) - env_key_on(ch7->slotz[1], egk_drum); + envelope_key_on(ch7->slotz[1], egk_drum); else - env_key_off(ch7->slotz[1], egk_drum); + envelope_key_off(ch7->slotz[1], egk_drum); // bd if (dev->rhy & 0x10) { - env_key_on(ch6->slotz[0], egk_drum); - env_key_on(ch6->slotz[1], egk_drum); + envelope_key_on(ch6->slotz[0], egk_drum); + envelope_key_on(ch6->slotz[1], egk_drum); } else { - env_key_off(ch6->slotz[0], egk_drum); - env_key_off(ch6->slotz[1], egk_drum); + envelope_key_off(ch6->slotz[0], egk_drum); + envelope_key_off(ch6->slotz[1], egk_drum); } } else { for (chnum = 6; chnum < 9; chnum++) { dev->chan[chnum].chtype = ch_2op; channel_setup_alg(&dev->chan[chnum]); - env_key_off(dev->chan[chnum].slotz[0], egk_drum); - env_key_off(dev->chan[chnum].slotz[1], egk_drum); + envelope_key_off(dev->chan[chnum].slotz[0], egk_drum); + envelope_key_off(dev->chan[chnum].slotz[1], egk_drum); } } } @@ -934,15 +934,15 @@ channel_write_a0(chan_t *ch, uint8_t data) ch->ksv = (ch->block << 1) | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); - env_update_ksl(ch->slotz[0]); - env_update_ksl(ch->slotz[1]); + envelope_update_ksl(ch->slotz[0]); + envelope_update_ksl(ch->slotz[1]); if (ch->dev->newm && ch->chtype == ch_4op) { ch->pair->f_num = ch->f_num; ch->pair->ksv = ch->ksv; - env_update_ksl(ch->pair->slotz[0]); - env_update_ksl(ch->pair->slotz[1]); + envelope_update_ksl(ch->pair->slotz[0]); + envelope_update_ksl(ch->pair->slotz[1]); } } @@ -957,16 +957,16 @@ channel_write_b0(chan_t *ch, uint8_t data) ch->ksv = (ch->block << 1) | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); - env_update_ksl(ch->slotz[0]); - env_update_ksl(ch->slotz[1]); + envelope_update_ksl(ch->slotz[0]); + envelope_update_ksl(ch->slotz[1]); if (ch->dev->newm && ch->chtype == ch_4op) { ch->pair->f_num = ch->f_num; ch->pair->block = ch->block; ch->pair->ksv = ch->ksv; - env_update_ksl(ch->pair->slotz[0]); - env_update_ksl(ch->pair->slotz[1]); + envelope_update_ksl(ch->pair->slotz[0]); + envelope_update_ksl(ch->pair->slotz[1]); } } @@ -1140,17 +1140,17 @@ channel_key_on(chan_t *ch) { if (ch->dev->newm) { if (ch->chtype == ch_4op) { - env_key_on(ch->slotz[0], egk_norm); - env_key_on(ch->slotz[1], egk_norm); - env_key_on(ch->pair->slotz[0], egk_norm); - env_key_on(ch->pair->slotz[1], egk_norm); + envelope_key_on(ch->slotz[0], egk_norm); + envelope_key_on(ch->slotz[1], egk_norm); + envelope_key_on(ch->pair->slotz[0], egk_norm); + envelope_key_on(ch->pair->slotz[1], egk_norm); } else if (ch->chtype == ch_2op || ch->chtype == ch_drum) { - env_key_on(ch->slotz[0], egk_norm); - env_key_on(ch->slotz[1], egk_norm); + envelope_key_on(ch->slotz[0], egk_norm); + envelope_key_on(ch->slotz[1], egk_norm); } } else { - env_key_on(ch->slotz[0], egk_norm); - env_key_on(ch->slotz[1], egk_norm); + envelope_key_on(ch->slotz[0], egk_norm); + envelope_key_on(ch->slotz[1], egk_norm); } } @@ -1159,17 +1159,17 @@ channel_key_off(chan_t *ch) { if (ch->dev->newm) { if (ch->chtype == ch_4op) { - env_key_off(ch->slotz[0], egk_norm); - env_key_off(ch->slotz[1], egk_norm); - env_key_off(ch->pair->slotz[0], egk_norm); - env_key_off(ch->pair->slotz[1], egk_norm); + envelope_key_off(ch->slotz[0], egk_norm); + envelope_key_off(ch->slotz[1], egk_norm); + envelope_key_off(ch->pair->slotz[0], egk_norm); + envelope_key_off(ch->pair->slotz[1], egk_norm); } else if (ch->chtype == ch_2op || ch->chtype == ch_drum) { - env_key_off(ch->slotz[0], egk_norm); - env_key_off(ch->slotz[1], egk_norm); + envelope_key_off(ch->slotz[0], egk_norm); + envelope_key_off(ch->slotz[1], egk_norm); } } else { - env_key_off(ch->slotz[0], egk_norm); - env_key_off(ch->slotz[1], egk_norm); + envelope_key_off(ch->slotz[0], egk_norm); + envelope_key_off(ch->slotz[1], egk_norm); } } @@ -1201,7 +1201,7 @@ static void process_slot(slot_t *slot) { slot_calc_fb(slot); - env_calc(slot); + envelope_calc(slot); phase_generate(slot); slot_generate(slot); } From 29d72a82dc55529707ef9ae061cd760c487ea913 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 12 Jul 2024 20:39:01 -0400 Subject: [PATCH 089/624] Nuked: slot_t -> opl_slot --- src/sound/snd_opl_nuked.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 9db7f086e..a634a2a82 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -131,10 +131,10 @@ typedef struct slot { uint32_t pg_phase; uint16_t pg_phase_out; uint8_t slot_num; -} slot_t; +} opl3_slot; typedef struct chan { - slot_t *slotz[2]; // Don't use "slots" keyword to avoid conflict with Qt applications + opl3_slot *slotz[2]; // Don't use "slots" keyword to avoid conflict with Qt applications struct chan *pair; struct chip *dev; int16_t *out[4]; @@ -164,7 +164,7 @@ typedef struct wrbuf { typedef struct chip { chan_t chan[18]; - slot_t slot[36]; + opl3_slot slot[36]; uint16_t timer; uint64_t eg_timer; uint8_t eg_timerrem; @@ -379,7 +379,7 @@ static uint8_t panpot_lut_build = 0; // Envelope generator typedef int16_t (*envelope_sinfunc)(uint16_t phase, uint16_t envelope); -typedef void (*envelope_genfunc)(slot_t *slot); +typedef void (*envelope_genfunc)(opl3_slot *slot); static int16_t envelope_calc_exp(uint32_t level) @@ -537,7 +537,7 @@ static const envelope_sinfunc envelope_sin[8] = { }; static void -envelope_update_ksl(slot_t *slot) +envelope_update_ksl(opl3_slot *slot) { int16_t ksl = (kslrom[slot->chan->f_num >> 6u] << 2) - ((0x08 - slot->chan->block) << 5); @@ -549,7 +549,7 @@ envelope_update_ksl(slot_t *slot) } static void -envelope_calc(slot_t *slot) +envelope_calc(opl3_slot *slot) { uint8_t nonzero; uint8_t rate; @@ -681,19 +681,19 @@ envelope_calc(slot_t *slot) } static void -envelope_key_on(slot_t *slot, uint8_t type) +envelope_key_on(opl3_slot *slot, uint8_t type) { slot->key |= type; } static void -envelope_key_off(slot_t *slot, uint8_t type) +envelope_key_off(opl3_slot *slot, uint8_t type) { slot->key &= ~type; } static void -phase_generate(slot_t *slot) +phase_generate(opl3_slot *slot) { uint16_t f_num; uint32_t basefreq; @@ -776,7 +776,7 @@ phase_generate(slot_t *slot) } static void -slot_write_20(slot_t *slot, uint8_t data) +slot_write_20(opl3_slot *slot, uint8_t data) { if ((data >> 7) & 0x01) slot->trem = &slot->dev->tremolo; @@ -790,7 +790,7 @@ slot_write_20(slot_t *slot, uint8_t data) } static void -slot_write_40(slot_t *slot, uint8_t data) +slot_write_40(opl3_slot *slot, uint8_t data) { slot->reg_ksl = (data >> 6) & 0x03; slot->reg_tl = data & 0x3f; @@ -799,14 +799,14 @@ slot_write_40(slot_t *slot, uint8_t data) } static void -slot_write_60(slot_t *slot, uint8_t data) +slot_write_60(opl3_slot *slot, uint8_t data) { slot->reg_ar = (data >> 4) & 0x0f; slot->reg_dr = data & 0x0f; } static void -slot_write_80(slot_t *slot, uint8_t data) +slot_write_80(opl3_slot *slot, uint8_t data) { slot->reg_sl = (data >> 4) & 0x0f; @@ -817,7 +817,7 @@ slot_write_80(slot_t *slot, uint8_t data) } static void -slot_write_e0(slot_t *slot, uint8_t data) +slot_write_e0(opl3_slot *slot, uint8_t data) { slot->reg_wf = data & 0x07; @@ -826,14 +826,14 @@ slot_write_e0(slot_t *slot, uint8_t data) } static void -slot_generate(slot_t *slot) +slot_generate(opl3_slot *slot) { slot->out = envelope_sin[slot->reg_wf](slot->pg_phase_out + *slot->mod, slot->eg_out); } static void -slot_calc_fb(slot_t *slot) +slot_calc_fb(opl3_slot *slot) { if (slot->chan->fb != 0x00) slot->fbmod = (slot->prout + slot->out) >> (0x09 - slot->chan->fb); @@ -1198,7 +1198,7 @@ channel_set_4op(nuked_t *dev, uint8_t data) } static void -process_slot(slot_t *slot) +process_slot(opl3_slot *slot) { slot_calc_fb(slot); envelope_calc(slot); @@ -1562,7 +1562,7 @@ nuked_generate_stream(nuked_t *dev, int32_t *sndptr, uint32_t num) void nuked_init(nuked_t *dev, uint32_t samplerate) { - slot_t *slot; + opl3_slot *slot; chan_t *ch; uint8_t i; uint8_t local_ch_slot; From 3c0387bfc1ea793356d4cc1aa9241db1ef387f0a Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 12 Jul 2024 21:02:50 -0400 Subject: [PATCH 090/624] Nuked: nuked_t -> opl3_chip --- src/include/86box/snd_opl_nuked.h | 2 ++ src/sound/snd_opl_nuked.c | 34 +++++++++++++++---------------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index e53f860f1..da2a8ae86 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -20,4 +20,6 @@ #ifndef SOUND_OPL_NUKED_H #define SOUND_OPL_NUKED_H +void nuked_write_reg(opl3_chip *dev, uint16_t reg, uint8_t val); + #endif /*SOUND_OPL_NUKED_H*/ diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index a634a2a82..4887c2a2b 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -204,10 +204,10 @@ typedef struct chip { uint32_t wrbuf_last; uint64_t wrbuf_lasttime; wrbuf_t wrbuf[WRBUF_SIZE]; -} nuked_t; +} opl3_chip; typedef struct { - nuked_t opl; + opl3_chip opl; int8_t flags; int8_t pad; @@ -703,7 +703,7 @@ phase_generate(opl3_slot *slot) uint16_t phase; int8_t range; uint8_t vibpos; - nuked_t *dev; + opl3_chip *dev; dev = slot->dev; f_num = slot->chan->f_num; @@ -849,7 +849,7 @@ static void channel_setup_alg(chan_t *ch); static void -channel_update_rhythm(nuked_t *dev, uint8_t data) +channel_update_rhythm(opl3_chip *dev, uint8_t data) { chan_t *ch6; chan_t *ch7; @@ -1174,7 +1174,7 @@ channel_key_off(chan_t *ch) } static void -channel_set_4op(nuked_t *dev, uint8_t data) +channel_set_4op(opl3_chip *dev, uint8_t data) { uint8_t chnum; @@ -1209,7 +1209,7 @@ process_slot(opl3_slot *slot) inline void nuked_generate_4ch(void *priv, int32_t *buf4) { - nuked_t *dev = (nuked_t *) priv; + opl3_chip *dev = (opl3_chip *) priv; chan_t *ch; wrbuf_t *writebuf; int16_t **out; @@ -1332,7 +1332,7 @@ nuked_generate_4ch(void *priv, int32_t *buf4) } void -nuked_generate(nuked_t *dev, int32_t *buf) +nuked_generate(opl3_chip *dev, int32_t *buf) { int32_t samples[4]; nuked_generate_4ch(dev, samples); @@ -1341,7 +1341,7 @@ nuked_generate(nuked_t *dev, int32_t *buf) } void -nuked_generate_4ch_resampled(nuked_t *dev, int32_t *buf4) +nuked_generate_4ch_resampled(opl3_chip *dev, int32_t *buf4) { while (dev->samplecnt >= dev->rateratio) { dev->oldsamples[0] = dev->samples[0]; @@ -1369,7 +1369,7 @@ nuked_generate_4ch_resampled(nuked_t *dev, int32_t *buf4) } void -nuked_generate_resampled(nuked_t *dev, int16_t *buf4) +nuked_generate_resampled(opl3_chip *dev, int16_t *buf4) { int16_t samples[4]; nuked_generate_4ch_resampled(dev, samples); @@ -1378,7 +1378,7 @@ nuked_generate_resampled(nuked_t *dev, int16_t *buf4) } void -nuked_generate_raw(nuked_t *dev, int32_t *bufp) +nuked_generate_raw(opl3_chip *dev, int32_t *bufp) { nuked_generate(dev, dev->samples); @@ -1389,7 +1389,7 @@ nuked_generate_raw(nuked_t *dev, int32_t *bufp) uint16_t nuked_write_addr(void *priv, uint16_t port, uint8_t val) { - const nuked_t *dev = (nuked_t *) priv; + const opl3_chip *dev = (opl3_chip *) priv; uint16_t addr; addr = val; @@ -1402,7 +1402,7 @@ nuked_write_addr(void *priv, uint16_t port, uint8_t val) void nuked_write_reg(void *priv, uint16_t reg, uint8_t val) { - nuked_t *dev = (nuked_t *) priv; + opl3_chip *dev = (opl3_chip *) priv; uint8_t high = (reg >> 8) & 0x01; uint8_t regm = reg & 0xff; @@ -1505,7 +1505,7 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) void nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) { - nuked_t *dev = (nuked_t *) priv; + opl3_chip *dev = (opl3_chip *) priv; uint64_t time1; uint64_t time2; wrbuf_t *writebuf; @@ -1535,7 +1535,7 @@ nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) } void -nuked_generate_4ch_stream(nuked_t *dev, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples) +nuked_generate_4ch_stream(opl3_chip *dev, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples) { int16_t samples[4]; @@ -1551,7 +1551,7 @@ nuked_generate_4ch_stream(nuked_t *dev, int16_t *sndptr1, int16_t *sndptr2, uint } void -nuked_generate_stream(nuked_t *dev, int32_t *sndptr, uint32_t num) +nuked_generate_stream(opl3_chip *dev, int32_t *sndptr, uint32_t num) { for (uint_fast32_t i = 0; i < num; i++) { nuked_generate_resampled(dev, sndptr); @@ -1560,14 +1560,14 @@ nuked_generate_stream(nuked_t *dev, int32_t *sndptr, uint32_t num) } void -nuked_init(nuked_t *dev, uint32_t samplerate) +nuked_init(opl3_chip *dev, uint32_t samplerate) { opl3_slot *slot; chan_t *ch; uint8_t i; uint8_t local_ch_slot; - memset(dev, 0x00, sizeof(nuked_t)); + memset(dev, 0x00, sizeof(opl3_chip)); for (i = 0; i < 36; i++) { slot = &dev->slot[i]; From 483fe43fb4d4d3cd2e93d8870a21a9b639e41cf7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 12 Jul 2024 20:28:12 -0400 Subject: [PATCH 091/624] Nuked: Compile fixes Update snd_opl_nuked.h --- src/include/86box/snd_opl_nuked.h | 2 +- src/sound/snd_opl_nuked.c | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index da2a8ae86..1cc4fe64e 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -20,6 +20,6 @@ #ifndef SOUND_OPL_NUKED_H #define SOUND_OPL_NUKED_H -void nuked_write_reg(opl3_chip *dev, uint16_t reg, uint8_t val); +void nuked_write_reg(void *priv, uint16_t reg, uint8_t val); #endif /*SOUND_OPL_NUKED_H*/ diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 4887c2a2b..0cddb33d0 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -1206,7 +1206,7 @@ process_slot(opl3_slot *slot) slot_generate(slot); } -inline void +static inline void nuked_generate_4ch(void *priv, int32_t *buf4) { opl3_chip *dev = (opl3_chip *) priv; @@ -1369,9 +1369,9 @@ nuked_generate_4ch_resampled(opl3_chip *dev, int32_t *buf4) } void -nuked_generate_resampled(opl3_chip *dev, int16_t *buf4) +nuked_generate_resampled(opl3_chip *dev, int32_t *buf4) { - int16_t samples[4]; + int32_t samples[4]; nuked_generate_4ch_resampled(dev, samples); buf4[0] = samples[0]; buf4[1] = samples[1]; @@ -1537,7 +1537,7 @@ nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) void nuked_generate_4ch_stream(opl3_chip *dev, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples) { - int16_t samples[4]; + int32_t samples[4]; for (uint_fast32_t i = 0; i < numsamples; i++) { nuked_generate_4ch_resampled(dev, samples); From d3142e77936d293be8c7c090c416fd50d2c55c61 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 12 Jul 2024 21:15:34 -0400 Subject: [PATCH 092/624] More reorganization in snd_opl_nuked.c --- src/sound/snd_opl_nuked.c | 132 +++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 0cddb33d0..7e535eb04 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -1377,6 +1377,72 @@ nuked_generate_resampled(opl3_chip *dev, int32_t *buf4) buf4[1] = samples[1]; } +void +nuked_init(opl3_chip *dev, uint32_t samplerate) +{ + opl3_slot *slot; + chan_t *ch; + uint8_t i; + uint8_t local_ch_slot; + + memset(dev, 0x00, sizeof(opl3_chip)); + + for (i = 0; i < 36; i++) { + slot = &dev->slot[i]; + slot->dev = dev; + slot->mod = &dev->zeromod; + slot->eg_rout = 0x01ff; + slot->eg_out = 0x01ff; + slot->eg_gen = envelope_gen_num_release; + slot->trem = (uint8_t *) &dev->zeromod; + slot->slot_num = i; + } + + for (i = 0; i < 18; i++) { + ch = &dev->chan[i]; + local_ch_slot = ch_slot[i]; + ch->slotz[0] = &dev->slot[local_ch_slot]; + ch->slotz[1] = &dev->slot[local_ch_slot + 3u]; + dev->slot[local_ch_slot].chan = ch; + dev->slot[local_ch_slot + 3u].chan = ch; + + if ((i % 9) < 3) + ch->pair = &dev->chan[i + 3u]; + else if ((i % 9) < 6) + ch->pair = &dev->chan[i - 3u]; + + ch->dev = dev; + ch->out[0] = &dev->zeromod; + ch->out[1] = &dev->zeromod; + ch->out[2] = &dev->zeromod; + ch->out[3] = &dev->zeromod; + ch->chtype = ch_2op; + ch->cha = 0xffff; + ch->chb = 0xffff; +#if OPL_ENABLE_STEREOEXT + ch->leftpan = 0x10000; + ch->rightpan = 0x10000; +#endif + ch->ch_num = i; + + channel_setup_alg(ch); + } + + dev->noise = 1; + dev->rateratio = (samplerate << RSM_FRAC) / 49716; + dev->tremoloshift = 4; + dev->vibshift = 1; + + +#if OPL_ENABLE_STEREOEXT + if (!panpot_lut_build) { + for (int32_t i = 0; i < 256; i++) + panpot_lut[i] = OPL_SIN(i); + panpot_lut_build = 1; + } +#endif +} + void nuked_generate_raw(opl3_chip *dev, int32_t *bufp) { @@ -1559,72 +1625,6 @@ nuked_generate_stream(opl3_chip *dev, int32_t *sndptr, uint32_t num) } } -void -nuked_init(opl3_chip *dev, uint32_t samplerate) -{ - opl3_slot *slot; - chan_t *ch; - uint8_t i; - uint8_t local_ch_slot; - - memset(dev, 0x00, sizeof(opl3_chip)); - - for (i = 0; i < 36; i++) { - slot = &dev->slot[i]; - slot->dev = dev; - slot->mod = &dev->zeromod; - slot->eg_rout = 0x01ff; - slot->eg_out = 0x01ff; - slot->eg_gen = envelope_gen_num_release; - slot->trem = (uint8_t *) &dev->zeromod; - slot->slot_num = i; - } - - for (i = 0; i < 18; i++) { - ch = &dev->chan[i]; - local_ch_slot = ch_slot[i]; - ch->slotz[0] = &dev->slot[local_ch_slot]; - ch->slotz[1] = &dev->slot[local_ch_slot + 3u]; - dev->slot[local_ch_slot].chan = ch; - dev->slot[local_ch_slot + 3u].chan = ch; - - if ((i % 9) < 3) - ch->pair = &dev->chan[i + 3u]; - else if ((i % 9) < 6) - ch->pair = &dev->chan[i - 3u]; - - ch->dev = dev; - ch->out[0] = &dev->zeromod; - ch->out[1] = &dev->zeromod; - ch->out[2] = &dev->zeromod; - ch->out[3] = &dev->zeromod; - ch->chtype = ch_2op; - ch->cha = 0xffff; - ch->chb = 0xffff; -#if OPL_ENABLE_STEREOEXT - ch->leftpan = 0x10000; - ch->rightpan = 0x10000; -#endif - ch->ch_num = i; - - channel_setup_alg(ch); - } - - dev->noise = 1; - dev->rateratio = (samplerate << RSM_FRAC) / 49716; - dev->tremoloshift = 4; - dev->vibshift = 1; - - -#if OPL_ENABLE_STEREOEXT - if (!panpot_lut_build) { - for (int32_t i = 0; i < 256; i++) - panpot_lut[i] = OPL_SIN(i); - panpot_lut_build = 1; - } -#endif -} - static void nuked_timer_tick(nuked_drv_t *dev, int tmr) { From 8cb40b8b68f0ae735a17c3a31613fe01f4b91b5f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 12 Jul 2024 21:27:04 -0400 Subject: [PATCH 093/624] Nuked: Move stuff out to it's header --- src/include/86box/snd_opl_nuked.h | 153 +++++++++++++++++++++++++++++ src/sound/snd_opl_nuked.c | 154 +----------------------------- 2 files changed, 154 insertions(+), 153 deletions(-) diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index 1cc4fe64e..801dd238c 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -20,6 +20,159 @@ #ifndef SOUND_OPL_NUKED_H #define SOUND_OPL_NUKED_H +#ifndef OPL_ENABLE_STEREOEXT +#define OPL_ENABLE_STEREOEXT 0 +#endif + +#define WRBUF_SIZE 1024 +#define WRBUF_DELAY 1 + +struct chan; +struct chip; + +typedef struct slot { + struct chan *chan; + struct chip *dev; + int16_t out; + int16_t fbmod; + int16_t *mod; + int16_t prout; + int16_t eg_rout; + int16_t eg_out; + uint8_t eg_inc; + uint8_t eg_gen; + uint8_t eg_rate; + uint8_t eg_ksl; + uint8_t *trem; + uint8_t reg_vib; + uint8_t reg_type; + uint8_t reg_ksr; + uint8_t reg_mult; + uint8_t reg_ksl; + uint8_t reg_tl; + uint8_t reg_ar; + uint8_t reg_dr; + uint8_t reg_sl; + uint8_t reg_rr; + uint8_t reg_wf; + uint8_t key; + uint32_t pg_reset; + uint32_t pg_phase; + uint16_t pg_phase_out; + uint8_t slot_num; +} opl3_slot; + +typedef struct chan { + opl3_slot *slotz[2]; // Don't use "slots" keyword to avoid conflict with Qt applications + struct chan *pair; + struct chip *dev; + int16_t *out[4]; +#if OPL_ENABLE_STEREOEXT + int32_t leftpan; + int32_t rightpan; +#endif + uint8_t chtype; + uint16_t f_num; + uint8_t block; + uint8_t fb; + uint8_t con; + uint8_t alg; + uint8_t ksv; + uint16_t cha; + uint16_t chb; + uint16_t chc; + uint16_t chd; + uint8_t ch_num; +} chan_t; + +typedef struct wrbuf { + uint64_t time; + uint16_t reg; + uint8_t data; +} wrbuf_t; + +typedef struct chip { + chan_t chan[18]; + opl3_slot slot[36]; + uint16_t timer; + uint64_t eg_timer; + uint8_t eg_timerrem; + uint8_t eg_state; + uint8_t eg_add; + uint64_t eg_timer_lo; + uint8_t newm; + uint8_t nts; + uint8_t rhy; + uint8_t vibpos; + uint8_t vibshift; + uint8_t tremolo; + uint8_t tremolopos; + uint8_t tremoloshift; + uint32_t noise; + int16_t zeromod; + int32_t mixbuff[4]; + uint8_t rm_hh_bit2; + uint8_t rm_hh_bit3; + uint8_t rm_hh_bit7; + uint8_t rm_hh_bit8; + uint8_t rm_tc_bit3; + uint8_t rm_tc_bit5; + +#if OPL_ENABLE_STEREOEXT + uint8_t stereoext; +#endif + + // OPL3L + int32_t rateratio; + int32_t samplecnt; + int32_t oldsamples[4]; + int32_t samples[4]; + + uint64_t wrbuf_samplecnt; + uint32_t wrbuf_cur; + uint32_t wrbuf_last; + uint64_t wrbuf_lasttime; + wrbuf_t wrbuf[WRBUF_SIZE]; +} opl3_chip; + +typedef struct { + opl3_chip opl; + int8_t flags; + int8_t pad; + + uint16_t port; + uint8_t status; + uint8_t timer_ctrl; + uint16_t timer_count[2]; + uint16_t timer_cur_count[2]; + + pc_timer_t timers[2]; + + int pos; + int32_t buffer[MUSICBUFLEN * 2]; +} nuked_drv_t; + +enum { + FLAG_CYCLES = 0x02, + FLAG_OPL3 = 0x01 +}; + +enum { + STAT_TMR_OVER = 0x60, + STAT_TMR1_OVER = 0x40, + STAT_TMR2_OVER = 0x20, + STAT_TMR_ANY = 0x80 +}; + +enum { + CTRL_RESET = 0x80, + CTRL_TMR_MASK = 0x60, + CTRL_TMR1_MASK = 0x40, + CTRL_TMR2_MASK = 0x20, + CTRL_TMR2_START = 0x02, + CTRL_TMR1_START = 0x01 +}; + void nuked_write_reg(void *priv, uint16_t reg, uint8_t val); #endif /*SOUND_OPL_NUKED_H*/ diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 7e535eb04..2ca41f53d 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -45,17 +45,13 @@ #define HAVE_STDARG_H #include <86box/86box.h> -#include <86box/snd_opl_nuked.h> #include <86box/sound.h> #include <86box/timer.h> #include <86box/device.h> #include <86box/snd_opl.h> +#include <86box/snd_opl_nuked.h> -#ifndef OPL_ENABLE_STEREOEXT -#define OPL_ENABLE_STEREOEXT 0 -#endif - #if OPL_ENABLE_STEREOEXT && !defined OPL_SIN #ifndef _USE_MATH_DEFINES #define _USE_MATH_DEFINES 1 @@ -70,8 +66,6 @@ #define OPL_QUIRK_CHANNELSAMPLEDELAY (!OPL_ENABLE_STEREOEXT) #endif -#define WRBUF_SIZE 1024 -#define WRBUF_DELAY 1 #define RSM_FRAC 10 // #define OPL_FREQ FREQ_48000 @@ -98,152 +92,6 @@ enum envelope_gen_num { envelope_gen_num_release = 3 }; -struct chan; -struct chip; - -typedef struct slot { - struct chan *chan; - struct chip *dev; - int16_t out; - int16_t fbmod; - int16_t *mod; - int16_t prout; - int16_t eg_rout; - int16_t eg_out; - uint8_t eg_inc; - uint8_t eg_gen; - uint8_t eg_rate; - uint8_t eg_ksl; - uint8_t *trem; - uint8_t reg_vib; - uint8_t reg_type; - uint8_t reg_ksr; - uint8_t reg_mult; - uint8_t reg_ksl; - uint8_t reg_tl; - uint8_t reg_ar; - uint8_t reg_dr; - uint8_t reg_sl; - uint8_t reg_rr; - uint8_t reg_wf; - uint8_t key; - uint32_t pg_reset; - uint32_t pg_phase; - uint16_t pg_phase_out; - uint8_t slot_num; -} opl3_slot; - -typedef struct chan { - opl3_slot *slotz[2]; // Don't use "slots" keyword to avoid conflict with Qt applications - struct chan *pair; - struct chip *dev; - int16_t *out[4]; -#if OPL_ENABLE_STEREOEXT - int32_t leftpan; - int32_t rightpan; -#endif - uint8_t chtype; - uint16_t f_num; - uint8_t block; - uint8_t fb; - uint8_t con; - uint8_t alg; - uint8_t ksv; - uint16_t cha; - uint16_t chb; - uint16_t chc; - uint16_t chd; - uint8_t ch_num; -} chan_t; - -typedef struct wrbuf { - uint64_t time; - uint16_t reg; - uint8_t data; -} wrbuf_t; - -typedef struct chip { - chan_t chan[18]; - opl3_slot slot[36]; - uint16_t timer; - uint64_t eg_timer; - uint8_t eg_timerrem; - uint8_t eg_state; - uint8_t eg_add; - uint64_t eg_timer_lo; - uint8_t newm; - uint8_t nts; - uint8_t rhy; - uint8_t vibpos; - uint8_t vibshift; - uint8_t tremolo; - uint8_t tremolopos; - uint8_t tremoloshift; - uint32_t noise; - int16_t zeromod; - int32_t mixbuff[4]; - uint8_t rm_hh_bit2; - uint8_t rm_hh_bit3; - uint8_t rm_hh_bit7; - uint8_t rm_hh_bit8; - uint8_t rm_tc_bit3; - uint8_t rm_tc_bit5; - -#if OPL_ENABLE_STEREOEXT - uint8_t stereoext; -#endif - - // OPL3L - int32_t rateratio; - int32_t samplecnt; - int32_t oldsamples[4]; - int32_t samples[4]; - - uint64_t wrbuf_samplecnt; - uint32_t wrbuf_cur; - uint32_t wrbuf_last; - uint64_t wrbuf_lasttime; - wrbuf_t wrbuf[WRBUF_SIZE]; -} opl3_chip; - -typedef struct { - opl3_chip opl; - int8_t flags; - int8_t pad; - - uint16_t port; - uint8_t status; - uint8_t timer_ctrl; - uint16_t timer_count[2]; - uint16_t timer_cur_count[2]; - - pc_timer_t timers[2]; - - int pos; - int32_t buffer[MUSICBUFLEN * 2]; -} nuked_drv_t; - -enum { - FLAG_CYCLES = 0x02, - FLAG_OPL3 = 0x01 -}; - -enum { - STAT_TMR_OVER = 0x60, - STAT_TMR1_OVER = 0x40, - STAT_TMR2_OVER = 0x20, - STAT_TMR_ANY = 0x80 -}; - -enum { - CTRL_RESET = 0x80, - CTRL_TMR_MASK = 0x60, - CTRL_TMR1_MASK = 0x40, - CTRL_TMR2_MASK = 0x20, - CTRL_TMR2_START = 0x02, - CTRL_TMR1_START = 0x01 -}; - #ifdef ENABLE_OPL_LOG int nuked_do_log = ENABLE_OPL_LOG; From 2bcfc8e697a02d8b12e5b475e2805dff5b3146ec Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 13 Jul 2024 23:51:59 -0400 Subject: [PATCH 094/624] Nuked: dev -> chip --- src/include/86box/snd_opl_nuked.h | 4 +- src/sound/snd_opl_nuked.c | 457 +++++++++++++++--------------- 2 files changed, 230 insertions(+), 231 deletions(-) diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index 801dd238c..082f16f5d 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -32,7 +32,7 @@ struct chip; typedef struct slot { struct chan *chan; - struct chip *dev; + struct chip *chip; int16_t out; int16_t fbmod; int16_t *mod; @@ -65,7 +65,7 @@ typedef struct slot { typedef struct chan { opl3_slot *slotz[2]; // Don't use "slots" keyword to avoid conflict with Qt applications struct chan *pair; - struct chip *dev; + struct chip *chip; int16_t *out[4]; #if OPL_ENABLE_STEREOEXT int32_t leftpan; diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 2ca41f53d..c3e709948 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -448,12 +448,12 @@ envelope_calc(opl3_slot *slot) rate_lo = rate & 0x03; if (rate_hi & 0x10) rate_hi = 0x0f; - eg_shift = rate_hi + slot->dev->eg_add; + eg_shift = rate_hi + slot->chip->eg_add; shift = 0; if (nonzero) { if (rate_hi < 12) { - if (slot->dev->eg_state) + if (slot->chip->eg_state) switch (eg_shift) { case 12: shift = 1; @@ -471,11 +471,11 @@ envelope_calc(opl3_slot *slot) break; } } else { - shift = (rate_hi & 0x03) + eg_incstep[rate_lo][slot->dev->eg_timer_lo]; + shift = (rate_hi & 0x03) + eg_incstep[rate_lo][slot->chip->eg_timer_lo]; if (shift & 0x04) shift = 0x03; if (!shift) - shift = slot->dev->eg_state; + shift = slot->chip->eg_state; } } @@ -551,19 +551,19 @@ phase_generate(opl3_slot *slot) uint16_t phase; int8_t range; uint8_t vibpos; - opl3_chip *dev; + opl3_chip *chip; - dev = slot->dev; + chip = slot->chip; f_num = slot->chan->f_num; if (slot->reg_vib) { range = (f_num >> 7) & 7; - vibpos = dev->vibpos; + vibpos = chip->vibpos; if (!(vibpos & 3)) range = 0; else if (vibpos & 1) range >>= 1; - range >>= dev->vibshift; + range >>= chip->vibshift; if (vibpos & 4) range = -range; @@ -578,22 +578,22 @@ phase_generate(opl3_slot *slot) slot->pg_phase += (basefreq * mt[slot->reg_mult]) >> 1; // Rhythm mode - noise = dev->noise; + noise = chip->noise; slot->pg_phase_out = phase; if (slot->slot_num == 13) { // hh - dev->rm_hh_bit2 = (phase >> 2) & 1; - dev->rm_hh_bit3 = (phase >> 3) & 1; - dev->rm_hh_bit7 = (phase >> 7) & 1; - dev->rm_hh_bit8 = (phase >> 8) & 1; + chip->rm_hh_bit2 = (phase >> 2) & 1; + chip->rm_hh_bit3 = (phase >> 3) & 1; + chip->rm_hh_bit7 = (phase >> 7) & 1; + chip->rm_hh_bit8 = (phase >> 8) & 1; } - if (slot->slot_num == 17 && (dev->rhy & 0x20)) { // tc - dev->rm_tc_bit3 = (phase >> 3) & 1; - dev->rm_tc_bit5 = (phase >> 5) & 1; + if (slot->slot_num == 17 && (chip->rhy & 0x20)) { // tc + chip->rm_tc_bit3 = (phase >> 3) & 1; + chip->rm_tc_bit5 = (phase >> 5) & 1; } - if (dev->rhy & 0x20) { - rm_xor = (dev->rm_hh_bit2 ^ dev->rm_hh_bit7) - | (dev->rm_hh_bit3 ^ dev->rm_tc_bit5) - | (dev->rm_tc_bit3 ^ dev->rm_tc_bit5); + if (chip->rhy & 0x20) { + rm_xor = (chip->rm_hh_bit2 ^ chip->rm_hh_bit7) + | (chip->rm_hh_bit3 ^ chip->rm_tc_bit5) + | (chip->rm_tc_bit3 ^ chip->rm_tc_bit5); switch (slot->slot_num) { case 13: // hh @@ -605,8 +605,8 @@ phase_generate(opl3_slot *slot) break; case 16: // sd - slot->pg_phase_out = (dev->rm_hh_bit8 << 9) - | ((dev->rm_hh_bit8 ^ (noise & 1)) << 8); + slot->pg_phase_out = (chip->rm_hh_bit8 << 9) + | ((chip->rm_hh_bit8 ^ (noise & 1)) << 8); break; case 17: // tc @@ -620,16 +620,16 @@ phase_generate(opl3_slot *slot) n_bit = ((noise >> 14) ^ noise) & 0x01; - dev->noise = (noise >> 1) | (n_bit << 22); + chip->noise = (noise >> 1) | (n_bit << 22); } static void slot_write_20(opl3_slot *slot, uint8_t data) { if ((data >> 7) & 0x01) - slot->trem = &slot->dev->tremolo; + slot->trem = &slot->chip->tremolo; else - slot->trem = (uint8_t *) &slot->dev->zeromod; + slot->trem = (uint8_t *) &slot->chip->zeromod; slot->reg_vib = (data >> 6) & 0x01; slot->reg_type = (data >> 5) & 0x01; @@ -669,7 +669,7 @@ slot_write_e0(opl3_slot *slot, uint8_t data) { slot->reg_wf = data & 0x07; - if (slot->dev->newm == 0x00) + if (slot->chip->newm == 0x00) slot->reg_wf &= 0x03; } @@ -697,22 +697,22 @@ static void channel_setup_alg(chan_t *ch); static void -channel_update_rhythm(opl3_chip *dev, uint8_t data) +channel_update_rhythm(opl3_chip *chip, uint8_t data) { chan_t *ch6; chan_t *ch7; chan_t *ch8; uint8_t chnum; - dev->rhy = data & 0x3f; - if (dev->rhy & 0x20) { - ch6 = &dev->chan[6]; - ch7 = &dev->chan[7]; - ch8 = &dev->chan[8]; + chip->rhy = data & 0x3f; + if (chip->rhy & 0x20) { + ch6 = &chip->chan[6]; + ch7 = &chip->chan[7]; + ch8 = &chip->chan[8]; ch6->out[0] = &ch6->slotz[1]->out; ch6->out[1] = &ch6->slotz[1]->out; - ch6->out[2] = &dev->zeromod; - ch6->out[3] = &dev->zeromod; + ch6->out[2] = &chip->zeromod; + ch6->out[3] = &chip->zeromod; ch7->out[0] = &ch7->slotz[0]->out; ch7->out[1] = &ch7->slotz[0]->out; ch7->out[2] = &ch7->slotz[1]->out; @@ -723,38 +723,38 @@ channel_update_rhythm(opl3_chip *dev, uint8_t data) ch8->out[3] = &ch8->slotz[1]->out; for (chnum = 6; chnum < 9; chnum++) - dev->chan[chnum].chtype = ch_drum; + chip->chan[chnum].chtype = ch_drum; channel_setup_alg(ch6); channel_setup_alg(ch7); channel_setup_alg(ch8); // hh - if (dev->rhy & 0x01) + if (chip->rhy & 0x01) envelope_key_on(ch7->slotz[0], egk_drum); else envelope_key_off(ch7->slotz[0], egk_drum); // tc - if (dev->rhy & 0x02) + if (chip->rhy & 0x02) envelope_key_on(ch8->slotz[1], egk_drum); else envelope_key_off(ch8->slotz[1], egk_drum); // tom - if (dev->rhy & 0x04) + if (chip->rhy & 0x04) envelope_key_on(ch8->slotz[0], egk_drum); else envelope_key_off(ch8->slotz[0], egk_drum); // sd - if (dev->rhy & 0x08) + if (chip->rhy & 0x08) envelope_key_on(ch7->slotz[1], egk_drum); else envelope_key_off(ch7->slotz[1], egk_drum); // bd - if (dev->rhy & 0x10) { + if (chip->rhy & 0x10) { envelope_key_on(ch6->slotz[0], egk_drum); envelope_key_on(ch6->slotz[1], egk_drum); } else { @@ -763,11 +763,11 @@ channel_update_rhythm(opl3_chip *dev, uint8_t data) } } else { for (chnum = 6; chnum < 9; chnum++) { - dev->chan[chnum].chtype = ch_2op; + chip->chan[chnum].chtype = ch_2op; - channel_setup_alg(&dev->chan[chnum]); - envelope_key_off(dev->chan[chnum].slotz[0], egk_drum); - envelope_key_off(dev->chan[chnum].slotz[1], egk_drum); + channel_setup_alg(&chip->chan[chnum]); + envelope_key_off(chip->chan[chnum].slotz[0], egk_drum); + envelope_key_off(chip->chan[chnum].slotz[1], egk_drum); } } } @@ -775,17 +775,17 @@ channel_update_rhythm(opl3_chip *dev, uint8_t data) static void channel_write_a0(chan_t *ch, uint8_t data) { - if (ch->dev->newm && ch->chtype == ch_4op2) + if (ch->chip->newm && ch->chtype == ch_4op2) return; ch->f_num = (ch->f_num & 0x300) | data; ch->ksv = (ch->block << 1) - | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); + | ((ch->f_num >> (0x09 - ch->chip->nts)) & 0x01); envelope_update_ksl(ch->slotz[0]); envelope_update_ksl(ch->slotz[1]); - if (ch->dev->newm && ch->chtype == ch_4op) { + if (ch->chip->newm && ch->chtype == ch_4op) { ch->pair->f_num = ch->f_num; ch->pair->ksv = ch->ksv; @@ -797,18 +797,18 @@ channel_write_a0(chan_t *ch, uint8_t data) static void channel_write_b0(chan_t *ch, uint8_t data) { - if (ch->dev->newm && ch->chtype == ch_4op2) + if (ch->chip->newm && ch->chtype == ch_4op2) return; ch->f_num = (ch->f_num & 0xff) | ((data & 0x03) << 8); ch->block = (data >> 2) & 0x07; ch->ksv = (ch->block << 1) - | ((ch->f_num >> (0x09 - ch->dev->nts)) & 0x01); + | ((ch->f_num >> (0x09 - ch->chip->nts)) & 0x01); envelope_update_ksl(ch->slotz[0]); envelope_update_ksl(ch->slotz[1]); - if (ch->dev->newm && ch->chtype == ch_4op) { + if (ch->chip->newm && ch->chtype == ch_4op) { ch->pair->f_num = ch->f_num; ch->pair->block = ch->block; ch->pair->ksv = ch->ksv; @@ -823,8 +823,8 @@ channel_setup_alg(chan_t *ch) { if (ch->chtype == ch_drum) { if (ch->ch_num == 7 || ch->ch_num == 8) { - ch->slotz[0]->mod = &ch->dev->zeromod; - ch->slotz[1]->mod = &ch->dev->zeromod; + ch->slotz[0]->mod = &ch->chip->zeromod; + ch->slotz[1]->mod = &ch->chip->zeromod; return; } @@ -836,7 +836,7 @@ channel_setup_alg(chan_t *ch) case 0x01: ch->slotz[0]->mod = &ch->slotz[0]->fbmod; - ch->slotz[1]->mod = &ch->dev->zeromod; + ch->slotz[1]->mod = &ch->chip->zeromod; break; default: @@ -849,10 +849,10 @@ channel_setup_alg(chan_t *ch) return; if (ch->alg & 0x04) { - ch->pair->out[0] = &ch->dev->zeromod; - ch->pair->out[1] = &ch->dev->zeromod; - ch->pair->out[2] = &ch->dev->zeromod; - ch->pair->out[3] = &ch->dev->zeromod; + ch->pair->out[0] = &ch->chip->zeromod; + ch->pair->out[1] = &ch->chip->zeromod; + ch->pair->out[2] = &ch->chip->zeromod; + ch->pair->out[3] = &ch->chip->zeromod; switch (ch->alg & 0x03) { case 0x00: @@ -861,42 +861,42 @@ channel_setup_alg(chan_t *ch) ch->slotz[0]->mod = &ch->pair->slotz[1]->out; ch->slotz[1]->mod = &ch->slotz[0]->out; ch->out[0] = &ch->slotz[1]->out; - ch->out[1] = &ch->dev->zeromod; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; + ch->out[1] = &ch->chip->zeromod; + ch->out[2] = &ch->chip->zeromod; + ch->out[3] = &ch->chip->zeromod; break; case 0x01: ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; ch->pair->slotz[1]->mod = &ch->pair->slotz[0]->out; - ch->slotz[0]->mod = &ch->dev->zeromod; + ch->slotz[0]->mod = &ch->chip->zeromod; ch->slotz[1]->mod = &ch->slotz[0]->out; ch->out[0] = &ch->pair->slotz[1]->out; ch->out[1] = &ch->slotz[1]->out; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; + ch->out[2] = &ch->chip->zeromod; + ch->out[3] = &ch->chip->zeromod; break; case 0x02: ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; - ch->pair->slotz[1]->mod = &ch->dev->zeromod; + ch->pair->slotz[1]->mod = &ch->chip->zeromod; ch->slotz[0]->mod = &ch->pair->slotz[1]->out; ch->slotz[1]->mod = &ch->slotz[0]->out; ch->out[0] = &ch->pair->slotz[0]->out; ch->out[1] = &ch->slotz[1]->out; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; + ch->out[2] = &ch->chip->zeromod; + ch->out[3] = &ch->chip->zeromod; break; case 0x03: ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; - ch->pair->slotz[1]->mod = &ch->dev->zeromod; + ch->pair->slotz[1]->mod = &ch->chip->zeromod; ch->slotz[0]->mod = &ch->pair->slotz[1]->out; - ch->slotz[1]->mod = &ch->dev->zeromod; + ch->slotz[1]->mod = &ch->chip->zeromod; ch->out[0] = &ch->pair->slotz[0]->out; ch->out[1] = &ch->slotz[0]->out; ch->out[2] = &ch->slotz[1]->out; - ch->out[3] = &ch->dev->zeromod; + ch->out[3] = &ch->chip->zeromod; break; default: @@ -908,18 +908,18 @@ channel_setup_alg(chan_t *ch) ch->slotz[0]->mod = &ch->slotz[0]->fbmod; ch->slotz[1]->mod = &ch->slotz[0]->out; ch->out[0] = &ch->slotz[1]->out; - ch->out[1] = &ch->dev->zeromod; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; + ch->out[1] = &ch->chip->zeromod; + ch->out[2] = &ch->chip->zeromod; + ch->out[3] = &ch->chip->zeromod; break; case 0x01: ch->slotz[0]->mod = &ch->slotz[0]->fbmod; - ch->slotz[1]->mod = &ch->dev->zeromod; + ch->slotz[1]->mod = &ch->chip->zeromod; ch->out[0] = &ch->slotz[0]->out; ch->out[1] = &ch->slotz[1]->out; - ch->out[2] = &ch->dev->zeromod; - ch->out[3] = &ch->dev->zeromod; + ch->out[2] = &ch->chip->zeromod; + ch->out[3] = &ch->chip->zeromod; break; default: @@ -932,7 +932,7 @@ channel_update_alg(chan_t *ch) { ch->alg = ch->con; - if (ch->dev->newm) { + if (ch->chip->newm) { if (ch->chtype == ch_4op) { ch->pair->alg = 0x04 | (ch->con << 1) | ch->pair->con; ch->alg = 0x08; @@ -953,7 +953,7 @@ channel_write_c0(chan_t *ch, uint8_t data) ch->fb = (data & 0x0e) >> 1; ch->con = data & 0x01; - if (ch->dev->newm) { + if (ch->chip->newm) { ch->cha = ((data >> 4) & 0x01) ? ~0 : 0; ch->chb = ((data >> 5) & 0x01) ? ~0 : 0; ch->chc = ((data >> 6) & 0x01) ? ~0 : 0; @@ -965,7 +965,7 @@ channel_write_c0(chan_t *ch, uint8_t data) } #if OPL_ENABLE_STEREOEXT - if (!ch->dev->stereoext) { + if (!ch->chip->stereoext) { ch->leftpan = ch->cha << 16; ch->rightpan = ch->chb << 16; } @@ -976,7 +976,7 @@ channel_write_c0(chan_t *ch, uint8_t data) static void channel_write_d0(chan_t *ch, uint8_t data) { - if (ch->dev->stereoext) { + if (ch->chip->stereoext) { ch->leftpan = panpot_lut[data ^ 0xffu]; ch->rightpan = panpot_lut[data]; } @@ -986,7 +986,7 @@ channel_write_d0(chan_t *ch, uint8_t data) static void channel_key_on(chan_t *ch) { - if (ch->dev->newm) { + if (ch->chip->newm) { if (ch->chtype == ch_4op) { envelope_key_on(ch->slotz[0], egk_norm); envelope_key_on(ch->slotz[1], egk_norm); @@ -1005,7 +1005,7 @@ channel_key_on(chan_t *ch) static void channel_key_off(chan_t *ch) { - if (ch->dev->newm) { + if (ch->chip->newm) { if (ch->chtype == ch_4op) { envelope_key_off(ch->slotz[0], egk_norm); envelope_key_off(ch->slotz[1], egk_norm); @@ -1022,7 +1022,7 @@ channel_key_off(chan_t *ch) } static void -channel_set_4op(opl3_chip *dev, uint8_t data) +channel_set_4op(opl3_chip *chip, uint8_t data) { uint8_t chnum; @@ -1033,14 +1033,14 @@ channel_set_4op(opl3_chip *dev, uint8_t data) chnum += 9 - 3; if ((data >> bit) & 0x01) { - dev->chan[chnum].chtype = ch_4op; - dev->chan[chnum + 3u].chtype = ch_4op2; - channel_update_alg(&dev->chan[chnum]); + chip->chan[chnum].chtype = ch_4op; + chip->chan[chnum + 3u].chtype = ch_4op2; + channel_update_alg(&chip->chan[chnum]); } else { - dev->chan[chnum].chtype = ch_2op; - dev->chan[chnum + 3u].chtype = ch_2op; - channel_update_alg(&dev->chan[chnum]); - channel_update_alg(&dev->chan[chnum + 3u]); + chip->chan[chnum].chtype = ch_2op; + chip->chan[chnum + 3u].chtype = ch_2op; + channel_update_alg(&chip->chan[chnum]); + channel_update_alg(&chip->chan[chnum + 3u]); } } } @@ -1057,29 +1057,29 @@ process_slot(opl3_slot *slot) static inline void nuked_generate_4ch(void *priv, int32_t *buf4) { - opl3_chip *dev = (opl3_chip *) priv; - chan_t *ch; - wrbuf_t *writebuf; - int16_t **out; - int32_t mix[2]; - int16_t accm; - int16_t shift = 0; - uint8_t i; + opl3_chip *chip = (opl3_chip *) priv; + chan_t *ch; + wrbuf_t *writebuf; + int16_t **out; + int32_t mix[2]; + int16_t accm; + int16_t shift = 0; + uint8_t i; - buf4[1] = dev->mixbuff[1]; - buf4[3] = dev->mixbuff[3]; + buf4[1] = chip->mixbuff[1]; + buf4[3] = chip->mixbuff[3]; #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 0; i < 15; i++) #else for (i = 0; i < 36; i++) #endif - process_slot(&dev->slot[i]); + process_slot(&chip->slot[i]); mix[0] = mix[1] = 0; for (i = 0; i < 18; i++) { - ch = &dev->chan[i]; + ch = &chip->chan[i]; out = ch->out; accm = *out[0] + *out[1] + *out[2] + *out[3]; #if OPL_ENABLE_STEREOEXT @@ -1090,26 +1090,26 @@ nuked_generate_4ch(void *priv, int32_t *buf4) mix[1] += (int32_t) (accm & ch->chc); } - dev->mixbuff[0] = mix[0]; - dev->mixbuff[2] = mix[1]; + chip->mixbuff[0] = mix[0]; + chip->mixbuff[2] = mix[1]; #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 15; i < 18; i++) - process_slot(&dev->slot[i]); + process_slot(&chip->slot[i]); #endif - buf4[0] = dev->mixbuff[0]; - buf4[2] = dev->mixbuff[2]; + buf4[0] = chip->mixbuff[0]; + buf4[2] = chip->mixbuff[2]; #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 18; i < 33; i++) - process_slot(&dev->slot[i]); + process_slot(&chip->slot[i]); #endif mix[0] = mix[1] = 0; for (i = 0; i < 18; i++) { - ch = &dev->chan[i]; + ch = &chip->chan[i]; out = ch->out; accm = *out[0] + *out[1] + *out[2] + *out[3]; #if OPL_ENABLE_STEREOEXT @@ -1120,150 +1120,150 @@ nuked_generate_4ch(void *priv, int32_t *buf4) mix[1] += (int32_t) (accm & ch->chd); } - dev->mixbuff[1] = mix[0]; - dev->mixbuff[3] = mix[1]; + chip->mixbuff[1] = mix[0]; + chip->mixbuff[3] = mix[1]; #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 33; i < 36; i++) - process_slot(&dev->slot[i]); + process_slot(&chip->slot[i]); #endif - if ((dev->timer & 0x3f) == 0x3f) - dev->tremolopos = (dev->tremolopos + 1) % 210; + if ((chip->timer & 0x3f) == 0x3f) + chip->tremolopos = (chip->tremolopos + 1) % 210; - if (dev->tremolopos < 105) - dev->tremolo = dev->tremolopos >> dev->tremoloshift; + if (chip->tremolopos < 105) + chip->tremolo = chip->tremolopos >> chip->tremoloshift; else - dev->tremolo = (210 - dev->tremolopos) >> dev->tremoloshift; + chip->tremolo = (210 - chip->tremolopos) >> chip->tremoloshift; - if ((dev->timer & 0x03ff) == 0x03ff) - dev->vibpos = (dev->vibpos + 1) & 7; + if ((chip->timer & 0x03ff) == 0x03ff) + chip->vibpos = (chip->vibpos + 1) & 7; - dev->timer++; + chip->timer++; - if (dev->eg_state) { - while (shift < 13 && ((dev->eg_timer >> shift) & 1) == 0) + if (chip->eg_state) { + while (shift < 13 && ((chip->eg_timer >> shift) & 1) == 0) shift++; if (shift > 12) - dev->eg_add = 0; + chip->eg_add = 0; else - dev->eg_add = shift + 1; + chip->eg_add = shift + 1; - dev->eg_timer_lo = (uint8_t) (dev->eg_timer & 0x3u); + chip->eg_timer_lo = (uint8_t) (chip->eg_timer & 0x3u); } - if (dev->eg_timerrem || dev->eg_state) { - if (dev->eg_timer == UINT64_C(0xfffffffff)) { - dev->eg_timer = 0; - dev->eg_timerrem = 1; + if (chip->eg_timerrem || chip->eg_state) { + if (chip->eg_timer == UINT64_C(0xfffffffff)) { + chip->eg_timer = 0; + chip->eg_timerrem = 1; } else { - dev->eg_timer++; - dev->eg_timerrem = 0; + chip->eg_timer++; + chip->eg_timerrem = 0; } } - dev->eg_state ^= 1; + chip->eg_state ^= 1; - while (writebuf = &dev->wrbuf[dev->wrbuf_cur], writebuf->time <= dev->wrbuf_samplecnt) { + while (writebuf = &chip->wrbuf[chip->wrbuf_cur], writebuf->time <= chip->wrbuf_samplecnt) { if (!(writebuf->reg & 0x200)) break; writebuf->reg &= 0x01ff; - nuked_write_reg(dev, writebuf->reg, writebuf->data); + nuked_write_reg(chip, writebuf->reg, writebuf->data); - dev->wrbuf_cur = (dev->wrbuf_cur + 1) % WRBUF_SIZE; + chip->wrbuf_cur = (chip->wrbuf_cur + 1) % WRBUF_SIZE; } - dev->wrbuf_samplecnt++; + chip->wrbuf_samplecnt++; } void -nuked_generate(opl3_chip *dev, int32_t *buf) +nuked_generate(opl3_chip *chip, int32_t *buf) { int32_t samples[4]; - nuked_generate_4ch(dev, samples); + nuked_generate_4ch(chip, samples); buf[0] = samples[0]; buf[1] = samples[1]; } void -nuked_generate_4ch_resampled(opl3_chip *dev, int32_t *buf4) +nuked_generate_4ch_resampled(opl3_chip *chip, int32_t *buf4) { - while (dev->samplecnt >= dev->rateratio) { - dev->oldsamples[0] = dev->samples[0]; - dev->oldsamples[1] = dev->samples[1]; - dev->oldsamples[2] = dev->samples[2]; - dev->oldsamples[3] = dev->samples[3]; - nuked_generate_4ch(dev, dev->samples); - dev->samplecnt -= dev->rateratio; + while (chip->samplecnt >= chip->rateratio) { + chip->oldsamples[0] = chip->samples[0]; + chip->oldsamples[1] = chip->samples[1]; + chip->oldsamples[2] = chip->samples[2]; + chip->oldsamples[3] = chip->samples[3]; + nuked_generate_4ch(chip, chip->samples); + chip->samplecnt -= chip->rateratio; } - buf4[0] = (int32_t) ((dev->oldsamples[0] * (dev->rateratio - dev->samplecnt) - + dev->samples[0] * dev->samplecnt) - / dev->rateratio); - buf4[1] = (int32_t) ((dev->oldsamples[1] * (dev->rateratio - dev->samplecnt) - + dev->samples[1] * dev->samplecnt) - / dev->rateratio); - buf4[2] = (int32_t) ((dev->oldsamples[2] * (dev->rateratio - dev->samplecnt) - + dev->samples[2] * dev->samplecnt) - / dev->rateratio); - buf4[3] = (int32_t) ((dev->oldsamples[3] * (dev->rateratio - dev->samplecnt) - + dev->samples[3] * dev->samplecnt) - / dev->rateratio); + buf4[0] = (int32_t) ((chip->oldsamples[0] * (chip->rateratio - chip->samplecnt) + + chip->samples[0] * chip->samplecnt) + / chip->rateratio); + buf4[1] = (int32_t) ((chip->oldsamples[1] * (chip->rateratio - chip->samplecnt) + + chip->samples[1] * chip->samplecnt) + / chip->rateratio); + buf4[2] = (int32_t) ((chip->oldsamples[2] * (chip->rateratio - chip->samplecnt) + + chip->samples[2] * chip->samplecnt) + / chip->rateratio); + buf4[3] = (int32_t) ((chip->oldsamples[3] * (chip->rateratio - chip->samplecnt) + + chip->samples[3] * chip->samplecnt) + / chip->rateratio); - dev->samplecnt += 1 << RSM_FRAC; + chip->samplecnt += 1 << RSM_FRAC; } void -nuked_generate_resampled(opl3_chip *dev, int32_t *buf4) +nuked_generate_resampled(opl3_chip *chip, int32_t *buf4) { int32_t samples[4]; - nuked_generate_4ch_resampled(dev, samples); + nuked_generate_4ch_resampled(chip, samples); buf4[0] = samples[0]; buf4[1] = samples[1]; } void -nuked_init(opl3_chip *dev, uint32_t samplerate) +nuked_init(opl3_chip *chip, uint32_t samplerate) { opl3_slot *slot; chan_t *ch; uint8_t i; uint8_t local_ch_slot; - memset(dev, 0x00, sizeof(opl3_chip)); + memset(chip, 0x00, sizeof(opl3_chip)); for (i = 0; i < 36; i++) { - slot = &dev->slot[i]; - slot->dev = dev; - slot->mod = &dev->zeromod; + slot = &chip->slot[i]; + slot->chip = chip; + slot->mod = &chip->zeromod; slot->eg_rout = 0x01ff; slot->eg_out = 0x01ff; slot->eg_gen = envelope_gen_num_release; - slot->trem = (uint8_t *) &dev->zeromod; + slot->trem = (uint8_t *) &chip->zeromod; slot->slot_num = i; } for (i = 0; i < 18; i++) { - ch = &dev->chan[i]; - local_ch_slot = ch_slot[i]; - ch->slotz[0] = &dev->slot[local_ch_slot]; - ch->slotz[1] = &dev->slot[local_ch_slot + 3u]; - dev->slot[local_ch_slot].chan = ch; - dev->slot[local_ch_slot + 3u].chan = ch; + ch = &chip->chan[i]; + local_ch_slot = ch_slot[i]; + ch->slotz[0] = &chip->slot[local_ch_slot]; + ch->slotz[1] = &chip->slot[local_ch_slot + 3u]; + chip->slot[local_ch_slot].chan = ch; + chip->slot[local_ch_slot + 3u].chan = ch; if ((i % 9) < 3) - ch->pair = &dev->chan[i + 3u]; + ch->pair = &chip->chan[i + 3u]; else if ((i % 9) < 6) - ch->pair = &dev->chan[i - 3u]; + ch->pair = &chip->chan[i - 3u]; - ch->dev = dev; - ch->out[0] = &dev->zeromod; - ch->out[1] = &dev->zeromod; - ch->out[2] = &dev->zeromod; - ch->out[3] = &dev->zeromod; + ch->chip = chip; + ch->out[0] = &chip->zeromod; + ch->out[1] = &chip->zeromod; + ch->out[2] = &chip->zeromod; + ch->out[3] = &chip->zeromod; ch->chtype = ch_2op; ch->cha = 0xffff; ch->chb = 0xffff; @@ -1276,11 +1276,10 @@ nuked_init(opl3_chip *dev, uint32_t samplerate) channel_setup_alg(ch); } - dev->noise = 1; - dev->rateratio = (samplerate << RSM_FRAC) / 49716; - dev->tremoloshift = 4; - dev->vibshift = 1; - + chip->noise = 1; + chip->rateratio = (samplerate << RSM_FRAC) / 49716; + chip->tremoloshift = 4; + chip->vibshift = 1; #if OPL_ENABLE_STEREOEXT if (!panpot_lut_build) { @@ -1292,22 +1291,22 @@ nuked_init(opl3_chip *dev, uint32_t samplerate) } void -nuked_generate_raw(opl3_chip *dev, int32_t *bufp) +nuked_generate_raw(opl3_chip *chip, int32_t *bufp) { - nuked_generate(dev, dev->samples); + nuked_generate(chip, chip->samples); - bufp[0] = (int32_t) dev->samples[0]; - bufp[1] = (int32_t) dev->samples[1]; + bufp[0] = (int32_t) chip->samples[0]; + bufp[1] = (int32_t) chip->samples[1]; } uint16_t nuked_write_addr(void *priv, uint16_t port, uint8_t val) { - const opl3_chip *dev = (opl3_chip *) priv; + const opl3_chip *chip = (opl3_chip *) priv; uint16_t addr; addr = val; - if ((port & 0x0002) && ((addr == 0x0005) || dev->newm)) + if ((port & 0x0002) && ((addr == 0x0005) || chip->newm)) addr |= 0x0100; return addr; @@ -1316,22 +1315,22 @@ nuked_write_addr(void *priv, uint16_t port, uint8_t val) void nuked_write_reg(void *priv, uint16_t reg, uint8_t val) { - opl3_chip *dev = (opl3_chip *) priv; - uint8_t high = (reg >> 8) & 0x01; - uint8_t regm = reg & 0xff; + opl3_chip *chip = (opl3_chip *) priv; + uint8_t high = (reg >> 8) & 0x01; + uint8_t regm = reg & 0xff; switch (regm & 0xf0) { case 0x00: if (high) switch (regm & 0x0f) { case 0x04: - channel_set_4op(dev, val); + channel_set_4op(chip, val); break; case 0x05: - dev->newm = val & 0x01; + chip->newm = val & 0x01; #if OPL_ENABLE_STEREOEXT - dev->stereoext = (val >> 1) & 0x01; + chip->stereoext = (val >> 1) & 0x01; #endif break; @@ -1341,7 +1340,7 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) else switch (regm & 0x0f) { case 0x08: - dev->nts = (val >> 6) & 0x01; + chip->nts = (val >> 6) & 0x01; break; default: @@ -1352,63 +1351,63 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) case 0x20: case 0x30: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_20(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); + slot_write_20(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x40: case 0x50: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_40(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); + slot_write_40(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x60: case 0x70: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_60(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); + slot_write_60(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x80: case 0x90: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_80(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); + slot_write_80(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0xa0: if ((regm & 0x0f) < 9) - channel_write_a0(&dev->chan[9u * high + (regm & 0x0fu)], val); + channel_write_a0(&chip->chan[9u * high + (regm & 0x0fu)], val); break; case 0xb0: if (regm == 0xbd && !high) { - dev->tremoloshift = (((val >> 7) ^ 1) << 1) + 2; - dev->vibshift = ((val >> 6) & 0x01) ^ 1; - channel_update_rhythm(dev, val); + chip->tremoloshift = (((val >> 7) ^ 1) << 1) + 2; + chip->vibshift = ((val >> 6) & 0x01) ^ 1; + channel_update_rhythm(chip, val); } else if ((regm & 0x0f) < 9) { - channel_write_b0(&dev->chan[9u * high + (regm & 0x0fu)], val); + channel_write_b0(&chip->chan[9u * high + (regm & 0x0fu)], val); if (val & 0x20) - channel_key_on(&dev->chan[9u * high + (regm & 0x0fu)]); + channel_key_on(&chip->chan[9u * high + (regm & 0x0fu)]); else - channel_key_off(&dev->chan[9u * high + (regm & 0x0fu)]); + channel_key_off(&chip->chan[9u * high + (regm & 0x0fu)]); } break; case 0xc0: if ((regm & 0x0f) < 9) - channel_write_c0(&dev->chan[9u * high + (regm & 0x0fu)], val); + channel_write_c0(&chip->chan[9u * high + (regm & 0x0fu)], val); break; #if OPL_ENABLE_STEREOEXT case 0xd0: if ((regm & 0x0f) < 9) - channel_write_d0(&dev->chan[9u * high + (regm & 0x0fu)], val); + channel_write_d0(&chip->chan[9u * high + (regm & 0x0fu)], val); break; #endif case 0xe0: case 0xf0: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_e0(&dev->slot[18u * high + ad_slot[regm & 0x1fu]], val); + slot_write_e0(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; default: @@ -1419,42 +1418,42 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) void nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) { - opl3_chip *dev = (opl3_chip *) priv; - uint64_t time1; - uint64_t time2; - wrbuf_t *writebuf; - uint32_t writebuf_last; + opl3_chip *chip = (opl3_chip *) priv; + uint64_t time1; + uint64_t time2; + wrbuf_t *writebuf; + uint32_t writebuf_last; - writebuf_last = dev->wrbuf_last; - writebuf = &dev->wrbuf[writebuf_last]; + writebuf_last = chip->wrbuf_last; + writebuf = &chip->wrbuf[writebuf_last]; if (writebuf->reg & 0x0200) { - nuked_write_reg(dev, writebuf->reg & 0x01ff, writebuf->data); + nuked_write_reg(chip, writebuf->reg & 0x01ff, writebuf->data); - dev->wrbuf_cur = (writebuf_last + 1) % WRBUF_SIZE; - dev->wrbuf_samplecnt = writebuf->time; + chip->wrbuf_cur = (writebuf_last + 1) % WRBUF_SIZE; + chip->wrbuf_samplecnt = writebuf->time; } writebuf->reg = reg | 0x0200; writebuf->data = val; - time1 = dev->wrbuf_lasttime + WRBUF_DELAY; - time2 = dev->wrbuf_samplecnt; + time1 = chip->wrbuf_lasttime + WRBUF_DELAY; + time2 = chip->wrbuf_samplecnt; if (time1 < time2) time1 = time2; writebuf->time = time1; - dev->wrbuf_lasttime = time1; - dev->wrbuf_last = (writebuf_last + 1) % WRBUF_SIZE; + chip->wrbuf_lasttime = time1; + chip->wrbuf_last = (writebuf_last + 1) % WRBUF_SIZE; } void -nuked_generate_4ch_stream(opl3_chip *dev, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples) +nuked_generate_4ch_stream(opl3_chip *chip, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples) { int32_t samples[4]; for (uint_fast32_t i = 0; i < numsamples; i++) { - nuked_generate_4ch_resampled(dev, samples); + nuked_generate_4ch_resampled(chip, samples); sndptr1[0] = samples[0]; sndptr1[1] = samples[1]; sndptr2[0] = samples[2]; @@ -1465,10 +1464,10 @@ nuked_generate_4ch_stream(opl3_chip *dev, int16_t *sndptr1, int16_t *sndptr2, ui } void -nuked_generate_stream(opl3_chip *dev, int32_t *sndptr, uint32_t num) +nuked_generate_stream(opl3_chip *chip, int32_t *sndptr, uint32_t num) { for (uint_fast32_t i = 0; i < num; i++) { - nuked_generate_resampled(dev, sndptr); + nuked_generate_resampled(chip, sndptr); sndptr += 2; } } From c7a268a01e5751d6bd10be13fe6019f9201fc0d6 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 14 Jul 2024 00:41:43 -0400 Subject: [PATCH 095/624] Nuked: ch/chan -> channel --- src/include/86box/snd_opl_nuked.h | 4 +- src/sound/snd_opl_nuked.c | 473 +++++++++++++++--------------- 2 files changed, 239 insertions(+), 238 deletions(-) diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index 082f16f5d..d0b6924d9 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -31,7 +31,7 @@ struct chan; struct chip; typedef struct slot { - struct chan *chan; + struct chan *channel; struct chip *chip; int16_t out; int16_t fbmod; @@ -92,7 +92,7 @@ typedef struct wrbuf { } wrbuf_t; typedef struct chip { - chan_t chan[18]; + chan_t channel[18]; opl3_slot slot[36]; uint16_t timer; uint64_t eg_timer; diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index c3e709948..a9a91d962 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -387,8 +387,8 @@ static const envelope_sinfunc envelope_sin[8] = { static void envelope_update_ksl(opl3_slot *slot) { - int16_t ksl = (kslrom[slot->chan->f_num >> 6u] << 2) - - ((0x08 - slot->chan->block) << 5); + int16_t ksl = (kslrom[slot->channel->f_num >> 6u] << 2) + - ((0x08 - slot->channel->block) << 5); if (ksl < 0) ksl = 0; @@ -441,13 +441,15 @@ envelope_calc(opl3_slot *slot) } slot->pg_reset = reset; - ks = slot->chan->ksv >> ((slot->reg_ksr ^ 1) << 1); + ks = slot->channel->ksv >> ((slot->reg_ksr ^ 1) << 1); nonzero = (reg_rate != 0); rate = ks + (reg_rate << 2); rate_hi = rate >> 2; rate_lo = rate & 0x03; + if (rate_hi & 0x10) rate_hi = 0x0f; + eg_shift = rate_hi + slot->chip->eg_add; shift = 0; @@ -554,7 +556,7 @@ phase_generate(opl3_slot *slot) opl3_chip *chip; chip = slot->chip; - f_num = slot->chan->f_num; + f_num = slot->channel->f_num; if (slot->reg_vib) { range = (f_num >> 7) & 7; vibpos = chip->vibpos; @@ -570,7 +572,7 @@ phase_generate(opl3_slot *slot) f_num += range; } - basefreq = (f_num << slot->chan->block) >> 1; + basefreq = (f_num << slot->channel->block) >> 1; phase = (uint16_t) (slot->pg_phase >> 9); if (slot->pg_reset) @@ -683,7 +685,7 @@ slot_generate(opl3_slot *slot) static void slot_calc_fb(opl3_slot *slot) { - if (slot->chan->fb != 0x00) + if (slot->channel->fb != 0x00) slot->fbmod = (slot->prout + slot->out) >> (0x09 - slot->chan->fb); else slot->fbmod = 0; @@ -692,151 +694,150 @@ slot_calc_fb(opl3_slot *slot) } // Channel - static void -channel_setup_alg(chan_t *ch); +channel_setup_alg(chan_t *channel); static void channel_update_rhythm(opl3_chip *chip, uint8_t data) { - chan_t *ch6; - chan_t *ch7; - chan_t *ch8; + chan_t *channel6; + chan_t *channel7; + chan_t *channel8; uint8_t chnum; chip->rhy = data & 0x3f; if (chip->rhy & 0x20) { - ch6 = &chip->chan[6]; - ch7 = &chip->chan[7]; - ch8 = &chip->chan[8]; - ch6->out[0] = &ch6->slotz[1]->out; - ch6->out[1] = &ch6->slotz[1]->out; - ch6->out[2] = &chip->zeromod; - ch6->out[3] = &chip->zeromod; - ch7->out[0] = &ch7->slotz[0]->out; - ch7->out[1] = &ch7->slotz[0]->out; - ch7->out[2] = &ch7->slotz[1]->out; - ch7->out[3] = &ch7->slotz[1]->out; - ch8->out[0] = &ch8->slotz[0]->out; - ch8->out[1] = &ch8->slotz[0]->out; - ch8->out[2] = &ch8->slotz[1]->out; - ch8->out[3] = &ch8->slotz[1]->out; + channel6 = &chip->channel[6]; + channel7 = &chip->channel[7]; + channel8 = &chip->channel[8]; + channel6->out[0] = &channel6->slotz[1]->out; + channel6->out[1] = &channel6->slotz[1]->out; + channel6->out[2] = &chip->zeromod; + channel6->out[3] = &chip->zeromod; + channel7->out[0] = &channel7->slotz[0]->out; + channel7->out[1] = &channel7->slotz[0]->out; + channel7->out[2] = &channel7->slotz[1]->out; + channel7->out[3] = &channel7->slotz[1]->out; + channel8->out[0] = &channel8->slotz[0]->out; + channel8->out[1] = &channel8->slotz[0]->out; + channel8->out[2] = &channel8->slotz[1]->out; + channel8->out[3] = &channel8->slotz[1]->out; for (chnum = 6; chnum < 9; chnum++) - chip->chan[chnum].chtype = ch_drum; + chip->channel[chnum].chtype = ch_drum; - channel_setup_alg(ch6); - channel_setup_alg(ch7); - channel_setup_alg(ch8); + channel_setup_alg(channel6); + channel_setup_alg(channel7); + channel_setup_alg(channel8); // hh if (chip->rhy & 0x01) - envelope_key_on(ch7->slotz[0], egk_drum); + envelope_key_on(channel7->slotz[0], egk_drum); else - envelope_key_off(ch7->slotz[0], egk_drum); + envelope_key_off(channel7->slotz[0], egk_drum); // tc if (chip->rhy & 0x02) - envelope_key_on(ch8->slotz[1], egk_drum); + envelope_key_on(channel8->slotz[1], egk_drum); else - envelope_key_off(ch8->slotz[1], egk_drum); + envelope_key_off(channel8->slotz[1], egk_drum); // tom if (chip->rhy & 0x04) - envelope_key_on(ch8->slotz[0], egk_drum); + envelope_key_on(channel8->slotz[0], egk_drum); else - envelope_key_off(ch8->slotz[0], egk_drum); + envelope_key_off(channel8->slotz[0], egk_drum); // sd if (chip->rhy & 0x08) - envelope_key_on(ch7->slotz[1], egk_drum); + envelope_key_on(channel7->slotz[1], egk_drum); else - envelope_key_off(ch7->slotz[1], egk_drum); + envelope_key_off(channel7->slotz[1], egk_drum); // bd if (chip->rhy & 0x10) { - envelope_key_on(ch6->slotz[0], egk_drum); - envelope_key_on(ch6->slotz[1], egk_drum); + envelope_key_on(channel6->slotz[0], egk_drum); + envelope_key_on(channel6->slotz[1], egk_drum); } else { - envelope_key_off(ch6->slotz[0], egk_drum); - envelope_key_off(ch6->slotz[1], egk_drum); + envelope_key_off(channel6->slotz[0], egk_drum); + envelope_key_off(channel6->slotz[1], egk_drum); } } else { for (chnum = 6; chnum < 9; chnum++) { - chip->chan[chnum].chtype = ch_2op; + chip->channel[chnum].chtype = ch_2op; - channel_setup_alg(&chip->chan[chnum]); - envelope_key_off(chip->chan[chnum].slotz[0], egk_drum); - envelope_key_off(chip->chan[chnum].slotz[1], egk_drum); + channel_setup_alg(&chip->channel[chnum]); + envelope_key_off(chip->channel[chnum].slotz[0], egk_drum); + envelope_key_off(chip->channel[chnum].slotz[1], egk_drum); } } } static void -channel_write_a0(chan_t *ch, uint8_t data) +channel_write_a0(chan_t *channel, uint8_t data) { - if (ch->chip->newm && ch->chtype == ch_4op2) + if (channel->chip->newm && channel->chtype == ch_4op2) return; - ch->f_num = (ch->f_num & 0x300) | data; - ch->ksv = (ch->block << 1) - | ((ch->f_num >> (0x09 - ch->chip->nts)) & 0x01); + channel->f_num = (channel->f_num & 0x300) | data; + channel->ksv = (channel->block << 1) + | ((channel->f_num >> (0x09 - channel->chip->nts)) & 0x01); - envelope_update_ksl(ch->slotz[0]); - envelope_update_ksl(ch->slotz[1]); + envelope_update_ksl(channel->slotz[0]); + envelope_update_ksl(channel->slotz[1]); - if (ch->chip->newm && ch->chtype == ch_4op) { - ch->pair->f_num = ch->f_num; - ch->pair->ksv = ch->ksv; + if (channel->chip->newm && channel->chtype == ch_4op) { + channel->pair->f_num = channel->f_num; + channel->pair->ksv = channel->ksv; - envelope_update_ksl(ch->pair->slotz[0]); - envelope_update_ksl(ch->pair->slotz[1]); + envelope_update_ksl(channel->pair->slotz[0]); + envelope_update_ksl(channel->pair->slotz[1]); } } static void -channel_write_b0(chan_t *ch, uint8_t data) +channel_write_b0(chan_t *channel, uint8_t data) { - if (ch->chip->newm && ch->chtype == ch_4op2) + if (channel->chip->newm && channel->chtype == ch_4op2) return; - ch->f_num = (ch->f_num & 0xff) | ((data & 0x03) << 8); - ch->block = (data >> 2) & 0x07; - ch->ksv = (ch->block << 1) - | ((ch->f_num >> (0x09 - ch->chip->nts)) & 0x01); + channel->f_num = (channel->f_num & 0xff) | ((data & 0x03) << 8); + channel->block = (data >> 2) & 0x07; + channel->ksv = (channel->block << 1) + | ((channel->f_num >> (0x09 - channel->chip->nts)) & 0x01); - envelope_update_ksl(ch->slotz[0]); - envelope_update_ksl(ch->slotz[1]); + envelope_update_ksl(channel->slotz[0]); + envelope_update_ksl(channel->slotz[1]); - if (ch->chip->newm && ch->chtype == ch_4op) { - ch->pair->f_num = ch->f_num; - ch->pair->block = ch->block; - ch->pair->ksv = ch->ksv; + if (channel->chip->newm && channel->chtype == ch_4op) { + channel->pair->f_num = channel->f_num; + channel->pair->block = channel->block; + channel->pair->ksv = channel->ksv; - envelope_update_ksl(ch->pair->slotz[0]); - envelope_update_ksl(ch->pair->slotz[1]); + envelope_update_ksl(channel->pair->slotz[0]); + envelope_update_ksl(channel->pair->slotz[1]); } } static void -channel_setup_alg(chan_t *ch) +channel_setup_alg(chan_t *channel) { - if (ch->chtype == ch_drum) { - if (ch->ch_num == 7 || ch->ch_num == 8) { - ch->slotz[0]->mod = &ch->chip->zeromod; - ch->slotz[1]->mod = &ch->chip->zeromod; + if (channel->chtype == ch_drum) { + if (channel->ch_num == 7 || channel->ch_num == 8) { + channel->slotz[0]->mod = &channel->chip->zeromod; + channel->slotz[1]->mod = &channel->chip->zeromod; return; } - switch (ch->alg & 0x01) { + switch (channel->alg & 0x01) { case 0x00: - ch->slotz[0]->mod = &ch->slotz[0]->fbmod; - ch->slotz[1]->mod = &ch->slotz[0]->out; + channel->slotz[0]->mod = &channel->slotz[0]->fbmod; + channel->slotz[1]->mod = &channel->slotz[0]->out; break; case 0x01: - ch->slotz[0]->mod = &ch->slotz[0]->fbmod; - ch->slotz[1]->mod = &ch->chip->zeromod; + channel->slotz[0]->mod = &channel->slotz[0]->fbmod; + channel->slotz[1]->mod = &channel->chip->zeromod; break; default: @@ -845,81 +846,81 @@ channel_setup_alg(chan_t *ch) return; } - if (ch->alg & 0x08) + if (channel->alg & 0x08) return; - if (ch->alg & 0x04) { - ch->pair->out[0] = &ch->chip->zeromod; - ch->pair->out[1] = &ch->chip->zeromod; - ch->pair->out[2] = &ch->chip->zeromod; - ch->pair->out[3] = &ch->chip->zeromod; + if (channel->alg & 0x04) { + channel->pair->out[0] = &channel->chip->zeromod; + channel->pair->out[1] = &channel->chip->zeromod; + channel->pair->out[2] = &channel->chip->zeromod; + channel->pair->out[3] = &channel->chip->zeromod; - switch (ch->alg & 0x03) { + switch (channel->alg & 0x03) { case 0x00: - ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; - ch->pair->slotz[1]->mod = &ch->pair->slotz[0]->out; - ch->slotz[0]->mod = &ch->pair->slotz[1]->out; - ch->slotz[1]->mod = &ch->slotz[0]->out; - ch->out[0] = &ch->slotz[1]->out; - ch->out[1] = &ch->chip->zeromod; - ch->out[2] = &ch->chip->zeromod; - ch->out[3] = &ch->chip->zeromod; + channel->pair->slotz[0]->mod = &channel->pair->slotz[0]->fbmod; + channel->pair->slotz[1]->mod = &channel->pair->slotz[0]->out; + channel->slotz[0]->mod = &channel->pair->slotz[1]->out; + channel->slotz[1]->mod = &channel->slotz[0]->out; + channel->out[0] = &channel->slotz[1]->out; + channel->out[1] = &channel->chip->zeromod; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; break; case 0x01: - ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; - ch->pair->slotz[1]->mod = &ch->pair->slotz[0]->out; - ch->slotz[0]->mod = &ch->chip->zeromod; - ch->slotz[1]->mod = &ch->slotz[0]->out; - ch->out[0] = &ch->pair->slotz[1]->out; - ch->out[1] = &ch->slotz[1]->out; - ch->out[2] = &ch->chip->zeromod; - ch->out[3] = &ch->chip->zeromod; + channel->pair->slotz[0]->mod = &channel->pair->slotz[0]->fbmod; + channel->pair->slotz[1]->mod = &channel->pair->slotz[0]->out; + channel->slotz[0]->mod = &channel->chip->zeromod; + channel->slotz[1]->mod = &channel->slotz[0]->out; + channel->out[0] = &channel->pair->slotz[1]->out; + channel->out[1] = &channel->slotz[1]->out; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; break; case 0x02: - ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; - ch->pair->slotz[1]->mod = &ch->chip->zeromod; - ch->slotz[0]->mod = &ch->pair->slotz[1]->out; - ch->slotz[1]->mod = &ch->slotz[0]->out; - ch->out[0] = &ch->pair->slotz[0]->out; - ch->out[1] = &ch->slotz[1]->out; - ch->out[2] = &ch->chip->zeromod; - ch->out[3] = &ch->chip->zeromod; + channel->pair->slotz[0]->mod = &channel->pair->slotz[0]->fbmod; + channel->pair->slotz[1]->mod = &channel->chip->zeromod; + channel->slotz[0]->mod = &channel->pair->slotz[1]->out; + channel->slotz[1]->mod = &channel->slotz[0]->out; + channel->out[0] = &channel->pair->slotz[0]->out; + channel->out[1] = &channel->slotz[1]->out; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; break; case 0x03: - ch->pair->slotz[0]->mod = &ch->pair->slotz[0]->fbmod; - ch->pair->slotz[1]->mod = &ch->chip->zeromod; - ch->slotz[0]->mod = &ch->pair->slotz[1]->out; - ch->slotz[1]->mod = &ch->chip->zeromod; - ch->out[0] = &ch->pair->slotz[0]->out; - ch->out[1] = &ch->slotz[0]->out; - ch->out[2] = &ch->slotz[1]->out; - ch->out[3] = &ch->chip->zeromod; + channel->pair->slotz[0]->mod = &channel->pair->slotz[0]->fbmod; + channel->pair->slotz[1]->mod = &channel->chip->zeromod; + channel->slotz[0]->mod = &channel->pair->slotz[1]->out; + channel->slotz[1]->mod = &channel->chip->zeromod; + channel->out[0] = &channel->pair->slotz[0]->out; + channel->out[1] = &channel->slotz[0]->out; + channel->out[2] = &channel->slotz[1]->out; + channel->out[3] = &channel->chip->zeromod; break; default: break; } } else - switch (ch->alg & 0x01) { + switch (channel->alg & 0x01) { case 0x00: - ch->slotz[0]->mod = &ch->slotz[0]->fbmod; - ch->slotz[1]->mod = &ch->slotz[0]->out; - ch->out[0] = &ch->slotz[1]->out; - ch->out[1] = &ch->chip->zeromod; - ch->out[2] = &ch->chip->zeromod; - ch->out[3] = &ch->chip->zeromod; + channel->slotz[0]->mod = &channel->slotz[0]->fbmod; + channel->slotz[1]->mod = &channel->slotz[0]->out; + channel->out[0] = &channel->slotz[1]->out; + channel->out[1] = &channel->chip->zeromod; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; break; case 0x01: - ch->slotz[0]->mod = &ch->slotz[0]->fbmod; - ch->slotz[1]->mod = &ch->chip->zeromod; - ch->out[0] = &ch->slotz[0]->out; - ch->out[1] = &ch->slotz[1]->out; - ch->out[2] = &ch->chip->zeromod; - ch->out[3] = &ch->chip->zeromod; + channel->slotz[0]->mod = &channel->slotz[0]->fbmod; + channel->slotz[1]->mod = &channel->chip->zeromod; + channel->out[0] = &channel->slotz[0]->out; + channel->out[1] = &channel->slotz[1]->out; + channel->out[2] = &channel->chip->zeromod; + channel->out[3] = &channel->chip->zeromod; break; default: @@ -928,96 +929,96 @@ channel_setup_alg(chan_t *ch) } static void -channel_update_alg(chan_t *ch) +channel_update_alg(chan_t *channel) { - ch->alg = ch->con; + channel->alg = channel->con; - if (ch->chip->newm) { - if (ch->chtype == ch_4op) { - ch->pair->alg = 0x04 | (ch->con << 1) | ch->pair->con; - ch->alg = 0x08; - channel_setup_alg(ch->pair); - } else if (ch->chtype == ch_4op2) { - ch->alg = 0x04 | (ch->pair->con << 1) | ch->con; - ch->pair->alg = 0x08; - channel_setup_alg(ch); + if (channel->chip->newm) { + if (channel->chtype == ch_4op) { + channel->pair->alg = 0x04 | (channel->con << 1) | channel->pair->con; + channel->alg = 0x08; + channel_setup_alg(channel->pair); + } else if (channel->chtype == ch_4op2) { + channel->alg = 0x04 | (channel->pair->con << 1) | channel->con; + channel->pair->alg = 0x08; + channel_setup_alg(channel); } else - channel_setup_alg(ch); + channel_setup_alg(channel); } else - channel_setup_alg(ch); + channel_setup_alg(channel); } static void -channel_write_c0(chan_t *ch, uint8_t data) +channel_write_c0(chan_t *channel, uint8_t data) { - ch->fb = (data & 0x0e) >> 1; - ch->con = data & 0x01; + channel->fb = (data & 0x0e) >> 1; + channel->con = data & 0x01; - if (ch->chip->newm) { - ch->cha = ((data >> 4) & 0x01) ? ~0 : 0; - ch->chb = ((data >> 5) & 0x01) ? ~0 : 0; - ch->chc = ((data >> 6) & 0x01) ? ~0 : 0; - ch->chd = ((data >> 7) & 0x01) ? ~0 : 0; + if (channel->chip->newm) { + channel->cha = ((data >> 4) & 0x01) ? ~0 : 0; + channel->chb = ((data >> 5) & 0x01) ? ~0 : 0; + channel->chc = ((data >> 6) & 0x01) ? ~0 : 0; + channel->chd = ((data >> 7) & 0x01) ? ~0 : 0; } else { - ch->cha = ch->chb = (uint16_t) ~0; + channel->cha = ch->chb = (uint16_t) ~0; // TODO: Verify on real chip if DAC2 output is disabled in compat mode - ch->chc = ch->chd = 0; + channel->chc = ch->chd = 0; } #if OPL_ENABLE_STEREOEXT - if (!ch->chip->stereoext) { - ch->leftpan = ch->cha << 16; - ch->rightpan = ch->chb << 16; + if (!channel->chip->stereoext) { + channel->leftpan = channel->cha << 16; + channel->rightpan = channel->chb << 16; } #endif } #if OPL_ENABLE_STEREOEXT static void -channel_write_d0(chan_t *ch, uint8_t data) +channel_write_d0(chan_t *channel, uint8_t data) { - if (ch->chip->stereoext) { - ch->leftpan = panpot_lut[data ^ 0xffu]; - ch->rightpan = panpot_lut[data]; + if (channel->chip->stereoext) { + channel->leftpan = panpot_lut[data ^ 0xffu]; + channel->rightpan = panpot_lut[data]; } } #endif static void -channel_key_on(chan_t *ch) +channel_key_on(chan_t *channel) { - if (ch->chip->newm) { - if (ch->chtype == ch_4op) { - envelope_key_on(ch->slotz[0], egk_norm); - envelope_key_on(ch->slotz[1], egk_norm); - envelope_key_on(ch->pair->slotz[0], egk_norm); - envelope_key_on(ch->pair->slotz[1], egk_norm); - } else if (ch->chtype == ch_2op || ch->chtype == ch_drum) { - envelope_key_on(ch->slotz[0], egk_norm); - envelope_key_on(ch->slotz[1], egk_norm); + if (channel->chip->newm) { + if (channel->chtype == ch_4op) { + envelope_key_on(channel->slotz[0], egk_norm); + envelope_key_on(channel->slotz[1], egk_norm); + envelope_key_on(channel->pair->slotz[0], egk_norm); + envelope_key_on(channel->pair->slotz[1], egk_norm); + } else if (channel->chtype == ch_2op || channel->chtype == ch_drum) { + envelope_key_on(channel->slotz[0], egk_norm); + envelope_key_on(channel->slotz[1], egk_norm); } } else { - envelope_key_on(ch->slotz[0], egk_norm); - envelope_key_on(ch->slotz[1], egk_norm); + envelope_key_on(channel->slotz[0], egk_norm); + envelope_key_on(channel->slotz[1], egk_norm); } } static void -channel_key_off(chan_t *ch) +channel_key_off(chan_t *channel) { - if (ch->chip->newm) { - if (ch->chtype == ch_4op) { - envelope_key_off(ch->slotz[0], egk_norm); - envelope_key_off(ch->slotz[1], egk_norm); - envelope_key_off(ch->pair->slotz[0], egk_norm); - envelope_key_off(ch->pair->slotz[1], egk_norm); - } else if (ch->chtype == ch_2op || ch->chtype == ch_drum) { - envelope_key_off(ch->slotz[0], egk_norm); - envelope_key_off(ch->slotz[1], egk_norm); + if (channel->chip->newm) { + if (channel->chtype == ch_4op) { + envelope_key_off(channel->slotz[0], egk_norm); + envelope_key_off(channel->slotz[1], egk_norm); + envelope_key_off(channel->pair->slotz[0], egk_norm); + envelope_key_off(channel->pair->slotz[1], egk_norm); + } else if (channel->chtype == ch_2op || channel->chtype == ch_drum) { + envelope_key_off(channel->slotz[0], egk_norm); + envelope_key_off(channel->slotz[1], egk_norm); } } else { - envelope_key_off(ch->slotz[0], egk_norm); - envelope_key_off(ch->slotz[1], egk_norm); + envelope_key_off(channel->slotz[0], egk_norm); + envelope_key_off(channel->slotz[1], egk_norm); } } @@ -1033,14 +1034,14 @@ channel_set_4op(opl3_chip *chip, uint8_t data) chnum += 9 - 3; if ((data >> bit) & 0x01) { - chip->chan[chnum].chtype = ch_4op; - chip->chan[chnum + 3u].chtype = ch_4op2; - channel_update_alg(&chip->chan[chnum]); + chip->channel[chnum].chtype = ch_4op; + chip->channel[chnum + 3u].chtype = ch_4op2; + channel_update_alg(&chip->channel[chnum]); } else { - chip->chan[chnum].chtype = ch_2op; - chip->chan[chnum + 3u].chtype = ch_2op; - channel_update_alg(&chip->chan[chnum]); - channel_update_alg(&chip->chan[chnum + 3u]); + chip->channel[chnum].chtype = ch_2op; + chip->channel[chnum + 3u].chtype = ch_2op; + channel_update_alg(&chip->channel[chnum]); + channel_update_alg(&chip->channel[chnum + 3u]); } } } @@ -1058,7 +1059,7 @@ static inline void nuked_generate_4ch(void *priv, int32_t *buf4) { opl3_chip *chip = (opl3_chip *) priv; - chan_t *ch; + chan_t *channel; wrbuf_t *writebuf; int16_t **out; int32_t mix[2]; @@ -1079,15 +1080,15 @@ nuked_generate_4ch(void *priv, int32_t *buf4) mix[0] = mix[1] = 0; for (i = 0; i < 18; i++) { - ch = &chip->chan[i]; - out = ch->out; - accm = *out[0] + *out[1] + *out[2] + *out[3]; + channel = &chip->channel[i]; + out = channel->out; + accm = *out[0] + *out[1] + *out[2] + *out[3]; #if OPL_ENABLE_STEREOEXT - mix[0] += (int32_t) ((accm * ch->leftpan) >> 16); + mix[0] += (int32_t) ((accm * channel->leftpan) >> 16); #else - mix[0] += (int32_t) (accm & ch->cha); + mix[0] += (int32_t) (accm & channel->cha); #endif - mix[1] += (int32_t) (accm & ch->chc); + mix[1] += (int32_t) (accm & channel->chc); } chip->mixbuff[0] = mix[0]; @@ -1109,15 +1110,15 @@ nuked_generate_4ch(void *priv, int32_t *buf4) mix[0] = mix[1] = 0; for (i = 0; i < 18; i++) { - ch = &chip->chan[i]; - out = ch->out; + channel = &chip->channel[i]; + out = channel->out; accm = *out[0] + *out[1] + *out[2] + *out[3]; #if OPL_ENABLE_STEREOEXT - mix[0] += (int32_t) ((accm * ch->rightpan) >> 16); + mix[0] += (int32_t) ((accm * channel->rightpan) >> 16); #else - mix[0] += (int32_t) (accm & ch->chb); + mix[0] += (int32_t) (accm & channel->chb); #endif - mix[1] += (int32_t) (accm & ch->chd); + mix[1] += (int32_t) (accm & channel->chd); } chip->mixbuff[1] = mix[0]; @@ -1229,9 +1230,9 @@ void nuked_init(opl3_chip *chip, uint32_t samplerate) { opl3_slot *slot; - chan_t *ch; - uint8_t i; - uint8_t local_ch_slot; + chan_t *channel; + uint8_t i; + uint8_t local_ch_slot; memset(chip, 0x00, sizeof(opl3_chip)); @@ -1247,33 +1248,33 @@ nuked_init(opl3_chip *chip, uint32_t samplerate) } for (i = 0; i < 18; i++) { - ch = &chip->chan[i]; - local_ch_slot = ch_slot[i]; - ch->slotz[0] = &chip->slot[local_ch_slot]; - ch->slotz[1] = &chip->slot[local_ch_slot + 3u]; - chip->slot[local_ch_slot].chan = ch; - chip->slot[local_ch_slot + 3u].chan = ch; + channel = &chip->channel[i]; + local_ch_slot = ch_slot[i]; + channel->slotz[0] = &chip->slot[local_ch_slot]; + channel->slotz[1] = &chip->slot[local_ch_slot + 3u]; + chip->slot[local_ch_slot].channel = channel; + chip->slot[local_ch_slot + 3u].channel = channel; if ((i % 9) < 3) - ch->pair = &chip->chan[i + 3u]; + channel->pair = &chip->channel[i + 3u]; else if ((i % 9) < 6) - ch->pair = &chip->chan[i - 3u]; + channel->pair = &chip->channel[i - 3u]; - ch->chip = chip; - ch->out[0] = &chip->zeromod; - ch->out[1] = &chip->zeromod; - ch->out[2] = &chip->zeromod; - ch->out[3] = &chip->zeromod; - ch->chtype = ch_2op; - ch->cha = 0xffff; - ch->chb = 0xffff; + channel->chip = chip; + channel->out[0] = &chip->zeromod; + channel->out[1] = &chip->zeromod; + channel->out[2] = &chip->zeromod; + channel->out[3] = &chip->zeromod; + channel->chtype = ch_2op; + channel->cha = 0xffff; + channel->chb = 0xffff; #if OPL_ENABLE_STEREOEXT - ch->leftpan = 0x10000; - ch->rightpan = 0x10000; + channel->leftpan = 0x10000; + channel->rightpan = 0x10000; #endif - ch->ch_num = i; + channel->ch_num = i; - channel_setup_alg(ch); + channel_setup_alg(channel); } chip->noise = 1; @@ -1374,7 +1375,7 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) case 0xa0: if ((regm & 0x0f) < 9) - channel_write_a0(&chip->chan[9u * high + (regm & 0x0fu)], val); + channel_write_a0(&chip->channel[9u * high + (regm & 0x0fu)], val); break; case 0xb0: @@ -1383,24 +1384,24 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) chip->vibshift = ((val >> 6) & 0x01) ^ 1; channel_update_rhythm(chip, val); } else if ((regm & 0x0f) < 9) { - channel_write_b0(&chip->chan[9u * high + (regm & 0x0fu)], val); + channel_write_b0(&chip->channel[9u * high + (regm & 0x0fu)], val); if (val & 0x20) - channel_key_on(&chip->chan[9u * high + (regm & 0x0fu)]); + channel_key_on(&chip->channel[9u * high + (regm & 0x0fu)]); else - channel_key_off(&chip->chan[9u * high + (regm & 0x0fu)]); + channel_key_off(&chip->channel[9u * high + (regm & 0x0fu)]); } break; case 0xc0: if ((regm & 0x0f) < 9) - channel_write_c0(&chip->chan[9u * high + (regm & 0x0fu)], val); + channel_write_c0(&chip->channel[9u * high + (regm & 0x0fu)], val); break; #if OPL_ENABLE_STEREOEXT case 0xd0: if ((regm & 0x0f) < 9) - channel_write_d0(&chip->chan[9u * high + (regm & 0x0fu)], val); + channel_write_d0(&chip->channel[9u * high + (regm & 0x0fu)], val); break; #endif From e4ee5d2d01d2db8571fca4fb38f77b6ea9fa5978 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 14 Jul 2024 00:51:26 -0400 Subject: [PATCH 096/624] Update snd_opl_nuked.c --- src/sound/snd_opl_nuked.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index a9a91d962..8125341e2 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -686,7 +686,7 @@ static void slot_calc_fb(opl3_slot *slot) { if (slot->channel->fb != 0x00) - slot->fbmod = (slot->prout + slot->out) >> (0x09 - slot->chan->fb); + slot->fbmod = (slot->prout + slot->out) >> (0x09 - slot->channel->fb); else slot->fbmod = 0; @@ -960,9 +960,9 @@ channel_write_c0(chan_t *channel, uint8_t data) channel->chc = ((data >> 6) & 0x01) ? ~0 : 0; channel->chd = ((data >> 7) & 0x01) ? ~0 : 0; } else { - channel->cha = ch->chb = (uint16_t) ~0; + channel->cha = channel->chb = (uint16_t) ~0; // TODO: Verify on real chip if DAC2 output is disabled in compat mode - channel->chc = ch->chd = 0; + channel->chc = channel->chd = 0; } #if OPL_ENABLE_STEREOEXT From e654d01bd0ff38831381160afa43e52927eb3ce9 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 14 Jul 2024 01:04:35 -0400 Subject: [PATCH 097/624] Nuked: chan_t -> opl3_channel --- src/include/86box/snd_opl_nuked.h | 4 +-- src/sound/snd_opl_nuked.c | 48 +++++++++++++++---------------- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index d0b6924d9..b6e128d09 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -83,7 +83,7 @@ typedef struct chan { uint16_t chc; uint16_t chd; uint8_t ch_num; -} chan_t; +} opl3_channel; typedef struct wrbuf { uint64_t time; @@ -92,7 +92,7 @@ typedef struct wrbuf { } wrbuf_t; typedef struct chip { - chan_t channel[18]; + opl3_channel channel[18]; opl3_slot slot[36]; uint16_t timer; uint64_t eg_timer; diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 8125341e2..f578b460c 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -695,14 +695,14 @@ slot_calc_fb(opl3_slot *slot) // Channel static void -channel_setup_alg(chan_t *channel); +channel_setup_alg(opl3_channel *channel); static void channel_update_rhythm(opl3_chip *chip, uint8_t data) { - chan_t *channel6; - chan_t *channel7; - chan_t *channel8; + opl3_channel *channel6; + opl3_channel *channel7; + opl3_channel *channel8; uint8_t chnum; chip->rhy = data & 0x3f; @@ -774,7 +774,7 @@ channel_update_rhythm(opl3_chip *chip, uint8_t data) } static void -channel_write_a0(chan_t *channel, uint8_t data) +channel_write_a0(opl3_channel *channel, uint8_t data) { if (channel->chip->newm && channel->chtype == ch_4op2) return; @@ -796,7 +796,7 @@ channel_write_a0(chan_t *channel, uint8_t data) } static void -channel_write_b0(chan_t *channel, uint8_t data) +channel_write_b0(opl3_channel *channel, uint8_t data) { if (channel->chip->newm && channel->chtype == ch_4op2) return; @@ -820,7 +820,7 @@ channel_write_b0(chan_t *channel, uint8_t data) } static void -channel_setup_alg(chan_t *channel) +channel_setup_alg(opl3_channel *channel) { if (channel->chtype == ch_drum) { if (channel->ch_num == 7 || channel->ch_num == 8) { @@ -929,7 +929,7 @@ channel_setup_alg(chan_t *channel) } static void -channel_update_alg(chan_t *channel) +channel_update_alg(opl3_channel *channel) { channel->alg = channel->con; @@ -949,7 +949,7 @@ channel_update_alg(chan_t *channel) } static void -channel_write_c0(chan_t *channel, uint8_t data) +channel_write_c0(opl3_channel *channel, uint8_t data) { channel->fb = (data & 0x0e) >> 1; channel->con = data & 0x01; @@ -975,7 +975,7 @@ channel_write_c0(chan_t *channel, uint8_t data) #if OPL_ENABLE_STEREOEXT static void -channel_write_d0(chan_t *channel, uint8_t data) +channel_write_d0(opl3_channel *channel, uint8_t data) { if (channel->chip->stereoext) { channel->leftpan = panpot_lut[data ^ 0xffu]; @@ -985,7 +985,7 @@ channel_write_d0(chan_t *channel, uint8_t data) #endif static void -channel_key_on(chan_t *channel) +channel_key_on(opl3_channel *channel) { if (channel->chip->newm) { if (channel->chtype == ch_4op) { @@ -1004,7 +1004,7 @@ channel_key_on(chan_t *channel) } static void -channel_key_off(chan_t *channel) +channel_key_off(opl3_channel *channel) { if (channel->chip->newm) { if (channel->chtype == ch_4op) { @@ -1058,14 +1058,14 @@ process_slot(opl3_slot *slot) static inline void nuked_generate_4ch(void *priv, int32_t *buf4) { - opl3_chip *chip = (opl3_chip *) priv; - chan_t *channel; - wrbuf_t *writebuf; - int16_t **out; - int32_t mix[2]; - int16_t accm; - int16_t shift = 0; - uint8_t i; + opl3_chip *chip = (opl3_chip *) priv; + opl3_channel *channel; + wrbuf_t *writebuf; + int16_t **out; + int32_t mix[2]; + int16_t accm; + int16_t shift = 0; + uint8_t i; buf4[1] = chip->mixbuff[1]; buf4[3] = chip->mixbuff[3]; @@ -1229,10 +1229,10 @@ nuked_generate_resampled(opl3_chip *chip, int32_t *buf4) void nuked_init(opl3_chip *chip, uint32_t samplerate) { - opl3_slot *slot; - chan_t *channel; - uint8_t i; - uint8_t local_ch_slot; + opl3_slot *slot; + opl3_channel *channel; + uint8_t i; + uint8_t local_ch_slot; memset(chip, 0x00, sizeof(opl3_chip)); From 8056c1bc9afae88ea1399834674474108e9261c7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 14 Jul 2024 14:48:43 -0400 Subject: [PATCH 098/624] Nuked: wrbuf -> writebuf --- src/include/86box/snd_opl_nuked.h | 18 +++++------ src/sound/snd_opl_nuked.c | 50 +++++++++++++++---------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index b6e128d09..508affde2 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -24,8 +24,8 @@ #define OPL_ENABLE_STEREOEXT 0 #endif -#define WRBUF_SIZE 1024 -#define WRBUF_DELAY 1 +#define OPL_WRITEBUF_SIZE 1024 +#define OPL_WRITEBUF_DELAY 2 struct chan; struct chip; @@ -85,11 +85,11 @@ typedef struct chan { uint8_t ch_num; } opl3_channel; -typedef struct wrbuf { +typedef struct _opl3_writebuf { uint64_t time; uint16_t reg; uint8_t data; -} wrbuf_t; +} opl3_writebuf; typedef struct chip { opl3_channel channel[18]; @@ -128,11 +128,11 @@ typedef struct chip { int32_t oldsamples[4]; int32_t samples[4]; - uint64_t wrbuf_samplecnt; - uint32_t wrbuf_cur; - uint32_t wrbuf_last; - uint64_t wrbuf_lasttime; - wrbuf_t wrbuf[WRBUF_SIZE]; + uint64_t writebuf_samplecnt; + uint32_t writebuf_cur; + uint32_t writebuf_last; + uint64_t writebuf_lasttime; + opl3_writebuf writebuf[OPL_WRITEBUF_SIZE]; } opl3_chip; typedef struct { diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index f578b460c..958dc87d5 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -1058,14 +1058,14 @@ process_slot(opl3_slot *slot) static inline void nuked_generate_4ch(void *priv, int32_t *buf4) { - opl3_chip *chip = (opl3_chip *) priv; - opl3_channel *channel; - wrbuf_t *writebuf; - int16_t **out; - int32_t mix[2]; - int16_t accm; - int16_t shift = 0; - uint8_t i; + opl3_chip *chip = (opl3_chip *) priv; + opl3_channel *channel; + opl3_writebuf *writebuf; + int16_t **out; + int32_t mix[2]; + int16_t accm; + int16_t shift = 0; + uint8_t i; buf4[1] = chip->mixbuff[1]; buf4[3] = chip->mixbuff[3]; @@ -1166,7 +1166,7 @@ nuked_generate_4ch(void *priv, int32_t *buf4) chip->eg_state ^= 1; - while (writebuf = &chip->wrbuf[chip->wrbuf_cur], writebuf->time <= chip->wrbuf_samplecnt) { + while (writebuf = &chip->writebuf[chip->writebuf_cur], writebuf->time <= chip->writebuf_samplecnt) { if (!(writebuf->reg & 0x200)) break; @@ -1174,10 +1174,10 @@ nuked_generate_4ch(void *priv, int32_t *buf4) nuked_write_reg(chip, writebuf->reg, writebuf->data); - chip->wrbuf_cur = (chip->wrbuf_cur + 1) % WRBUF_SIZE; + chip->writebuf_cur = (chip->writebuf_cur + 1) % OPL_WRITEBUF_SIZE; } - chip->wrbuf_samplecnt++; + chip->writebuf_samplecnt++; } void @@ -1419,33 +1419,33 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) void nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) { - opl3_chip *chip = (opl3_chip *) priv; - uint64_t time1; - uint64_t time2; - wrbuf_t *writebuf; - uint32_t writebuf_last; + opl3_chip *chip = (opl3_chip *) priv; + uint64_t time1; + uint64_t time2; + opl3_writebuf *writebuf; + uint32_t writebuf_last; - writebuf_last = chip->wrbuf_last; - writebuf = &chip->wrbuf[writebuf_last]; + writebuf_last = chip->writebuf_last; + writebuf = &chip->writebuf[writebuf_last]; if (writebuf->reg & 0x0200) { nuked_write_reg(chip, writebuf->reg & 0x01ff, writebuf->data); - chip->wrbuf_cur = (writebuf_last + 1) % WRBUF_SIZE; - chip->wrbuf_samplecnt = writebuf->time; + chip->writebuf_cur = (writebuf_last + 1) % OPL_WRITEBUF_SIZE; + chip->writebuf_samplecnt = writebuf->time; } writebuf->reg = reg | 0x0200; writebuf->data = val; - time1 = chip->wrbuf_lasttime + WRBUF_DELAY; - time2 = chip->wrbuf_samplecnt; + time1 = chip->writebuf_lasttime + OPL_WRITEBUF_DELAY; + time2 = chip->writebuf_samplecnt; if (time1 < time2) time1 = time2; - writebuf->time = time1; - chip->wrbuf_lasttime = time1; - chip->wrbuf_last = (writebuf_last + 1) % WRBUF_SIZE; + writebuf->time = time1; + chip->writebuf_lasttime = time1; + chip->writebuf_last = (writebuf_last + 1) % OPL_WRITEBUF_SIZE; } void From 70bc4ef0bee15a0b8f3cf13584fbaa0f4d7780be Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 15 Jul 2024 10:51:36 +0500 Subject: [PATCH 099/624] Remove a leftover copy of libslirp headers --- src/include/slirp/libslirp-version.h | 24 --- src/include/slirp/libslirp.h | 273 --------------------------- 2 files changed, 297 deletions(-) delete mode 100644 src/include/slirp/libslirp-version.h delete mode 100644 src/include/slirp/libslirp.h diff --git a/src/include/slirp/libslirp-version.h b/src/include/slirp/libslirp-version.h deleted file mode 100644 index b68906957..000000000 --- a/src/include/slirp/libslirp-version.h +++ /dev/null @@ -1,24 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -#ifndef LIBSLIRP_VERSION_H_ -#define LIBSLIRP_VERSION_H_ - -#ifdef __cplusplus -extern "C" { -#endif - -#define SLIRP_MAJOR_VERSION 4 -#define SLIRP_MINOR_VERSION 7 -#define SLIRP_MICRO_VERSION 0 -#define SLIRP_VERSION_STRING "4.7.0-86Box" - -#define SLIRP_CHECK_VERSION(major,minor,micro) \ - (SLIRP_MAJOR_VERSION > (major) || \ - (SLIRP_MAJOR_VERSION == (major) && SLIRP_MINOR_VERSION > (minor)) || \ - (SLIRP_MAJOR_VERSION == (major) && SLIRP_MINOR_VERSION == (minor) && \ - SLIRP_MICRO_VERSION >= (micro))) - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LIBSLIRP_VERSION_H_ */ diff --git a/src/include/slirp/libslirp.h b/src/include/slirp/libslirp.h deleted file mode 100644 index 7a6c9a4da..000000000 --- a/src/include/slirp/libslirp.h +++ /dev/null @@ -1,273 +0,0 @@ -/* SPDX-License-Identifier: BSD-3-Clause */ -#ifndef LIBSLIRP_H -#define LIBSLIRP_H - -#include -#include -#include - -#ifdef _WIN32 -#include -#include -#include -#else -#include -#include -#endif - -#include "libslirp-version.h" - -/* Windows does not define ssize_t, so we need to define it here. */ -#ifndef _SSIZE_T_DEFINED -# define _SSIZE_T_DEFINED -# undef ssize_t -# ifdef _WIN64 -# define ssize_t int64_t -# else -# define ssize_t int32_t -# endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* Opaque structure containing the slirp state */ -typedef struct Slirp Slirp; - -/* Flags passed to SlirpAddPollCb and to be returned by SlirpGetREventsCb. */ -enum { - SLIRP_POLL_IN = 1 << 0, - SLIRP_POLL_OUT = 1 << 1, - SLIRP_POLL_PRI = 1 << 2, - SLIRP_POLL_ERR = 1 << 3, - SLIRP_POLL_HUP = 1 << 4, -}; - -typedef ssize_t (*SlirpReadCb)(void *buf, size_t len, void *opaque); -typedef ssize_t (*SlirpWriteCb)(const void *buf, size_t len, void *opaque); -typedef void (*SlirpTimerCb)(void *opaque); -typedef int (*SlirpAddPollCb)(int fd, int events, void *opaque); -typedef int (*SlirpGetREventsCb)(int idx, void *opaque); - -typedef enum SlirpTimerId { - SLIRP_TIMER_RA, - SLIRP_TIMER_NUM, -} SlirpTimerId; - -/* - * Callbacks from slirp, to be set by the application. - * - * The opaque parameter is set to the opaque pointer given in the slirp_new / - * slirp_init call. - */ -typedef struct SlirpCb { - /* - * Send an ethernet frame to the guest network. The opaque parameter is the - * one given to slirp_init(). If the guest is not ready to receive a frame, - * the function can just drop the data. TCP will then handle retransmissions - * at a lower pace. - * <0 reports an IO error. - */ - SlirpWriteCb send_packet; - /* Print a message for an error due to guest misbehavior. */ - void (*guest_error)(const char *msg, void *opaque); - /* Return the virtual clock value in nanoseconds */ - int64_t (*clock_get_ns)(void *opaque); - /* Create a new timer with the given callback and opaque data. Not - * needed if timer_new_opaque is provided. */ - void *(*timer_new)(SlirpTimerCb cb, void *cb_opaque, void *opaque); - /* Remove and free a timer */ - void (*timer_free)(void *timer, void *opaque); - /* Modify a timer to expire at @expire_time (ms) */ - void (*timer_mod)(void *timer, int64_t expire_time, void *opaque); - /* Register a fd for future polling */ - void (*register_poll_fd)(int fd, void *opaque); - /* Unregister a fd */ - void (*unregister_poll_fd)(int fd, void *opaque); - /* Kick the io-thread, to signal that new events may be processed because some TCP buffer - * can now receive more data, i.e. slirp_socket_can_recv will return 1. */ - void (*notify)(void *opaque); - - /* - * Fields introduced in SlirpConfig version 4 begin - */ - - /* Initialization has completed and a Slirp* has been created. */ - void (*init_completed)(Slirp *slirp, void *opaque); - /* Create a new timer. When the timer fires, the application passes - * the SlirpTimerId and cb_opaque to slirp_handle_timer. */ - void *(*timer_new_opaque)(SlirpTimerId id, void *cb_opaque, void *opaque); -} SlirpCb; - -#define SLIRP_CONFIG_VERSION_MIN 1 -#define SLIRP_CONFIG_VERSION_MAX 4 - -typedef struct SlirpConfig { - /* Version must be provided */ - uint32_t version; - /* - * Fields introduced in SlirpConfig version 1 begin - */ - int restricted; - bool in_enabled; - struct in_addr vnetwork; - struct in_addr vnetmask; - struct in_addr vhost; - bool in6_enabled; - struct in6_addr vprefix_addr6; - uint8_t vprefix_len; - struct in6_addr vhost6; - const char *vhostname; - const char *tftp_server_name; - const char *tftp_path; - const char *bootfile; - struct in_addr vdhcp_start; - struct in_addr vnameserver; - struct in6_addr vnameserver6; - const char **vdnssearch; - const char *vdomainname; - /* Default: IF_MTU_DEFAULT */ - size_t if_mtu; - /* Default: IF_MRU_DEFAULT */ - size_t if_mru; - /* Prohibit connecting to 127.0.0.1:* */ - bool disable_host_loopback; - /* - * Enable emulation code (*warning*: this code isn't safe, it is not - * recommended to enable it) - */ - bool enable_emu; - /* - * Fields introduced in SlirpConfig version 2 begin - */ - struct sockaddr_in *outbound_addr; - struct sockaddr_in6 *outbound_addr6; - /* - * Fields introduced in SlirpConfig version 3 begin - */ - bool disable_dns; /* slirp will not redirect/serve any DNS packet */ - /* - * Fields introduced in SlirpConfig version 4 begin - */ - bool disable_dhcp; /* slirp will not reply to any DHCP requests */ -} SlirpConfig; - -/* Create a new instance of a slirp stack */ -Slirp *slirp_new(const SlirpConfig *cfg, const SlirpCb *callbacks, - void *opaque); -/* slirp_init is deprecated in favor of slirp_new */ -Slirp *slirp_init(int restricted, bool in_enabled, struct in_addr vnetwork, - struct in_addr vnetmask, struct in_addr vhost, - bool in6_enabled, struct in6_addr vprefix_addr6, - uint8_t vprefix_len, struct in6_addr vhost6, - const char *vhostname, const char *tftp_server_name, - const char *tftp_path, const char *bootfile, - struct in_addr vdhcp_start, struct in_addr vnameserver, - struct in6_addr vnameserver6, const char **vdnssearch, - const char *vdomainname, const SlirpCb *callbacks, - void *opaque); -/* Shut down an instance of a slirp stack */ -void slirp_cleanup(Slirp *slirp); - -/* This is called by the application when it is about to sleep through poll(). - * *timeout is set to the amount of virtual time (in ms) that the application intends to - * wait (UINT32_MAX if infinite). slirp_pollfds_fill updates it according to - * e.g. TCP timers, so the application knows it should sleep a smaller amount of - * time. slirp_pollfds_fill calls add_poll for each file descriptor - * that should be monitored along the sleep. The opaque pointer is passed as - * such to add_poll, and add_poll returns an index. */ -void slirp_pollfds_fill(Slirp *slirp, uint32_t *timeout, - SlirpAddPollCb add_poll, void *opaque); - -/* This is called by the application after sleeping, to report which file - * descriptors are available. slirp_pollfds_poll calls get_revents on each file - * descriptor, giving it the index that add_poll returned during the - * slirp_pollfds_fill call, to know whether the descriptor is available for - * read/write/etc. (SLIRP_POLL_*) - * select_error should be passed 1 if poll() returned an error. */ -void slirp_pollfds_poll(Slirp *slirp, int select_error, - SlirpGetREventsCb get_revents, void *opaque); - -/* This is called by the application when the guest emits a packet on the - * guest network, to be interpreted by slirp. */ -void slirp_input(Slirp *slirp, const uint8_t *pkt, int pkt_len); - -/* This is called by the application when a timer expires, if it provides - * the timer_new_opaque callback. It is not needed if the application only - * uses timer_new. */ -void slirp_handle_timer(Slirp *slirp, SlirpTimerId id, void *cb_opaque); - -/* These set up / remove port forwarding between a host port in the real world - * and the guest network. */ -int slirp_add_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, - int host_port, struct in_addr guest_addr, int guest_port); -int slirp_remove_hostfwd(Slirp *slirp, int is_udp, struct in_addr host_addr, - int host_port); - -#define SLIRP_HOSTFWD_UDP 1 -#define SLIRP_HOSTFWD_V6ONLY 2 -int slirp_add_hostxfwd(Slirp *slirp, - const struct sockaddr *haddr, socklen_t haddrlen, - const struct sockaddr *gaddr, socklen_t gaddrlen, - int flags); -int slirp_remove_hostxfwd(Slirp *slirp, - const struct sockaddr *haddr, socklen_t haddrlen, - int flags); - -/* Set up port forwarding between a port in the guest network and a - * command running on the host */ -int slirp_add_exec(Slirp *slirp, const char *cmdline, - struct in_addr *guest_addr, int guest_port); -/* Set up port forwarding between a port in the guest network and a - * Unix port on the host */ -int slirp_add_unix(Slirp *slirp, const char *unixsock, - struct in_addr *guest_addr, int guest_port); -/* Set up port forwarding between a port in the guest network and a - * callback that will receive the data coming from the port */ -int slirp_add_guestfwd(Slirp *slirp, SlirpWriteCb write_cb, void *opaque, - struct in_addr *guest_addr, int guest_port); - -/* TODO: rather identify a guestfwd through an opaque pointer instead of through - * the guest_addr */ - -/* This is called by the application for a guestfwd, to determine how much data - * can be received by the forwarded port through a call to slirp_socket_recv. */ -size_t slirp_socket_can_recv(Slirp *slirp, struct in_addr guest_addr, - int guest_port); -/* This is called by the application for a guestfwd, to provide the data to be - * sent on the forwarded port */ -void slirp_socket_recv(Slirp *slirp, struct in_addr guest_addr, int guest_port, - const uint8_t *buf, int size); - -/* Remove entries added by slirp_add_exec, slirp_add_unix or slirp_add_guestfwd */ -int slirp_remove_guestfwd(Slirp *slirp, struct in_addr guest_addr, - int guest_port); - -/* Return a human-readable state of the slirp stack */ -char *slirp_connection_info(Slirp *slirp); - -/* Return a human-readable state of the NDP/ARP tables */ -char *slirp_neighbor_info(Slirp *slirp); - -/* Save the slirp state through the write_cb. The opaque pointer is passed as - * such to the write_cb. */ -void slirp_state_save(Slirp *s, SlirpWriteCb write_cb, void *opaque); - -/* Returns the version of the slirp state, to be saved along the state */ -int slirp_state_version(void); - -/* Load the slirp state through the read_cb. The opaque pointer is passed as - * such to the read_cb. The version should be given as it was obtained from - * slirp_state_version when slirp_state_save was called. */ -int slirp_state_load(Slirp *s, int version_id, SlirpReadCb read_cb, - void *opaque); - -/* Return the version of the slirp implementation */ -const char *slirp_version_string(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif /* LIBSLIRP_H */ From 0177e2881a6e830f412258456b79f9588e8104b8 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 15 Jul 2024 10:53:57 +0500 Subject: [PATCH 100/624] Define LIBSLIRP_STATIC on Windows for proper static linking This requires a not-yet-released version of libslirp, but thankfully MSYS2 has backported the patch --- src/network/CMakeLists.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index e407d4364..0783e4b4c 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -23,6 +23,9 @@ target_link_libraries(86Box PkgConfig::SLIRP) if(WIN32) target_link_libraries(PkgConfig::SLIRP INTERFACE wsock32 ws2_32 iphlpapi iconv) + if(STATIC_BUILD) + add_compile_definitions(LIBSLIRP_STATIC) + endif() endif() if (HAIKU) From 9f4886e031996bb5f1524155f6a0313324907836 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 15 Jul 2024 10:59:35 +0500 Subject: [PATCH 101/624] Only define FLUIDSYNTH_NOT_A_DLL when linking statically --- src/sound/CMakeLists.txt | 8 ++++++-- src/sound/midi_fluidsynth.c | 1 - 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index a05481228..2d57a42e0 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -90,8 +90,12 @@ if(FLUIDSYNTH) target_link_libraries(86Box PkgConfig::FLUIDSYNTH) if(STATIC_BUILD) target_link_libraries(86Box -static ${FLUIDSYNTH_STATIC_LIBRARIES} -fopenmp) - if(WIN32 AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") - target_link_libraries(86Box psapi) + if(WIN32) + add_compile_definitions(FLUIDSYNTH_NOT_A_DLL) + + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64") + target_link_libraries(86Box psapi) + endif() endif() endif() diff --git a/src/sound/midi_fluidsynth.c b/src/sound/midi_fluidsynth.c index c1b9956d0..f8c7964f7 100644 --- a/src/sound/midi_fluidsynth.c +++ b/src/sound/midi_fluidsynth.c @@ -7,7 +7,6 @@ #ifdef __unix__ # include #endif -#define FLUIDSYNTH_NOT_A_DLL #include #include <86box/86box.h> From 1d322fe99d479b01f606e1608d141ea8425ab8f0 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 15 Jul 2024 14:03:23 +0500 Subject: [PATCH 102/624] Fix ssize_t related warnings on 32-bit Windows builds --- src/network/net_slirp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/network/net_slirp.c b/src/network/net_slirp.c index 599ee896d..92434973d 100644 --- a/src/network/net_slirp.c +++ b/src/network/net_slirp.c @@ -171,7 +171,11 @@ net_slirp_notify(void *opaque) (void) opaque; } +#if SLIRP_CHECK_VERSION(4, 8, 0) +slirp_ssize_t +#else ssize_t +#endif net_slirp_send_packet(const void *qp, size_t pkt_len, void *opaque) { net_slirp_t *slirp = (net_slirp_t *) opaque; From fba01a9b3981cfedf39021b92d1145158d544c87 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 15 Jul 2024 15:38:36 +0200 Subject: [PATCH 103/624] CD-ROM IOCTL: Raw sector read fix. --- src/qt/win_cdrom_ioctl.c | 74 ++++++++++++++++++++++++++++++++-------- 1 file changed, 59 insertions(+), 15 deletions(-) diff --git a/src/qt/win_cdrom_ioctl.c b/src/qt/win_cdrom_ioctl.c index ff422bcd2..510a1143f 100644 --- a/src/qt/win_cdrom_ioctl.c +++ b/src/qt/win_cdrom_ioctl.c @@ -30,6 +30,7 @@ #include #include #include +#include #include #define HAVE_STDARG_H #include <86box/86box.h> @@ -326,17 +327,55 @@ plat_cdrom_get_audio_sub(UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, } int -plat_cdrom_get_sector_size(UNUSED(uint32_t sector)) +plat_cdrom_get_sector_size(uint32_t sector) { - long size; - DISK_GEOMETRY dgCDROM; + /* Sector size returned by Windows is always a power of two, which is pointless. */ + return 2352; +} - plat_cdrom_open(); - DeviceIoControl(handle, IOCTL_CDROM_GET_DRIVE_GEOMETRY, NULL, 0, &dgCDROM, sizeof(dgCDROM), (LPDWORD)&size, NULL); - plat_cdrom_close(); +/* Used EXCLUSIVELY to read raw sectors, not to detect tracks. */ +static int +plat_cdrom_read_scsi_direct(uint32_t sector, uint8_t *buffer) +{ + DWORD unused; + int ret; + typedef struct SCSI_PASS_THROUGH_DIRECT_BUF { + SCSI_PASS_THROUGH_DIRECT spt; + ULONG Filler; + UCHAR SenseBuf[32]; + } SCSI_PASS_THROUGH_DIRECT_BUF; - win_cdrom_ioctl_log("BytesPerSector=%d\n", dgCDROM.BytesPerSector); - return dgCDROM.BytesPerSector; + SCSI_PASS_THROUGH_DIRECT_BUF req; + + memset(&req, 0, sizeof(req)); + req.Filler = 0; + req.spt.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); + req.spt.CdbLength = 12; + req.spt.DataIn = SCSI_IOCTL_DATA_IN; + req.spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_DIRECT_BUF, SenseBuf); + req.spt.SenseInfoLength = sizeof(req.SenseBuf); + req.spt.TimeOutValue = 6; + req.spt.DataTransferLength = 2352; + req.spt.DataBuffer = buffer; + + /* Fill in the CDB. */ + req.spt.Cdb[0] = 0xBE; /* READ CD */ + req.spt.Cdb[1] = 0x00; /* DAP = 0, Any Sector Type. */ + req.spt.Cdb[2] = (sector & 0xFF000000) >> 24; + req.spt.Cdb[3] = (sector & 0xFF0000) >> 16; + req.spt.Cdb[4] = (sector & 0xFF00) >> 8; + req.spt.Cdb[5] = (sector & 0xFF); /* Starting Logical Block Address. */ + req.spt.Cdb[6] = 0; + req.spt.Cdb[7] = 0; + req.spt.Cdb[8] = 1; /* Transfer Length. */ + req.spt.Cdb[9] = 0xF8; /* 2352 bytes of data (non-subchannel). */ + req.spt.Cdb[10] = 0; /* No subchannel data. */ + req.spt.Cdb[11] = 0; + + ret = DeviceIoControl(handle, IOCTL_SCSI_PASS_THROUGH_DIRECT, &req, sizeof(req), &req, sizeof(req), &unused, NULL) && req.spt.DataTransferLength == 2352; + + win_cdrom_ioctl_log("plat_cdrom_read_scsi_direct: ret = %d, req.spt.DataTransferLength = %lu\n", ret, req.spt.DataTransferLength); + return ret; } int @@ -351,13 +390,18 @@ plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) if (raw) { win_cdrom_ioctl_log("Raw\n"); /* Raw */ - RAW_READ_INFO in; - in.DiskOffset.LowPart = sector * COOKED_SECTOR_SIZE; - in.DiskOffset.HighPart = 0; - in.SectorCount = 1; - in.TrackMode = CDDA; - status = DeviceIoControl(handle, IOCTL_CDROM_RAW_READ, &in, sizeof(in), - buffer, buflen, (LPDWORD)&size, NULL); + status = plat_cdrom_read_scsi_direct(sector, buffer); + if (status) { + return 1; + } else { + RAW_READ_INFO in; + in.DiskOffset.LowPart = sector * COOKED_SECTOR_SIZE; + in.DiskOffset.HighPart = 0; + in.SectorCount = 1; + in.TrackMode = CDDA; + status = DeviceIoControl(handle, IOCTL_CDROM_RAW_READ, &in, sizeof(in), + buffer, buflen, (LPDWORD)&size, NULL); + } } else { win_cdrom_ioctl_log("Cooked\n"); /* Cooked */ From 595db237f7e08ae6be118520eba451c6e2ea209f Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 15 Jul 2024 19:39:36 +0500 Subject: [PATCH 104/624] Sort the ESS sound cards in the card list --- src/sound/sound.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/sound/sound.c b/src/sound/sound.c index f941c8817..794e21359 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -137,6 +137,11 @@ static const SOUND_CARD sound_cards[] = { { &cms_device }, { &cs4235_device }, { &cs4236b_device }, + { &ess_688_device }, + { &ess_ess0100_pnp_device }, + { &ess_1688_device }, + { &ess_ess0102_pnp_device }, + { &ess_ess0968_pnp_device }, { &gus_device }, { &sb_1_device }, { &sb_15_device }, @@ -176,11 +181,6 @@ static const SOUND_CARD sound_cards[] = { { &ct5880_device }, { &ad1881_device }, { &cs4297a_device }, - { &ess_688_device }, - { &ess_ess0100_pnp_device }, - { &ess_1688_device }, - { &ess_ess0102_pnp_device }, - { &ess_ess0968_pnp_device }, { NULL } // clang-format on }; From 2fceeb4e4bbcf445c151c85f96470b0bae797f49 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 15 Jul 2024 19:48:33 +0500 Subject: [PATCH 105/624] Fix unused variable warnings with Clang --- src/sound/resid-fp/WaveformGenerator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sound/resid-fp/WaveformGenerator.cpp b/src/sound/resid-fp/WaveformGenerator.cpp index 207431c94..4c7a55b3d 100644 --- a/src/sound/resid-fp/WaveformGenerator.cpp +++ b/src/sound/resid-fp/WaveformGenerator.cpp @@ -43,7 +43,7 @@ namespace reSIDfp const unsigned int FLOATING_OUTPUT_TTL_6581R3 = 54000; const unsigned int FLOATING_OUTPUT_FADE_6581R3 = 1400; // ~1s -const unsigned int FLOATING_OUTPUT_TTL_6581R4 = 1000000; +//const unsigned int FLOATING_OUTPUT_TTL_6581R4 = 1000000; // ~1s const unsigned int FLOATING_OUTPUT_TTL_8580R5 = 800000; const unsigned int FLOATING_OUTPUT_FADE_8580R5 = 50000; @@ -61,7 +61,7 @@ const unsigned int FLOATING_OUTPUT_FADE_8580R5 = 50000; const unsigned int SHIFT_REGISTER_RESET_6581R3 = 50000; const unsigned int SHIFT_REGISTER_FADE_6581R3 = 15000; // ~2.15s -const unsigned int SHIFT_REGISTER_RESET_6581R4 = 2150000; +//const unsigned int SHIFT_REGISTER_RESET_6581R4 = 2150000; // ~2.8s const unsigned int SHIFT_REGISTER_RESET_8580R5 = 986000; const unsigned int SHIFT_REGISTER_FADE_8580R5 = 314300; From b5c7e59ab7e0b90c65c5405704be6f7d6a4e0448 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 14 Jul 2024 15:16:17 -0400 Subject: [PATCH 106/624] Nuked: Last of the update --- src/include/86box/snd_opl_nuked.h | 150 ++++++----- src/sound/snd_opl_nuked.c | 413 +++++++++++++++--------------- 2 files changed, 287 insertions(+), 276 deletions(-) diff --git a/src/include/86box/snd_opl_nuked.h b/src/include/86box/snd_opl_nuked.h index 508affde2..0b203fe31 100644 --- a/src/include/86box/snd_opl_nuked.h +++ b/src/include/86box/snd_opl_nuked.h @@ -20,6 +20,12 @@ #ifndef SOUND_OPL_NUKED_H #define SOUND_OPL_NUKED_H +#ifdef __cplusplus +extern "C" { +#endif + +#include + #ifndef OPL_ENABLE_STEREOEXT #define OPL_ENABLE_STEREOEXT 0 #endif @@ -27,63 +33,66 @@ #define OPL_WRITEBUF_SIZE 1024 #define OPL_WRITEBUF_DELAY 2 -struct chan; -struct chip; +typedef struct _opl3_slot opl3_slot; +typedef struct _opl3_channel opl3_channel; +typedef struct _opl3_chip opl3_chip; -typedef struct slot { - struct chan *channel; - struct chip *chip; - int16_t out; - int16_t fbmod; - int16_t *mod; - int16_t prout; - int16_t eg_rout; - int16_t eg_out; - uint8_t eg_inc; - uint8_t eg_gen; - uint8_t eg_rate; - uint8_t eg_ksl; - uint8_t *trem; - uint8_t reg_vib; - uint8_t reg_type; - uint8_t reg_ksr; - uint8_t reg_mult; - uint8_t reg_ksl; - uint8_t reg_tl; - uint8_t reg_ar; - uint8_t reg_dr; - uint8_t reg_sl; - uint8_t reg_rr; - uint8_t reg_wf; - uint8_t key; - uint32_t pg_reset; - uint32_t pg_phase; - uint16_t pg_phase_out; - uint8_t slot_num; -} opl3_slot; +struct _opl3_slot { + opl3_channel *channel; + opl3_chip *chip; + int16_t out; + int16_t fbmod; + int16_t *mod; + int16_t prout; + uint16_t eg_rout; + uint16_t eg_out; + uint8_t eg_inc; + uint8_t eg_gen; + uint8_t eg_rate; + uint8_t eg_ksl; + uint8_t *trem; + uint8_t reg_vib; + uint8_t reg_type; + uint8_t reg_ksr; + uint8_t reg_mult; + uint8_t reg_ksl; + uint8_t reg_tl; + uint8_t reg_ar; + uint8_t reg_dr; + uint8_t reg_sl; + uint8_t reg_rr; + uint8_t reg_wf; + uint8_t key; + uint32_t pg_reset; + uint32_t pg_phase; + uint16_t pg_phase_out; + uint8_t slot_num; +}; + +struct _opl3_channel { + opl3_slot *slotz[2]; // Don't use "slots" keyword to avoid conflict with Qt applications + opl3_channel *pair; + opl3_chip *chip; + int16_t *out[4]; -typedef struct chan { - opl3_slot *slotz[2]; // Don't use "slots" keyword to avoid conflict with Qt applications - struct chan *pair; - struct chip *chip; - int16_t *out[4]; #if OPL_ENABLE_STEREOEXT - int32_t leftpan; - int32_t rightpan; + int32_t leftpan; + int32_t rightpan; #endif - uint8_t chtype; - uint16_t f_num; - uint8_t block; - uint8_t fb; - uint8_t con; - uint8_t alg; - uint8_t ksv; - uint16_t cha; - uint16_t chb; - uint16_t chc; - uint16_t chd; - uint8_t ch_num; -} opl3_channel; + + uint8_t chtype; + uint16_t f_num; + uint8_t block; + uint8_t fb; + uint8_t con; + uint8_t alg; + uint8_t ksv; + uint16_t cha; + uint16_t chb; + uint16_t chc; + uint16_t chd; + uint8_t ch_num; +}; typedef struct _opl3_writebuf { uint64_t time; @@ -91,7 +100,7 @@ typedef struct _opl3_writebuf { uint8_t data; } opl3_writebuf; -typedef struct chip { +struct _opl3_chip { opl3_channel channel[18]; opl3_slot slot[36]; uint16_t timer; @@ -99,7 +108,7 @@ typedef struct chip { uint8_t eg_timerrem; uint8_t eg_state; uint8_t eg_add; - uint64_t eg_timer_lo; + uint8_t eg_timer_lo; uint8_t newm; uint8_t nts; uint8_t rhy; @@ -119,26 +128,26 @@ typedef struct chip { uint8_t rm_tc_bit5; #if OPL_ENABLE_STEREOEXT - uint8_t stereoext; + uint8_t stereoext; #endif // OPL3L - int32_t rateratio; - int32_t samplecnt; - int32_t oldsamples[4]; - int32_t samples[4]; + int32_t rateratio; + int32_t samplecnt; + int32_t oldsamples[4]; + int32_t samples[4]; uint64_t writebuf_samplecnt; uint32_t writebuf_cur; uint32_t writebuf_last; uint64_t writebuf_lasttime; opl3_writebuf writebuf[OPL_WRITEBUF_SIZE]; -} opl3_chip; +}; typedef struct { opl3_chip opl; - int8_t flags; - int8_t pad; + int8_t flags; + int8_t pad; uint16_t port; uint8_t status; @@ -173,6 +182,19 @@ enum { CTRL_TMR1_START = 0x01 }; -void nuked_write_reg(void *priv, uint16_t reg, uint8_t val); +void OPL3_Generate(opl3_chip *chip, int32_t *buf); +void OPL3_GenerateResampled(opl3_chip *chip, int32_t *buf); +void OPL3_Reset(opl3_chip *chip, uint32_t samplerate); +void OPL3_WriteReg(void *priv, uint16_t reg, uint8_t val); +void OPL3_WriteRegBuffered(void *priv, uint16_t reg, uint8_t val); +void OPL3_GenerateStream(opl3_chip *chip, int32_t *sndptr, uint32_t numsamples); + +static void OPL3_Generate4Ch(void *priv, int32_t *buf4); +void OPL3_Generate4Ch_Resampled(opl3_chip *chip, int32_t *buf4); +void OPL3_Generate4Ch_Stream(opl3_chip *chip, int32_t *sndptr1, int32_t *sndptr2, uint32_t numsamples); + +#ifdef __cplusplus +} +#endif #endif /*SOUND_OPL_NUKED_H*/ diff --git a/src/sound/snd_opl_nuked.c b/src/sound/snd_opl_nuked.c index 958dc87d5..f1132867b 100644 --- a/src/sound/snd_opl_nuked.c +++ b/src/sound/snd_opl_nuked.c @@ -85,13 +85,6 @@ enum { egk_drum = 0x02 }; -enum envelope_gen_num { - envelope_gen_num_attack = 0, - envelope_gen_num_decay = 1, - envelope_gen_num_sustain = 2, - envelope_gen_num_release = 3 -}; - #ifdef ENABLE_OPL_LOG int nuked_do_log = ENABLE_OPL_LOG; @@ -230,7 +223,7 @@ typedef int16_t (*envelope_sinfunc)(uint16_t phase, uint16_t envelope); typedef void (*envelope_genfunc)(opl3_slot *slot); static int16_t -envelope_calc_exp(uint32_t level) +OPL3_EnvelopeCalcExp(uint32_t level) { if (level > 0x1fff) level = 0x1fff; @@ -239,7 +232,7 @@ envelope_calc_exp(uint32_t level) } static int16_t -envelope_calc_sin0(uint16_t phase, uint16_t envelope) +OPL3_EnvelopeCalcSin0(uint16_t phase, uint16_t envelope) { uint16_t out = 0; uint16_t neg = 0; @@ -254,11 +247,11 @@ envelope_calc_sin0(uint16_t phase, uint16_t envelope) else out = logsinrom[phase & 0xffu]; - return (envelope_calc_exp(out + (envelope << 3)) ^ neg); + return (OPL3_EnvelopeCalcExp(out + (envelope << 3)) ^ neg); } static int16_t -envelope_calc_sin1(uint16_t phase, uint16_t envelope) +OPL3_EnvelopeCalcSin1(uint16_t phase, uint16_t envelope) { uint16_t out = 0; @@ -271,11 +264,11 @@ envelope_calc_sin1(uint16_t phase, uint16_t envelope) else out = logsinrom[phase & 0xffu]; - return (envelope_calc_exp(out + (envelope << 3))); + return (OPL3_EnvelopeCalcExp(out + (envelope << 3))); } static int16_t -envelope_calc_sin2(uint16_t phase, uint16_t envelope) +OPL3_EnvelopeCalcSin2(uint16_t phase, uint16_t envelope) { uint16_t out = 0; @@ -286,11 +279,11 @@ envelope_calc_sin2(uint16_t phase, uint16_t envelope) else out = logsinrom[phase & 0xffu]; - return (envelope_calc_exp(out + (envelope << 3))); + return (OPL3_EnvelopeCalcExp(out + (envelope << 3))); } static int16_t -envelope_calc_sin3(uint16_t phase, uint16_t envelope) +OPL3_EnvelopeCalcSin3(uint16_t phase, uint16_t envelope) { uint16_t out = 0; @@ -301,11 +294,11 @@ envelope_calc_sin3(uint16_t phase, uint16_t envelope) else out = logsinrom[phase & 0xffu]; - return (envelope_calc_exp(out + (envelope << 3))); + return (OPL3_EnvelopeCalcExp(out + (envelope << 3))); } static int16_t -envelope_calc_sin4(uint16_t phase, uint16_t envelope) +OPL3_EnvelopeCalcSin4(uint16_t phase, uint16_t envelope) { uint16_t out = 0; uint16_t neg = 0; @@ -322,11 +315,11 @@ envelope_calc_sin4(uint16_t phase, uint16_t envelope) else out = logsinrom[(phase << 1u) & 0xffu]; - return (envelope_calc_exp(out + (envelope << 3)) ^ neg); + return (OPL3_EnvelopeCalcExp(out + (envelope << 3)) ^ neg); } static int16_t -envelope_calc_sin5(uint16_t phase, uint16_t envelope) +OPL3_EnvelopeCalcSin5(uint16_t phase, uint16_t envelope) { uint16_t out = 0; @@ -339,11 +332,11 @@ envelope_calc_sin5(uint16_t phase, uint16_t envelope) else out = logsinrom[(phase << 1u) & 0xffu]; - return (envelope_calc_exp(out + (envelope << 3))); + return (OPL3_EnvelopeCalcExp(out + (envelope << 3))); } static int16_t -envelope_calc_sin6(uint16_t phase, uint16_t envelope) +OPL3_EnvelopeCalcSin6(uint16_t phase, uint16_t envelope) { uint16_t neg = 0; @@ -352,11 +345,11 @@ envelope_calc_sin6(uint16_t phase, uint16_t envelope) if (phase & 0x0200) neg = 0xffff; - return (envelope_calc_exp(envelope << 3) ^ neg); + return (OPL3_EnvelopeCalcExp(envelope << 3) ^ neg); } static int16_t -envelope_calc_sin7(uint16_t phase, uint16_t envelope) +OPL3_EnvelopeCalcSin7(uint16_t phase, uint16_t envelope) { uint16_t out = 0; uint16_t neg = 0; @@ -370,22 +363,29 @@ envelope_calc_sin7(uint16_t phase, uint16_t envelope) out = phase << 3; - return (envelope_calc_exp(out + (envelope << 3)) ^ neg); + return (OPL3_EnvelopeCalcExp(out + (envelope << 3)) ^ neg); } static const envelope_sinfunc envelope_sin[8] = { - envelope_calc_sin0, - envelope_calc_sin1, - envelope_calc_sin2, - envelope_calc_sin3, - envelope_calc_sin4, - envelope_calc_sin5, - envelope_calc_sin6, - envelope_calc_sin7 + OPL3_EnvelopeCalcSin0, + OPL3_EnvelopeCalcSin1, + OPL3_EnvelopeCalcSin2, + OPL3_EnvelopeCalcSin3, + OPL3_EnvelopeCalcSin4, + OPL3_EnvelopeCalcSin5, + OPL3_EnvelopeCalcSin6, + OPL3_EnvelopeCalcSin7 +}; + +enum envelope_gen_num { + envelope_gen_num_attack = 0, + envelope_gen_num_decay = 1, + envelope_gen_num_sustain = 2, + envelope_gen_num_release = 3 }; static void -envelope_update_ksl(opl3_slot *slot) +OPL3_EnvelopeUpdateKSL(opl3_slot *slot) { int16_t ksl = (kslrom[slot->channel->f_num >> 6u] << 2) - ((0x08 - slot->channel->block) << 5); @@ -397,7 +397,7 @@ envelope_update_ksl(opl3_slot *slot) } static void -envelope_calc(opl3_slot *slot) +OPL3_EnvelopeCalc(opl3_slot *slot) { uint8_t nonzero; uint8_t rate; @@ -531,33 +531,35 @@ envelope_calc(opl3_slot *slot) } static void -envelope_key_on(opl3_slot *slot, uint8_t type) +OPL3_EnvelopeKeyOn(opl3_slot *slot, uint8_t type) { slot->key |= type; } static void -envelope_key_off(opl3_slot *slot, uint8_t type) +OPL3_EnvelopeKeyOff(opl3_slot *slot, uint8_t type) { slot->key &= ~type; } +// Phase Generator static void -phase_generate(opl3_slot *slot) +OPL3_PhaseGenerate(opl3_slot *slot) { - uint16_t f_num; - uint32_t basefreq; - uint8_t rm_xor; - uint8_t n_bit; - uint32_t noise; - uint16_t phase; - int8_t range; - uint8_t vibpos; opl3_chip *chip; + uint16_t f_num; + uint32_t basefreq; + uint8_t rm_xor; + uint8_t n_bit; + uint32_t noise; + uint16_t phase; chip = slot->chip; f_num = slot->channel->f_num; if (slot->reg_vib) { + int8_t range; + uint8_t vibpos; + range = (f_num >> 7) & 7; vibpos = chip->vibpos; @@ -625,8 +627,9 @@ phase_generate(opl3_slot *slot) chip->noise = (noise >> 1) | (n_bit << 22); } +// Slot static void -slot_write_20(opl3_slot *slot, uint8_t data) +OPL3_SlotWrite20(opl3_slot *slot, uint8_t data) { if ((data >> 7) & 0x01) slot->trem = &slot->chip->tremolo; @@ -640,23 +643,23 @@ slot_write_20(opl3_slot *slot, uint8_t data) } static void -slot_write_40(opl3_slot *slot, uint8_t data) +OPL3_SlotWrite40(opl3_slot *slot, uint8_t data) { slot->reg_ksl = (data >> 6) & 0x03; slot->reg_tl = data & 0x3f; - envelope_update_ksl(slot); + OPL3_EnvelopeUpdateKSL(slot); } static void -slot_write_60(opl3_slot *slot, uint8_t data) +OPL3_SlotWrite60(opl3_slot *slot, uint8_t data) { slot->reg_ar = (data >> 4) & 0x0f; slot->reg_dr = data & 0x0f; } static void -slot_write_80(opl3_slot *slot, uint8_t data) +OPL3_SlotWrite80(opl3_slot *slot, uint8_t data) { slot->reg_sl = (data >> 4) & 0x0f; @@ -667,7 +670,7 @@ slot_write_80(opl3_slot *slot, uint8_t data) } static void -slot_write_e0(opl3_slot *slot, uint8_t data) +OPL3_SlotWriteE0(opl3_slot *slot, uint8_t data) { slot->reg_wf = data & 0x07; @@ -676,14 +679,13 @@ slot_write_e0(opl3_slot *slot, uint8_t data) } static void -slot_generate(opl3_slot *slot) +OPL3_SlotGenerate(opl3_slot *slot) { - slot->out = envelope_sin[slot->reg_wf](slot->pg_phase_out + *slot->mod, - slot->eg_out); + slot->out = envelope_sin[slot->reg_wf](slot->pg_phase_out + *slot->mod, slot->eg_out); } static void -slot_calc_fb(opl3_slot *slot) +OPL3_SlotCalcFB(opl3_slot *slot) { if (slot->channel->fb != 0x00) slot->fbmod = (slot->prout + slot->out) >> (0x09 - slot->channel->fb); @@ -695,10 +697,10 @@ slot_calc_fb(opl3_slot *slot) // Channel static void -channel_setup_alg(opl3_channel *channel); +OPL3_ChannelSetupAlg(opl3_channel *channel); static void -channel_update_rhythm(opl3_chip *chip, uint8_t data) +OPL3_ChannelUpdateRhythm(opl3_chip *chip, uint8_t data) { opl3_channel *channel6; opl3_channel *channel7; @@ -726,55 +728,55 @@ channel_update_rhythm(opl3_chip *chip, uint8_t data) for (chnum = 6; chnum < 9; chnum++) chip->channel[chnum].chtype = ch_drum; - channel_setup_alg(channel6); - channel_setup_alg(channel7); - channel_setup_alg(channel8); + OPL3_ChannelSetupAlg(channel6); + OPL3_ChannelSetupAlg(channel7); + OPL3_ChannelSetupAlg(channel8); // hh if (chip->rhy & 0x01) - envelope_key_on(channel7->slotz[0], egk_drum); + OPL3_EnvelopeKeyOn(channel7->slotz[0], egk_drum); else - envelope_key_off(channel7->slotz[0], egk_drum); + OPL3_EnvelopeKeyOff(channel7->slotz[0], egk_drum); // tc if (chip->rhy & 0x02) - envelope_key_on(channel8->slotz[1], egk_drum); + OPL3_EnvelopeKeyOn(channel8->slotz[1], egk_drum); else - envelope_key_off(channel8->slotz[1], egk_drum); + OPL3_EnvelopeKeyOff(channel8->slotz[1], egk_drum); // tom if (chip->rhy & 0x04) - envelope_key_on(channel8->slotz[0], egk_drum); + OPL3_EnvelopeKeyOn(channel8->slotz[0], egk_drum); else - envelope_key_off(channel8->slotz[0], egk_drum); + OPL3_EnvelopeKeyOff(channel8->slotz[0], egk_drum); // sd if (chip->rhy & 0x08) - envelope_key_on(channel7->slotz[1], egk_drum); + OPL3_EnvelopeKeyOn(channel7->slotz[1], egk_drum); else - envelope_key_off(channel7->slotz[1], egk_drum); + OPL3_EnvelopeKeyOff(channel7->slotz[1], egk_drum); // bd if (chip->rhy & 0x10) { - envelope_key_on(channel6->slotz[0], egk_drum); - envelope_key_on(channel6->slotz[1], egk_drum); + OPL3_EnvelopeKeyOn(channel6->slotz[0], egk_drum); + OPL3_EnvelopeKeyOn(channel6->slotz[1], egk_drum); } else { - envelope_key_off(channel6->slotz[0], egk_drum); - envelope_key_off(channel6->slotz[1], egk_drum); + OPL3_EnvelopeKeyOff(channel6->slotz[0], egk_drum); + OPL3_EnvelopeKeyOff(channel6->slotz[1], egk_drum); } } else { for (chnum = 6; chnum < 9; chnum++) { chip->channel[chnum].chtype = ch_2op; - channel_setup_alg(&chip->channel[chnum]); - envelope_key_off(chip->channel[chnum].slotz[0], egk_drum); - envelope_key_off(chip->channel[chnum].slotz[1], egk_drum); + OPL3_ChannelSetupAlg(&chip->channel[chnum]); + OPL3_EnvelopeKeyOff(chip->channel[chnum].slotz[0], egk_drum); + OPL3_EnvelopeKeyOff(chip->channel[chnum].slotz[1], egk_drum); } } } static void -channel_write_a0(opl3_channel *channel, uint8_t data) +OPL3_ChannelWriteA0(opl3_channel *channel, uint8_t data) { if (channel->chip->newm && channel->chtype == ch_4op2) return; @@ -783,20 +785,20 @@ channel_write_a0(opl3_channel *channel, uint8_t data) channel->ksv = (channel->block << 1) | ((channel->f_num >> (0x09 - channel->chip->nts)) & 0x01); - envelope_update_ksl(channel->slotz[0]); - envelope_update_ksl(channel->slotz[1]); + OPL3_EnvelopeUpdateKSL(channel->slotz[0]); + OPL3_EnvelopeUpdateKSL(channel->slotz[1]); if (channel->chip->newm && channel->chtype == ch_4op) { channel->pair->f_num = channel->f_num; channel->pair->ksv = channel->ksv; - envelope_update_ksl(channel->pair->slotz[0]); - envelope_update_ksl(channel->pair->slotz[1]); + OPL3_EnvelopeUpdateKSL(channel->pair->slotz[0]); + OPL3_EnvelopeUpdateKSL(channel->pair->slotz[1]); } } static void -channel_write_b0(opl3_channel *channel, uint8_t data) +OPL3_ChannelWriteB0(opl3_channel *channel, uint8_t data) { if (channel->chip->newm && channel->chtype == ch_4op2) return; @@ -806,21 +808,21 @@ channel_write_b0(opl3_channel *channel, uint8_t data) channel->ksv = (channel->block << 1) | ((channel->f_num >> (0x09 - channel->chip->nts)) & 0x01); - envelope_update_ksl(channel->slotz[0]); - envelope_update_ksl(channel->slotz[1]); + OPL3_EnvelopeUpdateKSL(channel->slotz[0]); + OPL3_EnvelopeUpdateKSL(channel->slotz[1]); if (channel->chip->newm && channel->chtype == ch_4op) { channel->pair->f_num = channel->f_num; channel->pair->block = channel->block; channel->pair->ksv = channel->ksv; - envelope_update_ksl(channel->pair->slotz[0]); - envelope_update_ksl(channel->pair->slotz[1]); + OPL3_EnvelopeUpdateKSL(channel->pair->slotz[0]); + OPL3_EnvelopeUpdateKSL(channel->pair->slotz[1]); } } static void -channel_setup_alg(opl3_channel *channel) +OPL3_ChannelSetupAlg(opl3_channel *channel) { if (channel->chtype == ch_drum) { if (channel->ch_num == 7 || channel->ch_num == 8) { @@ -929,30 +931,31 @@ channel_setup_alg(opl3_channel *channel) } static void -channel_update_alg(opl3_channel *channel) +OPL3_ChannelUpdateAlg(opl3_channel *channel) { channel->alg = channel->con; if (channel->chip->newm) { if (channel->chtype == ch_4op) { - channel->pair->alg = 0x04 | (channel->con << 1) | channel->pair->con; + channel->pair->alg = 0x04 | (channel->con << 1) | (channel->pair->con); channel->alg = 0x08; - channel_setup_alg(channel->pair); + OPL3_ChannelSetupAlg(channel->pair); } else if (channel->chtype == ch_4op2) { - channel->alg = 0x04 | (channel->pair->con << 1) | channel->con; + channel->alg = 0x04 | (channel->pair->con << 1) | (channel->con); channel->pair->alg = 0x08; - channel_setup_alg(channel); + OPL3_ChannelSetupAlg(channel); } else - channel_setup_alg(channel); + OPL3_ChannelSetupAlg(channel); } else - channel_setup_alg(channel); + OPL3_ChannelSetupAlg(channel); } static void -channel_write_c0(opl3_channel *channel, uint8_t data) +OPL3_ChannelWriteC0(opl3_channel *channel, uint8_t data) { channel->fb = (data & 0x0e) >> 1; channel->con = data & 0x01; + OPL3_ChannelUpdateAlg(channel); if (channel->chip->newm) { channel->cha = ((data >> 4) & 0x01) ? ~0 : 0; @@ -975,7 +978,7 @@ channel_write_c0(opl3_channel *channel, uint8_t data) #if OPL_ENABLE_STEREOEXT static void -channel_write_d0(opl3_channel *channel, uint8_t data) +OPL3_ChannelWriteD0(opl3_channel *channel, uint8_t data) { if (channel->chip->stereoext) { channel->leftpan = panpot_lut[data ^ 0xffu]; @@ -985,45 +988,45 @@ channel_write_d0(opl3_channel *channel, uint8_t data) #endif static void -channel_key_on(opl3_channel *channel) +OPL3_ChannelKeyOn(opl3_channel *channel) { if (channel->chip->newm) { if (channel->chtype == ch_4op) { - envelope_key_on(channel->slotz[0], egk_norm); - envelope_key_on(channel->slotz[1], egk_norm); - envelope_key_on(channel->pair->slotz[0], egk_norm); - envelope_key_on(channel->pair->slotz[1], egk_norm); + OPL3_EnvelopeKeyOn(channel->slotz[0], egk_norm); + OPL3_EnvelopeKeyOn(channel->slotz[1], egk_norm); + OPL3_EnvelopeKeyOn(channel->pair->slotz[0], egk_norm); + OPL3_EnvelopeKeyOn(channel->pair->slotz[1], egk_norm); } else if (channel->chtype == ch_2op || channel->chtype == ch_drum) { - envelope_key_on(channel->slotz[0], egk_norm); - envelope_key_on(channel->slotz[1], egk_norm); + OPL3_EnvelopeKeyOn(channel->slotz[0], egk_norm); + OPL3_EnvelopeKeyOn(channel->slotz[1], egk_norm); } } else { - envelope_key_on(channel->slotz[0], egk_norm); - envelope_key_on(channel->slotz[1], egk_norm); + OPL3_EnvelopeKeyOn(channel->slotz[0], egk_norm); + OPL3_EnvelopeKeyOn(channel->slotz[1], egk_norm); } } static void -channel_key_off(opl3_channel *channel) +OPL3_ChannelKeyOff(opl3_channel *channel) { if (channel->chip->newm) { if (channel->chtype == ch_4op) { - envelope_key_off(channel->slotz[0], egk_norm); - envelope_key_off(channel->slotz[1], egk_norm); - envelope_key_off(channel->pair->slotz[0], egk_norm); - envelope_key_off(channel->pair->slotz[1], egk_norm); + OPL3_EnvelopeKeyOff(channel->slotz[0], egk_norm); + OPL3_EnvelopeKeyOff(channel->slotz[1], egk_norm); + OPL3_EnvelopeKeyOff(channel->pair->slotz[0], egk_norm); + OPL3_EnvelopeKeyOff(channel->pair->slotz[1], egk_norm); } else if (channel->chtype == ch_2op || channel->chtype == ch_drum) { - envelope_key_off(channel->slotz[0], egk_norm); - envelope_key_off(channel->slotz[1], egk_norm); + OPL3_EnvelopeKeyOff(channel->slotz[0], egk_norm); + OPL3_EnvelopeKeyOff(channel->slotz[1], egk_norm); } } else { - envelope_key_off(channel->slotz[0], egk_norm); - envelope_key_off(channel->slotz[1], egk_norm); + OPL3_EnvelopeKeyOff(channel->slotz[0], egk_norm); + OPL3_EnvelopeKeyOff(channel->slotz[1], egk_norm); } } static void -channel_set_4op(opl3_chip *chip, uint8_t data) +OPL3_ChannelSet4Op(opl3_chip *chip, uint8_t data) { uint8_t chnum; @@ -1036,36 +1039,36 @@ channel_set_4op(opl3_chip *chip, uint8_t data) if ((data >> bit) & 0x01) { chip->channel[chnum].chtype = ch_4op; chip->channel[chnum + 3u].chtype = ch_4op2; - channel_update_alg(&chip->channel[chnum]); + OPL3_ChannelUpdateAlg(&chip->channel[chnum]); } else { chip->channel[chnum].chtype = ch_2op; chip->channel[chnum + 3u].chtype = ch_2op; - channel_update_alg(&chip->channel[chnum]); - channel_update_alg(&chip->channel[chnum + 3u]); + OPL3_ChannelUpdateAlg(&chip->channel[chnum]); + OPL3_ChannelUpdateAlg(&chip->channel[chnum + 3u]); } } } static void -process_slot(opl3_slot *slot) +OPL3_ProcessSlot(opl3_slot *slot) { - slot_calc_fb(slot); - envelope_calc(slot); - phase_generate(slot); - slot_generate(slot); + OPL3_SlotCalcFB(slot); + OPL3_EnvelopeCalc(slot); + OPL3_PhaseGenerate(slot); + OPL3_SlotGenerate(slot); } static inline void -nuked_generate_4ch(void *priv, int32_t *buf4) +OPL3_Generate4Ch(void *priv, int32_t *buf4) { opl3_chip *chip = (opl3_chip *) priv; opl3_channel *channel; opl3_writebuf *writebuf; int16_t **out; int32_t mix[2]; - int16_t accm; - int16_t shift = 0; uint8_t i; + int16_t accm; + uint8_t shift = 0; buf4[1] = chip->mixbuff[1]; buf4[3] = chip->mixbuff[3]; @@ -1075,7 +1078,7 @@ nuked_generate_4ch(void *priv, int32_t *buf4) #else for (i = 0; i < 36; i++) #endif - process_slot(&chip->slot[i]); + OPL3_ProcessSlot(&chip->slot[i]); mix[0] = mix[1] = 0; @@ -1084,11 +1087,11 @@ nuked_generate_4ch(void *priv, int32_t *buf4) out = channel->out; accm = *out[0] + *out[1] + *out[2] + *out[3]; #if OPL_ENABLE_STEREOEXT - mix[0] += (int32_t) ((accm * channel->leftpan) >> 16); + mix[0] += (int16_t) ((accm * channel->leftpan) >> 16); #else - mix[0] += (int32_t) (accm & channel->cha); + mix[0] += (int16_t) (accm & channel->cha); #endif - mix[1] += (int32_t) (accm & channel->chc); + mix[1] += (int16_t) (accm & channel->chc); } chip->mixbuff[0] = mix[0]; @@ -1096,7 +1099,7 @@ nuked_generate_4ch(void *priv, int32_t *buf4) #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 15; i < 18; i++) - process_slot(&chip->slot[i]); + OPL3_ProcessSlot(&chip->slot[i]); #endif buf4[0] = chip->mixbuff[0]; @@ -1104,7 +1107,7 @@ nuked_generate_4ch(void *priv, int32_t *buf4) #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 18; i < 33; i++) - process_slot(&chip->slot[i]); + OPL3_ProcessSlot(&chip->slot[i]); #endif mix[0] = mix[1] = 0; @@ -1112,13 +1115,13 @@ nuked_generate_4ch(void *priv, int32_t *buf4) for (i = 0; i < 18; i++) { channel = &chip->channel[i]; out = channel->out; - accm = *out[0] + *out[1] + *out[2] + *out[3]; + accm = *out[0] + *out[1] + *out[2] + *out[3]; #if OPL_ENABLE_STEREOEXT - mix[0] += (int32_t) ((accm * channel->rightpan) >> 16); + mix[0] += (int16_t) ((accm * channel->rightpan) >> 16); #else - mix[0] += (int32_t) (accm & channel->chb); + mix[0] += (int16_t) (accm & channel->chb); #endif - mix[1] += (int32_t) (accm & channel->chd); + mix[1] += (int16_t) (accm & channel->chd); } chip->mixbuff[1] = mix[0]; @@ -1126,7 +1129,7 @@ nuked_generate_4ch(void *priv, int32_t *buf4) #if OPL_QUIRK_CHANNELSAMPLEDELAY for (i = 33; i < 36; i++) - process_slot(&chip->slot[i]); + OPL3_ProcessSlot(&chip->slot[i]); #endif if ((chip->timer & 0x3f) == 0x3f) @@ -1166,13 +1169,13 @@ nuked_generate_4ch(void *priv, int32_t *buf4) chip->eg_state ^= 1; - while (writebuf = &chip->writebuf[chip->writebuf_cur], writebuf->time <= chip->writebuf_samplecnt) { + while ((writebuf = &chip->writebuf[chip->writebuf_cur]), writebuf->time <= chip->writebuf_samplecnt) { if (!(writebuf->reg & 0x200)) break; writebuf->reg &= 0x01ff; - nuked_write_reg(chip, writebuf->reg, writebuf->data); + OPL3_WriteReg(chip, writebuf->reg, writebuf->data); chip->writebuf_cur = (chip->writebuf_cur + 1) % OPL_WRITEBUF_SIZE; } @@ -1181,84 +1184,79 @@ nuked_generate_4ch(void *priv, int32_t *buf4) } void -nuked_generate(opl3_chip *chip, int32_t *buf) +OPL3_Generate(opl3_chip *chip, int32_t *buf) { int32_t samples[4]; - nuked_generate_4ch(chip, samples); + OPL3_Generate4Ch(chip, samples); buf[0] = samples[0]; buf[1] = samples[1]; } void -nuked_generate_4ch_resampled(opl3_chip *chip, int32_t *buf4) +OPL3_Generate4ChResampled(opl3_chip *chip, int32_t *buf4) { while (chip->samplecnt >= chip->rateratio) { chip->oldsamples[0] = chip->samples[0]; chip->oldsamples[1] = chip->samples[1]; chip->oldsamples[2] = chip->samples[2]; chip->oldsamples[3] = chip->samples[3]; - nuked_generate_4ch(chip, chip->samples); + OPL3_Generate4Ch(chip, chip->samples); chip->samplecnt -= chip->rateratio; } buf4[0] = (int32_t) ((chip->oldsamples[0] * (chip->rateratio - chip->samplecnt) - + chip->samples[0] * chip->samplecnt) - / chip->rateratio); + + chip->samples[0] * chip->samplecnt) / chip->rateratio); buf4[1] = (int32_t) ((chip->oldsamples[1] * (chip->rateratio - chip->samplecnt) - + chip->samples[1] * chip->samplecnt) - / chip->rateratio); + + chip->samples[1] * chip->samplecnt) / chip->rateratio); buf4[2] = (int32_t) ((chip->oldsamples[2] * (chip->rateratio - chip->samplecnt) - + chip->samples[2] * chip->samplecnt) - / chip->rateratio); + + chip->samples[2] * chip->samplecnt) / chip->rateratio); buf4[3] = (int32_t) ((chip->oldsamples[3] * (chip->rateratio - chip->samplecnt) - + chip->samples[3] * chip->samplecnt) - / chip->rateratio); + + chip->samples[3] * chip->samplecnt) / chip->rateratio); chip->samplecnt += 1 << RSM_FRAC; } void -nuked_generate_resampled(opl3_chip *chip, int32_t *buf4) +OPL3_GenerateResampled(opl3_chip *chip, int32_t *buf) { int32_t samples[4]; - nuked_generate_4ch_resampled(chip, samples); - buf4[0] = samples[0]; - buf4[1] = samples[1]; + OPL3_Generate4ChResampled(chip, samples); + buf[0] = samples[0]; + buf[1] = samples[1]; } void -nuked_init(opl3_chip *chip, uint32_t samplerate) +OPL3_Reset(opl3_chip *chip, uint32_t samplerate) { opl3_slot *slot; opl3_channel *channel; - uint8_t i; uint8_t local_ch_slot; memset(chip, 0x00, sizeof(opl3_chip)); - for (i = 0; i < 36; i++) { - slot = &chip->slot[i]; - slot->chip = chip; - slot->mod = &chip->zeromod; - slot->eg_rout = 0x01ff; - slot->eg_out = 0x01ff; - slot->eg_gen = envelope_gen_num_release; - slot->trem = (uint8_t *) &chip->zeromod; - slot->slot_num = i; + for (uint8_t slotnum = 0; slotnum < 36; slotnum++) { + slot = &chip->slot[slotnum]; + slot->chip = chip; + slot->mod = &chip->zeromod; + slot->eg_rout = 0x01ff; + slot->eg_out = 0x01ff; + slot->eg_gen = envelope_gen_num_release; + slot->trem = (uint8_t *) &chip->zeromod; + slot->slot_num = slotnum; } - for (i = 0; i < 18; i++) { - channel = &chip->channel[i]; - local_ch_slot = ch_slot[i]; + for (uint8_t channum = 0; channum < 18; channum++) { + channel = &chip->channel[channum]; + local_ch_slot = ch_slot[channum]; channel->slotz[0] = &chip->slot[local_ch_slot]; channel->slotz[1] = &chip->slot[local_ch_slot + 3u]; chip->slot[local_ch_slot].channel = channel; chip->slot[local_ch_slot + 3u].channel = channel; - if ((i % 9) < 3) - channel->pair = &chip->channel[i + 3u]; - else if ((i % 9) < 6) - channel->pair = &chip->channel[i - 3u]; + if ((channum % 9) < 3) + channel->pair = &chip->channel[channum + 3u]; + else if ((channum % 9) < 6) + channel->pair = &chip->channel[channum - 3u]; channel->chip = chip; channel->out[0] = &chip->zeromod; @@ -1272,9 +1270,9 @@ nuked_init(opl3_chip *chip, uint32_t samplerate) channel->leftpan = 0x10000; channel->rightpan = 0x10000; #endif - channel->ch_num = i; + channel->ch_num = channum; - channel_setup_alg(channel); + OPL3_ChannelSetupAlg(channel); } chip->noise = 1; @@ -1291,15 +1289,6 @@ nuked_init(opl3_chip *chip, uint32_t samplerate) #endif } -void -nuked_generate_raw(opl3_chip *chip, int32_t *bufp) -{ - nuked_generate(chip, chip->samples); - - bufp[0] = (int32_t) chip->samples[0]; - bufp[1] = (int32_t) chip->samples[1]; -} - uint16_t nuked_write_addr(void *priv, uint16_t port, uint8_t val) { @@ -1314,7 +1303,7 @@ nuked_write_addr(void *priv, uint16_t port, uint8_t val) } void -nuked_write_reg(void *priv, uint16_t reg, uint8_t val) +OPL3_WriteReg(void *priv, uint16_t reg, uint8_t val) { opl3_chip *chip = (opl3_chip *) priv; uint8_t high = (reg >> 8) & 0x01; @@ -1325,7 +1314,7 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) if (high) switch (regm & 0x0f) { case 0x04: - channel_set_4op(chip, val); + OPL3_ChannelSet4Op(chip, val); break; case 0x05: @@ -1352,72 +1341,72 @@ nuked_write_reg(void *priv, uint16_t reg, uint8_t val) case 0x20: case 0x30: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_20(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); + OPL3_SlotWrite20(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x40: case 0x50: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_40(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); + OPL3_SlotWrite40(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x60: case 0x70: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_60(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); + OPL3_SlotWrite60(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0x80: case 0x90: if (ad_slot[regm & 0x1fu] >= 0) - slot_write_80(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); + OPL3_SlotWrite80(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); + break; + + case 0xe0: + case 0xf0: + if (ad_slot[regm & 0x1fu] >= 0) + OPL3_SlotWriteE0(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); break; case 0xa0: if ((regm & 0x0f) < 9) - channel_write_a0(&chip->channel[9u * high + (regm & 0x0fu)], val); + OPL3_ChannelWriteA0(&chip->channel[9u * high + (regm & 0x0fu)], val); break; case 0xb0: if (regm == 0xbd && !high) { chip->tremoloshift = (((val >> 7) ^ 1) << 1) + 2; chip->vibshift = ((val >> 6) & 0x01) ^ 1; - channel_update_rhythm(chip, val); + OPL3_ChannelUpdateRhythm(chip, val); } else if ((regm & 0x0f) < 9) { - channel_write_b0(&chip->channel[9u * high + (regm & 0x0fu)], val); + OPL3_ChannelWriteB0(&chip->channel[9u * high + (regm & 0x0fu)], val); if (val & 0x20) - channel_key_on(&chip->channel[9u * high + (regm & 0x0fu)]); + OPL3_ChannelKeyOn(&chip->channel[9u * high + (regm & 0x0fu)]); else - channel_key_off(&chip->channel[9u * high + (regm & 0x0fu)]); + OPL3_ChannelKeyOff(&chip->channel[9u * high + (regm & 0x0fu)]); } break; case 0xc0: if ((regm & 0x0f) < 9) - channel_write_c0(&chip->channel[9u * high + (regm & 0x0fu)], val); + OPL3_ChannelWriteC0(&chip->channel[9u * high + (regm & 0x0fu)], val); break; #if OPL_ENABLE_STEREOEXT case 0xd0: if ((regm & 0x0f) < 9) - channel_write_d0(&chip->channel[9u * high + (regm & 0x0fu)], val); + OPL3_ChannelWriteD0(&chip->channel[9u * high + (regm & 0x0fu)], val); break; #endif - case 0xe0: - case 0xf0: - if (ad_slot[regm & 0x1fu] >= 0) - slot_write_e0(&chip->slot[18u * high + ad_slot[regm & 0x1fu]], val); - break; - default: break; } } void -nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) +OPL3_WriteRegBuffered(void *priv, uint16_t reg, uint8_t val) { opl3_chip *chip = (opl3_chip *) priv; uint64_t time1; @@ -1429,7 +1418,7 @@ nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) writebuf = &chip->writebuf[writebuf_last]; if (writebuf->reg & 0x0200) { - nuked_write_reg(chip, writebuf->reg & 0x01ff, writebuf->data); + OPL3_WriteReg(chip, writebuf->reg & 0x01ff, writebuf->data); chip->writebuf_cur = (writebuf_last + 1) % OPL_WRITEBUF_SIZE; chip->writebuf_samplecnt = writebuf->time; @@ -1449,12 +1438,12 @@ nuked_write_reg_buffered(void *priv, uint16_t reg, uint8_t val) } void -nuked_generate_4ch_stream(opl3_chip *chip, int16_t *sndptr1, int16_t *sndptr2, uint32_t numsamples) +OPL3_Generate4ChStream(opl3_chip *chip, int32_t *sndptr1, int32_t *sndptr2, uint32_t numsamples) { int32_t samples[4]; for (uint_fast32_t i = 0; i < numsamples; i++) { - nuked_generate_4ch_resampled(chip, samples); + OPL3_Generate4Ch(chip, samples); sndptr1[0] = samples[0]; sndptr1[1] = samples[1]; sndptr2[0] = samples[2]; @@ -1465,10 +1454,10 @@ nuked_generate_4ch_stream(opl3_chip *chip, int16_t *sndptr1, int16_t *sndptr2, u } void -nuked_generate_stream(opl3_chip *chip, int32_t *sndptr, uint32_t num) +OPL3_GenerateStream(opl3_chip *chip, int32_t *sndptr, uint32_t numsamples) { - for (uint_fast32_t i = 0; i < num; i++) { - nuked_generate_resampled(chip, sndptr); + for (uint_fast32_t i = 0; i < numsamples; i++) { + OPL3_Generate(chip, sndptr); sndptr += 2; } } @@ -1549,7 +1538,7 @@ nuked_drv_init(const device_t *info) dev->status = 0x06; /* Initialize the NukedOPL object. */ - nuked_init(&dev->opl, OPL_FREQ); + OPL3_Reset(&dev->opl, OPL_FREQ); timer_add(&dev->timers[0], nuked_timer_1, dev, 0); timer_add(&dev->timers[1], nuked_timer_2, dev, 0); @@ -1572,7 +1561,7 @@ nuked_drv_update(void *priv) if (dev->pos >= music_pos_global) return dev->buffer; - nuked_generate_stream(&dev->opl, + OPL3_GenerateStream(&dev->opl, &dev->buffer[dev->pos * 2], music_pos_global - dev->pos); @@ -1614,7 +1603,7 @@ nuked_drv_write(uint16_t port, uint8_t val, void *priv) nuked_drv_update(dev); if ((port & 0x0001) == 0x0001) { - nuked_write_reg_buffered(&dev->opl, dev->port, val); + OPL3_WriteRegBuffered(&dev->opl, dev->port, val); switch (dev->port) { case 0x002: /* Timer 1 */ From 541b2ee556f99143caca2a33b3caedfd0e5cc95b Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 16 Jul 2024 21:32:21 +0200 Subject: [PATCH 107/624] PVGA fixes of the day (July 16th, 2024) Actually fix it correctly as well as fixing 16 color mode that was made corrupt after the cleanup of the bank commit. --- src/video/vid_paradise.c | 61 ++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 36 deletions(-) diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index dbc4c2ba3..70f90d6d8 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -45,6 +45,7 @@ typedef struct paradise_t { } type; uint32_t vram_mask; + uint32_t memory; uint32_t read_bank[4], write_bank[4]; @@ -167,12 +168,10 @@ paradise_out(uint16_t addr, uint8_t val, void *priv) return; } - old = svga->gdcreg[svga->gdcaddr]; switch (svga->gdcaddr) { case 6: - if ((val & 0xc) != (old & 0xc)) { - svga->gdcreg[6] = val; - switch (svga->gdcreg[6] & 0xc) { + if ((svga->gdcreg[6] & 0x0c) != (val & 0xc)) { + switch (val & 0x0c) { case 0x0: /*128k at A0000*/ mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); svga->banked_mask = 0xffff; @@ -193,8 +192,9 @@ paradise_out(uint16_t addr, uint8_t val, void *priv) default: break; } - paradise_remap(paradise); } + svga->gdcreg[6] = val; + paradise_remap(paradise); return; case 9: @@ -296,6 +296,8 @@ paradise_recalctimings(svga_t *svga) { const paradise_t *paradise = (paradise_t *) svga->priv; + svga->lowres = !(svga->gdcreg[0x0e] & 0x01); + if (paradise->type == WD90C30) { if (svga->crtc[0x3e] & 0x01) svga->vtotal |= 0x400; @@ -309,22 +311,18 @@ paradise_recalctimings(svga_t *svga) svga->split |= 0x400; svga->interlace = !!(svga->crtc[0x2d] & 0x20); - - if (!svga->interlace && !(svga->gdcreg[0x0e] & 0x01) && (svga->hdisp >= 1024) && ((svga->gdcreg[5] & 0x60) == 0) && (svga->miscout >= 0x27) && (svga->miscout <= 0x2f) && ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1))) { /*Horrible tweak to re-enable the interlace after returning to - a windowed DOS box in Win3.x*/ - svga->interlace = 1; - } } if (paradise->type < WD90C30) { if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if ((svga->bpp >= 8) && (svga->gdcreg[0x0e] & 0x01)) { + if ((svga->bpp >= 8) && !svga->lowres) { svga->render = svga_render_8bpp_highres; + svga->vram_display_mask = (svga->crtc[0x2f] & 0x02) ? 0x3ffff : paradise->vram_mask; } } } else { if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if ((svga->bpp >= 8) && (svga->gdcreg[0x0e] & 0x01)) { + if ((svga->bpp >= 8) && !svga->lowres) { if (svga->bpp == 16) { svga->render = svga_render_16bpp_highres; svga->hdisp >>= 1; @@ -339,13 +337,16 @@ paradise_recalctimings(svga_t *svga) svga->hdisp += 12; if (svga->hdisp == 800) svga->ma_latch -= 3; - } else { + } else svga->render = svga_render_8bpp_highres; - } - } + + svga->vram_display_mask = (svga->crtc[0x2f] & 0x02) ? 0x3ffff : paradise->vram_mask; + } else if ((svga->bpp <= 8) && svga->lowres && !svga->interlace && (svga->hdisp >= 1024) && + (svga->miscout >= 0x27) && (svga->miscout <= 0x2f)) + svga->interlace = 1; /*Horrible tweak to re-enable the interlace after returning to + a windowed DOS box in Win3.x*/ } } - svga->vram_display_mask = (svga->crtc[0x2f] & 0x02) ? 0x3ffff : paradise->vram_mask; } static void @@ -356,15 +357,10 @@ paradise_write(uint32_t addr, uint8_t val, void *priv) uint32_t prev_addr; uint32_t prev_addr2; - if (!(svga->gdcreg[5] & 0x40)) { - svga_write(addr, val, svga); - return; - } - addr = (addr & 0x7fff) + paradise->write_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { + if (!svga->lowres || (svga->attrregs[0x10] & 0x40)) { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; @@ -385,6 +381,7 @@ paradise_write(uint32_t addr, uint8_t val, void *priv) } svga_write_linear(addr, val, svga); } + static void paradise_writew(uint32_t addr, uint16_t val, void *priv) { @@ -393,15 +390,10 @@ paradise_writew(uint32_t addr, uint16_t val, void *priv) uint32_t prev_addr; uint32_t prev_addr2; - if (!(svga->gdcreg[5] & 0x40)) { - svga_writew(addr, val, svga); - return; - } - addr = (addr & 0x7fff) + paradise->write_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { + if (!svga->lowres || (svga->attrregs[0x10] & 0x40)) { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; @@ -431,13 +423,10 @@ paradise_read(uint32_t addr, void *priv) uint32_t prev_addr; uint32_t prev_addr2; - if (!(svga->gdcreg[5] & 0x40)) - return svga_read(addr, svga); - addr = (addr & 0x7fff) + paradise->read_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { + if (!svga->lowres || (svga->attrregs[0x10] & 0x40)) { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; @@ -458,6 +447,7 @@ paradise_read(uint32_t addr, void *priv) } return svga_read_linear(addr, svga); } + static uint16_t paradise_readw(uint32_t addr, void *priv) { @@ -466,13 +456,10 @@ paradise_readw(uint32_t addr, void *priv) uint32_t prev_addr; uint32_t prev_addr2; - if (!(svga->gdcreg[5] & 0x40)) - return svga_readw(addr, svga); - addr = (addr & 0x7fff) + paradise->read_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ - if ((svga->gdcreg[0x0e] & 0x01) || (svga->gdcreg[5] & 0x40)) { + if (!svga->lowres || (svga->attrregs[0x10] & 0x40)) { if (((svga->gdcreg[6] & 0x0c) == 0x04) && (svga->crtc[0x14] & 0x40) && ((svga->gdcreg[0x0b] & 0xc0) == 0xc0) && !svga->chain4) { prev_addr = addr & 3; prev_addr2 = addr & 0xfffc; @@ -506,6 +493,8 @@ paradise_init(const device_t *info, uint32_t memsize) else video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_paradise_wd90c); + paradise->memory = memsize >> 10; + switch (info->local) { case PVGA1A: svga_init(info, svga, paradise, memsize, /*256kb*/ From 138059ff45a4b9ed78113a7b73a96b81b51504a6 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 5 Jul 2024 16:28:01 +0600 Subject: [PATCH 108/624] libsndfile support --- src/cdrom/CMakeLists.txt | 8 +++ src/cdrom/cdrom_image_backend.c | 95 +++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/src/cdrom/CMakeLists.txt b/src/cdrom/CMakeLists.txt index d3b38095e..f2acce4e2 100644 --- a/src/cdrom/CMakeLists.txt +++ b/src/cdrom/CMakeLists.txt @@ -13,4 +13,12 @@ # Copyright 2020-2021 David Hrdlička. # +find_package(PkgConfig REQUIRED) + +pkg_check_modules(SNDFILE REQUIRED IMPORTED_TARGET sndfile) + add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c cdrom_ioctl.c cdrom_mitsumi.c) +target_link_libraries(86Box PkgConfig::SNDFILE) +if (WIN32) + target_link_libraries(86Box -static ${SNDFILE_STATIC_LIBRARIES}) +endif() diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index 9ce78e5b4..e7373a319 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -40,6 +40,8 @@ #include <86box/plat.h> #include <86box/cdrom_image_backend.h> +#include + #define CDROM_BCD(x) (((x) % 10) | (((x) / 10) << 4)) #define MAX_LINE_LENGTH 512 @@ -66,6 +68,96 @@ cdrom_image_backend_log(const char *fmt, ...) # define cdrom_image_backend_log(fmt, ...) #endif +typedef struct audio_file { + SNDFILE *file; + SF_INFO info; +} audio_file; + +/* Audio file functions */ +static int +audio_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) +{ + track_file_t *tf = (track_file_t*)priv; + audio_file *audio = (audio_file*)tf->priv; + uint64_t samples_seek = seek / 4; + uint64_t samples_count = count / 4; + + if ((seek & 3) || (count & 3)) { + pclog("Reading on non-4-aligned boundaries\n"); + } + + sf_count_t res = sf_seek(audio->file, seek, SEEK_SET); + + if (res == -1) + return 0; + + return !!sf_readf_short(audio->file, (short*)buffer, samples_count); +} + +static uint64_t +audio_get_length(void *priv) +{ + track_file_t *tf = (track_file_t*)priv; + audio_file *audio = (audio_file*)tf->priv; + + return audio->info.frames * 4ull; +} + +static void +audio_close(void *priv) +{ + track_file_t *tf = (track_file_t*)priv; + audio_file *audio = (audio_file*)tf->priv; + + memset(tf->fn, 0x00, sizeof(tf->fn)); + if (audio && audio->file) + sf_close(audio->file); + free(audio); + free(tf); +} + +static track_file_t * +audio_init(const char *filename, int *error) +{ + track_file_t *tf = (track_file_t *) calloc(sizeof(track_file_t), 1); + audio_file *audio = (audio_file*) calloc(sizeof(audio_file), 1); +#ifdef _WIN32 + wchar_t filename_w[4096]; +#endif + + if (tf == NULL || audio == NULL) { + free(tf); + free(audio); + *error = 1; + return NULL; + } + + memset(tf->fn, 0x00, sizeof(tf->fn)); + strncpy(tf->fn, filename, sizeof(tf->fn) - 1); +#ifdef _WIN32 + mbstowcs(filename_w, filename, 4096); + audio->file = sf_wchar_open(filename_w, SFM_READ, &audio->info); +#else + audio->file = sf_open(filename, SFM_READ, &audio->info); +#endif + + if (!audio->file) { + goto cleanup_error; + } + + if (audio->info.channels != 2 || audio->info.samplerate != 44100) { + sf_close(audio->file); + goto cleanup_error; + } + + return tf; +cleanup_error: + free(tf); + free(audio); + *error = 1; + return NULL; +} + /* Binary file functions. */ static int bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) @@ -995,6 +1087,9 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) if (!strcmp(type, "BINARY")) { path_append_filename(filename, pathname, ansi); trk.file = track_file_init(filename, &error); + } else if (!strcmp(type, "WAVE")) { + path_append_filename(filename, pathname, ansi); + trk.file = audio_init(filename, &error); } if (error) { #ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG From 4dd4d2e6e1584e56533af8cc0af6ad47bdf7ae09 Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Fri, 5 Jul 2024 23:44:45 +0600 Subject: [PATCH 109/624] A bit of more fixes --- src/cdrom/cdrom_image_backend.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index e7373a319..9e50d6503 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -68,17 +68,17 @@ cdrom_image_backend_log(const char *fmt, ...) # define cdrom_image_backend_log(fmt, ...) #endif -typedef struct audio_file { +typedef struct audio_file_t { SNDFILE *file; SF_INFO info; -} audio_file; +} audio_file_t; /* Audio file functions */ static int audio_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) { track_file_t *tf = (track_file_t*)priv; - audio_file *audio = (audio_file*)tf->priv; + audio_file_t *audio = (audio_file_t*)tf->priv; uint64_t samples_seek = seek / 4; uint64_t samples_count = count / 4; @@ -98,7 +98,7 @@ static uint64_t audio_get_length(void *priv) { track_file_t *tf = (track_file_t*)priv; - audio_file *audio = (audio_file*)tf->priv; + audio_file_t *audio = (audio_file_t*)tf->priv; return audio->info.frames * 4ull; } @@ -107,7 +107,7 @@ static void audio_close(void *priv) { track_file_t *tf = (track_file_t*)priv; - audio_file *audio = (audio_file*)tf->priv; + audio_file_t *audio = (audio_file_t*)tf->priv; memset(tf->fn, 0x00, sizeof(tf->fn)); if (audio && audio->file) @@ -120,16 +120,13 @@ static track_file_t * audio_init(const char *filename, int *error) { track_file_t *tf = (track_file_t *) calloc(sizeof(track_file_t), 1); - audio_file *audio = (audio_file*) calloc(sizeof(audio_file), 1); + audio_file_t *audio = (audio_file_t*) calloc(sizeof(audio_file_t), 1); #ifdef _WIN32 wchar_t filename_w[4096]; #endif if (tf == NULL || audio == NULL) { - free(tf); - free(audio); - *error = 1; - return NULL; + goto cleanup_error; } memset(tf->fn, 0x00, sizeof(tf->fn)); @@ -145,7 +142,7 @@ audio_init(const char *filename, int *error) goto cleanup_error; } - if (audio->info.channels != 2 || audio->info.samplerate != 44100) { + if (audio->info.channels != 2 || audio->info.samplerate != 44100 || !audio->info.seekable) { sf_close(audio->file); goto cleanup_error; } @@ -1087,7 +1084,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) if (!strcmp(type, "BINARY")) { path_append_filename(filename, pathname, ansi); trk.file = track_file_init(filename, &error); - } else if (!strcmp(type, "WAVE")) { + } else if (!strcmp(type, "WAVE") || !strcmp(type, "AIFF") || !strcmp(type, "MP3")) { path_append_filename(filename, pathname, ansi); trk.file = audio_init(filename, &error); } From 94c44da4d13c10436bb5cb11f53cb480c0d4805a Mon Sep 17 00:00:00 2001 From: Cacodemon345 Date: Sat, 6 Jul 2024 14:46:45 +0600 Subject: [PATCH 110/624] Add support for using directories and .iso files within CUE sheets Add support for big-endian binary files Remove unused is_dir member --- src/cdrom/CMakeLists.txt | 1 + src/cdrom/cdrom_image.c | 1 - src/cdrom/cdrom_image_backend.c | 438 ++++++++++++++---------- src/cdrom/cdrom_ioctl.c | 1 - src/include/86box/cdrom.h | 1 - src/include/86box/cdrom_image_backend.h | 4 +- src/qt/qt_settingsfloppycdrom.cpp | 1 - 7 files changed, 258 insertions(+), 189 deletions(-) diff --git a/src/cdrom/CMakeLists.txt b/src/cdrom/CMakeLists.txt index f2acce4e2..897b353cb 100644 --- a/src/cdrom/CMakeLists.txt +++ b/src/cdrom/CMakeLists.txt @@ -20,5 +20,6 @@ pkg_check_modules(SNDFILE REQUIRED IMPORTED_TARGET sndfile) add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c cdrom_ioctl.c cdrom_mitsumi.c) target_link_libraries(86Box PkgConfig::SNDFILE) if (WIN32) + # MSYS2 target_link_libraries(86Box -static ${SNDFILE_STATIC_LIBRARIES}) endif() diff --git a/src/cdrom/cdrom_image.c b/src/cdrom/cdrom_image.c index 2203674cd..113d426c6 100644 --- a/src/cdrom/cdrom_image.c +++ b/src/cdrom/cdrom_image.c @@ -294,7 +294,6 @@ cdrom_image_open(cdrom_t *dev, const char *fn) dev->cd_status = CD_STATUS_DATA_ONLY; else dev->cd_status = CD_STATUS_STOPPED; - dev->is_dir = (i == 3); dev->seek_pos = 0; dev->cd_buflen = 0; dev->cdrom_capacity = image_get_capacity(dev); diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index 9e50d6503..e588a1938 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -14,10 +14,12 @@ * Authors: Miran Grca, * Fred N. van Kempen, * The DOSBox Team, + * Cacodemon345 * * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2002-2020 The DOSBox Team. + * Copyright 2024 Cacodemon345. */ #define __STDC_FORMAT_MACROS #include @@ -77,37 +79,38 @@ typedef struct audio_file_t { static int audio_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) { - track_file_t *tf = (track_file_t*)priv; - audio_file_t *audio = (audio_file_t*)tf->priv; - uint64_t samples_seek = seek / 4; - uint64_t samples_count = count / 4; + track_file_t *tf = (track_file_t *) priv; + audio_file_t *audio = (audio_file_t *) tf->priv; + uint64_t samples_seek = seek / 4; + uint64_t samples_count = count / 4; if ((seek & 3) || (count & 3)) { - pclog("Reading on non-4-aligned boundaries\n"); + cdrom_image_backend_log("CD Audio file: Reading on non-4-aligned boundaries.\n"); } - sf_count_t res = sf_seek(audio->file, seek, SEEK_SET); + sf_count_t res = sf_seek(audio->file, samples_seek, SEEK_SET); if (res == -1) return 0; - - return !!sf_readf_short(audio->file, (short*)buffer, samples_count); + + return !!sf_readf_short(audio->file, (short *) buffer, samples_count); } static uint64_t audio_get_length(void *priv) { - track_file_t *tf = (track_file_t*)priv; - audio_file_t *audio = (audio_file_t*)tf->priv; + track_file_t *tf = (track_file_t *) priv; + audio_file_t *audio = (audio_file_t *) tf->priv; + /* Assume 16-bit audio, 2 channel. */ return audio->info.frames * 4ull; } static void audio_close(void *priv) { - track_file_t *tf = (track_file_t*)priv; - audio_file_t *audio = (audio_file_t*)tf->priv; + track_file_t *tf = (track_file_t *) priv; + audio_file_t *audio = (audio_file_t *) tf->priv; memset(tf->fn, 0x00, sizeof(tf->fn)); if (audio && audio->file) @@ -119,8 +122,8 @@ audio_close(void *priv) static track_file_t * audio_init(const char *filename, int *error) { - track_file_t *tf = (track_file_t *) calloc(sizeof(track_file_t), 1); - audio_file_t *audio = (audio_file_t*) calloc(sizeof(audio_file_t), 1); + track_file_t *tf = (track_file_t *) calloc(sizeof(track_file_t), 1); + audio_file_t *audio = (audio_file_t *) calloc(sizeof(audio_file_t), 1); #ifdef _WIN32 wchar_t filename_w[4096]; #endif @@ -139,14 +142,22 @@ audio_init(const char *filename, int *error) #endif if (!audio->file) { + cdrom_image_backend_log("Audio file open error!"); goto cleanup_error; } if (audio->info.channels != 2 || audio->info.samplerate != 44100 || !audio->info.seekable) { + cdrom_image_backend_log("Audio file not seekable or in non-CD format!"); sf_close(audio->file); goto cleanup_error; } + *error = 0; + tf->priv = audio; + tf->fp = NULL; + tf->close = audio_close; + tf->get_length = audio_get_length; + tf->read = audio_read; return tf; cleanup_error: free(tf); @@ -161,7 +172,7 @@ bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) { track_file_t *tf; - cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu\n", + cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu)\n", tf->fp, seek, count); if ((tf = (track_file_t *) priv)->fp == NULL) @@ -181,6 +192,15 @@ bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) return 0; } + if (UNLIKELY(tf->motorola)) { + for (uint64_t i = 0; i < count; i += 2) { + uint8_t buffer0 = buffer[i]; + uint8_t buffer1 = buffer[i + 1]; + buffer[i] = buffer1; + buffer[i + 1] = buffer0; + } + } + return 1; } @@ -368,12 +388,11 @@ int cdi_get_audio_track_info(cd_img_t *cdi, UNUSED(int end), int track, int *track_num, TMSF *start, uint8_t *attr) { const track_t *trk = &cdi->tracks[track - 1]; + const int pos = trk->start + 150; if ((track < 1) || (track > cdi->tracks_num)) return 0; - const int pos = trk->start + 150; - FRAMES_TO_MSF(pos, &start->min, &start->sec, &start->fr); *track_num = trk->track_number; @@ -449,20 +468,20 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector) { const int track = cdi_get_track(cdi, sector) - 1; const uint64_t sect = (uint64_t) sector; - int raw_size; - int cooked_size; - uint64_t offset; - int m = 0; - int s = 0; - int f = 0; + int raw_size; + int cooked_size; + uint64_t offset; + int m = 0; + int s = 0; + int f = 0; if (track < 0) return 0; - const track_t *trk = &cdi->tracks[track]; - const int track_is_raw = ((trk->sector_size == RAW_SECTOR_SIZE) || (trk->sector_size == 2448)); + const track_t *trk = &cdi->tracks[track]; + const int track_is_raw = ((trk->sector_size == RAW_SECTOR_SIZE) || (trk->sector_size == 2448)); - const uint64_t seek = trk->skip + ((sect - trk->start) * trk->sector_size); + const uint64_t seek = trk->skip + ((sect - trk->start) * trk->sector_size); if (track_is_raw) raw_size = trk->sector_size; @@ -509,13 +528,13 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector) int cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint32_t num) { - int success = 1; + int success = 1; /* TODO: This fails to account for Mode 2. Shouldn't we have a function to get sector size? */ - const int sector_size = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE; - const uint32_t buf_len = num * sector_size; - uint8_t *buf = (uint8_t *) malloc(buf_len * sizeof(uint8_t)); + const int sector_size = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE; + const uint32_t buf_len = num * sector_size; + uint8_t *buf = (uint8_t *) malloc(buf_len * sizeof(uint8_t)); for (uint32_t i = 0; i < num; i++) { success = cdi_read_sector(cdi, &buf[i * sector_size], raw, sector + i); @@ -523,9 +542,7 @@ cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint3 break; /* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an audio track. */ - if (raw && (sector < cdi->tracks[0].length) && - !cdi->tracks[0].mode2 && (cdi->tracks[0].attr != AUDIO_TRACK) && - *(uint64_t *) &(buf[(i * sector_size) + 2068])) + if (raw && (sector < cdi->tracks[0].length) && !cdi->tracks[0].mode2 && (cdi->tracks[0].attr != AUDIO_TRACK) && *(uint64_t *) &(buf[(i * sector_size) + 2068])) return 0; } @@ -626,81 +643,94 @@ cdi_track_push_back(cd_img_t *cdi, track_t *trk) cdi->tracks_num++; } +int +cdi_get_iso_track(cd_img_t *cdi, track_t *trk, const char *filename) +{ + int error; + int ret = 2; + memset(trk, 0, sizeof(track_t)); + + /* Data track (shouldn't there be a lead in track?). */ + trk->file = bin_init(filename, &error); + if (error) { + if ((trk->file != NULL) && (trk->file->close != NULL)) + trk->file->close(trk->file); + ret = 3; + trk->file = viso_init(filename, &error); + if (error) { + if ((trk->file != NULL) && (trk->file->close != NULL)) + trk->file->close(trk->file); + return 0; + } + } + trk->number = 1; + trk->track_number = 1; + trk->attr = DATA_TRACK; + + /* Try to detect ISO type. */ + trk->form = 0; + trk->mode2 = 0; + + if (cdi_can_read_pvd(trk->file, RAW_SECTOR_SIZE, 0, 0)) + trk->sector_size = RAW_SECTOR_SIZE; + else if (cdi_can_read_pvd(trk->file, 2336, 1, 0)) { + trk->sector_size = 2336; + trk->mode2 = 1; + } else if (cdi_can_read_pvd(trk->file, 2324, 1, 2)) { + trk->sector_size = 2324; + trk->mode2 = 1; + trk->form = 2; + trk->noskip = 1; + } else if (cdi_can_read_pvd(trk->file, 2328, 1, 2)) { + trk->sector_size = 2328; + trk->mode2 = 1; + trk->form = 2; + trk->noskip = 1; + } else if (cdi_can_read_pvd(trk->file, 2336, 1, 1)) { + trk->sector_size = 2336; + trk->mode2 = 1; + trk->form = 1; + trk->skip = 8; + } else if (cdi_can_read_pvd(trk->file, RAW_SECTOR_SIZE, 1, 0)) { + trk->sector_size = RAW_SECTOR_SIZE; + trk->mode2 = 1; + } else if (cdi_can_read_pvd(trk->file, RAW_SECTOR_SIZE, 1, 1)) { + trk->sector_size = RAW_SECTOR_SIZE; + trk->mode2 = 1; + trk->form = 1; + } else { + /* We use 2048 mode 1 as the default. */ + trk->sector_size = COOKED_SECTOR_SIZE; + } + + trk->length = trk->file->get_length(trk->file) / trk->sector_size; + cdrom_image_backend_log("ISO: Data track: length = %" PRIu64 ", sector_size = %i\n", trk->length, trk->sector_size); + return ret; +} + int cdi_load_iso(cd_img_t *cdi, const char *filename) { - int error; int ret = 2; track_t trk; cdi->tracks = NULL; cdi->tracks_num = 0; - memset(&trk, 0, sizeof(track_t)); + ret = cdi_get_iso_track(cdi, &trk, filename); - /* Data track (shouldn't there be a lead in track?). */ - trk.file = bin_init(filename, &error); - if (error) { - if ((trk.file != NULL) && (trk.file->close != NULL)) - trk.file->close(trk.file); - ret = 3; - trk.file = viso_init(filename, &error); - if (error) { - if ((trk.file != NULL) && (trk.file->close != NULL)) - trk.file->close(trk.file); - return 0; - } + if (ret >= 1) { + cdi_track_push_back(cdi, &trk); + + /* Lead out track. */ + trk.number = 2; + trk.track_number = 0xAA; + trk.attr = 0x16; /* Was originally 0x00, but I believe 0x16 is appropriate. */ + trk.start = trk.length; + trk.length = 0; + trk.file = NULL; + cdi_track_push_back(cdi, &trk); } - trk.number = 1; - trk.track_number = 1; - trk.attr = DATA_TRACK; - - /* Try to detect ISO type. */ - trk.form = 0; - trk.mode2 = 0; - - if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 0, 0)) - trk.sector_size = RAW_SECTOR_SIZE; - else if (cdi_can_read_pvd(trk.file, 2336, 1, 0)) { - trk.sector_size = 2336; - trk.mode2 = 1; - } else if (cdi_can_read_pvd(trk.file, 2324, 1, 2)) { - trk.sector_size = 2324; - trk.mode2 = 1; - trk.form = 2; - } else if (cdi_can_read_pvd(trk.file, 2328, 1, 2)) { - trk.sector_size = 2328; - trk.mode2 = 1; - trk.form = 2; - } else if (cdi_can_read_pvd(trk.file, 2336, 1, 1)) { - trk.sector_size = 2336; - trk.mode2 = 1; - trk.form = 1; - trk.skip = 8; - } else if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 1, 0)) { - trk.sector_size = RAW_SECTOR_SIZE; - trk.mode2 = 1; - } else if (cdi_can_read_pvd(trk.file, RAW_SECTOR_SIZE, 1, 1)) { - trk.sector_size = RAW_SECTOR_SIZE; - trk.mode2 = 1; - trk.form = 1; - } else { - /* We use 2048 mode 1 as the default. */ - trk.sector_size = COOKED_SECTOR_SIZE; - } - - trk.length = trk.file->get_length(trk.file) / trk.sector_size; - cdrom_image_backend_log("ISO: Data track: length = %" PRIu64 ", sector_size = %i\n", trk.length, trk.sector_size); - cdi_track_push_back(cdi, &trk); - - /* Lead out track. */ - trk.number = 2; - trk.track_number = 0xAA; - trk.attr = 0x16; /* Was originally 0x00, but I believe 0x16 is appropriate. */ - trk.start = trk.length; - trk.length = 0; - trk.file = NULL; - cdi_track_push_back(cdi, &trk); return ret; } @@ -793,7 +823,7 @@ cdi_cue_get_frame(uint64_t *frames, char **line) char temp[128]; int min = 0; int sec = 0; - int fr = 0; + int fr = 0; int success; success = cdi_cue_get_buffer(temp, line, 0); @@ -854,7 +884,7 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u if (cur->number != 1) return 0; cur->skip = skip * cur->sector_size; - if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0)) + if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0) && !cur->noskip) cur->skip += 8; cur->start += cur_pregap; *total_pregap = cur_pregap; @@ -871,14 +901,14 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u cur->start += *total_pregap; } else { const uint64_t temp = prev->file->get_length(prev->file) - (prev->skip); - prev->length = temp / ((uint64_t) prev->sector_size); + prev->length = temp / ((uint64_t) prev->sector_size); if ((temp % prev->sector_size) != 0) prev->length++; /* Padding. */ cur->start += prev->start + prev->length + cur_pregap; cur->skip = skip * cur->sector_size; - if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0)) + if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0) && !cur->noskip) cur->skip += 8; *shift += prev->start + prev->length; *total_pregap = cur_pregap; @@ -902,12 +932,13 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) { track_t trk; char pathname[MAX_FILENAME_LENGTH]; - uint64_t shift = 0ULL; - uint64_t prestart = 0ULL; - uint64_t cur_pregap = 0ULL; + uint64_t shift = 0ULL; + uint64_t prestart = 0ULL; + uint64_t cur_pregap = 0ULL; uint64_t total_pregap = 0ULL; - uint64_t frame = 0ULL; + uint64_t frame = 0ULL; uint64_t index; + int iso_file_used = 0; int success; int error; int can_add_track = 0; @@ -963,82 +994,97 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) if (!success) break; - trk.start = 0; - trk.skip = 0; - cur_pregap = 0; - prestart = 0; + if (iso_file_used) { + /* We don't alter anything of the detected track type with the one specified in the CUE file, except its numbers. */ + cur_pregap = 0; + prestart = 0; - trk.number = cdi_cue_get_number(&line); - trk.track_number = trk.number; - success = cdi_cue_get_keyword(&type, &line); - if (!success) - break; + trk.number = cdi_cue_get_number(&line); + trk.track_number = trk.number; + success = cdi_cue_get_keyword(&type, &line); + if (!success) + break; + can_add_track = 1; - trk.form = 0; - trk.mode2 = 0; + iso_file_used = 0; + } else { + trk.start = 0; + trk.skip = 0; + cur_pregap = 0; + prestart = 0; - trk.pre = 0; + trk.number = cdi_cue_get_number(&line); + trk.track_number = trk.number; + success = cdi_cue_get_keyword(&type, &line); + if (!success) + break; - if (!strcmp(type, "AUDIO")) { - trk.sector_size = RAW_SECTOR_SIZE; - trk.attr = AUDIO_TRACK; - } else if (!strcmp(type, "MODE1/2048")) { - trk.sector_size = COOKED_SECTOR_SIZE; - trk.attr = DATA_TRACK; - } else if (!strcmp(type, "MODE1/2352")) { - trk.sector_size = RAW_SECTOR_SIZE; - trk.attr = DATA_TRACK; - } else if (!strcmp(type, "MODE1/2448")) { - trk.sector_size = 2448; - trk.attr = DATA_TRACK; - } else if (!strcmp(type, "MODE2/2048")) { - trk.form = 1; - trk.sector_size = COOKED_SECTOR_SIZE; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else if (!strcmp(type, "MODE2/2324")) { - trk.form = 2; - trk.sector_size = 2324; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else if (!strcmp(type, "MODE2/2328")) { - trk.form = 2; - trk.sector_size = 2328; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else if (!strcmp(type, "MODE2/2336")) { - trk.form = 1; - trk.sector_size = 2336; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else if (!strcmp(type, "MODE2/2352")) { - /* Assume this is XA Mode 2 Form 1. */ - trk.form = 1; - trk.sector_size = RAW_SECTOR_SIZE; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else if (!strcmp(type, "MODE2/2448")) { - /* Assume this is XA Mode 2 Form 1. */ - trk.form = 1; - trk.sector_size = 2448; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else if (!strcmp(type, "CDG/2448")) { - trk.sector_size = 2448; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else if (!strcmp(type, "CDI/2336")) { - trk.sector_size = 2336; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else if (!strcmp(type, "CDI/2352")) { - trk.sector_size = RAW_SECTOR_SIZE; - trk.attr = DATA_TRACK; - trk.mode2 = 1; - } else - success = 0; + trk.form = 0; + trk.mode2 = 0; - can_add_track = 1; + trk.pre = 0; + + if (!strcmp(type, "AUDIO")) { + trk.sector_size = RAW_SECTOR_SIZE; + trk.attr = AUDIO_TRACK; + } else if (!strcmp(type, "MODE1/2048")) { + trk.sector_size = COOKED_SECTOR_SIZE; + trk.attr = DATA_TRACK; + } else if (!strcmp(type, "MODE1/2352")) { + trk.sector_size = RAW_SECTOR_SIZE; + trk.attr = DATA_TRACK; + } else if (!strcmp(type, "MODE1/2448")) { + trk.sector_size = 2448; + trk.attr = DATA_TRACK; + } else if (!strcmp(type, "MODE2/2048")) { + trk.form = 1; + trk.sector_size = COOKED_SECTOR_SIZE; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else if (!strcmp(type, "MODE2/2324")) { + trk.form = 2; + trk.sector_size = 2324; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else if (!strcmp(type, "MODE2/2328")) { + trk.form = 2; + trk.sector_size = 2328; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else if (!strcmp(type, "MODE2/2336")) { + trk.form = 1; + trk.sector_size = 2336; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else if (!strcmp(type, "MODE2/2352")) { + /* Assume this is XA Mode 2 Form 1. */ + trk.form = 1; + trk.sector_size = RAW_SECTOR_SIZE; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else if (!strcmp(type, "MODE2/2448")) { + /* Assume this is XA Mode 2 Form 1. */ + trk.form = 1; + trk.sector_size = 2448; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else if (!strcmp(type, "CDG/2448")) { + trk.sector_size = 2448; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else if (!strcmp(type, "CDI/2336")) { + trk.sector_size = 2336; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else if (!strcmp(type, "CDI/2352")) { + trk.sector_size = RAW_SECTOR_SIZE; + trk.attr = DATA_TRACK; + trk.mode2 = 1; + } else + success = 0; + + can_add_track = 1; + } } else if (!strcmp(command, "INDEX")) { index = cdi_cue_get_number(&line); success = cdi_cue_get_frame(&frame, &line); @@ -1057,8 +1103,8 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) break; } } else if (!strcmp(command, "FILE")) { - char filename[MAX_FILENAME_LENGTH]; - char ansi[MAX_FILENAME_LENGTH]; + char filename[MAX_FILENAME_LENGTH]; + char ansi[MAX_FILENAME_LENGTH]; if (can_add_track) success = cdi_add_track(cdi, &trk, &shift, prestart, &total_pregap, cur_pregap); @@ -1081,16 +1127,40 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) trk.file = NULL; error = 1; - if (!strcmp(type, "BINARY")) { - path_append_filename(filename, pathname, ansi); - trk.file = track_file_init(filename, &error); + if (!strcmp(type, "BINARY") || !strcmp(type, "MOTOROLA")) { + int fn_len = 0; + if (!path_abs(ansi)) { + path_append_filename(filename, pathname, ansi); + } else { + strcpy(filename, ansi); + } + fn_len = strlen(filename); + if ((tolower((int) filename[fn_len - 1]) == 'o' + && tolower((int) filename[fn_len - 2]) == 's' + && tolower((int) filename[fn_len - 3]) == 'i' + && filename[fn_len - 4] == '.') + || plat_dir_check(filename)) { + error = !cdi_get_iso_track(cdi, &trk, filename); + if (!error) { + iso_file_used = 1; + } + } else + trk.file = track_file_init(filename, &error); + + if (trk.file) { + trk.file->motorola = !strcmp(type, "MOTOROLA"); + } } else if (!strcmp(type, "WAVE") || !strcmp(type, "AIFF") || !strcmp(type, "MP3")) { - path_append_filename(filename, pathname, ansi); + if (!path_abs(ansi)) { + path_append_filename(filename, pathname, ansi); + } else { + strcpy(filename, ansi); + } trk.file = audio_init(filename, &error); } if (error) { #ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG - cdrom_image_backend_log("CUE: cannot open fille '%s' in cue sheet!\n", + cdrom_image_backend_log("CUE: cannot open file '%s' in cue sheet!\n", filename); #endif if (trk.file != NULL) { @@ -1159,7 +1229,7 @@ cdi_has_audio_track(cd_img_t *cdi) if ((cdi == NULL) || (cdi->tracks == NULL)) return 0; - /* Audio track has attribute 0x14. */ + /* Audio track has attribute 0x10. */ for (int i = 0; i < cdi->tracks_num; i++) { if (cdi->tracks[i].attr == AUDIO_TRACK) return 1; diff --git a/src/cdrom/cdrom_ioctl.c b/src/cdrom/cdrom_ioctl.c index a204fad0f..13df2d965 100644 --- a/src/cdrom/cdrom_ioctl.c +++ b/src/cdrom/cdrom_ioctl.c @@ -254,7 +254,6 @@ cdrom_ioctl_open(cdrom_t *dev, const char *drv) /* All good, reset state. */ dev->cd_status = CD_STATUS_STOPPED; - dev->is_dir = 0; dev->seek_pos = 0; dev->cd_buflen = 0; dev->cdrom_capacity = ioctl_get_capacity(dev); diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index b3f5a5ea5..b97693560 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -226,7 +226,6 @@ typedef struct cdrom { uint8_t speed; uint8_t cur_speed; - int is_dir; void *priv; char image_path[1024]; diff --git a/src/include/86box/cdrom_image_backend.h b/src/include/86box/cdrom_image_backend.h index 5222e8aa0..cf4fe95c3 100644 --- a/src/include/86box/cdrom_image_backend.h +++ b/src/include/86box/cdrom_image_backend.h @@ -53,6 +53,8 @@ typedef struct track_file_t { char fn[260]; FILE *fp; void *priv; + + int motorola; } track_file_t; typedef struct track_t { @@ -63,7 +65,7 @@ typedef struct track_t { int mode2; int form; int pre; - int pad; + int noskip; /* Do not skip by 8 bytes.*/ uint64_t start; uint64_t length; uint64_t skip; diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 8f0ac81a9..190dbc2e1 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -218,7 +218,6 @@ SettingsFloppyCDROM::save() /* Removable devices category */ model = ui->tableViewCDROM->model(); for (int i = 0; i < CDROM_NUM; i++) { - cdrom[i].is_dir = 0; cdrom[i].priv = NULL; cdrom[i].ops = NULL; cdrom[i].image = NULL; From 1e597c39c4f3fdc98b652c76415bdc3ea775cd18 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 17 Jul 2024 18:12:03 -0300 Subject: [PATCH 111/624] CMI8x38: Make another bit writable and improve DMA value readback, fixes #4576 again --- src/sound/snd_cmi8x38.c | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/sound/snd_cmi8x38.c b/src/sound/snd_cmi8x38.c index b1f56f775..d548763ce 100644 --- a/src/sound/snd_cmi8x38.c +++ b/src/sound/snd_cmi8x38.c @@ -860,7 +860,7 @@ cmi8x38_write(uint16_t addr, uint8_t val, void *priv) case 0x1b: if (dev->type == CMEDIA_CMI8338) - val &= 0xf0; + val &= 0xf4; /* bit 2 reserved, mpxplay driver expects writable */ else val &= 0xd7; break; @@ -909,6 +909,24 @@ cmi8x38_write(uint16_t addr, uint8_t val, void *priv) dev->sb->opl.write(addr, val, dev->sb->opl.priv); return; + case 0x80 ... 0x83: + case 0x88 ... 0x8b: + dev->io_regs[addr] = val; + dev->dma[(addr & 0x78) >> 3].sample_ptr = *((uint32_t *) &dev->io_regs[addr & 0xfc]); + return; + + case 0x84 ... 0x85: + case 0x8c ... 0x8d: + dev->io_regs[addr] = val; + dev->dma[(addr & 0x78) >> 3].frame_count_dma = dev->dma[(addr & 0x78) >> 3].sample_count_out = *((uint16_t *) &dev->io_regs[addr & 0xfe]) + 1; + return; + + case 0x86 ... 0x87: + case 0x8e ... 0x8f: + dev->io_regs[addr] = val; + dev->dma[(addr & 0x78) >> 3].frame_count_fragment = *((uint16_t *) &dev->io_regs[addr & 0xfe]) + 1; + return; + case 0x92: if (dev->type == CMEDIA_CMI8338) return; @@ -927,7 +945,6 @@ cmi8x38_write(uint16_t addr, uint8_t val, void *priv) case 0x26: case 0x70: case 0x71: - case 0x80 ... 0x8f: break; default: From 7a402649cd3e81d9d2c05578bf685f31e273d2f2 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 17 Jul 2024 18:13:10 -0300 Subject: [PATCH 112/624] C&T 69000: Fix I2C naming oversight --- src/video/vid_chips_69000.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_chips_69000.c b/src/video/vid_chips_69000.c index 2caefd413..fd4ff5c8e 100644 --- a/src/video/vid_chips_69000.c +++ b/src/video/vid_chips_69000.c @@ -2477,7 +2477,7 @@ chips_69000_init(const device_t *info) timer_add(&chips->decrement_timer, chips_69000_decrement_timer, chips, 0); timer_on_auto(&chips->decrement_timer, 1000000. / 2000.); - chips->i2c = i2c_gpio_init("chips_69000_ddc"); + chips->i2c = i2c_gpio_init("ddc_chips_69000"); chips->ddc = ddc_init(i2c_gpio_get_bus(chips->i2c)); chips->flat_panel_regs[0x01] = 1; From f266272c60c9336572c909b01301eb10b69f34ef Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 18 Jul 2024 17:55:57 -0300 Subject: [PATCH 113/624] AC97: Highest codec powerdown bits should be write only, fixes #4393 --- src/sound/snd_ac97_codec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sound/snd_ac97_codec.c b/src/sound/snd_ac97_codec.c index d302db6ae..ae87ce870 100644 --- a/src/sound/snd_ac97_codec.c +++ b/src/sound/snd_ac97_codec.c @@ -316,7 +316,7 @@ line_gain: val = (val & i) | (prev & ~i); /* Update status bits to reflect powerdowns. */ - val = (val & ~0x000f) | (~(val >> 8) & 0x000f); + val = (val & ~0x300f) | (~(val >> 8) & 0x000f); /* also clear write-only PR4 and PR5 */ if (val & 0x0800) /* PR3 clears both ANL and REF */ val &= ~0x0004; break; @@ -527,7 +527,7 @@ ac97_codec_getattn(void *priv, uint8_t reg, int *l, int *r) /* Apply full mute and powerdowns. */ int full_mute = (reg < 0x36); if ((full_mute && (val & AC97_MUTE)) || /* full mute */ - (dev->regs[0x26 >> 1] & 0x3e00) || /* DAC powerdown */ + (dev->regs[0x26 >> 1] & 0x0e00) || /* DAC powerdown */ ((reg == 0x38) && (dev->regs[0x2a >> 1] & AC97_PRJ))) { /* surround DAC powerdown */ *l = 0; *r = 0; From c377a3628887854bddbc6c825472e13ce5417686 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 19 Jul 2024 17:45:44 +0200 Subject: [PATCH 114/624] SM(S)C FDC37c932 Super I/O chip fixes, fixes #4601. --- src/include/86box/sio.h | 1 + src/machine/m_at_socket7_3v.c | 2 +- src/sio/sio_fdc37c93x.c | 61 +++++++++++++++++++++++++++-------- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/src/include/86box/sio.h b/src/include/86box/sio.h index d5fc88fb4..6b7d46987 100644 --- a/src/include/86box/sio.h +++ b/src/include/86box/sio.h @@ -42,6 +42,7 @@ extern const device_t fdc37c931apm_device; extern const device_t fdc37c931apm_compaq_device; extern const device_t fdc37c932fr_device; extern const device_t fdc37c932qf_device; +extern const device_t fdc37c932_device; extern const device_t fdc37c935_device; extern const device_t fdc37c935_370_device; extern const device_t fdc37c935_no_nvr_device; diff --git a/src/machine/m_at_socket7_3v.c b/src/machine/m_at_socket7_3v.c index 380e56e41..c36fade86 100644 --- a/src/machine/m_at_socket7_3v.c +++ b/src/machine/m_at_socket7_3v.c @@ -816,7 +816,7 @@ machine_at_vectra54_init(const machine_t *model) device_add(&i430fx_device); device_add(&piix_device); - device_add(&fdc37c931apm_device); + device_add(&fdc37c932_device); device_add(&sst_flash_29ee010_device); return ret; diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index 97fcb3fbd..949c59552 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -211,7 +211,8 @@ fdc37c93x_nvr_pri_handler(fdc37c93x_t *dev) { uint8_t local_enable = !!dev->ld_regs[6][0x30]; - local_enable &= ((dev->ld_regs[6][0xf0] & 0x90) != 0x80); + if (dev->chip_id != 0x02) + local_enable &= ((dev->ld_regs[6][0xf0] & 0x90) != 0x80); nvr_at_handler(0, 0x70, dev->nvr); if (local_enable) @@ -441,9 +442,9 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) return; else switch (dev->regs[7]) { - case 0x01: - case 0x02: - return; + // case 0x01: + // case 0x02: + // return; case 0x06: if (!dev->has_nvr) return; @@ -495,7 +496,8 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) break; case 0x27: - fdc37c93x_superio_handler(dev); + if (dev->chip_id != 0x02) + fdc37c93x_superio_handler(dev); break; default: @@ -617,12 +619,13 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) case 0x30: if (valxor) { fdc37c93x_nvr_pri_handler(dev); - fdc37c93x_nvr_sec_handler(dev); + if (dev->chip_id != 0x02) + fdc37c93x_nvr_sec_handler(dev); } break; case 0x62: case 0x63: - if (valxor) + if ((dev->chip_id != 0x02) && valxor) fdc37c93x_nvr_sec_handler(dev); break; case 0xf0: @@ -631,7 +634,9 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) nvr_lock_set(0xa0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x02), dev->nvr); nvr_lock_set(0xc0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x04), dev->nvr); nvr_lock_set(0xe0, 0x20, !!(dev->ld_regs[6][dev->cur_reg] & 0x08), dev->nvr); - if (dev->ld_regs[6][dev->cur_reg] & 0x80) + if ((dev->chip_id == 0x02) && (dev->ld_regs[6][dev->cur_reg] & 0x80)) + nvr_bank_set(0, 1, dev->nvr); + else if ((dev->chip_id != 0x02) && (dev->ld_regs[6][dev->cur_reg] & 0x80)) switch ((dev->ld_regs[6][dev->cur_reg] >> 4) & 0x07) { default: case 0x00: @@ -663,11 +668,13 @@ fdc37c93x_write(uint16_t port, uint8_t val, void *priv) } else { nvr_bank_set(0, 0, dev->nvr); - nvr_bank_set(1, 0xff, dev->nvr); + if (dev->chip_id != 0x02) + nvr_bank_set(1, 0xff, dev->nvr); } fdc37c93x_nvr_pri_handler(dev); - fdc37c93x_nvr_sec_handler(dev); + if (dev->chip_id != 0x02) + fdc37c93x_nvr_sec_handler(dev); } break; @@ -786,8 +793,10 @@ fdc37c93x_reset(fdc37c93x_t *dev) dev->regs[0x21] = 0x01; dev->regs[0x22] = 0x39; dev->regs[0x24] = 0x04; - dev->regs[0x26] = dev->port_370 ? 0x70 : 0xF0; - dev->regs[0x27] = 0x03; + if (dev->chip_id != 0x02) { + dev->regs[0x26] = dev->port_370 ? 0x70 : 0xF0; + dev->regs[0x27] = 0x03; + } for (uint8_t i = 0; i < 11; i++) memset(dev->ld_regs[i], 0, 256); @@ -846,7 +855,9 @@ fdc37c93x_reset(fdc37c93x_t *dev) /* Logical device 6: RTC */ dev->ld_regs[6][0x30] = 0; - dev->ld_regs[6][0x63] = (dev->has_nvr) ? 0x70 : 0x00; + dev->ld_regs[6][0x60] = 0x70; + if (dev->chip_id != 0x02) + dev->ld_regs[6][0x63] = (dev->has_nvr) ? 0x70 : 0x00; dev->ld_regs[6][0xF0] = 0; dev->ld_regs[6][0xF4] = 3; @@ -888,7 +899,8 @@ fdc37c93x_reset(fdc37c93x_t *dev) fdc37c93x_kbc_handler(dev); - fdc37c93x_superio_handler(dev); + if (dev->chip_id != 0x02) + fdc37c93x_superio_handler(dev); dev->locked = 0; } @@ -982,6 +994,13 @@ fdc37c93x_init(const device_t *info) fdc37c93x_reset(dev); + if (dev->chip_id == 0x02) { + io_sethandler(0x03f0, 0x0002, + fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); + io_sethandler(0x0370, 0x0002, + fdc37c93x_read, NULL, NULL, fdc37c93x_write, NULL, NULL, dev); + } + return dev; } @@ -1013,6 +1032,20 @@ const device_t fdc37c931apm_compaq_device = { .config = NULL }; +const device_t fdc37c932_device = { + .name = "SMC FDC37C932 Super I/O", + .internal_name = "fdc37c932", + .flags = 0, + .local = 0x02, + .init = fdc37c93x_init, + .close = fdc37c93x_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t fdc37c932fr_device = { .name = "SMC FDC37C932FR Super I/O", .internal_name = "fdc37c932fr", From d4a718cc2faa4aa8b83b306041d3971fdcb1e374 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 19 Jul 2024 20:09:21 +0200 Subject: [PATCH 115/624] Reading SB DSP port 0Ch now gets the DSP out of the reset state - fixes Inherit the Orb detection of the Sound Blaster Pro. --- src/sound/snd_sb_dsp.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index 65f33f4a3..d86063654 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -1886,6 +1886,10 @@ sb_read(uint16_t a, void *priv) dsp->state = DSP_S_NORMAL; break; case 0xC: /* Write data ready */ + /* Advance the state just in case something reads from here + without reading the status first. */ + if (dsp->state == DSP_S_RESET_WAIT) + dsp->state = DSP_S_NORMAL; if ((dsp->state == DSP_S_NORMAL) || IS_ESS(dsp)) { if (dsp->sb_8_enable || dsp->sb_type >= SB16) dsp->busy_count = (dsp->busy_count + 1) & 3; From 78293cffd16fdd9d250de017b80edcc5a04195dc Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 19 Jul 2024 22:00:46 +0200 Subject: [PATCH 116/624] Sound Blaster 16 DSP now correctly uses the 8-bit DMA channel when the 16-bit DMA channel is set to 4, fixes #3101. --- src/sound/snd_sb_dsp.c | 48 ++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index d86063654..de420c740 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -553,8 +553,12 @@ sb_resume_dma(const sb_dsp_t *dsp, const int is_8) } else if (is_8) dma_set_drq(dsp->sb_8_dmanum, 1); else { - if (dsp->sb_16_dmanum != 0xff) - dma_set_drq(dsp->sb_16_dmanum, 1); + if (dsp->sb_16_dmanum != 0xff) { + if (dsp->sb_16_dmanum == 4) + dma_set_drq(dsp->sb_8_dmanum, 1); + else + dma_set_drq(dsp->sb_16_dmanum, 1); + } if (dsp->sb_16_8_dmanum != 0xff) dma_set_drq(dsp->sb_16_8_dmanum, 1); @@ -566,8 +570,12 @@ sb_stop_dma(const sb_dsp_t *dsp) { dma_set_drq(dsp->sb_8_dmanum, 0); - if (dsp->sb_16_dmanum != 0xff) - dma_set_drq(dsp->sb_16_dmanum, 0); + if (dsp->sb_16_dmanum != 0xff) { + if (dsp->sb_16_dmanum == 4) + dma_set_drq(dsp->sb_8_dmanum, 0); + else + dma_set_drq(dsp->sb_16_dmanum, 0); + } if (dsp->sb_16_8_dmanum != 0xff) dma_set_drq(dsp->sb_16_8_dmanum, 0); @@ -609,9 +617,12 @@ sb_start_dma(sb_dsp_t *dsp, int dma8, int autoinit, uint8_t format, int len) if (!timer_is_enabled(&dsp->output_timer)) timer_set_delay_u64(&dsp->output_timer, (uint64_t) dsp->sblatcho); - if (dsp->sb_16_dma_supported) - dma_set_drq(dsp->sb_16_dmanum, 1); - else + if (dsp->sb_16_dma_supported) { + if (dsp->sb_16_dmanum == 4) + dma_set_drq(dsp->sb_8_dmanum, 1); + else + dma_set_drq(dsp->sb_16_dmanum, 1); + } else dma_set_drq(dsp->sb_16_8_dmanum, 1); } @@ -649,9 +660,12 @@ sb_start_dma_i(sb_dsp_t *dsp, int dma8, int autoinit, uint8_t format, int len) if (!timer_is_enabled(&dsp->input_timer)) timer_set_delay_u64(&dsp->input_timer, (uint64_t) dsp->sblatchi); - if (dsp->sb_16_dma_supported) - dma_set_drq(dsp->sb_16_dmanum, 1); - else + if (dsp->sb_16_dma_supported) { + if (dsp->sb_16_dmanum == 4) + dma_set_drq(dsp->sb_8_dmanum, 1); + else + dma_set_drq(dsp->sb_16_dmanum, 1); + } else dma_set_drq(dsp->sb_16_8_dmanum, 1); } @@ -761,13 +775,16 @@ sb_16_read_dma(void *priv) int ret; int dma_ch = dsp->sb_16_dmanum; - if (dsp->sb_16_dma_enabled && dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate) + if (dsp->sb_16_dma_enabled && dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate && (dma_ch != 4)) ret = dma_channel_read(dma_ch); else { if (dsp->sb_16_dma_enabled) { /* High DMA channel enabled, either translation is enabled or 16-bit transfers are not supported. */ - dma_ch = dsp->sb_16_8_dmanum; + if (dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate && (dma_ch == 4)) + dma_ch = dsp->sb_8_dmanum; + else + dma_ch = dsp->sb_16_8_dmanum; } else /* High DMA channel disabled, always use the first 8-bit channel. */ dma_ch = dsp->sb_8_dmanum; @@ -795,13 +812,16 @@ sb_16_write_dma(void *priv, uint16_t val) int dma_ch = dsp->sb_16_dmanum; int ret; - if (dsp->sb_16_dma_enabled && dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate) + if (dsp->sb_16_dma_enabled && dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate && (dma_ch != 4)) ret = dma_channel_write(dma_ch, val) == DMA_NODATA; else { if (dsp->sb_16_dma_enabled) { /* High DMA channel enabled, either translation is enabled or 16-bit transfers are not supported. */ - dma_ch = dsp->sb_16_8_dmanum; + if (dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate && (dma_ch == 4)) + dma_ch = dsp->sb_8_dmanum; + else + dma_ch = dsp->sb_16_8_dmanum; } else /* High DMA channel disabled, always use the first 8-bit channel. */ dma_ch = dsp->sb_8_dmanum; From 652ffa646e912b4cabd89fab41aaa25ee2b35757 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 19 Jul 2024 22:02:02 +0200 Subject: [PATCH 117/624] Added a sanity check to device.c. --- src/device.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/device.c b/src/device.c index 6fadc901b..b9dba8fd6 100644 --- a/src/device.c +++ b/src/device.c @@ -186,7 +186,8 @@ device_add_common(const device_t *dev, void *p, void *params, int inst) devices[c] = NULL; device_priv[c] = NULL; - free(init_dev); + if (init_dev != NULL) + free(init_dev); return (NULL); } From dfe83ac32aa4883c7ca4d58d8c448f505a957e6f Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 19 Jul 2024 22:08:37 +0200 Subject: [PATCH 118/624] Do not attempt to free init_dev if it's pointing to the const device itself. --- src/device.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device.c b/src/device.c index b9dba8fd6..be39847e6 100644 --- a/src/device.c +++ b/src/device.c @@ -186,7 +186,7 @@ device_add_common(const device_t *dev, void *p, void *params, int inst) devices[c] = NULL; device_priv[c] = NULL; - if (init_dev != NULL) + if ((init_dev != NULL) && (init_dev != (device_t *) dev)) free(init_dev); return (NULL); From 27c8bdd57e0bace39fb2c48db98799987b85e536 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 30 Jun 2024 22:18:15 -0400 Subject: [PATCH 119/624] Less dummy devices --- src/device.c | 28 ++++++++++++++++++++++ src/device/isamem.c | 16 +------------ src/device/isartc.c | 26 +++++---------------- src/disk/hdc.c | 32 ++----------------------- src/floppy/fdc.c | 46 +++++++----------------------------- src/include/86box/device.h | 3 +++ src/network/network.c | 32 ++----------------------- src/scsi/scsi.c | 16 +------------ src/sound/midi.c | 48 ++++++++------------------------------ src/sound/sound.c | 32 ++----------------------- src/video/vid_table.c | 31 ++---------------------- 11 files changed, 66 insertions(+), 244 deletions(-) diff --git a/src/device.c b/src/device.c index be39847e6..cf0764946 100644 --- a/src/device.c +++ b/src/device.c @@ -843,3 +843,31 @@ device_context_get_device(void) { return device_current.dev; } + +const device_t device_none = { + .name = "None", + .internal_name = "none", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t device_internal = { + .name = "Internal", + .internal_name = "internal", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/device/isamem.c b/src/device/isamem.c index 278bc49a5..d6fa04a64 100644 --- a/src/device/isamem.c +++ b/src/device/isamem.c @@ -2040,25 +2040,11 @@ static const device_t iab_device = { }; #endif -static const device_t isa_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - static const struct { const device_t *dev; } boards[] = { // clang-format off - { &isa_none_device }, + { &device_none }, // XT Ram Expansion Cards { &ibmxt_32k_device }, { &ibmxt_64k_device }, diff --git a/src/device/isartc.c b/src/device/isartc.c index fea108426..7721d9885 100644 --- a/src/device/isartc.c +++ b/src/device/isartc.c @@ -752,30 +752,16 @@ const device_t vendex_xt_rtc_onboard_device = { .config = NULL }; -static const device_t isartc_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - static const struct { const device_t *dev; } boards[] = { // clang-format off - { &isartc_none_device }, - { &ev170_device }, - { &pii147_device }, - { &p5pak_device }, - { &a6pak_device }, - { NULL }, + { &device_none }, + { &ev170_device }, + { &pii147_device }, + { &p5pak_device }, + { &a6pak_device }, + { NULL }, // clang-format on }; diff --git a/src/disk/hdc.c b/src/disk/hdc.c index bb7adcd67..ee25e8574 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -50,40 +50,12 @@ hdc_log(const char *fmt, ...) # define hdc_log(fmt, ...) #endif -static const device_t hdc_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -static const device_t hdc_internal_device = { - .name = "Internal", - .internal_name = "internal", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - static const struct { const device_t *device; } controllers[] = { // clang-format off - { &hdc_none_device }, - { &hdc_internal_device }, + { &device_none }, + { &device_internal }, { &st506_xt_xebec_device }, { &st506_xt_wdxt_gen_device }, { &st506_xt_dtc5150x_device }, diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 49171ae30..7c7549ed7 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -97,49 +97,21 @@ fdc_log(const char *fmt, ...) # define fdc_log(fmt, ...) #endif -const device_t fdc_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -const device_t fdc_internal_device = { - .name = "Internal", - .internal_name = "internal", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - typedef const struct { const device_t *device; } fdc_cards_t; static fdc_cards_t fdc_cards[] = { // clang-format off - { &fdc_none_device }, - { &fdc_internal_device }, - { &fdc_xt_device }, - { &fdc_at_device }, - { &fdc_b215_device }, - { &fdc_pii151b_device }, - { &fdc_pii158b_device }, - { &fdc_monster_device }, - { NULL } + { &device_none }, + { &device_internal }, + { &fdc_xt_device }, + { &fdc_at_device }, + { &fdc_b215_device }, + { &fdc_pii151b_device }, + { &fdc_pii158b_device }, + { &fdc_monster_device }, + { NULL } // clang-format on }; diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 30ce1c093..1a2a6fd8b 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -244,6 +244,9 @@ extern const char *device_get_internal_name(const device_t *dev); extern int machine_get_config_int(char *s); extern char *machine_get_config_string(char *s); +extern const device_t device_none; +extern const device_t device_internal; + #ifdef __cplusplus } #endif diff --git a/src/network/network.c b/src/network/network.c index 10f81b938..c972e80da 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -77,37 +77,9 @@ # include #endif -static const device_t net_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = NET_TYPE_NONE, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -static const device_t net_internal_device = { - .name = "Internal", - .internal_name = "internal", - .flags = 0, - .local = NET_TYPE_NONE, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - static const device_t *net_cards[] = { - &net_none_device, - &net_internal_device, + &device_none, + &device_internal, &threec501_device, &threec503_device, &pcnet_am79c960_device, diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index 23c3e65f3..591ef2aa3 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -47,27 +47,13 @@ double scsi_bus_speed[SCSI_BUS_MAX] = { 0.0, 0.0, 0.0, 0.0 }; static uint8_t next_scsi_bus = 0; -static const device_t scsi_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - typedef const struct { const device_t *device; } SCSI_CARD; static SCSI_CARD scsi_cards[] = { // clang-format off - { &scsi_none_device, }, + { &device_none, }, { &aha154xa_device, }, { &aha154xb_device, }, { &aha154xc_device, }, diff --git a/src/sound/midi.c b/src/sound/midi.c index bb107acbf..18fad1886 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -71,59 +71,31 @@ typedef struct const device_t *device; } MIDI_OUT_DEVICE, MIDI_IN_DEVICE; -static const device_t midi_out_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - static const MIDI_OUT_DEVICE devices[] = { // clang-format off - { &midi_out_none_device }, + { &device_none }, #ifdef USE_FLUIDSYNTH - { &fluidsynth_device }, + { &fluidsynth_device }, #endif #ifdef USE_MUNT - { &mt32_old_device }, - { &mt32_new_device }, - { &cm32l_device }, - { &cm32ln_device }, + { &mt32_old_device }, + { &mt32_new_device }, + { &cm32l_device }, + { &cm32ln_device }, #endif #ifdef USE_RTMIDI - { &rtmidi_output_device }, + { &rtmidi_output_device }, #endif #if defined(DEV_BRANCH) && defined(USE_OPL4ML) - { &opl4_midi_device }, + { &opl4_midi_device }, #endif - { NULL } + { NULL } // clang-format on }; -static const device_t midi_in_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - static const MIDI_IN_DEVICE midi_in_devices[] = { // clang-format off - { &midi_in_none_device }, + { &device_none }, #ifdef USE_RTMIDI { &rtmidi_input_device }, #endif diff --git a/src/sound/sound.c b/src/sound/sound.c index 794e21359..4820c45f9 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -96,38 +96,10 @@ static void *filter_cd_audio_p = NULL; void (*filter_pc_speaker)(int channel, double *buffer, void *priv) = NULL; void *filter_pc_speaker_p = NULL; -static const device_t sound_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - -static const device_t sound_internal_device = { - .name = "Internal", - .internal_name = "internal", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - static const SOUND_CARD sound_cards[] = { // clang-format off - { &sound_none_device }, - { &sound_internal_device }, + { &device_none }, + { &device_internal }, { &acermagic_s20_device }, { &mirosound_pcm10_device }, { &adlib_device }, diff --git a/src/video/vid_table.c b/src/video/vid_table.c index c99a41544..bcc7d5de8 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -47,38 +47,11 @@ static video_timings_t timing_default = { .type = VIDEO_ISA, .write_b = 8, .writ static int was_reset = 0; -static const device_t vid_none_device = { - .name = "None", - .internal_name = "none", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; -static const device_t vid_internal_device = { - .name = "Internal", - .internal_name = "internal", - .flags = 0, - .local = 0, - .init = NULL, - .close = NULL, - .reset = NULL, - { .available = NULL }, - .speed_changed = NULL, - .force_redraw = NULL, - .config = NULL -}; - static const VIDEO_CARD video_cards[] = { // clang-format off - { &vid_none_device }, - { &vid_internal_device }, + { &device_none }, + { &device_internal }, { &atiega800p_device }, { &mach8_vga_isa_device, VIDEO_FLAG_TYPE_8514 }, { &mach32_isa_device, VIDEO_FLAG_TYPE_8514 }, From 3f14c7f5905a2619cacf1c9203cd87b9bf60762f Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 20 Jul 2024 01:09:42 +0200 Subject: [PATCH 120/624] Chips PCI card fixes (July 20th, 2024) Cleaned up the code and fixed the reset and LFB accesses. NT 4.0 now works with its v2.47 drivers without a soft reset (it used to only with a soft reset originally and, without it, hang with a blank screen upon reaching the GUI). --- src/video/vid_chips_69000.c | 101 ++++++++++++++++++++++++------------ 1 file changed, 69 insertions(+), 32 deletions(-) diff --git a/src/video/vid_chips_69000.c b/src/video/vid_chips_69000.c index fd4ff5c8e..5d41dc4a7 100644 --- a/src/video/vid_chips_69000.c +++ b/src/video/vid_chips_69000.c @@ -161,6 +161,8 @@ typedef struct chips_69000_t { uint8_t st01; } chips_69000_t; +static chips_69000_t *reset_state = NULL; + /* TODO: Probe timings on real hardware. */ static video_timings_t timing_chips = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 1, .read_b = 10, .read_w = 10, .read_l = 10 }; @@ -777,7 +779,7 @@ chips_69000_recalctimings(svga_t *svga) if (!(chips->ext_regs[0x81] & 0x10)) svga->htotal += 5; - + svga->hblank_end_val = ((svga->crtc[3] & 0x1f) | ((svga->crtc[5] & 0x80) ? 0x20 : 0x00)) | (svga->crtc[0x3c] & 0b11000000); svga->hblank_end_mask = 0xff; @@ -980,7 +982,7 @@ chips_69000_process_pixel(chips_69000_t* chips, uint32_t pixel) if (!!(color_key == dest_pixel) == !!(chips->bitblt_running.bitblt.bitblt_control & (1 << 16))) { return; } - + break; } } @@ -1018,7 +1020,7 @@ chips_69000_process_pixel(chips_69000_t* chips, uint32_t pixel) if (!!(color_key == dest_pixel) == !!(chips->bitblt_running.bitblt.bitblt_control & (1 << 16))) { return; } - + break; } } @@ -1191,7 +1193,7 @@ chips_69000_setup_bitblt(chips_69000_t* chips) chips->bitblt_running.mono_bytes_pitch = ((chips->bitblt_running.actual_destination_width + chips->bitblt_running.bitblt.monochrome_source_left_clip + 63) & ~63) / 8; } } - + return; } @@ -1273,7 +1275,7 @@ chips_69000_setup_bitblt(chips_69000_t* chips) do { uint32_t pixel = 0; uint32_t source_addr = chips->bitblt_running.bitblt.source_addr + (chips->bitblt_running.y * chips->bitblt.source_span) + (chips->bitblt_running.x * chips->bitblt_running.bytes_per_pixel); - + switch (chips->bitblt_running.bytes_per_pixel) { case 1: /* 8 bits-per-pixel. */ { @@ -1423,7 +1425,7 @@ chips_69000_bitblt_write(chips_69000_t* chips, uint8_t data) { source_pixel |= (chips->bitblt_running.bytes_port[1] << 8); if (chips->bitblt_running.bytes_per_pixel >= 3) source_pixel |= (chips->bitblt_running.bytes_port[2] << 16); - + chips->bitblt_running.bytes_in_line_written += chips->bitblt_running.bytes_per_pixel; chips_69000_process_pixel(chips, source_pixel); @@ -1446,7 +1448,7 @@ chips_69000_bitblt_write(chips_69000_t* chips, uint8_t data) { chips->bitblt_running.count_x = 0; chips->bitblt_running.x = 0; - + if (chips->bitblt_running.count_y >= chips->bitblt_running.actual_destination_height) { chips_69000_bitblt_interrupt(chips); return; @@ -1498,7 +1500,7 @@ chips_69000_read_ext_reg(chips_69000_t* chips) val = chips->ext_regs[index]; if (!(chips->ext_regs[0x62] & 0x8)) val = (val & ~8) | (i2c_gpio_get_scl(chips->i2c) << 3); - + if (!(chips->ext_regs[0x62] & 0x4)) val = (val & ~4) | (i2c_gpio_get_sda(chips->i2c) << 2); @@ -1561,12 +1563,12 @@ chips_69000_write_ext_reg(chips_69000_t* chips, uint8_t val) scl = !!(val & 8); else scl = i2c_gpio_get_scl(chips->i2c); - + if (chips->ext_regs[0x62] & 0x4) sda = !!(val & 4); else scl = i2c_gpio_get_sda(chips->i2c); - + i2c_gpio_set(chips->i2c, scl, sda); chips->ext_regs[chips->ext_index] = val & 0x9F; @@ -1742,7 +1744,7 @@ chips_69000_out(uint16_t addr, uint8_t val, void *p) case 0x3B7: case 0x3D7: return chips_69000_write_ext_reg(chips, val); - + } svga_out(addr, val, svga); } @@ -1901,17 +1903,15 @@ chips_69000_pci_write(int func, int addr, uint8_t val, void *p) if (chips->pci_conf_status & PCI_COMMAND_MEM) { mem_mapping_enable(&chips->svga.mapping); if (chips->linear_mapping.base) - mem_mapping_enable(&chips->linear_mapping); + mem_mapping_set_addr(&chips->linear_mapping, chips->linear_mapping.base, (1 << 24)); } break; } case 0x13: { - if (!chips->linear_mapping.enable) { - chips->linear_mapping.base = val << 24; - break; - } - mem_mapping_set_addr(&chips->linear_mapping, val << 24, (1 << 24)); + chips->linear_mapping.base = val << 24; + if (chips->linear_mapping.base) + mem_mapping_set_addr(&chips->linear_mapping, chips->linear_mapping.base, (1 << 24)); break; } case 0x3c: @@ -2093,7 +2093,7 @@ chips_69000_writeb_mmio(uint32_t addr, uint8_t val, chips_69000_t* chips) chips->mem_regs_b[addr & 0xF] = val; break; } - + } chips->mem_regs_b[addr & 0xF] = val; break; @@ -2213,7 +2213,7 @@ chips_69000_readw_linear(uint32_t addr, void *p) if (addr & 0x800000) { if (addr & 0x400000) return bswap16(chips_69000_readw_mmio(addr, chips)); - + return bswap16(svga_readw_linear(addr & 0x1FFFFF, p)); } @@ -2232,7 +2232,7 @@ chips_69000_readl_linear(uint32_t addr, void *p) if (addr & 0x800000) { if (addr & 0x400000) return bswap32(chips_69000_readl_mmio(addr, chips)); - + return bswap32(svga_readl_linear(addr & 0x1FFFFF, p)); } @@ -2290,7 +2290,7 @@ chips_69000_vblank_start(svga_t *svga) chips_69000_t *chips = (chips_69000_t *) svga->priv; chips->mem_regs[1] |= 1 << 14; chips->svga.crtc[0x40] &= ~0x80; - + chips_69000_interrupt(chips); } @@ -2307,13 +2307,13 @@ chips_69000_hwcursor_draw_64x64(svga_t *svga, int displine) dat[1] = bswap64(*(uint64_t *) (&svga->vram[svga->hwcursor_latch.addr])); dat[0] = bswap64(*(uint64_t *) (&svga->vram[svga->hwcursor_latch.addr + 8])); svga->hwcursor_latch.addr += 16; - + for (uint8_t x = 0; x < 64; x++) { if (!(dat[1] & (1ULL << 63))) svga->monitor->target_buffer->line[displine][(offset + svga->x_add) & 2047] = (dat[0] & (1ULL << 63)) ? svga_lookup_lut_ram(svga, chips->cursor_pallook[5]) : svga_lookup_lut_ram(svga, chips->cursor_pallook[4]); else if (dat[0] & (1ULL << 63)) svga->monitor->target_buffer->line[displine][(offset + svga->x_add) & 2047] ^= 0xffffff; - + offset++; dat[0] <<= 1; dat[1] <<= 1; @@ -2430,14 +2430,48 @@ chips_69000_line_compare(svga_t* svga) if (chips->ext_regs[0x81] & 0xF) { return 0; } - + return 1; } +static void +chips_69000_disable_handlers(chips_69000_t *chips) +{ + io_removehandler(0x03c0, 0x0020, chips_69000_in, NULL, NULL, chips_69000_out, NULL, NULL, chips); + + mem_mapping_disable(&chips->linear_mapping); + mem_mapping_disable(&chips->svga.mapping); + if (!chips->on_board) + mem_mapping_disable(&chips->bios_rom.mapping); + + /* Save all the mappings and the timers because they are part of linked lists. */ + reset_state->linear_mapping = chips->linear_mapping; + reset_state->svga.mapping = chips->svga.mapping; + reset_state->bios_rom.mapping = chips->bios_rom.mapping; + + reset_state->decrement_timer = chips->decrement_timer; + reset_state->svga.timer = chips->svga.timer; + reset_state->svga.timer8514 = chips->svga.timer8514; +} + +static void +chips_69000_reset(void *priv) +{ + chips_69000_t *chips = (chips_69000_t *) priv; + + if (reset_state != NULL) { + chips_69000_disable_handlers(chips); + reset_state->slot = chips->slot; + + *chips = *reset_state; + } +} + static void * chips_69000_init(const device_t *info) { chips_69000_t *chips = calloc(1, sizeof(chips_69000_t)); + reset_state = calloc(1, sizeof(chips_69000_t)); /* Appears to have an odd VBIOS size. */ if (!info->local) { @@ -2450,7 +2484,7 @@ chips_69000_init(const device_t *info) svga_init(info, &chips->svga, chips, 1 << 21, /*2048kb*/ chips_69000_recalctimings, chips_69000_in, chips_69000_out, - NULL, + chips_69000_hwcursor_draw, NULL); io_sethandler(0x03c0, 0x0020, chips_69000_in, NULL, NULL, chips_69000_out, NULL, NULL, chips); @@ -2459,9 +2493,7 @@ chips_69000_init(const device_t *info) chips->svga.bpp = 8; chips->svga.miscout = 1; - chips->svga.recalctimings_ex = chips_69000_recalctimings; chips->svga.vblank_start = chips_69000_vblank_start; - chips->svga.hwcursor_draw = chips_69000_hwcursor_draw; chips->svga.getclock = chips_69000_getclock; chips->svga.conv_16to32 = chips_69000_conv_16to32; chips->svga.line_compare = chips_69000_line_compare; @@ -2471,7 +2503,7 @@ chips_69000_init(const device_t *info) chips->quit = 0; chips->engine_active = 0; chips->on_board = !!(info->local); - + chips->svga.packed_chain4 = 1; timer_add(&chips->decrement_timer, chips_69000_decrement_timer, chips, 0); @@ -2479,9 +2511,11 @@ chips_69000_init(const device_t *info) chips->i2c = i2c_gpio_init("ddc_chips_69000"); chips->ddc = ddc_init(i2c_gpio_get_bus(chips->i2c)); - + chips->flat_panel_regs[0x01] = 1; + *reset_state = *chips; + return chips; } @@ -2503,6 +2537,9 @@ chips_69000_close(void *p) i2c_gpio_close(chips->i2c); svga_close(&chips->svga); + free(reset_state); + reset_state = NULL; + free(chips); } @@ -2519,7 +2556,7 @@ chips_69000_force_redraw(void *p) { chips_69000_t *chips = (chips_69000_t *) p; - chips->svga.fullchange = changeframecount; + chips->svga.fullchange = chips->svga.monitor->mon_changeframecount; } const device_t chips_69000_device = { @@ -2529,7 +2566,7 @@ const device_t chips_69000_device = { .local = 0, .init = chips_69000_init, .close = chips_69000_close, - .reset = NULL, + .reset = chips_69000_reset, { .available = chips_69000_available }, .speed_changed = chips_69000_speed_changed, .force_redraw = chips_69000_force_redraw, @@ -2543,7 +2580,7 @@ const device_t chips_69000_onboard_device = { .local = 1, .init = chips_69000_init, .close = chips_69000_close, - .reset = NULL, + .reset = chips_69000_reset, { .available = chips_69000_available }, .speed_changed = chips_69000_speed_changed, .force_redraw = chips_69000_force_redraw, From 322adf1c2be2936cbf4b96c212f2f9530fd35add Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 29 Jun 2024 19:43:42 -0400 Subject: [PATCH 121/624] Initial underlying code support for more than 2 video cards --- src/86box.c | 17 ++++++++++------- src/config.c | 22 ++++++++++++++-------- src/include/86box/86box.h | 3 ++- src/qt/qt_main.cpp | 8 +++++--- src/qt/qt_settingsdisplay.cpp | 14 +++++++++----- src/qt/qt_settingsdisplay.hpp | 4 +++- src/unix/unix.c | 5 +++-- src/video/vid_table.c | 14 ++++++++------ 8 files changed, 54 insertions(+), 33 deletions(-) diff --git a/src/86box.c b/src/86box.c index 16d7cf3de..5e1f58413 100644 --- a/src/86box.c +++ b/src/86box.c @@ -179,7 +179,7 @@ int postcard_enabled = 0; /* (C) enable int unittester_enabled = 0; /* (C) enable unit tester device */ int isamem_type[ISAMEM_MAX] = { 0, 0, 0, 0 }; /* (C) enable ISA mem cards */ int isartc_type = 0; /* (C) enable ISA RTC card */ -int gfxcard[2] = { 0, 0 }; /* (C) graphics/video card */ +int gfxcard[GFXCARD_MAX] = { 0, 0 }; /* (C) graphics/video card */ int show_second_monitors = 1; /* (C) show non-primary monitors */ int sound_is_float = 1; /* (C) sound uses FP values */ int voodoo_enabled = 0; /* (C) video option */ @@ -1004,12 +1004,15 @@ pc_init_modules(void) } } - if (!video_card_available(gfxcard[1])) { - char tempc[512] = { 0 }; - device_get_name(video_card_getdevice(gfxcard[1]), 0, tempc); - swprintf(temp, sizeof_w(temp), plat_get_string(STRING_HW_NOT_AVAILABLE_VIDEO2), tempc); - ui_msgbox_header(MBX_INFO, plat_get_string(STRING_HW_NOT_AVAILABLE_TITLE), temp); - gfxcard[1] = 0; + // TODO + for (uint8_t i = 1; i < GFXCARD_MAX; i ++) { + if (!video_card_available(gfxcard[i])) { + char tempc[512] = { 0 }; + device_get_name(video_card_getdevice(gfxcard[i]), 0, tempc); + swprintf(temp, sizeof_w(temp), plat_get_string(STRING_HW_NOT_AVAILABLE_VIDEO2), tempc); + ui_msgbox_header(MBX_INFO, plat_get_string(STRING_HW_NOT_AVAILABLE_TITLE), temp); + gfxcard[i] = 0; + } } atfullspeed = 0; diff --git a/src/config.c b/src/config.c index 8a837cf56..43555a704 100644 --- a/src/config.c +++ b/src/config.c @@ -459,10 +459,13 @@ load_video(void) show_second_monitors = !!ini_section_get_int(cat, "show_second_monitors", 1); video_fullscreen_scale_maximized = !!ini_section_get_int(cat, "video_fullscreen_scale_maximized", 0); - p = ini_section_get_string(cat, "gfxcard_2", NULL); - if (!p) - p = "none"; - gfxcard[1] = video_get_video_from_internal_name(p); + // TODO + for (uint8_t i = 1; i < GFXCARD_MAX; i ++) { + p = ini_section_get_string(cat, "gfxcard_2", NULL); + if (!p) + p = "none"; + gfxcard[i] = video_get_video_from_internal_name(p); + } } /* Load "Input Devices" section. */ @@ -2010,10 +2013,13 @@ save_video(void) else ini_section_set_int(cat, "xga", xga_standalone_enabled); - if (gfxcard[1] == 0) - ini_section_delete_var(cat, "gfxcard_2"); - else - ini_section_set_string(cat, "gfxcard_2", video_get_internal_name(gfxcard[1])); + // TODO + for (uint8_t i = 1; i < GFXCARD_MAX; i ++) { + if (gfxcard[i] == 0) + ini_section_delete_var(cat, "gfxcard_2"); + else + ini_section_set_string(cat, "gfxcard_2", video_get_internal_name(gfxcard[i])); + } if (show_second_monitors == 1) ini_section_delete_var(cat, "show_second_monitors"); diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index 0d57b4cae..c91b8d406 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -21,6 +21,7 @@ #define EMU_86BOX_H /* Configuration values. */ +#define GFXCARD_MAX 2 #define SERIAL_MAX 7 #define PARALLEL_MAX 4 #define SCREEN_RES_X 640 @@ -124,7 +125,7 @@ extern int force_43; /* (C) video */ extern int video_filter_method; /* (C) video */ extern int video_vsync; /* (C) video */ extern int video_framerate; /* (C) video */ -extern int gfxcard[2]; /* (C) graphics/video card */ +extern int gfxcard[GFXCARD_MAX]; /* (C) graphics/video card */ extern char video_shader[512]; /* (C) video */ extern int bugger_enabled; /* (C) enable ISAbugger */ extern int novell_keycard_enabled; /* (C) enable Novell NetWare 2.x key card emulation. */ diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index 049a7907b..c39007864 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -145,9 +145,11 @@ main_thread_fn() } is_quit = 1; - if (gfxcard[1]) { - ui_deinit_monitor(1); - std::this_thread::sleep_for(std::chrono::milliseconds(500)); + for (uint8_t i = 1; i < GFXCARD_MAX; i ++) { + if (gfxcard[i]) { + ui_deinit_monitor(i); + std::this_thread::sleep_for(std::chrono::milliseconds(500)); + } } QTimer::singleShot(0, QApplication::instance(), []() { QApplication::processEvents(); QApplication::instance()->quit(); }); } diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index 6969a1c2c..db8c30e5d 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -36,8 +36,8 @@ SettingsDisplay::SettingsDisplay(QWidget *parent) { ui->setupUi(this); - videoCard[0] = gfxcard[0]; - videoCard[1] = gfxcard[1]; + for (uint8_t i = 0; i < GFXCARD_MAX; i ++) + videoCard[i] = gfxcard[i]; onCurrentMachineChanged(machine); } @@ -50,7 +50,9 @@ void SettingsDisplay::save() { gfxcard[0] = ui->comboBoxVideo->currentData().toInt(); - gfxcard[1] = ui->comboBoxVideoSecondary->currentData().toInt(); + // TODO + for (uint8_t i = 1; i < GFXCARD_MAX; i ++) + gfxcard[i] = ui->comboBoxVideoSecondary->currentData().toInt(); voodoo_enabled = ui->checkBoxVoodoo->isChecked() ? 1 : 0; ibm8514_standalone_enabled = ui->checkBox8514->isChecked() ? 1 : 0; xga_standalone_enabled = ui->checkBoxXga->isChecked() ? 1 : 0; @@ -103,8 +105,10 @@ SettingsDisplay::onCurrentMachineChanged(int machineId) ui->pushButtonConfigureSecondary->setEnabled(true); } ui->comboBoxVideo->setCurrentIndex(selectedRow); - if (gfxcard[1] == 0) - ui->pushButtonConfigureSecondary->setEnabled(false); + // TODO + for (uint8_t i = 1; i < GFXCARD_MAX; i ++) + if (gfxcard[i] == 0) + ui->pushButtonConfigureSecondary->setEnabled(false); } void diff --git a/src/qt/qt_settingsdisplay.hpp b/src/qt/qt_settingsdisplay.hpp index 8331bbb5b..6297f7eae 100644 --- a/src/qt/qt_settingsdisplay.hpp +++ b/src/qt/qt_settingsdisplay.hpp @@ -3,6 +3,8 @@ #include +#define VIDEOCARD_MAX 2 + namespace Ui { class SettingsDisplay; } @@ -36,7 +38,7 @@ private slots: private: Ui::SettingsDisplay *ui; int machineId = 0; - int videoCard[2] = { 0, 0 }; + int videoCard[VIDEOCARD_MAX] = { 0, 0 }; }; #endif // QT_SETTINGSDISPLAY_HPP diff --git a/src/unix/unix.c b/src/unix/unix.c index e08b82133..1fe477a23 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -1168,7 +1168,7 @@ monitor_thread(void *param) #endif } -extern int gfxcard[2]; +extern int gfxcard[GFXCARD_MAX]; int main(int argc, char **argv) { @@ -1186,7 +1186,8 @@ main(int argc, char **argv) return 6; } - gfxcard[1] = 0; + for (uint8_t i = 1; i < GFXCARD_MAX; i++) + gfxcard[i] = 0; eventthread = SDL_ThreadID(); blitmtx = SDL_CreateMutex(); if (!blitmtx) { diff --git a/src/video/vid_table.c b/src/video/vid_table.c index c99a41544..40c5e1110 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -349,12 +349,14 @@ video_reset(int card) monitor_index_global = 0; loadfont("roms/video/mda/mda.rom", 0); - if ((card != VID_NONE) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY) && - (gfxcard[1] > VID_INTERNAL) && device_is_valid(video_card_getdevice(gfxcard[1]), machine)) { - video_monitor_init(1); - monitor_index_global = 1; - device_add(video_cards[gfxcard[1]].device); - monitor_index_global = 0; + for (uint8_t i = 1; i < GFXCARD_MAX; i ++) { + if ((card != VID_NONE) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY) && + (gfxcard[i] > VID_INTERNAL) && device_is_valid(video_card_getdevice(gfxcard[i]), machine)) { + video_monitor_init(i); + monitor_index_global = 1; + device_add(video_cards[gfxcard[i]].device); + monitor_index_global = 0; + } } /* Do not initialize internal cards here. */ From 20439f24fadf0f7a727cef4a2bc9c477434c9cce Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 29 Jun 2024 19:11:59 -0400 Subject: [PATCH 122/624] Cleanups in qt_settingsports.hpp --- src/qt/qt_settingsports.cpp | 21 +++++++++------------ src/qt/qt_settingsports.hpp | 6 +----- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index f6486aa9a..2547c2ab4 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -66,18 +66,17 @@ SettingsPorts::SettingsPorts(QWidget *parent) } for (int i = 0; i < SERIAL_MAX; i++) { - auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); + auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); + auto *checkBoxPass = findChild(QString("checkBoxSerialPassThru%1").arg(i + 1)); if (checkBox != NULL) checkBox->setChecked(com_ports[i].enabled > 0); + if (checkBoxPass != NULL) + checkBoxPass->setChecked(serial_passthrough_enabled[i]); } - ui->checkBoxSerialPassThru1->setChecked(serial_passthrough_enabled[0]); ui->pushButtonSerialPassThru1->setEnabled(serial_passthrough_enabled[0]); - ui->checkBoxSerialPassThru2->setChecked(serial_passthrough_enabled[1]); ui->pushButtonSerialPassThru2->setEnabled(serial_passthrough_enabled[1]); - ui->checkBoxSerialPassThru3->setChecked(serial_passthrough_enabled[2]); ui->pushButtonSerialPassThru3->setEnabled(serial_passthrough_enabled[2]); - ui->checkBoxSerialPassThru4->setChecked(serial_passthrough_enabled[3]); ui->pushButtonSerialPassThru4->setEnabled(serial_passthrough_enabled[3]); } @@ -90,7 +89,7 @@ void SettingsPorts::save() { for (int i = 0; i < PARALLEL_MAX; i++) { - auto *cbox = findChild(QString("comboBoxLpt%1").arg(i + 1)); + auto *cbox = findChild(QString("comboBoxLpt%1").arg(i + 1)); auto *checkBox = findChild(QString("checkBoxParallel%1").arg(i + 1)); if (cbox != NULL) lpt_ports[i].device = cbox->currentData().toInt(); @@ -99,15 +98,13 @@ SettingsPorts::save() } for (int i = 0; i < SERIAL_MAX; i++) { - auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); + auto *checkBox = findChild(QString("checkBoxSerial%1").arg(i + 1)); + auto *checkBoxPass = findChild(QString("checkBoxSerialPassThru%1").arg(i + 1)); if (checkBox != NULL) com_ports[i].enabled = checkBox->isChecked() ? 1 : 0; + if (checkBoxPass != NULL) + serial_passthrough_enabled[i] = checkBoxPass->isChecked(); } - - serial_passthrough_enabled[0] = ui->checkBoxSerialPassThru1->isChecked(); - serial_passthrough_enabled[1] = ui->checkBoxSerialPassThru2->isChecked(); - serial_passthrough_enabled[2] = ui->checkBoxSerialPassThru3->isChecked(); - serial_passthrough_enabled[3] = ui->checkBoxSerialPassThru4->isChecked(); } void diff --git a/src/qt/qt_settingsports.hpp b/src/qt/qt_settingsports.hpp index a5129d35f..fb811f771 100644 --- a/src/qt/qt_settingsports.hpp +++ b/src/qt/qt_settingsports.hpp @@ -37,15 +37,11 @@ private slots: void on_pushButtonSerialPassThru1_clicked(); private slots: - void on_checkBoxSerialPassThru1_clicked(bool checked); - -private slots: + void on_checkBoxParallel4_stateChanged(int arg1); void on_checkBoxParallel3_stateChanged(int arg1); void on_checkBoxParallel2_stateChanged(int arg1); void on_checkBoxParallel1_stateChanged(int arg1); - void on_checkBoxParallel4_stateChanged(int arg1); - private: Ui::SettingsPorts *ui; }; From de21053e5d54b5f1218a3af2f69cbe3e6eb01575 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 29 Jun 2024 19:11:37 -0400 Subject: [PATCH 123/624] Add logic for serial 5-7 in QT UI --- src/qt/qt_settingsports.cpp | 43 +++++++++++++++++++++++++++++++++++++ src/qt/qt_settingsports.hpp | 24 +++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/src/qt/qt_settingsports.cpp b/src/qt/qt_settingsports.cpp index 2547c2ab4..01d7d3f9f 100644 --- a/src/qt/qt_settingsports.cpp +++ b/src/qt/qt_settingsports.cpp @@ -78,6 +78,11 @@ SettingsPorts::SettingsPorts(QWidget *parent) ui->pushButtonSerialPassThru2->setEnabled(serial_passthrough_enabled[1]); ui->pushButtonSerialPassThru3->setEnabled(serial_passthrough_enabled[2]); ui->pushButtonSerialPassThru4->setEnabled(serial_passthrough_enabled[3]); +#if 0 + ui->pushButtonSerialPassThru5->setEnabled(serial_passthrough_enabled[4]); + ui->pushButtonSerialPassThru6->setEnabled(serial_passthrough_enabled[5]); + ui->pushButtonSerialPassThru7->setEnabled(serial_passthrough_enabled[6]); +#endif } SettingsPorts::~SettingsPorts() @@ -155,6 +160,24 @@ SettingsPorts::on_pushButtonSerialPassThru4_clicked() DeviceConfig::ConfigureDevice(&serial_passthrough_device, 4, qobject_cast(Settings::settings)); } +void +SettingsPorts::on_pushButtonSerialPassThru5_clicked() +{ + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 5, qobject_cast(Settings::settings)); +} + +void +SettingsPorts::on_pushButtonSerialPassThru6_clicked() +{ + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 6, qobject_cast(Settings::settings)); +} + +void +SettingsPorts::on_pushButtonSerialPassThru7_clicked() +{ + DeviceConfig::ConfigureDevice(&serial_passthrough_device, 7, qobject_cast(Settings::settings)); +} + void SettingsPorts::on_checkBoxSerialPassThru1_clicked(bool checked) { @@ -178,3 +201,23 @@ SettingsPorts::on_checkBoxSerialPassThru4_clicked(bool checked) { ui->pushButtonSerialPassThru4->setEnabled(checked); } + +#if 0 +void +SettingsPorts::on_checkBoxSerialPassThru5_clicked(bool checked) +{ + ui->pushButtonSerialPassThru5->setEnabled(checked); +} + +void +SettingsPorts::on_checkBoxSerialPassThru6_clicked(bool checked) +{ + ui->pushButtonSerialPassThru6->setEnabled(checked); +} + +void +SettingsPorts::on_checkBoxSerialPassThru7_clicked(bool checked) +{ + ui->pushButtonSerialPassThru7->setEnabled(checked); +} +#endif \ No newline at end of file diff --git a/src/qt/qt_settingsports.hpp b/src/qt/qt_settingsports.hpp index fb811f771..1ecb051af 100644 --- a/src/qt/qt_settingsports.hpp +++ b/src/qt/qt_settingsports.hpp @@ -15,6 +15,18 @@ public: ~SettingsPorts(); void save(); + +#if 0 +private slots: + void on_checkBoxSerialPassThru7_clicked(bool checked); + +private slots: + void on_checkBoxSerialPassThru6_clicked(bool checked); + +private slots: + void on_checkBoxSerialPassThru5_clicked(bool checked); +#endif + private slots: void on_checkBoxSerialPassThru4_clicked(bool checked); @@ -24,6 +36,18 @@ private slots: private slots: void on_checkBoxSerialPassThru2_clicked(bool checked); +private slots: + void on_checkBoxSerialPassThru1_clicked(bool checked); + +private slots: + void on_pushButtonSerialPassThru7_clicked(); + +private slots: + void on_pushButtonSerialPassThru6_clicked(); + +private slots: + void on_pushButtonSerialPassThru5_clicked(); + private slots: void on_pushButtonSerialPassThru4_clicked(); From 529cef56e388c69378a7f013b4f608ed1817e9e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Sat, 20 Jul 2024 19:55:47 +0200 Subject: [PATCH 124/624] Revert win_cdrom_ioctl.c to the previous version, fixes regressions. --- src/qt/win_cdrom_ioctl.c | 74 ++++++++-------------------------------- 1 file changed, 15 insertions(+), 59 deletions(-) diff --git a/src/qt/win_cdrom_ioctl.c b/src/qt/win_cdrom_ioctl.c index 510a1143f..ff422bcd2 100644 --- a/src/qt/win_cdrom_ioctl.c +++ b/src/qt/win_cdrom_ioctl.c @@ -30,7 +30,6 @@ #include #include #include -#include #include #define HAVE_STDARG_H #include <86box/86box.h> @@ -327,55 +326,17 @@ plat_cdrom_get_audio_sub(UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, } int -plat_cdrom_get_sector_size(uint32_t sector) +plat_cdrom_get_sector_size(UNUSED(uint32_t sector)) { - /* Sector size returned by Windows is always a power of two, which is pointless. */ - return 2352; -} + long size; + DISK_GEOMETRY dgCDROM; -/* Used EXCLUSIVELY to read raw sectors, not to detect tracks. */ -static int -plat_cdrom_read_scsi_direct(uint32_t sector, uint8_t *buffer) -{ - DWORD unused; - int ret; - typedef struct SCSI_PASS_THROUGH_DIRECT_BUF { - SCSI_PASS_THROUGH_DIRECT spt; - ULONG Filler; - UCHAR SenseBuf[32]; - } SCSI_PASS_THROUGH_DIRECT_BUF; + plat_cdrom_open(); + DeviceIoControl(handle, IOCTL_CDROM_GET_DRIVE_GEOMETRY, NULL, 0, &dgCDROM, sizeof(dgCDROM), (LPDWORD)&size, NULL); + plat_cdrom_close(); - SCSI_PASS_THROUGH_DIRECT_BUF req; - - memset(&req, 0, sizeof(req)); - req.Filler = 0; - req.spt.Length = sizeof(SCSI_PASS_THROUGH_DIRECT); - req.spt.CdbLength = 12; - req.spt.DataIn = SCSI_IOCTL_DATA_IN; - req.spt.SenseInfoOffset = offsetof(SCSI_PASS_THROUGH_DIRECT_BUF, SenseBuf); - req.spt.SenseInfoLength = sizeof(req.SenseBuf); - req.spt.TimeOutValue = 6; - req.spt.DataTransferLength = 2352; - req.spt.DataBuffer = buffer; - - /* Fill in the CDB. */ - req.spt.Cdb[0] = 0xBE; /* READ CD */ - req.spt.Cdb[1] = 0x00; /* DAP = 0, Any Sector Type. */ - req.spt.Cdb[2] = (sector & 0xFF000000) >> 24; - req.spt.Cdb[3] = (sector & 0xFF0000) >> 16; - req.spt.Cdb[4] = (sector & 0xFF00) >> 8; - req.spt.Cdb[5] = (sector & 0xFF); /* Starting Logical Block Address. */ - req.spt.Cdb[6] = 0; - req.spt.Cdb[7] = 0; - req.spt.Cdb[8] = 1; /* Transfer Length. */ - req.spt.Cdb[9] = 0xF8; /* 2352 bytes of data (non-subchannel). */ - req.spt.Cdb[10] = 0; /* No subchannel data. */ - req.spt.Cdb[11] = 0; - - ret = DeviceIoControl(handle, IOCTL_SCSI_PASS_THROUGH_DIRECT, &req, sizeof(req), &req, sizeof(req), &unused, NULL) && req.spt.DataTransferLength == 2352; - - win_cdrom_ioctl_log("plat_cdrom_read_scsi_direct: ret = %d, req.spt.DataTransferLength = %lu\n", ret, req.spt.DataTransferLength); - return ret; + win_cdrom_ioctl_log("BytesPerSector=%d\n", dgCDROM.BytesPerSector); + return dgCDROM.BytesPerSector; } int @@ -390,18 +351,13 @@ plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) if (raw) { win_cdrom_ioctl_log("Raw\n"); /* Raw */ - status = plat_cdrom_read_scsi_direct(sector, buffer); - if (status) { - return 1; - } else { - RAW_READ_INFO in; - in.DiskOffset.LowPart = sector * COOKED_SECTOR_SIZE; - in.DiskOffset.HighPart = 0; - in.SectorCount = 1; - in.TrackMode = CDDA; - status = DeviceIoControl(handle, IOCTL_CDROM_RAW_READ, &in, sizeof(in), - buffer, buflen, (LPDWORD)&size, NULL); - } + RAW_READ_INFO in; + in.DiskOffset.LowPart = sector * COOKED_SECTOR_SIZE; + in.DiskOffset.HighPart = 0; + in.SectorCount = 1; + in.TrackMode = CDDA; + status = DeviceIoControl(handle, IOCTL_CDROM_RAW_READ, &in, sizeof(in), + buffer, buflen, (LPDWORD)&size, NULL); } else { win_cdrom_ioctl_log("Cooked\n"); /* Cooked */ From 05e7d9239c8c39347ccba800580d4c16e5cc46c1 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 20 Jul 2024 01:14:35 -0400 Subject: [PATCH 125/624] Standardize fdc_type into fdc_current Also make it into an array --- src/config.c | 10 ++--- src/floppy/fdc.c | 6 +-- src/include/86box/config.h | 2 +- src/include/86box/fdc.h | 2 +- src/include/86box/fdc_ext.h | 2 +- src/machine/m_at.c | 4 +- src/machine/m_at_286_386sx.c | 56 +++++++++++------------ src/machine/m_at_386dx_486.c | 57 ++++++++++++------------ src/machine/m_at_commodore.c | 2 +- src/machine/m_at_compaq.c | 2 +- src/machine/m_at_socket4.c | 4 +- src/machine/m_at_socket5.c | 4 +- src/machine/m_at_t3100e.c | 2 +- src/machine/m_elt.c | 2 +- src/machine/m_ps2_mca.c | 2 +- src/machine/m_tandy.c | 2 +- src/machine/m_v86p.c | 2 +- src/machine/m_xt.c | 2 +- src/machine/m_xt_compaq.c | 4 +- src/machine/m_xt_laserxt.c | 2 +- src/machine/m_xt_olivetti.c | 4 +- src/machine/m_xt_xi8088.c | 2 +- src/machine/m_xt_zenith.c | 6 +-- src/qt/qt_settingsstoragecontrollers.cpp | 4 +- 24 files changed, 92 insertions(+), 93 deletions(-) diff --git a/src/config.c b/src/config.c index 43555a704..4a7bd45fa 100644 --- a/src/config.c +++ b/src/config.c @@ -792,9 +792,9 @@ load_storage_controllers(void) p = ini_section_get_string(cat, "fdc", NULL); #if 1 if (p != NULL) - fdc_type = fdc_card_get_from_internal_name(p); + fdc_current[0] = fdc_card_get_from_internal_name(p); else - fdc_type = FDC_INTERNAL; + fdc_current[0] = FDC_INTERNAL; #else if (p == NULL) { if (machine_has_flags(machine, MACHINE_FDC)) { @@ -807,7 +807,7 @@ load_storage_controllers(void) free_p = 1; } - fdc_type = fdc_card_get_from_internal_name(p); + fdc_current[0] = fdc_card_get_from_internal_name(p); if (free_p) { free(p); @@ -2296,11 +2296,11 @@ save_storage_controllers(void) scsi_card_get_internal_name(scsi_card_current[c])); } - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) ini_section_delete_var(cat, "fdc"); else ini_section_set_string(cat, "fdc", - fdc_card_get_internal_name(fdc_type)); + fdc_card_get_internal_name(fdc_current[0])); ini_section_set_string(cat, "hdc", hdc_get_internal_name(hdc_current)); diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 7c7549ed7..756f43448 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -77,7 +77,7 @@ int lastbyte = 0; int floppymodified[4]; int floppyrate[4]; -int fdc_type = 0; +int fdc_current[2] = { 0, 0 }; #ifdef ENABLE_FDC_LOG int fdc_do_log = ENABLE_FDC_LOG; @@ -162,8 +162,8 @@ fdc_card_get_from_internal_name(char *s) void fdc_card_init(void) { - if ((fdc_type > FDC_INTERNAL) && fdc_cards[fdc_type].device) - device_add_inst(fdc_cards[fdc_type].device, 0); + if ((fdc_current[0] > FDC_INTERNAL) && fdc_cards[fdc_current[0]].device) + device_add_inst(fdc_cards[fdc_current[0]].device, 0); } uint8_t diff --git a/src/include/86box/config.h b/src/include/86box/config.h index 8ce6f4cfe..0f596b7ac 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -113,7 +113,7 @@ typedef struct config_t { # endif /* Other peripherals category */ - int fdc_type; /* Floppy disk controller type */ + int fdc_current[2]; /* Floppy disk controller type */ int hdc_current; /* Hard disk controller type */ int hdc; /* Hard disk controller */ int scsi_card; /* SCSI controller */ diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index cee1fed62..a00f59cd6 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -22,7 +22,7 @@ #ifndef EMU_FDC_H #define EMU_FDC_H -extern int fdc_type; +extern int fdc_current[2]; #define FDC_PRIMARY_ADDR 0x03f0 #define FDC_PRIMARY_IRQ 6 diff --git a/src/include/86box/fdc_ext.h b/src/include/86box/fdc_ext.h index 2c46d0704..2467b4901 100644 --- a/src/include/86box/fdc_ext.h +++ b/src/include/86box/fdc_ext.h @@ -22,7 +22,7 @@ #ifndef EMU_FDC_EXT_H #define EMU_FDC_EXT_H -extern int fdc_type; +extern int fdc_current[2]; /* Controller types. */ #define FDC_NONE 0 diff --git a/src/machine/m_at.c b/src/machine/m_at.c index 9fc53ebcd..7b133a822 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -105,7 +105,7 @@ machine_at_ibm_common_init(const machine_t *model) mem_remap_top(384); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); } @@ -252,7 +252,7 @@ machine_at_siemens_init(const machine_t *model) mem_remap_top(384); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index a1c3d7772..9e9186040 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -59,7 +59,7 @@ machine_at_mr286_init(const machine_t *model) machine_at_common_ide_init(model); device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -70,7 +70,7 @@ machine_at_headland_common_init(int type) { device_add(&keyboard_at_ami_device); - if ((type != 2) && (fdc_type == FDC_INTERNAL)) + if ((type != 2) && (fdc_current[0] == FDC_INTERNAL)) device_add(&fdc_at_device); if (type == 2) @@ -137,7 +137,7 @@ machine_at_quadt286_init(const machine_t *model) machine_at_common_init(model); device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&headland_gc10x_device); @@ -160,7 +160,7 @@ machine_at_quadt386sx_init(const machine_t *model) machine_at_common_init(model); device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&headland_gc10x_device); @@ -183,7 +183,7 @@ machine_at_neat_init(const machine_t *model) device_add(&neat_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -204,7 +204,7 @@ machine_at_neat_ami_init(const machine_t *model) device_add(&neat_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&keyboard_at_ami_device); @@ -226,7 +226,7 @@ machine_at_px286_init(const machine_t *model) machine_at_common_init(model); device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&neat_device); @@ -248,7 +248,7 @@ machine_at_micronics386_init(const machine_t *model) machine_at_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -284,7 +284,7 @@ machine_at_scatsx_init(const machine_t *model) device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&scat_sx_device); @@ -303,7 +303,7 @@ machine_at_award286_init(const machine_t *model) machine_at_scat_init(model, 0, 1); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&ide_isa_device); @@ -324,7 +324,7 @@ machine_at_gdc212m_init(const machine_t *model) machine_at_scat_init(model, 0, 1); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&ide_isa_device); @@ -365,7 +365,7 @@ machine_at_senor_scat286_init(const machine_t *model) machine_at_scat_init(model, 0, 1); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -386,7 +386,7 @@ machine_at_super286c_init(const machine_t *model) device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&neat_device); @@ -407,7 +407,7 @@ machine_at_super286tr_init(const machine_t *model) machine_at_scat_init(model, 0, 1); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -426,7 +426,7 @@ machine_at_spc4200p_init(const machine_t *model) machine_at_scat_init(model, 0, 1); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&ide_isa_device); @@ -448,7 +448,7 @@ machine_at_spc4216p_init(const machine_t *model) machine_at_scat_init(model, 1, 1); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -471,7 +471,7 @@ machine_at_spc4620p_init(const machine_t *model) machine_at_scat_init(model, 1, 1); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&ide_isa_device); @@ -508,7 +508,7 @@ machine_at_deskmaster286_init(const machine_t *model) machine_at_scat_init(model, 0, 1); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&ide_isa_device); @@ -533,7 +533,7 @@ machine_at_shuttle386sx_init(const machine_t *model) device_add(&intel_82335_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -557,7 +557,7 @@ machine_at_adi386sx_init(const machine_t *model) device_add(&intel_82335_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -603,7 +603,7 @@ machine_at_cmdsl386sx16_init(const machine_t *model) device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&neat_device); @@ -624,7 +624,7 @@ machine_at_scamp_common_init(const machine_t *model, int is_ps2) else device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&vlsi_scamp_device); @@ -699,7 +699,7 @@ machine_at_awardsx_init(const machine_t *model) device_add(&opti291_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -718,7 +718,7 @@ machine_at_acer100t_init(const machine_t *model) machine_at_ps2_ide_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&ali1409_device); @@ -896,7 +896,7 @@ machine_at_pc8_init(const machine_t *model) machine_at_common_init(model); device_add(&keyboard_at_ncr_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -921,7 +921,7 @@ machine_at_3302_init(const machine_t *model) machine_at_common_ide_init(model); device_add(&neat_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); if (gfxcard[0] == VID_INTERNAL) @@ -953,7 +953,7 @@ machine_at_pc916sx_init(const machine_t *model) device_add(&keyboard_at_ncr_device); mem_remap_top(384); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -975,7 +975,7 @@ machine_at_m290_init(const machine_t *model) device_add(&keyboard_at_olivetti_device); device_add(&port_6x_olivetti_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&olivetti_eva_device); diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 1a6a6db67..07ed218ff 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -63,7 +63,7 @@ machine_at_acc386_init(const machine_t *model) device_add(&acc2168_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -84,7 +84,7 @@ machine_at_asus386_init(const machine_t *model) device_add(&rabbit_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -104,7 +104,7 @@ machine_at_tandy4000_init(const machine_t *model) machine_at_common_init(model); device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -117,7 +117,7 @@ machine_at_sis401_common_init(const machine_t *model) device_add(&sis_85c401_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); } @@ -168,7 +168,7 @@ machine_at_av4_init(const machine_t *model) device_add(&sis_85c460_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -192,7 +192,7 @@ machine_at_valuepoint433_init(const machine_t *model) // hangs without the PS/2 device_add(&keyboard_ps2_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -213,7 +213,7 @@ machine_at_ecs386_init(const machine_t *model) machine_at_common_init(model); device_add(&cs8230_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&keyboard_at_ami_device); @@ -236,7 +236,7 @@ machine_at_spc6000a_init(const machine_t *model) machine_at_common_init_ex(model, 1); device_add(&cs8230_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&keyboard_at_ami_device); @@ -259,7 +259,7 @@ machine_at_ecs386v_init(const machine_t *model) device_add(&ali1429_device); device_add(&keyboard_ps2_intel_ami_pci_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -281,7 +281,7 @@ machine_at_rycleopardlx_init(const machine_t *model) device_add(&opti283_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -303,7 +303,7 @@ machine_at_486vchd_init(const machine_t *model) device_add(&via_vt82c49x_device); device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -324,7 +324,7 @@ machine_at_cs4031_init(const machine_t *model) device_add(&cs4031_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -448,7 +448,7 @@ machine_at_acerv10_init(const machine_t *model) device_add(&keyboard_ps2_acer_pci_device); device_add(&ide_isa_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -492,7 +492,7 @@ machine_at_ali1429_common_init(const machine_t *model, int is_green) device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); } @@ -545,7 +545,7 @@ machine_at_opti495_init(const machine_t *model) device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -560,7 +560,7 @@ machine_at_opti495_ami_common_init(const machine_t *model) device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); } @@ -612,7 +612,7 @@ machine_at_exp4349_init(const machine_t *model) device_add(&ali1429g_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; } @@ -630,7 +630,7 @@ machine_at_403tg_common_init(const machine_t *model, int nvr_hack) device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); } @@ -801,7 +801,7 @@ machine_at_sis_85c471_common_init(const machine_t *model) { machine_at_common_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&sis_85c471_device); @@ -920,7 +920,7 @@ machine_at_pci400ca_init(const machine_t *model) device_add(&i420tx_device); device_add(&ncr53c810_onboard_pci_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -956,7 +956,7 @@ machine_at_greenb_init(const machine_t *model) machine_at_common_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&contaq_82c597_device); @@ -979,7 +979,7 @@ machine_at_4gpv5_init(const machine_t *model) machine_at_common_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&contaq_82c596a_device); @@ -1417,7 +1417,7 @@ machine_at_pci400cb_init(const machine_t *model) device_add(&ims8848_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -1446,7 +1446,7 @@ machine_at_g486ip_init(const machine_t *model) device_add(&ims8848_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -1506,7 +1506,7 @@ machine_at_486ap4_init(const machine_t *model) pci_register_slot(0x0c, PCI_CARD_NORMAL, 4, 1, 2, 3); /* 0c = Slot 4 */ device_add(&keyboard_ps2_ami_pci_device); /* Uses the AMIKEY KBC */ - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&i420ex_device); @@ -1986,7 +1986,7 @@ machine_at_atc1415_init(const machine_t *model) device_add(&intel_flash_bxt_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -2247,7 +2247,7 @@ machine_at_ecsal486_init(const machine_t *model) device_add(&ali1429g_device); device_add(&keyboard_ps2_ami_pci_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -2290,9 +2290,8 @@ machine_at_atc1762_init(const machine_t *model) device_add(&ali1429g_device); device_add(&keyboard_ps2_ami_pci_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); - return ret; } diff --git a/src/machine/m_at_commodore.c b/src/machine/m_at_commodore.c index a0b522371..0b45fe60c 100644 --- a/src/machine/m_at_commodore.c +++ b/src/machine/m_at_commodore.c @@ -112,7 +112,7 @@ machine_at_cmdpc_init(const machine_t *model) mem_remap_top(384); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); cmd_uart = device_add(&ns8250_device); diff --git a/src/machine/m_at_compaq.c b/src/machine/m_at_compaq.c index b628ea095..2d4597007 100644 --- a/src/machine/m_at_compaq.c +++ b/src/machine/m_at_compaq.c @@ -779,7 +779,7 @@ machine_at_compaq_init(const machine_t *model, int type) { compaq_machine_type = type; - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); if (type < COMPAQ_PORTABLEIII386) { diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index f7aad92ec..e39ab87be 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -293,7 +293,7 @@ machine_at_award_common_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SCSI, 1, 2, 3, 4); /* 07 = SCSI */ pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&keyboard_ps2_ami_pci_device); @@ -402,7 +402,7 @@ machine_at_p5vl_init(const machine_t *model) device_add(&sst_flash_29ee010_device); device_add(&keyboard_at_ami_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index ff59ec65f..3afd96ca7 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -370,7 +370,7 @@ machine_at_pat54pv_init(const machine_t *model) device_add(&opti5x7_device); device_add(&keyboard_ps2_intel_ami_pci_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; @@ -400,7 +400,7 @@ machine_at_hot543_init(const machine_t *model) device_add(&sst_flash_29ee010_device); device_add(&keyboard_at_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); return ret; diff --git a/src/machine/m_at_t3100e.c b/src/machine/m_at_t3100e.c index e3e24cf2c..357f012f2 100644 --- a/src/machine/m_at_t3100e.c +++ b/src/machine/m_at_t3100e.c @@ -815,7 +815,7 @@ machine_at_t3100e_init(const machine_t *model) device_add(&keyboard_at_toshiba_device); - if (fdc_type == FDC_INTERNAL) { + if (fdc_current[0] == FDC_INTERNAL) { device_add(&fdc_at_device); } diff --git a/src/machine/m_elt.c b/src/machine/m_elt.c index a69b62184..812755898 100644 --- a/src/machine/m_elt.c +++ b/src/machine/m_elt.c @@ -178,7 +178,7 @@ machine_elt_init(const machine_t *model) pit_devs[0].set_out_func(pit_devs[0].data, 1, pit_refresh_timer_xt); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_device); if (gfxcard[0] == VID_INTERNAL) { diff --git a/src/machine/m_ps2_mca.c b/src/machine/m_ps2_mca.c index 8ad69e314..cb83d9be7 100644 --- a/src/machine/m_ps2_mca.c +++ b/src/machine/m_ps2_mca.c @@ -1395,7 +1395,7 @@ machine_ps2_common_init(const machine_t *model) { machine_common_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); dma16_init(); diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 437ac7d54..e677ff8b4 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -1738,7 +1738,7 @@ machine_tandy1k_init(const machine_t *model, int type) device_add(&keyboard_tandy_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_tandy_device); video_reset(gfxcard[0]); diff --git a/src/machine/m_v86p.c b/src/machine/m_v86p.c index 5d132a839..f8358a8ff 100644 --- a/src/machine/m_v86p.c +++ b/src/machine/m_v86p.c @@ -88,7 +88,7 @@ machine_v86p_init(const machine_t *model) device_add(&keyboard_xt_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_device); if (gfxcard[0] == VID_INTERNAL) diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index adca9f4de..355f45b23 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -25,7 +25,7 @@ extern const device_t vendex_xt_rtc_onboard_device; static void machine_xt_common_init(const machine_t *model, int fixed_floppy) { - if ((fdc_type == FDC_INTERNAL) || fixed_floppy) + if ((fdc_current[0] == FDC_INTERNAL) || fixed_floppy) device_add(&fdc_xt_device); machine_common_init(model); diff --git a/src/machine/m_xt_compaq.c b/src/machine/m_xt_compaq.c index f5dca48a7..ed1b3e26c 100644 --- a/src/machine/m_xt_compaq.c +++ b/src/machine/m_xt_compaq.c @@ -53,7 +53,7 @@ machine_xt_compaq_deskpro_init(const machine_t *model) pit_devs[0].set_out_func(pit_devs[0].data, 1, pit_refresh_timer_xt); device_add(&keyboard_xt_compaq_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_device); nmi_init(); standalone_gameport_type = &gameport_device; @@ -80,7 +80,7 @@ machine_xt_compaq_portable_init(const machine_t *model) pit_devs[0].set_out_func(pit_devs[0].data, 1, pit_refresh_timer_xt); device_add(&keyboard_xt_compaq_device); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_device); nmi_init(); if (joystick_type) diff --git a/src/machine/m_xt_laserxt.c b/src/machine/m_xt_laserxt.c index 87c2fe362..877d26ff5 100644 --- a/src/machine/m_xt_laserxt.c +++ b/src/machine/m_xt_laserxt.c @@ -147,7 +147,7 @@ machine_xt_laserxt_common_init(const machine_t *model,int is_lxt3) pit_devs[0].set_out_func(pit_devs[0].data, 1, pit_refresh_timer_xt); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_device); nmi_init(); diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index 172880361..94c7376c8 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -2317,7 +2317,7 @@ machine_xt_m24_init(const machine_t *model) machine_common_init(model); /* On-board FDC can be disabled only on M24SP */ - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_device); /* Address 66-67 = mainboard dip-switch settings */ @@ -2393,7 +2393,7 @@ machine_xt_m240_init(const machine_t *model) m24_kbd_init(m24_kbd); device_add_ex(&m24_kbd_device, m24_kbd); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); /* io.c logs clearly show it using port 3F7 */ if (joystick_type) diff --git a/src/machine/m_xt_xi8088.c b/src/machine/m_xt_xi8088.c index 3f07e6a4e..8515ea27a 100644 --- a/src/machine/m_xt_xi8088.c +++ b/src/machine/m_xt_xi8088.c @@ -201,7 +201,7 @@ machine_xt_xi8088_init(const machine_t *model) machine_common_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); device_add(&keyboard_ps2_xi8088_device); diff --git a/src/machine/m_xt_zenith.c b/src/machine/m_xt_zenith.c index 0da091917..f5e231772 100644 --- a/src/machine/m_xt_zenith.c +++ b/src/machine/m_xt_zenith.c @@ -140,7 +140,7 @@ machine_xt_z184_init(const machine_t *model) machine_zenith_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_device); lpt1_remove(); /* only one parallel port */ @@ -170,7 +170,7 @@ machine_xt_z151_init(const machine_t *model) machine_zenith_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_tandy_device); return ret; @@ -193,7 +193,7 @@ machine_xt_z159_init(const machine_t *model) machine_zenith_init(model); - if (fdc_type == FDC_INTERNAL) + if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_xt_tandy_device); /* parallel port is on the memory board */ diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index fa02ce613..ff30696c4 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -57,7 +57,7 @@ SettingsStorageControllers::save() scsi_card_current[i] = cbox->currentData().toInt(); } hdc_current = ui->comboBoxHD->currentData().toInt(); - fdc_type = ui->comboBoxFD->currentData().toInt(); + fdc_current[0] = ui->comboBoxFD->currentData().toInt(); cdrom_interface_current = ui->comboBoxCDInterface->currentData().toInt(); ide_ter_enabled = ui->checkBoxTertiaryIDE->isChecked() ? 1 : 0; ide_qua_enabled = ui->checkBoxQuaternaryIDE->isChecked() ? 1 : 0; @@ -128,7 +128,7 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId) if (device_is_valid(fdc_dev, machineId)) { int row = Models::AddEntry(model, name, c); - if (c == fdc_type) { + if (c == fdc_current[0]) { selectedRow = row - removeRows; } } From 539dccdcd169abe65e136a4da8b657a57a7556f7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 20 Jul 2024 01:39:07 -0400 Subject: [PATCH 126/624] Simplify sound_card_init() by using a loop --- src/sound/sound.c | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/src/sound/sound.c b/src/sound/sound.c index 4820c45f9..254e529ca 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -221,14 +221,9 @@ sound_card_get_from_internal_name(const char *s) void sound_card_init(void) { - if ((sound_card_current[0] > SOUND_INTERNAL) && (sound_cards[sound_card_current[0]].device)) - device_add_inst(sound_cards[sound_card_current[0]].device, 1); - if ((sound_card_current[1] > SOUND_INTERNAL) && (sound_cards[sound_card_current[1]].device)) - device_add_inst(sound_cards[sound_card_current[1]].device, 2); - if ((sound_card_current[2] > SOUND_INTERNAL) && (sound_cards[sound_card_current[2]].device)) - device_add_inst(sound_cards[sound_card_current[2]].device, 3); - if ((sound_card_current[3] > SOUND_INTERNAL) && (sound_cards[sound_card_current[3]].device)) - device_add_inst(sound_cards[sound_card_current[3]].device, 4); + for (uint8_t i = 0; i < SOUND_CARD_MAX; i++) + if ((sound_card_current[i] > SOUND_INTERNAL) && (sound_cards[sound_card_current[i]].device)) + device_add_inst(sound_cards[sound_card_current[i]].device, i + 1); } void From 680f65cf1948cc483e535a0bb266676329643ea1 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 20 Jul 2024 03:08:04 -0400 Subject: [PATCH 127/624] Standardize hdc_current into an array --- src/config.c | 10 +++++----- src/disk/hdc.c | 8 ++++---- src/include/86box/config.h | 2 +- src/include/86box/hdc.h | 2 +- src/machine/m_at_compaq.c | 4 ++-- src/machine/m_europc.c | 2 +- src/machine/m_ps1.c | 2 +- src/machine/m_ps2_isa.c | 2 +- src/machine/m_v86p.c | 2 +- src/machine/m_xt_olivetti.c | 8 ++++---- src/machine/m_xt_t1000.c | 2 +- src/qt/qt_machinestatus.cpp | 8 ++++---- src/qt/qt_settingsstoragecontrollers.cpp | 4 ++-- 13 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/config.c b/src/config.c index 4a7bd45fa..23b78f117 100644 --- a/src/config.c +++ b/src/config.c @@ -829,15 +829,15 @@ load_storage_controllers(void) } /* Migrate renamed and merged cards. */ if (!strcmp(p, "xtide_plus")) { - hdc_current = hdc_get_from_internal_name("xtide"); + hdc_current[0] = hdc_get_from_internal_name("xtide"); migration_cat = ini_find_or_create_section(config, "PC/XT XTIDE"); ini_section_set_string(migration_cat, "bios", "xt_plus"); } else if (!strcmp(p, "xtide_at_386")) { - hdc_current = hdc_get_from_internal_name("xtide_at"); + hdc_current[0] = hdc_get_from_internal_name("xtide_at"); migration_cat = ini_find_or_create_section(config, "PC/AT XTIDE"); ini_section_set_string(migration_cat, "bios", "at_386"); } else - hdc_current = hdc_get_from_internal_name(p); + hdc_current[0] = hdc_get_from_internal_name(p); if (free_p) { free(p); @@ -1631,7 +1631,7 @@ config_load(void) video_fullscreen_first = 1; video_fullscreen_scale = 1; time_sync = TIME_SYNC_ENABLED; - hdc_current = hdc_get_from_internal_name("none"); + hdc_current[0] = hdc_get_from_internal_name("none"); com_ports[0].enabled = 1; com_ports[1].enabled = 1; @@ -2303,7 +2303,7 @@ save_storage_controllers(void) fdc_card_get_internal_name(fdc_current[0])); ini_section_set_string(cat, "hdc", - hdc_get_internal_name(hdc_current)); + hdc_get_internal_name(hdc_current[0])); if (cdrom_interface_current == 0) ini_section_delete_var(cat, "cdrom_interface"); diff --git a/src/disk/hdc.c b/src/disk/hdc.c index ee25e8574..08a290aef 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -30,7 +30,7 @@ #include <86box/hdc_ide.h> #include <86box/hdd.h> -int hdc_current; +int hdc_current[2]; #ifdef ENABLE_HDC_LOG int hdc_do_log = ENABLE_HDC_LOG; @@ -101,11 +101,11 @@ void hdc_reset(void) { hdc_log("HDC: reset(current=%d, internal=%d)\n", - hdc_current, (machines[machine].flags & MACHINE_HDC) ? 1 : 0); + hdc_current[0], (machines[machine].flags & MACHINE_HDC) ? 1 : 0); /* If we have a valid controller, add its device. */ - if (hdc_current > HDC_INTERNAL) - device_add(controllers[hdc_current].device); + if (hdc_current[0] > HDC_INTERNAL) + device_add(controllers[hdc_current[0]].device); /* Now, add the tertiary and/or quaternary IDE controllers. */ if (ide_ter_enabled) diff --git a/src/include/86box/config.h b/src/include/86box/config.h index 0f596b7ac..d0b2857e7 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -114,7 +114,7 @@ typedef struct config_t { /* Other peripherals category */ int fdc_current[2]; /* Floppy disk controller type */ - int hdc_current; /* Hard disk controller type */ + int hdc_current[2]; /* Hard disk controller type */ int hdc; /* Hard disk controller */ int scsi_card; /* SCSI controller */ int ide_ter_enabled; /* Tertiary IDE controller enabled */ diff --git a/src/include/86box/hdc.h b/src/include/86box/hdc.h index 38c0a6e9a..8e09119bf 100644 --- a/src/include/86box/hdc.h +++ b/src/include/86box/hdc.h @@ -32,7 +32,7 @@ #define HDC_NONE 0 #define HDC_INTERNAL 1 -extern int hdc_current; +extern int hdc_current[2]; extern const device_t st506_xt_xebec_device; /* st506_xt_xebec */ extern const device_t st506_xt_wdxt_gen_device; /* st506_xt_wdxt_gen */ diff --git a/src/machine/m_at_compaq.c b/src/machine/m_at_compaq.c index 2d4597007..0ac541e90 100644 --- a/src/machine/m_at_compaq.c +++ b/src/machine/m_at_compaq.c @@ -798,7 +798,7 @@ machine_at_compaq_init(const machine_t *model, int type) break; case COMPAQ_PORTABLEIII: - if (hdc_current == HDC_INTERNAL) + if (hdc_current[0] == HDC_INTERNAL) device_add(&ide_isa_device); if (gfxcard[0] == VID_INTERNAL) device_add(&compaq_plasma_device); @@ -806,7 +806,7 @@ machine_at_compaq_init(const machine_t *model, int type) break; case COMPAQ_PORTABLEIII386: - if (hdc_current == HDC_INTERNAL) + if (hdc_current[0] == HDC_INTERNAL) device_add(&ide_isa_device); if (gfxcard[0] == VID_INTERNAL) device_add(&compaq_plasma_device); diff --git a/src/machine/m_europc.c b/src/machine/m_europc.c index c53061c4e..42034e2f6 100644 --- a/src/machine/m_europc.c +++ b/src/machine/m_europc.c @@ -660,7 +660,7 @@ europc_boot(UNUSED(const device_t *info)) * * We only do this if we have not configured another one. */ - if (hdc_current == HDC_INTERNAL) + if (hdc_current[0] == HDC_INTERNAL) (void) device_add(&xta_hd20_device); return sys; diff --git a/src/machine/m_ps1.c b/src/machine/m_ps1.c index 25d21cfb9..a6a16d65c 100644 --- a/src/machine/m_ps1.c +++ b/src/machine/m_ps1.c @@ -353,7 +353,7 @@ ps1_setup(int model) device_add(&fdc_at_ps1_device); /* Enable the builtin HDC. */ - if (hdc_current == HDC_INTERNAL) { + if (hdc_current[0] == HDC_INTERNAL) { priv = device_add(&ps1_hdc_device); ps1_hdc_inform(priv, &ps->ps1_91); diff --git a/src/machine/m_ps2_isa.c b/src/machine/m_ps2_isa.c index 4f6d9bc2b..2887cca20 100644 --- a/src/machine/m_ps2_isa.c +++ b/src/machine/m_ps2_isa.c @@ -179,7 +179,7 @@ ps2_isa_setup(int model, int cpu_type) device_add(&fdc_at_ps1_device); /* Enable the builtin HDC. */ - if (hdc_current == HDC_INTERNAL) { + if (hdc_current[0] == HDC_INTERNAL) { priv = device_add(&ps1_hdc_device); ps1_hdc_inform(priv, &ps2->ps2_91); } diff --git a/src/machine/m_v86p.c b/src/machine/m_v86p.c index f8358a8ff..f152383d1 100644 --- a/src/machine/m_v86p.c +++ b/src/machine/m_v86p.c @@ -94,7 +94,7 @@ machine_v86p_init(const machine_t *model) if (gfxcard[0] == VID_INTERNAL) device_add(&f82c425_video_device); - if (hdc_current <= HDC_INTERNAL) + if (hdc_current[0] <= HDC_INTERNAL) device_add(&st506_xt_victor_v86p_device); return ret; diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index 94c7376c8..b13db6bf9 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -591,7 +591,7 @@ m24_kbd_write(uint16_t port, uint8_t val, void *priv) * bit 7 - use BIOS HD on mainboard (on) / on controller (off) * bit 6 - use OCG/CGA display adapter (on) / other display adapter (off) */ - ret = (hdc_current == HDC_INTERNAL) ? 0x00 : 0x80; + ret = (hdc_current[0] == HDC_INTERNAL) ? 0x00 : 0x80; ret |= video_is_cga() ? 0x40 : 0x00; m24_kbd_adddata(ret); @@ -2219,7 +2219,7 @@ m24_read(uint16_t port, UNUSED(void *priv)) "Reserved for HDU", same as for Switch 3 */ /* Switch 3 - Disable internal BIOS HD */ - if (hdc_current != HDC_INTERNAL) + if (hdc_current[0] != HDC_INTERNAL) ret |= 0x4; /* Switch 2 - Set fast startup */ @@ -2349,7 +2349,7 @@ machine_xt_m24_init(const machine_t *model) m24_kbd_init(m24_kbd); device_add_ex(&m24_kbd_device, m24_kbd); - if (hdc_current == HDC_INTERNAL) + if (hdc_current[0] == HDC_INTERNAL) device_add(&st506_xt_wd1002a_wx1_nobios_device); return ret; @@ -2409,7 +2409,7 @@ machine_xt_m240_init(const machine_t *model) mm58274_init(nvr, model->nvrmask + 1); - if (hdc_current == HDC_INTERNAL) + if (hdc_current[0] == HDC_INTERNAL) device_add(&st506_xt_wd1002a_wx1_nobios_device); return ret; diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index 88fc6ada2..5a787292f 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -969,7 +969,7 @@ machine_xt_t1200_init(const machine_t *model) if (gfxcard[0] == VID_INTERNAL) device_add(&t1200_video_device); - if (hdc_current <= HDC_INTERNAL) + if (hdc_current[0] <= HDC_INTERNAL) device_add(&st506_xt_toshiba_t1200_device); return ret; diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index d6f84ea71..64f3b0e43 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -294,7 +294,7 @@ MachineStatus::iterateFDD(const std::function &cb) void MachineStatus::iterateCDROM(const std::function &cb) { - auto hdc_name = QString(hdc_get_internal_name(hdc_current)); + auto hdc_name = QString(hdc_get_internal_name(hdc_current[0])); for (size_t i = 0; i < CDROM_NUM; i++) { /* Could be Internal or External IDE.. */ if ((cdrom[i].bus_type == CDROM_BUS_ATAPI) && !hasIDE() && @@ -317,7 +317,7 @@ MachineStatus::iterateCDROM(const std::function &cb) void MachineStatus::iterateZIP(const std::function &cb) { - auto hdc_name = QString(hdc_get_internal_name(hdc_current)); + auto hdc_name = QString(hdc_get_internal_name(hdc_current[0])); for (size_t i = 0; i < ZIP_NUM; i++) { /* Could be Internal or External IDE.. */ if ((zip_drives[i].bus_type == ZIP_BUS_ATAPI) && !hasIDE() && @@ -338,7 +338,7 @@ MachineStatus::iterateZIP(const std::function &cb) void MachineStatus::iterateMO(const std::function &cb) { - auto hdc_name = QString(hdc_get_internal_name(hdc_current)); + auto hdc_name = QString(hdc_get_internal_name(hdc_current[0])); for (size_t i = 0; i < MO_NUM; i++) { /* Could be Internal or External IDE.. */ if ((mo_drives[i].bus_type == MO_BUS_ATAPI) && !hasIDE() && @@ -602,7 +602,7 @@ MachineStatus::refresh(QStatusBar *sbar) sbar->addWidget(d->net[i].label.get()); }); - auto hdc_name = QString(hdc_get_internal_name(hdc_current)); + auto hdc_name = QString(hdc_get_internal_name(hdc_current[0])); if ((has_mfm || (hdc_name.left(5) == QStringLiteral("st506"))) && (c_mfm > 0)) { d->hdds[HDD_BUS_MFM].label = std::make_unique(); d->hdds[HDD_BUS_MFM].setActive(false); diff --git a/src/qt/qt_settingsstoragecontrollers.cpp b/src/qt/qt_settingsstoragecontrollers.cpp index ff30696c4..a86362909 100644 --- a/src/qt/qt_settingsstoragecontrollers.cpp +++ b/src/qt/qt_settingsstoragecontrollers.cpp @@ -56,7 +56,7 @@ SettingsStorageControllers::save() auto *cbox = findChild(QString("comboBoxSCSI%1").arg(i + 1)); scsi_card_current[i] = cbox->currentData().toInt(); } - hdc_current = ui->comboBoxHD->currentData().toInt(); + hdc_current[0] = ui->comboBoxHD->currentData().toInt(); fdc_current[0] = ui->comboBoxFD->currentData().toInt(); cdrom_interface_current = ui->comboBoxCDInterface->currentData().toInt(); ide_ter_enabled = ui->checkBoxTertiaryIDE->isChecked() ? 1 : 0; @@ -92,7 +92,7 @@ SettingsStorageControllers::onCurrentMachineChanged(int machineId) if (device_is_valid(hdc_dev, machineId)) { int row = Models::AddEntry(model, name, c); - if (c == hdc_current) { + if (c == hdc_current[0]) { selectedRow = row - removeRows; } } From b4907799908f6f7e35eb9fa9a5508f87ee52f000 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 21 Jul 2024 01:03:55 +0200 Subject: [PATCH 128/624] Add Mode Hexadecimal to allow Photo Play games to work with touch --- src/device/mouse_microtouch_touchscreen.c | 144 +++++++++++++--------- 1 file changed, 89 insertions(+), 55 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index af5ef5bf0..e1a965513 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -39,7 +39,8 @@ enum mtouch_modes { MODE_TABLET = 1, - MODE_RAW = 2 + MODE_RAW = 2, + MODE_HEX = 3 }; typedef struct mouse_microtouch_t { @@ -50,7 +51,7 @@ typedef struct mouse_microtouch_t { char cmd[512]; int cmd_pos; int mode; - uint8_t cal_cntr, pen_mode; + uint8_t cal_cntr, pen_mode, prev_b; bool soh; bool in_reset; serial_t *serial; @@ -93,80 +94,85 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) for (i = 0; i < strlen(mtouch->cmd); i++) { mtouch->cmd[i] = toupper(mtouch->cmd[i]); } - if (mtouch->cmd[0] == 'Z') { + if (mtouch->cmd[0] == 'Z') { // Null fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { // Finger Only mtouch->pen_mode = 1; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { + if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { // Unit Type fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "TP****00\r", sizeof("TP****00\r") - 1); } - if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { + if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { // Output Identity fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "P50200\r", sizeof("P50200\r") - 1); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { // Format Tablet mtouch->mode = MODE_TABLET; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { // Format Hexadecimal + mtouch->mode = MODE_HEX; + fifo8_push(&mtouch->resp, 1); + fifo8_push_all(&mtouch->resp, (uint8_t *)"0\r", 2); + } + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { // Format Raw mtouch->mode = MODE_RAW; mtouch->cal_cntr = 0; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { + if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { // Mode Stream fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'R') { + if (mtouch->cmd[0] == 'R') { // Reset mtouch->in_reset = true; mtouch->mode = MODE_TABLET; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; timer_on_auto(&mtouch->reset_timer, 500. * 1000.); } - if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { + if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { // Autobaud Enable/Disable fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'N' && mtouch->cmd[1] == 'M') { + if (mtouch->cmd[0] == 'N' && mtouch->cmd[1] == 'M') { // ?? fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'Q') { + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'Q') { // ?? fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); } - if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'F') { + if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'F') { // ?? fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); } if (mtouch->cmd[0] == 'P') { - if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; - else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; + if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; // Pen or Finger + else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; // Pen Only fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { + if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { // Calibrate New/Extended fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); mtouch->cal_cntr = 2; } - if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { + if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { // Get Parameter Block 1 fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "A\r", 2); fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", sizeof("0000000000000000000000000\r") - 1); fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { + if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { // Set Parameter Block 1 fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "A\r", 2); } @@ -219,46 +225,52 @@ static int mtouch_poll(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + + if (fifo8_num_free(&dev->resp) <= 10 || dev->mode == MODE_RAW) { + return 0; + } + + unsigned int abs_x_int = 0, abs_y_int = 0; + double abs_x; + double abs_y; + int b = mouse_get_buttons_ex(); - if (dev->mode != MODE_RAW && fifo8_num_free(&dev->resp) >= 10) { - unsigned int abs_x_int = 0, abs_y_int = 0; - double abs_x; - double abs_y; - int b = mouse_get_buttons_ex(); - mouse_get_abs_coords(&abs_x, &abs_y); - dev->b |= !!(b & 3); - + mouse_get_abs_coords(&abs_x, &abs_y); + dev->b |= !!(b & 3); // any button pressed + + if (abs_x >= 1.0) + abs_x = 1.0; + if (abs_y >= 1.0) + abs_y = 1.0; + if (abs_x <= 0.0) + abs_x = 0.0; + if (abs_y <= 0.0) + abs_y = 0.0; + if (enable_overscan) { + int index = mouse_tablet_in_proximity - 1; + if (mouse_tablet_in_proximity == -1) + mouse_tablet_in_proximity = 0; + + abs_x *= monitors[index].mon_unscaled_size_x - 1; + abs_y *= monitors[index].mon_efscrnsz_y - 1; + + if (abs_x <= (monitors[index].mon_overscan_x / 2.)) { + abs_x = (monitors[index].mon_overscan_x / 2.); + } + if (abs_y <= (monitors[index].mon_overscan_y / 2.)) { + abs_y = (monitors[index].mon_overscan_y / 2.); + } + abs_x -= (monitors[index].mon_overscan_x / 2.); + abs_y -= (monitors[index].mon_overscan_y / 2.); + abs_x = abs_x / (double) monitors[index].mon_xsize; + abs_y = abs_y / (double) monitors[index].mon_ysize; if (abs_x >= 1.0) abs_x = 1.0; if (abs_y >= 1.0) abs_y = 1.0; - if (abs_x <= 0.0) - abs_x = 0.0; - if (abs_y <= 0.0) - abs_y = 0.0; - if (enable_overscan) { - int index = mouse_tablet_in_proximity - 1; - if (mouse_tablet_in_proximity == -1) - mouse_tablet_in_proximity = 0; + } - abs_x *= monitors[index].mon_unscaled_size_x - 1; - abs_y *= monitors[index].mon_efscrnsz_y - 1; - - if (abs_x <= (monitors[index].mon_overscan_x / 2.)) { - abs_x = (monitors[index].mon_overscan_x / 2.); - } - if (abs_y <= (monitors[index].mon_overscan_y / 2.)) { - abs_y = (monitors[index].mon_overscan_y / 2.); - } - abs_x -= (monitors[index].mon_overscan_x / 2.); - abs_y -= (monitors[index].mon_overscan_y / 2.); - abs_x = abs_x / (double) monitors[index].mon_xsize; - abs_y = abs_y / (double) monitors[index].mon_ysize; - if (abs_x >= 1.0) - abs_x = 1.0; - if (abs_y >= 1.0) - abs_y = 1.0; - } + if (dev->mode == MODE_TABLET) { if (dev->cal_cntr && (!(dev->b & 1) && !!(b & 3))) { dev->b |= 1; } else if (dev->cal_cntr && ((dev->b & 1) && !(b & 3))) { @@ -268,7 +280,7 @@ mtouch_poll(void *priv) if (dev->cal_cntr) { return 0; } - if (!!(b & 3)) { + if (!!(b & 3)) { // Hover dev->abs_x = abs_x; dev->abs_y = abs_y; dev->b |= 1; @@ -281,7 +293,7 @@ mtouch_poll(void *priv) fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); fifo8_push(&dev->resp, abs_y_int & 0b1111111); fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); - } else if ((dev->b & 1) && !(b & 3)) { + } else if ((dev->b & 1) && !(b & 3)) { // Touch dev->b &= ~1; abs_x_int = dev->abs_x * 16383; abs_y_int = 16383 - dev->abs_y * 16383; @@ -297,6 +309,28 @@ mtouch_poll(void *priv) fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); } } + + else if (dev->mode == MODE_HEX) { + abs_x_int = abs_x * 1023; + abs_y_int = 1023 - (abs_y * 1023); + char buffer[20]; + + if (dev->cal_cntr && !b && dev->prev_b) { + microtouch_calibrate_timer(dev); + } + else if (b & 1) { + if (dev->prev_b == 0) { // Touchdown + snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); + } else { // Touch Continuation + snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } else if (dev->prev_b == 1) { // Liftoff + snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } + dev->prev_b = b & 1; + } return 0; } From 7817336567f211269f52b99aa2eeca2e2ba54cc5 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 20 Jul 2024 20:02:34 -0400 Subject: [PATCH 129/624] Use a define for max FDC's --- src/floppy/fdc.c | 2 +- src/include/86box/config.h | 2 +- src/include/86box/fdc.h | 2 -- src/include/86box/fdc_ext.h | 4 +++- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 756f43448..bce34e327 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -77,7 +77,7 @@ int lastbyte = 0; int floppymodified[4]; int floppyrate[4]; -int fdc_current[2] = { 0, 0 }; +int fdc_current[FDC_MAX] = { 0, 0 }; #ifdef ENABLE_FDC_LOG int fdc_do_log = ENABLE_FDC_LOG; diff --git a/src/include/86box/config.h b/src/include/86box/config.h index d0b2857e7..4691686c7 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -113,7 +113,7 @@ typedef struct config_t { # endif /* Other peripherals category */ - int fdc_current[2]; /* Floppy disk controller type */ + int fdc_current[FDC_MAX]; /* Floppy disk controller type */ int hdc_current[2]; /* Hard disk controller type */ int hdc; /* Hard disk controller */ int scsi_card; /* SCSI controller */ diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index a00f59cd6..e03785df6 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -22,8 +22,6 @@ #ifndef EMU_FDC_H #define EMU_FDC_H -extern int fdc_current[2]; - #define FDC_PRIMARY_ADDR 0x03f0 #define FDC_PRIMARY_IRQ 6 #define FDC_PRIMARY_DMA 2 diff --git a/src/include/86box/fdc_ext.h b/src/include/86box/fdc_ext.h index 2467b4901..188881f77 100644 --- a/src/include/86box/fdc_ext.h +++ b/src/include/86box/fdc_ext.h @@ -22,7 +22,9 @@ #ifndef EMU_FDC_EXT_H #define EMU_FDC_EXT_H -extern int fdc_current[2]; +#define FDC_MAX 2 + +extern int fdc_current[FDC_MAX]; /* Controller types. */ #define FDC_NONE 0 From 2a7d300078dff5fb2bb3fe52ba32acf27f4c73c4 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 20 Jul 2024 20:05:00 -0400 Subject: [PATCH 130/624] Use a define for max HDC's --- src/disk/hdc.c | 2 +- src/include/86box/config.h | 2 +- src/include/86box/hdc.h | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 08a290aef..908cbce07 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -30,7 +30,7 @@ #include <86box/hdc_ide.h> #include <86box/hdd.h> -int hdc_current[2]; +int hdc_current[HDC_MAX] = { 0, 0 }; #ifdef ENABLE_HDC_LOG int hdc_do_log = ENABLE_HDC_LOG; diff --git a/src/include/86box/config.h b/src/include/86box/config.h index 4691686c7..a043fb22a 100644 --- a/src/include/86box/config.h +++ b/src/include/86box/config.h @@ -114,7 +114,7 @@ typedef struct config_t { /* Other peripherals category */ int fdc_current[FDC_MAX]; /* Floppy disk controller type */ - int hdc_current[2]; /* Hard disk controller type */ + int hdc_current[HDC_MAX]; /* Hard disk controller type */ int hdc; /* Hard disk controller */ int scsi_card; /* SCSI controller */ int ide_ter_enabled; /* Tertiary IDE controller enabled */ diff --git a/src/include/86box/hdc.h b/src/include/86box/hdc.h index 8e09119bf..48235bb1e 100644 --- a/src/include/86box/hdc.h +++ b/src/include/86box/hdc.h @@ -32,7 +32,9 @@ #define HDC_NONE 0 #define HDC_INTERNAL 1 -extern int hdc_current[2]; +#define HDC_MAX 2 + +extern int hdc_current[HDC_MAX]; extern const device_t st506_xt_xebec_device; /* st506_xt_xebec */ extern const device_t st506_xt_wdxt_gen_device; /* st506_xt_wdxt_gen */ From 1ebbc25c2a39a69703d3256748f9a5b630e9ac0f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 20 Jul 2024 20:09:17 -0400 Subject: [PATCH 131/624] Correct endif comment in fdc_ext.h --- src/include/86box/fdc_ext.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/include/86box/fdc_ext.h b/src/include/86box/fdc_ext.h index 188881f77..4b33ed7a1 100644 --- a/src/include/86box/fdc_ext.h +++ b/src/include/86box/fdc_ext.h @@ -44,4 +44,4 @@ extern const device_t *fdc_card_getdevice(int card); extern int fdc_card_has_config(int card); extern int fdc_card_available(int card); -#endif /*EMU_FDC_H*/ +#endif /*EMU_FDC_EXT_H*/ From 2e6d392ff83070a71448f784aa84fe46eb901be4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 21 Jul 2024 04:53:54 +0200 Subject: [PATCH 132/624] On ASIC keyboard controllers, output on channel 0 (KBC) now overrides any existing bytes in the output buffer, fixes FIC PT-2000 soft reset problems. --- src/device/kbc_at.c | 8 ++++++++ src/machine/m_at_socket5.c | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index dd18649de..8c94685b7 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -422,6 +422,14 @@ kbc_delay_to_ob(atkbc_t *dev, uint8_t val, uint8_t channel, uint8_t stat_hi) dev->stat_hi = stat_hi; dev->pending = 1; dev->state = STATE_KBC_DELAY_OUT; + + if (dev->is_asic && (channel == 0) && (dev->status & STAT_OFULL)) { + /* Expedite the sending to the output buffer to prevent the wrong + data from being accidentally read. */ + kbc_send_to_ob(dev, dev->val, dev->channel, dev->stat_hi); + dev->state = STATE_MAIN_IBF; + dev->pending = 0; + } } static void kbc_at_process_cmd(void *priv); diff --git a/src/machine/m_at_socket5.c b/src/machine/m_at_socket5.c index ff59ec65f..3629c9d6b 100644 --- a/src/machine/m_at_socket5.c +++ b/src/machine/m_at_socket5.c @@ -345,7 +345,8 @@ machine_at_pt2000_init(const machine_t *model) pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x0B, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&keyboard_ps2_ami_pci_device); + /* Should be VIA, but we do not emulate that yet. */ + device_add(&keyboard_ps2_holtek_device); device_add(&i430fx_device); device_add(&piix_device); device_add(&pc87332_398_device); From 1205392e4f94a92cf68cef521f721ee31eb9f6aa Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 21 Jul 2024 06:09:03 +0200 Subject: [PATCH 133/624] Wells AT, DataExpert 386WB, Genoa Unknown 486, Gigabyte GA-486L, Alaris Cougar, and updates to CMakeLists.txt and chipset.h. to finally include opti391.c and opti499.c. --- src/chipset/CMakeLists.txt | 2 +- src/chipset/compaq_386.c | 33 +++++ src/chipset/opti391.c | 265 ++++++++++++++++++++++++++++------- src/chipset/opti499.c | 6 +- src/include/86box/chipset.h | 5 + src/include/86box/machine.h | 13 ++ src/include/86box/mem.h | 1 + src/machine/m_at.c | 17 +++ src/machine/m_at_386dx_486.c | 93 ++++++++++++ src/machine/machine_table.c | 203 +++++++++++++++++++++++++++ src/mem/mem.c | 9 +- 11 files changed, 590 insertions(+), 57 deletions(-) diff --git a/src/chipset/CMakeLists.txt b/src/chipset/CMakeLists.txt index 4daccd2d8..3f7f6e43d 100644 --- a/src/chipset/CMakeLists.txt +++ b/src/chipset/CMakeLists.txt @@ -17,7 +17,7 @@ add_library(chipset OBJECT 82c100.c acc2168.c cs8230.c ali1429.c ali1435.c ali14 ali1531.c ali1541.c ali1543.c ali1621.c ali6117.c ali1409.c headland.c ims8848.c intel_82335.c compaq_386.c contaq_82c59x.c cs4031.c intel_420ex.c intel_4x0.c intel_i450kx.c intel_sio.c intel_piix.c ../ioapic.c neat.c opti283.c opti291.c opti391.c opti495.c - opti602.c opti822.c opti895.c opti5x7.c scamp.c scat.c sis_85c310.c sis_85c4xx.c + opti499.c opti602.c opti822.c opti895.c opti5x7.c scamp.c scat.c sis_85c310.c sis_85c4xx.c sis_85c496.c sis_85c50x.c sis_5511.c sis_5571.c sis_5581.c sis_5591.c sis_5600.c sis_5511_h2p.c sis_5571_h2p.c sis_5581_h2p.c sis_5591_h2p.c sis_5600_h2p.c sis_5513_p2i.c sis_5513_ide.c sis_5572_usb.c sis_5595_pmu.c sis_55xx.c via_vt82c49x.c diff --git a/src/chipset/compaq_386.c b/src/chipset/compaq_386.c index 7d55bc5a5..4eb21de72 100644 --- a/src/chipset/compaq_386.c +++ b/src/chipset/compaq_386.c @@ -746,6 +746,25 @@ compaq_386_init(UNUSED(const device_t *info)) return dev; } +static void +compaq_genoa_outw(uint16_t port, uint16_t val, void *priv) +{ + if (port == 0x0c02) { + if (val) + mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); + else + mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); + } +} + +static void * +compaq_genoa_init(UNUSED(const device_t *info)) +{ + io_sethandler(0x0c02, 3, NULL, NULL, NULL, NULL, compaq_genoa_outw, NULL, ram); + + return ram; +} + const device_t compaq_386_device = { .name = "Compaq 386 Memory Control", .internal_name = "compaq_386", @@ -759,3 +778,17 @@ const device_t compaq_386_device = { .force_redraw = NULL, .config = NULL }; + +const device_t compaq_genoa_device = { + .name = "Compaq Genoa Memory Control", + .internal_name = "compaq_genoa", + .flags = 0, + .local = 0, + .init = compaq_genoa_init, + .close = NULL, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/chipset/opti391.c b/src/chipset/opti391.c index 03cbb2ea7..8c5dd7b7c 100644 --- a/src/chipset/opti391.c +++ b/src/chipset/opti391.c @@ -54,10 +54,34 @@ typedef struct mem_remapping_t { } mem_remapping_t; typedef struct opti391_t { + uint8_t type; + uint8_t reg_base; + uint8_t min_reg; + uint8_t max_reg; + + uint16_t shadowed; + uint16_t old_start; + uint8_t index; uint8_t regs[256]; } opti391_t; +static void +opti391_recalcremap(opti391_t *dev) +{ + if (dev->type < 2) { + if ((mem_size > 8192) || (dev->shadowed & 0x0ff0) || + !(dev->regs[0x01] & 0x0f) || !(dev->regs[0x01] & 0x10)) { + mem_remap_top_ex(0, dev->old_start); + dev->old_start = 1024; + } else { + mem_remap_top_ex(0, dev->old_start); + dev->old_start = (dev->regs[0x01] & 0x0f) * 1024; + mem_remap_top_ex(-256, dev->old_start); + } + } +} + static void opti391_shadow_recalc(opti391_t *dev) { @@ -70,24 +94,25 @@ opti391_shadow_recalc(opti391_t *dev) shadowbios = shadowbios_write = 0; /* F0000-FFFFF */ - sh_enable = !(dev->regs[0x22] & 0x80); + sh_enable = (dev->regs[0x02] & 0x80); if (sh_enable) mem_set_mem_state_both(0xf0000, 0x10000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); else mem_set_mem_state_both(0xf0000, 0x10000, MEM_READ_INTERNAL | MEM_WRITE_DISABLED); + dev->shadowed |= 0xf000; - sh_write_internal = (dev->regs[0x26] & 0x40); + sh_write_internal = (dev->regs[0x06] & 0x40); /* D0000-EFFFF */ for (uint8_t i = 0; i < 8; i++) { base = 0xd0000 + (i << 14); if (base >= 0xe0000) { - sh_master = (dev->regs[0x22] & 0x40); - sh_wp = (dev->regs[0x22] & 0x10); + sh_master = (dev->regs[0x02] & 0x40); + sh_wp = (dev->regs[0x02] & 0x10); } else { - sh_master = (dev->regs[0x22] & 0x20); - sh_wp = (dev->regs[0x22] & 0x08); + sh_master = (dev->regs[0x02] & 0x20); + sh_wp = (dev->regs[0x02] & 0x08); } - sh_enable = dev->regs[0x23] & (1 << i); + sh_enable = dev->regs[0x03] & (1 << i); if (sh_master) { if (sh_enable) { @@ -95,22 +120,29 @@ opti391_shadow_recalc(opti391_t *dev) mem_set_mem_state_both(base, 0x4000, MEM_READ_INTERNAL | MEM_WRITE_DISABLED); else mem_set_mem_state_both(base, 0x4000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); - } else if (sh_write_internal) + dev->shadowed |= (1 << (i + 4)); + } else if (sh_write_internal) { mem_set_mem_state_both(base, 0x4000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); - else + dev->shadowed |= (1 << (i + 4)); + } else { mem_set_mem_state_both(base, 0x4000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); - } else if (sh_write_internal) + dev->shadowed &= ~(1 << (i + 4)); + } + } else if (sh_write_internal) { mem_set_mem_state_both(base, 0x4000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); - else + dev->shadowed |= (1 << (i + 4)); + } else { mem_set_mem_state_both(base, 0x4000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); + dev->shadowed &= ~(1 << (i + 4)); + } } /* C0000-CFFFF */ - sh_master = !(dev->regs[0x26] & 0x10); - sh_wp = (dev->regs[0x26] & 0x20); + sh_master = (dev->regs[0x06] & 0x10); /* OPTi 391 datasheet erratum! */ + sh_wp = (dev->regs[0x06] & 0x20); for (uint8_t i = 0; i < 4; i++) { base = 0xc0000 + (i << 14); - sh_enable = dev->regs[0x26] & (1 << i); + sh_enable = dev->regs[0x06] & (1 << i); if (sh_master) { if (sh_enable) { @@ -118,15 +150,24 @@ opti391_shadow_recalc(opti391_t *dev) mem_set_mem_state_both(base, 0x4000, MEM_READ_INTERNAL | MEM_WRITE_DISABLED); else mem_set_mem_state_both(base, 0x4000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); - } else if (sh_write_internal) + dev->shadowed |= (1 << i); + } else if (sh_write_internal) { mem_set_mem_state_both(base, 0x4000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); - else + dev->shadowed |= (1 << i); + } else { mem_set_mem_state_both(base, 0x4000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); - } else if (sh_write_internal) + dev->shadowed &= ~(1 << i); + } + } else if (sh_write_internal) { mem_set_mem_state_both(base, 0x4000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); - else + dev->shadowed |= (1 << i); + } else { mem_set_mem_state_both(base, 0x4000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); + dev->shadowed &= ~(1 << i); + } } + + opti391_recalcremap(dev); } static void @@ -134,6 +175,8 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) { opti391_t *dev = (opti391_t *) priv; + opti391_log("[W] %04X = %02X\n", addr, val); + switch (addr) { case 0x22: dev->index = val; @@ -142,26 +185,76 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) case 0x24: opti391_log("OPTi 391: dev->regs[%02x] = %02x\n", dev->index, val); - switch (dev->index) { - case 0x20: - dev->regs[dev->index] = (dev->regs[dev->index] & 0xc0) | (val & 0x3f); + if ((dev->index <= 0x01) && (dev->type < 2)) switch (dev->index) { + case 0x00: + if (!(dev->regs[0x10] & 0x20) && (val & 0x20)) { + softresetx86(); /* Pulse reset! */ + cpu_set_edx(); + flushmmucache(); + } + dev->regs[dev->index + 0x10] = val; break; - case 0x21: - case 0x24: - case 0x25: - case 0x27: - case 0x28: - case 0x29: - case 0x2a: - case 0x2b: - dev->regs[dev->index] = val; + case 0x01: + dev->regs[dev->index + 0x10] = val; + reset_on_hlt = !!(val & 0x02); + break; + } else switch (dev->index - dev->reg_base) { + case 0x00: + if (dev->type == 2) { + reset_on_hlt = !!(val & 0x02); + if (!(dev->regs[dev->index - dev->reg_base] & 0x01) && (val & 0x01)) { + softresetx86(); /* Pulse reset! */ + cpu_set_edx(); + flushmmucache(); + } + dev->regs[dev->index - dev->reg_base] = + (dev->regs[dev->index - dev->reg_base] & 0xc0) | (val & 0x3f); + } break; - case 0x22: - case 0x23: - case 0x26: - dev->regs[dev->index] = val; + case 0x01: + dev->regs[dev->index - dev->reg_base] = val; + if (dev->type == 2) { + cpu_cache_ext_enabled = !!(dev->regs[0x01] & 0x10); + cpu_update_waitstates(); + } else + opti391_recalcremap(dev); + break; + + case 0x04: + case 0x05: + case 0x09: + case 0x0a: + case 0x0b: + dev->regs[dev->index - dev->reg_base] = val; + break; + + case 0x07: + dev->regs[dev->index - dev->reg_base] = val; + if (dev->type < 2) { + mem_a20_alt = val & 0x08; + mem_a20_recalc(); + } + break; + case 0x08: + dev->regs[dev->index - dev->reg_base] = val; + if (dev->type < 2) { + cpu_cache_ext_enabled = !!(dev->regs[0x02] & 0x40); + cpu_update_waitstates(); + } + break; + case 0x0c: + case 0x0d: + if (dev->type < 2) + dev->regs[dev->index - dev->reg_base] = val; + break; + + case 0x02: + case 0x03: + case 0x06: + pclog("Write %02X: %02X\n", dev->index - dev->reg_base, val); + dev->regs[dev->index - dev->reg_base] = val; opti391_shadow_recalc(dev); break; @@ -181,8 +274,14 @@ opti391_read(uint16_t addr, void *priv) const opti391_t *dev = (opti391_t *) priv; uint8_t ret = 0xff; - if (addr == 0x24) - ret = dev->regs[dev->index]; + if (addr == 0x24) { + if ((dev->index <= 0x01) && (dev->type < 2)) + ret = dev->regs[dev->index + 0x10]; + else if ((dev->index >= dev->min_reg) && (dev->index <= dev->max_reg)) + ret = dev->regs[dev->index - dev->reg_base]; + } + + opti391_log("[R] %04X = %02X\n", addr, ret); return ret; } @@ -196,32 +295,68 @@ opti391_close(void *priv) } static void * -opti391_init(UNUSED(const device_t *info)) +opti391_init(const device_t *info) { - opti391_t *dev = (opti391_t *) malloc(sizeof(opti391_t)); - memset(dev, 0x00, sizeof(opti391_t)); + opti391_t *dev = (opti391_t *) calloc(1, sizeof(opti391_t)); io_sethandler(0x0022, 0x0001, opti391_read, NULL, NULL, opti391_write, NULL, NULL, dev); io_sethandler(0x0024, 0x0001, opti391_read, NULL, NULL, opti391_write, NULL, NULL, dev); - dev->regs[0x21] = 0x84; - dev->regs[0x24] = 0x07; - dev->regs[0x25] = 0xf0; - dev->regs[0x26] = 0x30; - dev->regs[0x27] = 0x91; - dev->regs[0x28] = 0x80; - dev->regs[0x29] = 0x10; - dev->regs[0x2a] = 0x80; - dev->regs[0x2b] = 0x10; + dev->type = info->local; + + if (info->local == 2) { + dev->reg_base = 0x20; + dev->min_reg = 0x20; + dev->max_reg = 0x2b; + + dev->regs[0x02] = 0x84; + dev->regs[0x04] = 0x07; + dev->regs[0x05] = 0xf0; + dev->regs[0x06] = 0x30; + dev->regs[0x07] = 0x91; + dev->regs[0x08] = 0x80; + dev->regs[0x09] = 0x10; + dev->regs[0x0a] = 0x80; + dev->regs[0x0b] = 0x10; + } else { + dev->reg_base = 0x0f; + dev->min_reg = 0x10; + dev->max_reg = 0x1c; + + dev->regs[0x01] = 0x01; + dev->regs[0x02] = 0xe0; + if (info->local == 1) + /* Guess due to no OPTi 48x datasheet. */ + dev->regs[0x04] = 0x07; + else + dev->regs[0x04] = 0x77; + dev->regs[0x05] = 0x60; + dev->regs[0x06] = 0x10; + dev->regs[0x07] = 0x50; + if (info->local == 1) { + /* Guess due to no OPTi 48x datasheet. */ + dev->regs[0x09] = 0x80; /* Non-Cacheable Block 1 */ + dev->regs[0x0b] = 0x80; /* Non-Cacheable Block 2 */ + dev->regs[0x0d] = 0x91; /* Cacheable Area */ + } else { + dev->regs[0x09] = 0xe0; /* Non-Cacheable Block 1 */ + dev->regs[0x0b] = 0x10; /* Non-Cacheable Block 2 */ + dev->regs[0x0d] = 0x80; /* Cacheable Area */ + } + dev->regs[0x0a] = 0x10; + dev->regs[0x0c] = 0x10; + } + + dev->old_start = 1024; opti391_shadow_recalc(dev); return dev; } -const device_t opti391_device = { - .name = "OPTi 82C391", - .internal_name = "opti391", +const device_t opti381_device = { + .name = "OPTi 82C381", + .internal_name = "opti381", .flags = 0, .local = 0, .init = opti391_init, @@ -232,3 +367,31 @@ const device_t opti391_device = { .force_redraw = NULL, .config = NULL }; + +const device_t opti481_device = { + .name = "OPTi 82C481", + .internal_name = "opti481", + .flags = 0, + .local = 1, + .init = opti391_init, + .close = opti391_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + +const device_t opti391_device = { + .name = "OPTi 82C391", + .internal_name = "opti391", + .flags = 0, + .local = 2, + .init = opti391_init, + .close = opti391_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/chipset/opti499.c b/src/chipset/opti499.c index f8b878559..a6d6c71cf 100644 --- a/src/chipset/opti499.c +++ b/src/chipset/opti499.c @@ -84,7 +84,7 @@ opti499_recalc(opti499_t *dev) shflags = MEM_READ_INTERNAL; shflags |= (dev->regs[0x22] & ((base >= 0xe0000) ? 0x08 : 0x10)) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; } else { - if (dev->regs[0x2d] && (1 << ((i >> 1) + 2))) + if (dev->regs[0x2d] & (1 << ((i >> 1) + 2))) shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; else shflags = MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL; @@ -101,13 +101,13 @@ opti499_recalc(opti499_t *dev) shflags |= (dev->regs[0x26] & 0x20) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; } else { if (dev->regs[0x26] & 0x40) { - if (dev->regs[0x2d] && (1 << (i >> 1))) + if (dev->regs[0x2d] & (1 << (i >> 1))) shflags = MEM_READ_EXTANY; else shflags = MEM_READ_EXTERNAL; shflags |= (dev->regs[0x26] & 0x20) ? MEM_WRITE_DISABLED : MEM_WRITE_INTERNAL; } else { - if (dev->regs[0x2d] && (1 << (i >> 1))) + if (dev->regs[0x2d] & (1 << (i >> 1))) shflags = MEM_READ_EXTANY | MEM_WRITE_EXTANY; else shflags = MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL; diff --git a/src/include/86box/chipset.h b/src/include/86box/chipset.h index 4be7c2ae2..90647da9a 100644 --- a/src/include/86box/chipset.h +++ b/src/include/86box/chipset.h @@ -39,6 +39,7 @@ extern const device_t amd640_device; /* Compaq */ extern const device_t compaq_386_device; +extern const device_t compaq_genoa_device; /* Contaq/Cypress */ extern const device_t contaq_82c596a_device; @@ -110,8 +111,12 @@ extern const device_t ioapic_device; /* OPTi */ extern const device_t opti283_device; extern const device_t opti291_device; +extern const device_t opti381_device; +extern const device_t opti391_device; +extern const device_t opti481_device; extern const device_t opti493_device; extern const device_t opti495_device; +extern const device_t opti499_device; extern const device_t opti601_device; extern const device_t opti602_device; extern const device_t opti802g_device; diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 7ff00ed52..22a81fae1 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -232,6 +232,9 @@ enum { MACHINE_CHIPSET_INTEL_440GX, MACHINE_CHIPSET_OPTI_283, MACHINE_CHIPSET_OPTI_291, + MACHINE_CHIPSET_OPTI_381, + MACHINE_CHIPSET_OPTI_391, + MACHINE_CHIPSET_OPTI_481, MACHINE_CHIPSET_OPTI_493, MACHINE_CHIPSET_OPTI_495, MACHINE_CHIPSET_OPTI_499, @@ -274,6 +277,7 @@ enum { MACHINE_CHIPSET_VLSI_VL82C481, MACHINE_CHIPSET_VLSI_VL82C486, MACHINE_CHIPSET_WD76C10, + MACHINE_CHIPSET_ZYMOS_POACH, MACHINE_CHIPSET_MAX }; @@ -432,6 +436,7 @@ extern int machine_at_ibmxt286_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 #if defined(DEV_BRANCH) && defined(USE_OPEN_AT) extern int machine_at_openat_init(const machine_t *); #endif @@ -488,6 +493,14 @@ extern int machine_at_awardsx_init(const machine_t *); extern int machine_at_pc916sx_init(const machine_t *); /* m_at_386dx_486.c */ +/* Note to jriwanek: When merging this into my branch, please make + sure this appear here (and in the .c file) in the order and position + in which they appear in the machine table. */ +extern int machine_at_dataexpert386wb_init(const machine_t *); +extern int machine_at_genoa486_init(const machine_t *); +extern int machine_at_ga486l_init(const machine_t *); +extern int machine_at_cougar_init(const machine_t *); + extern int machine_at_acc386_init(const machine_t *); extern int machine_at_asus386_init(const machine_t *); extern int machine_at_ecs386_init(const machine_t *); diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h index a130309c4..beb690918 100644 --- a/src/include/86box/mem.h +++ b/src/include/86box/mem.h @@ -451,6 +451,7 @@ extern void mem_a20_recalc(void); extern void mem_init(void); extern void mem_close(void); extern void mem_reset(void); +extern void mem_remap_top_ex(int kb, uint32_t start); extern void mem_remap_top(int kb); extern void umc_smram_recalc(uint32_t start, int set); diff --git a/src/machine/m_at.c b/src/machine/m_at.c index 7b133a822..6343af4dc 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -258,6 +258,23 @@ machine_at_siemens_init(const machine_t *model) return ret; } +int +machine_at_wellamerastar_init(const machine_t *model) +{ + int ret; + + ret = bios_load_interleaved("roms/machines/wellamerastar/W_3.031_L.BIN", + "roms/machines/wellamerastar/W_3.031_H.BIN", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_ibm_common_init(model); + + return ret; +} + #if defined(DEV_BRANCH) && defined(USE_OPEN_AT) int machine_at_openat_init(const machine_t *model) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 07ed218ff..966639476 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -41,6 +41,7 @@ #include <86box/sio.h> #include <86box/hdc.h> #include <86box/port_6x.h> +#include <86box/port_92.h> #include <86box/video.h> #include <86box/flash.h> #include <86box/scsi_ncr53c8xx.h> @@ -2295,3 +2296,95 @@ machine_at_atc1762_init(const machine_t *model) return ret; } + +int +machine_at_dataexpert386wb_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/dataexpert386wb/st0386-wb-ver2-0-618f078c738cb397184464.bin", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + device_add(&opti391_device); + device_add(&keyboard_at_ami_device); + + if (fdc_current[0] == FDC_INTERNAL) + device_add(&fdc_at_device); + + return ret; +} + +int +machine_at_genoa486_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/genoa486/AMI486.BIO", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + + device_add(&compaq_genoa_device); + device_add(&port_92_device); + + device_add(&keyboard_at_ami_device); + + if (fdc_current[0] == FDC_INTERNAL) + device_add(&fdc_at_device); + + return ret; +} + +int +machine_at_ga486l_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/ga486l/ga-486l_bios.bin", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + device_add(&opti381_device); + device_add(&keyboard_at_ami_device); + + if (fdc_current[0] == FDC_INTERNAL) + device_add(&fdc_at_device); + + return ret; +} + +int +machine_at_cougar_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/cougar/COUGRMRB.BIN", + 0x000f0000, 65536, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init(model); + device_add(&ide_vlb_device); + + device_add(&opti499_device); + device_add(&fdc37c665_ide_pri_device); + + device_add(&keyboard_at_ami_device); + + if (fdc_current[0] == FDC_INTERNAL) + device_add(&fdc_at_device); + + return ret; +} diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index b6ea732af..57da4c7dc 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -126,6 +126,9 @@ const machine_filter_t machine_chipsets[] = { { "Intel 440GX", MACHINE_CHIPSET_INTEL_440GX }, { "OPTi 283", MACHINE_CHIPSET_OPTI_283 }, { "OPTi 291", MACHINE_CHIPSET_OPTI_291 }, + { "OPTi 381", MACHINE_CHIPSET_OPTI_381 }, + { "OPTi 391", MACHINE_CHIPSET_OPTI_391 }, + { "OPTi 481", MACHINE_CHIPSET_OPTI_481 }, { "OPTi 493", MACHINE_CHIPSET_OPTI_493 }, { "OPTi 495", MACHINE_CHIPSET_OPTI_495 }, { "OPTi 499", MACHINE_CHIPSET_OPTI_499 }, @@ -2921,6 +2924,46 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has Chips & Technologies KBC firmware. */ + { + .name = "[ISA] Wells American A*Star ", + .internal_name = "wellamerastar", + .type = MACHINE_TYPE_286, + .chipset = MACHINE_CHIPSET_DISCRETE, + .init = machine_at_wellamerastar_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 = 6000000, + .max_bus = 14000000, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_AT, + .flags = MACHINE_FLAGS_NONE, + .ram = { + .min = 512, + .max = 1024, + .step = 512 + }, + .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 + }, #if defined(DEV_BRANCH) && defined(USE_OLIVETTI) /* Has Olivetti KBC firmware. */ { @@ -5221,6 +5264,46 @@ const machine_t machines[] = { .vid_device = NULL, .snd_device = NULL, .net_device = NULL + }, + /* Has AMIKey 'F' KBC firmware. */ + { + .name = "[OPTi 391] DataExpert 386WB", + .internal_name = "dataexpert386wb", + .type = MACHINE_TYPE_386DX, + .chipset = MACHINE_CHIPSET_OPTI_391, + .init = machine_at_dataexpert386wb_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_386DX, /* Actual machine only supports 386DXes */ + .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 = 1024, + .max = 32768, + .step = 1024 + }, + .nvrmask = 127, + .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 }, /* The board has a "ASII KB-100" which I was not able to find any information about, but the BIOS sends commands C9 without a parameter and D5, both of which are @@ -5550,6 +5633,86 @@ const machine_t machines[] = { }, /* 486 machines - Socket 1 */ + /* Has AMI KF KBC firmware. */ + { + .name = "[ZyMOS Poach] Genoa Unknown 486", + .internal_name = "genoa486", + .type = MACHINE_TYPE_486, + .chipset = MACHINE_CHIPSET_ZYMOS_POACH, + .init = machine_at_genoa486_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET1, + .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_APM, + .ram = { + .min = 1024, + .max = 65536, + .step = 1024 + }, + .nvrmask = 127, + .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 + }, + /* Has AMI KF KBC firmware. */ + { + .name = "[OPTi 381] Gigabyte GA-486L", + .internal_name = "ga486l", + .type = MACHINE_TYPE_486, + .chipset = MACHINE_CHIPSET_OPTI_381, + .init = machine_at_ga486l_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET1, + .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_APM, + .ram = { + .min = 1024, + .max = 16384, + .step = 1024 + }, + .nvrmask = 127, + .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 + }, /* Has JetKey 5 KBC Firmware which looks like it is a clone of AMIKey type F. It also has those Ex commands also seen on the VIA VT82C42N (the BIOS supposedly sends command EF. @@ -6204,6 +6367,46 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has AMIKey-2 'H' KBC firmware. */ + { + .name = "[OPTi 499] Alaris COUGAR 486BL", + .internal_name = "cougar", + .type = MACHINE_TYPE_486_S2, + .chipset = MACHINE_CHIPSET_OPTI_499, + .init = machine_at_cougar_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET3, + .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_VLB, + .flags = MACHINE_APM, + .ram = { + .min = 1024, + .max = 65536, + .step = 1024 + }, + .nvrmask = 127, + .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 + }, /* Uses an Intel KBC with Phoenix MultiKey KBC firmware. */ { .name = "[SiS 461] DEC DECpc LPV", diff --git a/src/mem/mem.c b/src/mem/mem.c index 0e06fbfca..8f2e0d935 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -2968,10 +2968,9 @@ umc_smram_recalc(uint32_t start, int set) } void -mem_remap_top(int kb) +mem_remap_top_ex(int kb, uint32_t start) { uint32_t c; - uint32_t start = (mem_size >= 1024) ? mem_size : 1024; int offset; int size = mem_size - 640; int set = 1; @@ -3097,6 +3096,12 @@ mem_remap_top(int kb) flushmmucache(); } +void +mem_remap_top(int kb) +{ + mem_remap_top_ex(kb, (mem_size >= 1024) ? mem_size : 1024); +} + void mem_reset_page_blocks(void) { From 60eeef8c31b5d502f6ac9309e2be80a369c6385c Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 21 Jul 2024 06:25:01 +0200 Subject: [PATCH 134/624] CS4236B: Use real PnP ROM dump. --- src/sound/snd_cs423x.c | 85 +++++++++++++----------------------------- 1 file changed, 26 insertions(+), 59 deletions(-) diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 90aa0b0dd..02ca16fa6 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -30,7 +30,9 @@ #include <86box/isapnp.h> #include <86box/midi.h> #include <86box/timer.h> +#include <86box/mem.h> #include <86box/nvr.h> +#include <86box/rom.h> #include <86box/pic.h> #include <86box/sound.h> #include <86box/snd_ad1848.h> @@ -39,6 +41,8 @@ #include <86box/plat_fallthrough.h> #include <86box/plat_unused.h> +#define PNP_ROM_CS4236B "roms/sound/crystal/PNPISA01.BIN" + #define CRYSTAL_NOEEPROM 0x100 enum { @@ -58,7 +62,7 @@ static const uint8_t slam_init_key[32] = { 0x96, 0x35, 0x9A, 0xCD, 0xE6, 0xF3, 0 0x5E, 0xAF, 0x57, 0x2B, 0x15, 0x8A, 0xC5, 0xE2, 0xF1, 0xF8, 0x7C, 0x3E, 0x9F, 0x4F, 0x27, 0x13, 0x09, 0x84, 0x42, 0xA1, 0xD0, 0x68, 0x34, 0x1A }; -static const uint8_t cs4236b_eeprom[] = { +static const uint8_t cs4236b_eeprom[8224] = { // clang-format off /* Chip configuration */ 0x55, 0xbb, /* magic */ @@ -74,59 +78,7 @@ static const uint8_t cs4236b_eeprom[] = { 0x10, 0x03, /* DMA routing */ /* PnP resources */ - 0x0e, 0x63, 0x42, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, /* CSC4236, dummy checksum (filled in by isapnp_add_card) */ - 0x0a, 0x10, 0x01, /* PnP version 1.0, vendor version 0.1 */ - 0x82, 0x0e, 0x00, 'C', 'r', 'y', 's', 't', 'a', 'l', ' ', 'C', 'o', 'd', 'e' ,'c', 0x00, /* ANSI identifier */ - - 0x15, 0x0e, 0x63, 0x00, 0x00, 0x00, /* logical device CSC0000 */ - 0x82, 0x07, 0x00, 'W', 'S', 'S', '/', 'S', 'B', 0x00, /* ANSI identifier */ - 0x31, 0x00, /* start dependent functions, preferred */ - 0x2a, 0x02, 0x28, /* DMA 1, type A, no count by word, count by byte, not bus master, 8-bit only */ - 0x2a, 0x09, 0x28, /* DMA 0/3, type A, no count by word, count by byte, not bus master, 8-bit only */ - 0x22, 0x20, 0x00, /* IRQ 5 */ - 0x47, 0x01, 0x34, 0x05, 0x34, 0x05, 0x04, 0x04, /* I/O 0x534, decodes 16-bit, 4-byte alignment, 4 addresses */ - 0x47, 0x01, 0x88, 0x03, 0x88, 0x03, 0x08, 0x04, /* I/O 0x388, decodes 16-bit, 8-byte alignment, 4 addresses */ - 0x47, 0x01, 0x20, 0x02, 0x20, 0x02, 0x20, 0x10, /* I/O 0x220, decodes 16-bit, 32-byte alignment, 16 addresses */ - 0x31, 0x01, /* start dependent functions, acceptable */ - 0x2a, 0x0a, 0x28, /* DMA 1/3, type A, no count by word, count by byte, not bus master, 8-bit only */ - 0x2a, 0x0b, 0x28, /* DMA 0/1/3, type A, no count by word, count by byte, not bus master, 8-bit only */ - 0x22, 0xa0, 0x9a, /* IRQ 5/7/9/11/12/15 */ - 0x47, 0x01, 0x34, 0x05, 0xfc, 0x0f, 0x04, 0x04, /* I/O 0x534-0xFFC, decodes 16-bit, 4-byte alignment, 4 addresses */ - 0x47, 0x01, 0x88, 0x03, 0x88, 0x03, 0x08, 0x04, /* I/O 0x388, decodes 16-bit, 8-byte alignment, 4 addresses */ - 0x47, 0x01, 0x20, 0x02, 0x60, 0x02, 0x20, 0x10, /* I/O 0x220-0x260, decodes 16-bit, 32-byte alignment, 16 addresses */ - 0x31, 0x02, /* start dependent functions, sub-optimal */ - 0x2a, 0x0b, 0x28, /* DMA 0/1/3, type A, no count by word, count by byte, not bus master, 8-bit only */ - 0x22, 0xa0, 0x9a, /* IRQ 5/7/9/11/12/15 */ - 0x47, 0x01, 0x34, 0x05, 0xfc, 0x0f, 0x04, 0x04, /* I/O 0x534-0xFFC, decodes 16-bit, 4-byte alignment, 4 addresses */ - 0x47, 0x01, 0x88, 0x03, 0xf8, 0x03, 0x08, 0x04, /* I/O 0x388-0x3F8, decodes 16-bit, 8-byte alignment, 4 addresses */ - 0x47, 0x01, 0x20, 0x02, 0x00, 0x03, 0x20, 0x10, /* I/O 0x220-0x300, decodes 16-bit, 32-byte alignment, 16 addresses */ - 0x38, /* end dependent functions */ - - 0x15, 0x0e, 0x63, 0x00, 0x01, 0x00, /* logical device CSC0001 */ - 0x82, 0x05, 0x00, 'G', 'A', 'M', 'E', 0x00, /* ANSI identifier */ - 0x31, 0x00, /* start dependent functions, preferred */ - 0x47, 0x01, 0x00, 0x02, 0x00, 0x02, 0x08, 0x08, /* I/O 0x200, decodes 16-bit, 8-byte alignment, 8 addresses */ - 0x31, 0x01, /* start dependent functions, acceptable */ - 0x47, 0x01, 0x08, 0x02, 0x08, 0x02, 0x08, 0x08, /* I/O 0x208, decodes 16-bit, 8-byte alignment, 8 addresses */ - 0x38, /* end dependent functions */ - - 0x15, 0x0e, 0x63, 0x00, 0x10, 0x00, /* logical device CSC0010 */ - 0x82, 0x05, 0x00, 'C', 'T', 'R', 'L', 0x00, /* ANSI identifier */ - 0x47, 0x01, 0x20, 0x01, 0xf8, 0x0f, 0x08, 0x08, /* I/O 0x120-0xFF8, decodes 16-bit, 8-byte alignment, 8 addresses */ - - 0x15, 0x0e, 0x63, 0x00, 0x03, 0x00, /* logical device CSC0003 */ - 0x82, 0x04, 0x00, 'M', 'P', 'U', 0x00, /* ANSI identifier */ - 0x31, 0x00, /* start dependent functions, preferred */ - 0x22, 0x00, 0x02, /* IRQ 9 */ - 0x47, 0x01, 0x30, 0x03, 0x30, 0x03, 0x08, 0x02, /* I/O 0x330, decodes 16-bit, 8-byte alignment, 2 addresses */ - 0x31, 0x01, /* start dependent functions, acceptable */ - 0x22, 0x00, 0x9a, /* IRQ 9/11/12/15 */ - 0x47, 0x01, 0x30, 0x03, 0x60, 0x03, 0x08, 0x02, /* I/O 0x330-0x360, decodes 16-bit, 8-byte alignment, 2 addresses */ - 0x31, 0x02, /* start dependent functions, sub-optimal */ - 0x47, 0x01, 0x30, 0x03, 0xe0, 0x03, 0x08, 0x02, /* I/O 0x330-0x3E0, decodes 16-bit, 8-byte alignment, 2 addresses */ - 0x38, /* end dependent functions */ - - 0x79, 0x00 /* end tag, dummy checksum (filled in by isapnp_add_card) */ + 0x00 // clang-format on }; @@ -798,6 +750,12 @@ cs423x_init(const device_t *info) /* Load EEPROM contents from template. */ memcpy(dev->eeprom_data, cs4236b_eeprom, sizeof(cs4236b_eeprom)); + FILE *fp = rom_fopen(PNP_ROM_CS4236B, "rb"); + if (fp) { + fread(&(dev->eeprom_data[23]), 1, 8201, fp); + fclose(fp); + } + /* Set content size. */ dev->eeprom_data[2] = sizeof(cs4236b_eeprom) >> 8; dev->eeprom_data[3] = sizeof(cs4236b_eeprom) & 0xff; @@ -808,6 +766,7 @@ cs423x_init(const device_t *info) dev->eeprom_data[8] = 0x05; dev->eeprom_data[16] = 0x08; dev->eeprom_data[26] = 0x25; + dev->eeprom_data[44] = '5'; dev->nvr_path = "cs4235.nvr"; break; @@ -817,11 +776,13 @@ cs423x_init(const device_t *info) case CRYSTAL_CS4237B: dev->eeprom_data[26] = 0x37; + dev->eeprom_data[44] = '7'; dev->nvr_path = "cs4237b.nvr"; break; case CRYSTAL_CS4238B: dev->eeprom_data[26] = 0x38; + dev->eeprom_data[44] = '8'; dev->nvr_path = "cs4238b.nvr"; break; @@ -886,6 +847,12 @@ cs423x_close(void *priv) free(dev); } +static int +cs423x_available(void) +{ + return rom_present(PNP_ROM_CS4236B); +} + static void cs423x_speed_changed(void *priv) { @@ -902,7 +869,7 @@ const device_t cs4235_device = { .init = cs423x_init, .close = cs423x_close, .reset = cs423x_reset, - { .available = NULL }, + { .available = cs423x_available }, .speed_changed = cs423x_speed_changed, .force_redraw = NULL, .config = NULL @@ -916,7 +883,7 @@ const device_t cs4235_onboard_device = { .init = cs423x_init, .close = cs423x_close, .reset = cs423x_reset, - { .available = NULL }, + { .available = cs423x_available }, .speed_changed = cs423x_speed_changed, .force_redraw = NULL, .config = NULL @@ -930,7 +897,7 @@ const device_t cs4236b_device = { .init = cs423x_init, .close = cs423x_close, .reset = cs423x_reset, - { .available = NULL }, + { .available = cs423x_available }, .speed_changed = cs423x_speed_changed, .force_redraw = NULL, .config = NULL @@ -944,7 +911,7 @@ const device_t cs4237b_device = { .init = cs423x_init, .close = cs423x_close, .reset = cs423x_reset, - { .available = NULL }, + { .available = cs423x_available }, .speed_changed = cs423x_speed_changed, .force_redraw = NULL, .config = NULL @@ -958,7 +925,7 @@ const device_t cs4238b_device = { .init = cs423x_init, .close = cs423x_close, .reset = cs423x_reset, - { .available = NULL }, + { .available = cs423x_available }, .speed_changed = cs423x_speed_changed, .force_redraw = NULL, .config = NULL From c4470c7382fec272b614b698287199cf1f82bbbe Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Sun, 21 Jul 2024 11:32:45 +0500 Subject: [PATCH 135/624] opti499.c: Remove an unneeded call to free() --- src/chipset/opti499.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/chipset/opti499.c b/src/chipset/opti499.c index a6d6c71cf..d976e0198 100644 --- a/src/chipset/opti499.c +++ b/src/chipset/opti499.c @@ -226,8 +226,6 @@ opti499_reset(void *priv) cpu_update_waitstates(); opti499_recalc(dev); - - free(dev); } static void From 189be035d2e1093a80eaec826d62dd996e315901 Mon Sep 17 00:00:00 2001 From: rilysh Date: Sun, 21 Jul 2024 12:49:06 +0530 Subject: [PATCH 136/624] Mark plat_vidapi() argument as const and remove the NULL * plat_vidapi() accepts char pointer, which never gets modifed later on. Mark it as const. * In src/config.c, va_name is initialized as NULL, however, plat_vidapi_name() never returns a NULL pointer, nor it was initialized under a condition branch. Removing NULL, might save one instruction, which requires zeroing the register before setting its initial value. --- src/config.c | 2 +- src/include/86box/plat.h | 2 +- src/qt/qt.c | 2 +- src/unix/unix_sdl.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/config.c b/src/config.c index 23b78f117..2c0781028 100644 --- a/src/config.c +++ b/src/config.c @@ -1720,7 +1720,7 @@ save_general(void) char temp[512]; char buffer[512] = { 0 }; - const char *va_name = NULL; + const char *va_name; ini_section_set_int(cat, "vid_resize", vid_resize); if (vid_resize == 0) diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 26f5d5cc8..4a310ab44 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -153,7 +153,7 @@ extern uint32_t plat_get_ticks(void); extern void plat_delay_ms(uint32_t count); extern void plat_pause(int p); extern void plat_mouse_capture(int on); -extern int plat_vidapi(char *name); +extern int plat_vidapi(const char *name); extern char *plat_vidapi_name(int api); extern void plat_resize(int x, int y, int monitor_index); extern void plat_resize_request(int x, int y, int monitor_index); diff --git a/src/qt/qt.c b/src/qt/qt.c index 47f5b9410..a9a6460eb 100644 --- a/src/qt/qt.c +++ b/src/qt/qt.c @@ -38,7 +38,7 @@ qt_nvr_save(void) char icon_set[256] = ""; /* name of the iconset to be used */ int -plat_vidapi(char *api) +plat_vidapi(const char *api) { if (!strcasecmp(api, "default") || !strcasecmp(api, "system")) { return 0; diff --git a/src/unix/unix_sdl.c b/src/unix/unix_sdl.c index c7cc898be..002e33fd6 100644 --- a/src/unix/unix_sdl.c +++ b/src/unix/unix_sdl.c @@ -392,7 +392,7 @@ sdl_reload(void) } int -plat_vidapi(char *api) +plat_vidapi(UNUSED(const char *api)) { return 0; } From 422ebb322b9a1c59fb91e0a759ccb2b0e473e3c5 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 21 Jul 2024 15:13:16 +0200 Subject: [PATCH 137/624] Migrate device configuration regardless of what instance it is. --- src/device.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/device.c b/src/device.c index cf0764946..41f4b74d5 100644 --- a/src/device.c +++ b/src/device.c @@ -97,14 +97,12 @@ device_set_context(device_context_t *c, const device_t *dev, int inst) if (inst) { sprintf(c->name, "%s #%i", dev->name, inst); - /* If this is the first instance and a numbered section is not present, but a non-numbered - section of the same name is, rename the non-numbered section to numbered. */ - if (inst == 1) { - const void *sec = config_find_section(c->name); - void * single_sec = config_find_section((char *) dev->name); - if ((sec == NULL) && (single_sec != NULL)) - config_rename_section(single_sec, c->name); - } + /* If a numbered section is not present, but a non-numbered of the same name + is, rename the non-numbered section to numbered. */ + const void *sec = config_find_section(c->name); + void * single_sec = config_find_section((char *) dev->name); + if ((sec == NULL) && (single_sec != NULL)) + config_rename_section(single_sec, c->name); } else sprintf(c->name, "%s", dev->name); } From d89d9c65f78dd19dfe1b5aa2b51c05bcccf9edc3 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 21 Jul 2024 17:52:42 +0200 Subject: [PATCH 138/624] Minor cleanup --- src/device/mouse_microtouch_touchscreen.c | 66 +++++++++++------------ 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index e1a965513..72ac9c53a 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -40,7 +40,7 @@ enum mtouch_modes { MODE_TABLET = 1, MODE_RAW = 2, - MODE_HEX = 3 + MODE_HEX = 3 }; typedef struct mouse_microtouch_t { @@ -94,69 +94,69 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) for (i = 0; i < strlen(mtouch->cmd); i++) { mtouch->cmd[i] = toupper(mtouch->cmd[i]); } - if (mtouch->cmd[0] == 'Z') { // Null + if (mtouch->cmd[0] == 'Z') { /* Null */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { // Finger Only + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ mtouch->pen_mode = 1; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { // Unit Type + if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "TP****00\r", sizeof("TP****00\r") - 1); } - if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { // Output Identity + if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "P50200\r", sizeof("P50200\r") - 1); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { // Format Tablet + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ mtouch->mode = MODE_TABLET; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { // Format Hexadecimal - mtouch->mode = MODE_HEX; + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ + mtouch->mode = MODE_HEX; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *)"0\r", 2); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { // Format Raw + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ mtouch->mode = MODE_RAW; mtouch->cal_cntr = 0; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { // Mode Stream + if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'R') { // Reset + if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; mtouch->mode = MODE_TABLET; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; timer_on_auto(&mtouch->reset_timer, 500. * 1000.); } - if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { // Autobaud Enable/Disable + if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { /* Autobaud Enable/Disable */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'N' && mtouch->cmd[1] == 'M') { // ?? + if (mtouch->cmd[0] == 'N' && mtouch->cmd[1] == 'M') { /* ?? */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'Q') { // ?? + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'Q') { /* ?? */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); } - if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'F') { // ?? + if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'F') { /* ?? */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); } if (mtouch->cmd[0] == 'P') { - if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; // Pen or Finger - else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; // Pen Only + if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ + else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } @@ -225,18 +225,18 @@ static int mtouch_poll(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - - if (fifo8_num_free(&dev->resp) <= 10 || dev->mode == MODE_RAW) { - return 0; - } - - unsigned int abs_x_int = 0, abs_y_int = 0; + + if (fifo8_num_free(&dev->resp) <= 10 || dev->mode == MODE_RAW) { + return 0; + } + + unsigned int abs_x_int = 0, abs_y_int = 0; double abs_x; double abs_y; int b = mouse_get_buttons_ex(); mouse_get_abs_coords(&abs_x, &abs_y); - dev->b |= !!(b & 3); // any button pressed + dev->b |= !!(b & 3); /* any button pressed */ if (abs_x >= 1.0) abs_x = 1.0; @@ -280,7 +280,7 @@ mtouch_poll(void *priv) if (dev->cal_cntr) { return 0; } - if (!!(b & 3)) { // Hover + if (!!(b & 3)) { /* Hover */ dev->abs_x = abs_x; dev->abs_y = abs_y; dev->b |= 1; @@ -293,7 +293,7 @@ mtouch_poll(void *priv) fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); fifo8_push(&dev->resp, abs_y_int & 0b1111111); fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); - } else if ((dev->b & 1) && !(b & 3)) { // Touch + } else if ((dev->b & 1) && !(b & 3)) { /* Touch */ dev->b &= ~1; abs_x_int = dev->abs_x * 16383; abs_y_int = 16383 - dev->abs_y * 16383; @@ -309,27 +309,27 @@ mtouch_poll(void *priv) fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); } } - + else if (dev->mode == MODE_HEX) { abs_x_int = abs_x * 1023; abs_y_int = 1023 - (abs_y * 1023); char buffer[20]; - if (dev->cal_cntr && !b && dev->prev_b) { + if (dev->cal_cntr && !b && dev->prev_b) { microtouch_calibrate_timer(dev); - } + } else if (b & 1) { - if (dev->prev_b == 0) { // Touchdown + if (dev->prev_b == 0) { /* Touchdown */ snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); - } else { // Touch Continuation + } else { /* Touch Continuation */ snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } else if (dev->prev_b == 1) { // Liftoff + } else if (dev->prev_b == 1) { /* Liftoff */ snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - dev->prev_b = b & 1; + dev->prev_b = b & 1; } return 0; } From ad710b710ddf8476eb414cacd6a76c59b98102ba Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 00:01:04 +0200 Subject: [PATCH 139/624] Gave the Acer T100 the missing ALi M5105 Super I/O chip, fixes #4540. --- src/machine/m_at_286_386sx.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index 9e9186040..e81eae1f1 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -725,6 +725,7 @@ machine_at_acer100t_init(const machine_t *model) if (gfxcard[0] == VID_INTERNAL) device_add(&oti077_acer100t_device); + device_add(&ali5105_device); return ret; } From f06fae90c8c8a038708df819cff58d9b12dbd8b3 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 21 Jul 2024 18:03:03 -0400 Subject: [PATCH 140/624] Fix pravetz16s compile --- src/machine/m_xt.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index f1c325582..c340d5a9b 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -375,7 +375,8 @@ machine_xt_pravetz16s_cpu12p_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_xt_init_ex(model); + machine_xt_common_init(model, 0); + return ret; } From fc714e727029645da3d7ecc50d6ec2bdaed533e6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 00:07:39 +0200 Subject: [PATCH 141/624] Backported the VLSI 82c113 Super I/O chip from my branch because of two machines we already had that require it. --- src/include/86box/sio.h | 1 + src/machine/m_at_286_386sx.c | 7 +- src/machine/m_at_386dx_486.c | 2 +- src/sio/CMakeLists.txt | 2 +- src/sio/sio_vl82c113.c | 163 +++++++++++++++++++++++++++++++++++ 5 files changed, 172 insertions(+), 3 deletions(-) create mode 100644 src/sio/sio_vl82c113.c diff --git a/src/include/86box/sio.h b/src/include/86box/sio.h index 6b7d46987..7f40203b4 100644 --- a/src/include/86box/sio.h +++ b/src/include/86box/sio.h @@ -88,6 +88,7 @@ extern const device_t um8669f_device; extern const device_t um8669f_ide_device; extern const device_t um8669f_ide_sec_device; extern const device_t via_vt82c686_sio_device; +extern const device_t vl82c113_device; extern const device_t w83787f_88h_device; extern const device_t w83787f_device; extern const device_t w83787f_ide_device; diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index e81eae1f1..4632e00df 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -644,7 +644,12 @@ machine_at_cmdsl386sx25_init(const machine_t *model) if (gfxcard[0] == VID_INTERNAL) device_add(&gd5402_onboard_device); - machine_at_scamp_common_init(model, 1); + machine_at_common_ide_init(model); + + device_add(&ali5105_device); /* The FDC is part of the ALi M5105. */ + device_add(&vl82c113_device); /* The keyboard controller is part of the VL82c113. */ + + device_add(&vlsi_scamp_device); return ret; } diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 966639476..82f946314 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -375,7 +375,7 @@ machine_at_vect486vl_init(const machine_t *model) // has HDC problems if (gfxcard[0] == VID_INTERNAL) device_add(&gd5428_onboard_device); - device_add(&keyboard_ps2_ami_device); + device_add(&vl82c113_device); device_add(&fdc37c651_ide_device); return ret; diff --git a/src/sio/CMakeLists.txt b/src/sio/CMakeLists.txt index dff0fcd0f..ecb780a9b 100644 --- a/src/sio/CMakeLists.txt +++ b/src/sio/CMakeLists.txt @@ -20,7 +20,7 @@ add_library(sio OBJECT sio_acc3221.c sio_ali5123.c sio_f82c710.c sio_82091aa.c sio_prime3b.c sio_prime3c.c sio_w83787f.c sio_w83877f.c sio_w83977f.c sio_um8663f.c sio_um8669f.c - sio_vt82c686.c) + sio_vl82c113.c sio_vt82c686.c) if(SIO_DETECT) target_sources(sio PRIVATE sio_detect.c) diff --git a/src/sio/sio_vl82c113.c b/src/sio/sio_vl82c113.c new file mode 100644 index 000000000..6a02ef359 --- /dev/null +++ b/src/sio/sio_vl82c113.c @@ -0,0 +1,163 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Implementation of the VLSI VL82c113 Combination I/O Chip. + * + * Authors: Miran Grca, + * + * Copyright 2024 Miran Grca. + */ +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/io.h> +#include <86box/timer.h> +#include <86box/device.h> +#include <86box/keyboard.h> +#include <86box/nvr.h> +#include <86box/sio.h> + +typedef struct vl82c113_t { + uint8_t index; + uint8_t nvr_enabled; + uint8_t regs[3]; + uint8_t pad; + uint16_t nvr_base; + int cur_reg; + nvr_t *nvr; + void *kbc; +} vl82c113_t; + +static void +vl82c113_nvr_handler(vl82c113_t *dev) +{ + const uint8_t nvr_enabled = (dev->regs[0x00]) & 0x01; + const uint16_t nvr_base = ((dev->regs[0x01] << 8) | dev->regs[0x00]) & 0xfffe; + + if ((nvr_enabled != dev->nvr_enabled) || (nvr_base != dev->nvr_base)) { + if (dev->nvr_enabled && (dev->nvr_base != 0x0000)) + nvr_at_handler(0, dev->nvr_base, dev->nvr); + + dev->nvr_enabled = nvr_enabled; + dev->nvr_base = nvr_base; + + if (dev->nvr_enabled && (dev->nvr_base != 0x0000)) + nvr_at_handler(1, dev->nvr_base, dev->nvr); + } +} + +static void +vl82c113_out(uint16_t port, uint8_t val, void *priv) +{ + vl82c113_t *dev = (vl82c113_t *) priv; + + if (port == 0xec) + dev->index = val; + else if ((dev->index >= 0x1b) && (dev->index <= 0x1d)) { + const uint8_t index = dev->index - 0x1b; + const uint8_t valxor = dev->regs[index] ^ val; + + dev->regs[index] = val; + + switch (index) { + default: + break; + + case 0x00: + case 0x01: + if (valxor) + vl82c113_nvr_handler(dev); + break; + + case 0x02: + if (valxor & 0x02) + kbc_at_set_ps2(dev->kbc, !(val & 0x02)); + break; + } + } +} + +static uint8_t +vl82c113_in(uint16_t port, void *priv) +{ + const vl82c113_t *dev = (vl82c113_t *) priv; + uint8_t ret = 0xff; + + if (port == 0xed) { + if ((dev->index >= 0x1b) && (dev->index <= 0x1d)) + ret = dev->regs[dev->index - 0x1b]; + else if (dev->index == 0x1f) + /* REVID */ + ret = 0xc0; + } + + return ret; +} + +static void +vl82c113_reset(void *priv) +{ + vl82c113_t *dev = (vl82c113_t *) priv; + + memset(dev->regs, 0x00, sizeof(dev->regs)); + + dev->regs[0x00] = 0x71; + dev->regs[0x01] = 0x00; + + dev->regs[0x02] = 0xc3; + + kbc_at_set_ps2(dev->kbc, 0); + + vl82c113_nvr_handler(dev); +} + +static void +vl82c113_close(void *priv) +{ + vl82c113_t *dev = (vl82c113_t *) priv; + + free(dev); +} + +static void * +vl82c113_init(const device_t *info) +{ + vl82c113_t *dev = (vl82c113_t *) calloc(1, sizeof(vl82c113_t)); + + dev->nvr = device_add(&at_nvr_device); + + dev->nvr_enabled = 1; + dev->nvr_base = 0x0070; + + /* Commands are standard. */ + dev->kbc = device_add(&keyboard_at_device); + + vl82c113_reset(dev); + + io_sethandler(0x00ec, 0x0002, vl82c113_in, NULL, NULL, vl82c113_out, NULL, NULL, dev); + + return dev; +} + +const device_t vl82c113_device = { + .name = "VLSI VL82c113 Combination I/O", + .internal_name = "vl82c113", + .flags = 0, + .local = 0, + .init = vl82c113_init, + .close = vl82c113_close, + .reset = vl82c113_reset, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + From 9ed1e75586ba9814baa4df610027d8f26c5ef22d Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 21 Jul 2024 18:11:38 -0400 Subject: [PATCH 142/624] add missing kbc to pravetz16s --- src/machine/m_xt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index c340d5a9b..c11968d33 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -375,6 +375,8 @@ machine_xt_pravetz16s_cpu12p_init(const machine_t *model) if (bios_only || !ret) return ret; + device_add(&keyboard_xt_device); + machine_xt_common_init(model, 0); return ret; From fd00bcca8b95e4523bb0b3f460340fc5bf470ba2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 00:12:12 +0200 Subject: [PATCH 143/624] Backported the kbc_at_set_ps2() function required by the VL82c113. --- src/device/kbc_at.c | 14 ++++++++++++++ src/include/86box/keyboard.h | 1 + 2 files changed, 15 insertions(+) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index 8c94685b7..9ba84888c 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -1189,6 +1189,20 @@ write60_ami(void *priv, uint8_t val) return 1; } +void +kbc_at_set_ps2(void *priv, const uint8_t ps2) +{ + atkbc_t *dev = (atkbc_t *) priv; + + dev->ami_flags = (dev->ami_flags & 0xfe) | (!!ps2); + dev->misc_flags &= ~FLAG_PS2; + if (ps2) { + dev->misc_flags |= FLAG_PS2; + kbc_at_do_poll = kbc_at_poll_ps2; + } else + kbc_at_do_poll = kbc_at_poll_at; +} + static uint8_t write64_ami(void *priv, uint8_t val) { diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index 846123627..bf9a76d73 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -278,6 +278,7 @@ extern int keyboard_isfsexit(void); 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_set_fast_reset(uint8_t new_fast_reset); extern void kbc_at_handler(int set, void *priv); From ecc7f965a813d6cabfde012000b679df6caa086c Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 20 Jul 2024 22:38:13 -0400 Subject: [PATCH 144/624] Named initializers for IBM & Cyrix CPU's --- src/cpu/cpu_table.c | 376 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 348 insertions(+), 28 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index b9e81aa72..1e756c183 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -1507,10 +1507,58 @@ const cpu_family_t cpu_families[] = { .name = "386SLC", .internal_name = "ibm386slc", .cpus = (const CPU[]) { - {"16", CPU_IBM386SLC, fpus_80386, 16000000, 1, 5000, 0xA301, 0, 0, 0, 3,3,3,3, 2}, - {"20", CPU_IBM386SLC, fpus_80386, 20000000, 1, 5000, 0xA301, 0, 0, 0, 4,4,3,3, 3}, - {"25", CPU_IBM386SLC, fpus_80386, 25000000, 1, 5000, 0xA301, 0, 0, 0, 4,4,3,3, 3}, - {"", 0} + { + .name = "16", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386SX, @@ -1518,10 +1566,58 @@ const cpu_family_t cpu_families[] = { .name = "Cx486SLC", .internal_name = "cx486slc", .cpus = (const CPU[]) { - {"20", CPU_486SLC, fpus_80386, 20000000, 1, 5000, 0x400, 0, 0x0000, 0, 4,4,3,3, 3}, - {"25", CPU_486SLC, fpus_80386, 25000000, 1, 5000, 0x400, 0, 0x0000, 0, 4,4,3,3, 3}, - {"33", CPU_486SLC, fpus_80386, 33333333, 1, 5000, 0x400, 0, 0x0000, 0, 6,6,3,3, 4}, - {"", 0} + { + .name = "20", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386SX, @@ -1529,10 +1625,58 @@ const cpu_family_t cpu_families[] = { .name = "Cx486SRx2", .internal_name = "cx486srx2", .cpus = (const CPU[]) { - {"32", CPU_486SLC, fpus_80386, 32000000, 2, 5000, 0x406, 0, 0x0006, 0, 6,6,6,6, 4}, - {"40", CPU_486SLC, fpus_80386, 40000000, 2, 5000, 0x406, 0, 0x0006, 0, 8,8,6,6, 6}, - {"50", CPU_486SLC, fpus_80386, 50000000, 2, 5000, 0x406, 0, 0x0006, 0, 8,8,6,6, 6}, - {"", 0} + { + .name = "32", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 32000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "50", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_486SLC_IBM, @@ -1540,8 +1684,24 @@ const cpu_family_t cpu_families[] = { .name = "486SLC", .internal_name = "ibm486slc", .cpus = (const CPU[]) { - {"33", CPU_IBM486SLC, fpus_80386, 33333333, 1, 5000, 0xA401, 0, 0, 0, 6,6,3,3, 4}, - {"", 0} + { + .name = "33", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA401, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_486SLC_IBM, @@ -1549,10 +1709,58 @@ const cpu_family_t cpu_families[] = { .name = "486SLC2", .internal_name = "ibm486slc2", .cpus = (const CPU[]) { - {"40", CPU_IBM486SLC, fpus_80386, 40000000, 2, 5000, 0xA421, 0, 0, 0, 7,7,6,6, 5}, - {"50", CPU_IBM486SLC, fpus_80386, 50000000, 2, 5000, 0xA421, 0, 0, 0, 8,8,6,6, 6}, - {"66", CPU_IBM486SLC, fpus_80386, 66666666, 2, 5000, 0xA421, 0, 0, 0, 12,12,6,6, 8}, - {"", 0} + { + .name = "40", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 5 + }, + { + .name = "50", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_486SLC_IBM, @@ -1560,10 +1768,58 @@ const cpu_family_t cpu_families[] = { .name = "486SLC3", .internal_name = "ibm486slc3", .cpus = (const CPU[]) { - {"60", CPU_IBM486SLC, fpus_80386, 60000000, 3, 5000, 0xA439, 0, 0, 0, 12,12,9,9, 7}, - {"75", CPU_IBM486SLC, fpus_80386, 75000000, 3, 5000, 0xA439, 0, 0, 0, 12,12,9,9, 9}, - {"100", CPU_IBM486SLC, fpus_80386, 100000000, 3, 5000, 0xA439, 0, 0, 0, 18,18,9,9, 12}, - {"", 0} + { + .name = "60", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 60000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 7 + }, + { + .name = "75", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 75000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 + }, + { + .name = "100", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 100000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_486BL, @@ -1571,9 +1827,41 @@ const cpu_family_t cpu_families[] = { .name = "486BL2", .internal_name = "ibm486bl2", .cpus = (const CPU[]) { - {"50", CPU_IBM486BL, fpus_80386, 50000000, 2, 5000, 0xA439, 0, 0, 0, 8,8,6,6, 6}, - {"66", CPU_IBM486BL, fpus_80386, 66666666, 2, 5000, 0xA439, 0, 0, 0, 12,12,6,6, 8}, - {"", 0} + { + .name = "50", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_486BL, @@ -1581,9 +1869,41 @@ const cpu_family_t cpu_families[] = { .name = "486BL3", .internal_name = "ibm486bl3", .cpus = (const CPU[]) { - {"75", CPU_IBM486BL, fpus_80386, 75000000, 3, 5000, 0xA439, 0, 0, 0, 12,12,9,9, 9}, - {"100", CPU_IBM486BL, fpus_80386, 100000000, 3, 5000, 0xA439, 0, 0, 0, 18,18,9,9, 12}, - {"", 0} + { + .name = "75", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 75000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 + }, + { + .name = "100", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 100000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { .name = "", 0 } } }, { .package = CPU_PKG_386DX, From 1b4408cf387ebd04eb30b49ec683cd30c6a24924 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 20 Jul 2024 23:30:51 -0400 Subject: [PATCH 145/624] Deal with incorrect formatting offset in cpu_table --- src/cpu/cpu_table.c | 5543 ++++++++++++++++++++++--------------------- 1 file changed, 2807 insertions(+), 2736 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 1e756c183..c24167500 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -71,2760 +71,2831 @@ FPU fpus_internal[] = { const cpu_family_t cpu_families[] = { // clang-format off { - .package = CPU_PKG_8088, - .manufacturer = "Intel", - .name = "8088", - .internal_name = "8088", - .cpus = (const CPU[]) { - { - .name = "4.77", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 4772728, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "7.16", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "8", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, + .package = CPU_PKG_8088, + .manufacturer = "Intel", + .name = "8088", + .internal_name = "8088", + .cpus = (const CPU[]) { + { + .name = "4.77", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 4772728, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "7.16", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "8", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, #if 0 - { - .name = "9.54", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 9545456, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, + { + .name = "9.54", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 9545456, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, #endif - { - .name = "10", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "12", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "16", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_8088_EUROPC, - .manufacturer = "Intel", - .name = "8088", - .internal_name = "8088_europc", - .cpus = (const CPU[]) { - { - .name = "4.77", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 4772728, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "7.16", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "9.54", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 9545456, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_8086, - .manufacturer = "Intel", - .name = "8086", - .internal_name = "8086", - .cpus = (const CPU[]) { - { - .name = "7.16", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "8", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "9.54", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 9545456, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "10", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "12", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "16", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 2 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_188, - .manufacturer = "Intel", - .name = "80188", - .internal_name = "80188", - .cpus = (const CPU[]) { - { - .name = "6", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 6000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "7.16", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "8", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "9.54", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 9545456, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "10", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "12", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "16", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 2 - }, - { - .name = "20", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 3 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_8088, - .manufacturer = "NEC", - .name = "V20", - .internal_name = "necv20", - .cpus = (const CPU[]) { - { - .name = "4.77", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 4772728, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "7.16", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "10", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "12", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "16", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 2 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_186, - .manufacturer = "Intel", - .name = "80186", - .internal_name = "80186", - .cpus = (const CPU[]) { - { - .name = "6", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 6000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "7.16", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 7159092, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "8", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 8000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "9.54", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 9545456, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "10", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 10000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "12", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 12000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "16", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 16000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 2 - }, - { - .name = "20", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 20000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 25000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 3 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_8086, - .manufacturer = "NEC", - .name = "V30", - .internal_name = "necv30", - .cpus = (const CPU[]) { - { - .name = "5", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 5000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "8", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "10", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "12", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 1 - }, - { - .name = "16", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, - .cache_write_cycles = 0, - .atclk_div = 2 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_286, - .manufacturer = "Intel", - .name = "80286", - .internal_name = "286", - .cpus = (const CPU[]) { - { - .name = "6", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 6000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 2, - .mem_write_cycles = 2, - .cache_read_cycles = 2, - .cache_write_cycles = 2, - .atclk_div = 1 - }, - { - .name = "8", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 2, - .mem_write_cycles = 2, - .cache_read_cycles = 2, - .cache_write_cycles = 2, - .atclk_div = 1 - }, - { - .name = "10", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 2, - .mem_write_cycles = 2, - .cache_read_cycles = 2, - .cache_write_cycles = 2, - .atclk_div = 1 - }, - { - .name = "12", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 12500000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 2 - }, - { - .name = "16", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 2 - }, - { - .name = "20", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 4, - .cache_write_cycles = 4, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 4, - .cache_write_cycles = 4, - .atclk_div = 3 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386SX, - .manufacturer = "Intel", - .name = "i386SX", - .internal_name = "i386sx", - .cpus = (const CPU[]) { - { - .name = "16", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 2 - }, - { - .name = "20", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "33", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 5 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386SX, - .manufacturer = "AMD", - .name = "Am386SX", - .internal_name = "am386sx", - .cpus = (const CPU[]) { - { - .name = "16", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 2 - }, - { - .name = "20", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "33", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 5 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386DX, - .manufacturer = "Intel", - .name = "i386DX", - .internal_name = "i386dx", - .cpus = (const CPU[]) { - { - .name = "16", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 2 - }, - { - .name = "20", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "33", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 5 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386DX_DESKPRO386, - .manufacturer = "Intel", - .name = "i386DX", - .internal_name = "i386dx_deskpro386", - .cpus = (const CPU[]) { - { - .name = "16", - .cpu_type = CPU_386DX, - .fpus = fpus_80286, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 2 - }, - { - .name = "20", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386DX, - .manufacturer = "Intel", - .name = "RapidCAD", - .internal_name = "rapidcad", - .cpus = (const CPU[]) { - { - .name = "25", - .cpu_type = CPU_RAPIDCAD, - .fpus = fpus_internal, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0340, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "33", - .cpu_type = CPU_RAPIDCAD, - .fpus = fpus_internal, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0340, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_RAPIDCAD, - .fpus = fpus_internal, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0340, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 5 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386DX, - .manufacturer = "AMD", - .name = "Am386DX", - .internal_name = "am386dx", - .cpus = (const CPU[]) { - { - .name = "25", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "33", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 5 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_M6117, - .manufacturer = "ALi", - .name = "M6117", - .internal_name = "m6117", - .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ - { - .name = "33", - .cpu_type = CPU_386SX, - .fpus = fpus_none, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2309, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_386SX, - .fpus = fpus_none, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2309, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 5 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386SLC_IBM, - .manufacturer = "IBM", - .name = "386SLC", - .internal_name = "ibm386slc", - .cpus = (const CPU[]) { - { - .name = "16", - .cpu_type = CPU_IBM386SLC, - .fpus = fpus_80386, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0xA301, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 2 - }, - { - .name = "20", - .cpu_type = CPU_IBM386SLC, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0xA301, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_IBM386SLC, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0xA301, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386SX, - .manufacturer = "Cyrix", - .name = "Cx486SLC", - .internal_name = "cx486slc", - .cpus = (const CPU[]) { - { - .name = "20", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x400, - .cpuid_model = 0, - .cyrix_id = 0x0000, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "25", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x400, - .cpuid_model = 0, - .cyrix_id = 0x0000, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "33", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x400, - .cpuid_model = 0, - .cyrix_id = 0x0000, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386SX, - .manufacturer = "Cyrix", - .name = "Cx486SRx2", - .internal_name = "cx486srx2", - .cpus = (const CPU[]) { - { - .name = "32", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 32000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x406, - .cpuid_model = 0, - .cyrix_id = 0x0006, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x406, - .cpuid_model = 0, - .cyrix_id = 0x0006, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 6 - }, - { - .name = "50", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x406, - .cpuid_model = 0, - .cyrix_id = 0x0006, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 6 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .name = "486SLC", - .internal_name = "ibm486slc", - .cpus = (const CPU[]) { - { - .name = "33", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0xA401, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .name = "486SLC2", - .internal_name = "ibm486slc2", - .cpus = (const CPU[]) { - { - .name = "40", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0xA421, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 5 - }, - { - .name = "50", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0xA421, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 6 - }, - { - .name = "66", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0xA421, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 8 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .name = "486SLC3", - .internal_name = "ibm486slc3", - .cpus = (const CPU[]) { - { - .name = "60", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 60000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 7 - }, - { - .name = "75", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 75000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 9 - }, - { - .name = "100", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 100000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 12 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_486BL, - .manufacturer = "IBM", - .name = "486BL2", - .internal_name = "ibm486bl2", - .cpus = (const CPU[]) { - { - .name = "50", - .cpu_type = CPU_IBM486BL, - .fpus = fpus_80386, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 6 - }, - { - .name = "66", - .cpu_type = CPU_IBM486BL, - .fpus = fpus_80386, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 8 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_486BL, - .manufacturer = "IBM", - .name = "486BL3", - .internal_name = "ibm486bl3", - .cpus = (const CPU[]) { - { - .name = "75", - .cpu_type = CPU_IBM486BL, - .fpus = fpus_80386, - .rspeed = 75000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 9 - }, - { - .name = "100", - .cpu_type = CPU_IBM486BL, - .fpus = fpus_80386, - .rspeed = 100000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 12 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386DX, - .manufacturer = "Cyrix", - .name = "Cx486DLC", - .internal_name = "cx486dlc", - .cpus = (const CPU[]) { - { - .name = "25", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x401, - .cpuid_model = 0, - .cyrix_id = 0x0001, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 3 - }, - { - .name = "33", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x401, - .cpuid_model = 0, - .cyrix_id = 0x0001, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x401, - .cpuid_model = 0, - .cyrix_id = 0x0001, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 5 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_386DX, - .manufacturer = "Cyrix", - .name = "Cx486DRx2", - .internal_name = "cx486drx2", - .cpus = (const CPU[]) { - { - .name = "32", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 32000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x407, - .cpuid_model = 0, - .cyrix_id = 0x0007, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 4 - }, - { - .name = "40", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x407, - .cpuid_model = 0, - .cyrix_id = 0x0007, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 6 - }, - { - .name = "50", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x407, - .cpuid_model = 0, - .cyrix_id = 0x0007, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 6 - }, - { - .name = "66", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x407, - .cpuid_model = 0, - .cyrix_id = 0x0007, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 8 - }, - { .name = "", 0 } - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486SX", - .internal_name = "i486sx", - .cpus = (const CPU[]) { - {"16", CPU_i486SX, fpus_486sx, 16000000, 1, 5000, 0x420, 0, 0, CPU_SUPPORTS_DYNAREC, 3, 3,3,3, 2}, - {"20", CPU_i486SX, fpus_486sx, 20000000, 1, 5000, 0x420, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, - {"25", CPU_i486SX, fpus_486sx, 25000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, - {"33", CPU_i486SX, fpus_486sx, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486SX-S", - .internal_name = "i486sx_slenh", - .cpus = (const CPU[]) { - {"25", CPU_i486SX_SLENH, fpus_486sx, 25000000, 1, 5000, 0x423, 0x423, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, - {"33", CPU_i486SX_SLENH, fpus_486sx, 33333333, 1, 5000, 0x42a, 0x42a, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486SX2", - .internal_name = "i486sx2", - .cpus = (const CPU[]) { - {"50", CPU_i486SX_SLENH, fpus_486sx, 50000000, 2, 5000, 0x45b, 0x45b, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66 (Q0569)", CPU_i486SX_SLENH, fpus_486sx, 66666666, 2, 5000, 0x45b, 0x45b, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 8}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486DX", - .internal_name = "i486dx", - .cpus = (const CPU[]) { - {"25", CPU_i486DX, fpus_internal, 25000000, 1, 5000, 0x404, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, - {"33", CPU_i486DX, fpus_internal, 33333333, 1, 5000, 0x404, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, - {"50", CPU_i486DX, fpus_internal, 50000000, 1, 5000, 0x411, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8,4,4, 6}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486DX-S", - .internal_name = "i486dx_slenh", - .cpus = (const CPU[]) { - {"33", CPU_i486DX_SLENH, fpus_internal, 33333333, 1, 5000, 0x414, 0x414, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, - {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 1, 5000, 0x414, 0x414, 0, CPU_SUPPORTS_DYNAREC, 8, 8,4,4, 6}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486DX2", - .internal_name = "i486dx2", - .cpus = (const CPU[]) { - {"40", CPU_i486DX, fpus_internal, 40000000, 2, 5000, 0x430, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7,6,6, 5}, - {"50", CPU_i486DX, fpus_internal, 50000000, 2, 5000, 0x433, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66", CPU_i486DX, fpus_internal, 66666666, 2, 5000, 0x433, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486DX2-S", - .internal_name = "i486dx2_slenh", - .cpus = (const CPU[]) { - {"40", CPU_i486DX_SLENH, fpus_internal, 40000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 7, 7,6,6, 5}, - {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1 | CPU_PKG_SOCKET3_PC330, - .manufacturer = "Intel", - .name = "i486DX2 WB", - .internal_name = "i486dx2_pc330", - .cpus = (const CPU[]) { - {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x436, 0x436, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x436, 0x436, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1 | CPU_PKG_SOCKET3_PC330, /*OEM versions are 3.3V, Retail versions are 3.3V with a 5V regulator for installation in older boards. They are functionally identical*/ - .manufacturer = "Intel", - .name = "iDX4", - .internal_name = "idx4", - .cpus = (const CPU[]) { - {"75", CPU_i486DX_SLENH, fpus_internal, 75000000, 3.0, 5000, 0x480, 0x480, 0x0000, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, - {"100", CPU_i486DX_SLENH, fpus_internal, 100000000, 3.0, 5000, 0x483, 0x483, 0x0000, CPU_SUPPORTS_DYNAREC, 18,18, 9, 9, 12}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET3 | CPU_PKG_SOCKET3_PC330, - .manufacturer = "Intel", - .name = "Pentium OverDrive", - .internal_name = "pentium_p24t", - .cpus = (const CPU[]) { - {"63", CPU_P24T, fpus_internal, 62500000, 2.5, 5000, 0x1531, 0x1531, 0x0000, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10,7,7, 15/2}, - {"83", CPU_P24T, fpus_internal, 83333333, 2.5, 5000, 0x1532, 0x1532, 0x0000, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,8,8, 10}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486SX", - .internal_name = "am486sx", - .cpus = (const CPU[]) { - {"33", CPU_Am486SX, fpus_486sx, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Am486SX, fpus_486sx, 40000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486SX2", - .internal_name = "am486sx2", - .cpus = (const CPU[]) { - {"50", CPU_Am486SX, fpus_486sx, 50000000, 2, 5000, 0x45b, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, - {"66", CPU_Am486SX, fpus_486sx, 66666666, 2, 5000, 0x45b, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486DX", - .internal_name = "am486dx", - .cpus = (const CPU[]) { - {"33", CPU_Am486DX, fpus_internal, 33333333, 1, 5000, 0x412, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Am486DX, fpus_internal, 40000000, 1, 5000, 0x412, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486DX2", - .internal_name = "am486dx2", - .cpus = (const CPU[]) { - {"50", CPU_Am486DX, fpus_internal, 50000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, - {"66", CPU_Am486DX, fpus_internal, 66666666, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"80", CPU_Am486DX, fpus_internal, 80000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486DXL", - .internal_name = "am486dxl", - .cpus = (const CPU[]) { - {"33", CPU_Am486DXL, fpus_internal, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Am486DXL, fpus_internal, 40000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486DXL2", - .internal_name = "am486dxl2", - .cpus = (const CPU[]) { - {"50", CPU_Am486DXL, fpus_internal, 50000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, - {"66", CPU_Am486DXL, fpus_internal, 66666666, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"80", CPU_Am486DXL, fpus_internal, 80000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "AMD", - .name = "Am486DX4", - .internal_name = "am486dx4", - .cpus = (const CPU[]) { - {"75", CPU_Am486DX, fpus_internal, 75000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, - {"90", CPU_Am486DX, fpus_internal, 90000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"100", CPU_Am486DX, fpus_internal, 100000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"120", CPU_Am486DX, fpus_internal, 120000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "AMD", - .name = "Am486DX2 (Enhanced)", - .internal_name = "am486dx2_slenh", - .cpus = (const CPU[]) { - {"66", CPU_ENH_Am486DX, fpus_internal, 66666666, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"80", CPU_ENH_Am486DX, fpus_internal, 80000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "AMD", - .name = "Am486DX4 (Enhanced)", - .internal_name = "am486dx4_slenh", - .cpus = (const CPU[]) { - {"75", CPU_ENH_Am486DX, fpus_internal, 75000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, - {"100", CPU_ENH_Am486DX, fpus_internal, 100000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"120", CPU_ENH_Am486DX, fpus_internal, 120000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "AMD", - .name = "Am5x86", - .internal_name = "am5x86", - .cpus = (const CPU[]) { - {"133 (P75)", CPU_ENH_Am486DX, fpus_internal, 133333333, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, - {"150 (P75+)", CPU_ENH_Am486DX, fpus_internal, 150000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 28,28,12,12, 20},/*The rare P75+ was indeed a triple-clocked 150 MHz according to research*/ - {"160 (P90)", CPU_ENH_Am486DX, fpus_internal, 160000000, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 28,28,12,12, 20},/*160 MHz on a 40 MHz bus was a common overclock and "5x86/P90" was used by a number of BIOSes to refer to that configuration*/ - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Cyrix", - .name = "Cx486S", - .internal_name = "cx486s", - .cpus = (const CPU[]) { - {"25", CPU_Cx486S, fpus_486sx, 25000000, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 4, 4, 3, 3, 3}, - {"33", CPU_Cx486S, fpus_486sx, 33333333, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Cx486S, fpus_486sx, 40000000, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Cyrix", - .name = "Cx486DX", - .internal_name = "cx486dx", - .cpus = (const CPU[]) { - {"33", CPU_Cx486DX, fpus_internal, 33333333, 1.0, 5000, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Cx486DX, fpus_internal, 40000000, 1.0, 5000, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Cyrix", - .name = "Cx486DX2", - .internal_name = "cx486dx2", - .cpus = (const CPU[]) { - {"50", CPU_Cx486DX, fpus_internal, 50000000, 2.0, 5000, 0x430, 0, 0x081b, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, - {"66", CPU_Cx486DX, fpus_internal, 66666666, 2.0, 5000, 0x430, 0, 0x0b1b, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"80", CPU_Cx486DX, fpus_internal, 80000000, 2.0, 5000, 0x430, 0, 0x311b, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "Cyrix", - .name = "Cx486DX4", - .internal_name = "cx486dx4", - .cpus = (const CPU[]) { - {"75", CPU_Cx486DX, fpus_internal, 75000000, 3.0, 5000, 0x480, 0, 0x361f, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, - {"100", CPU_Cx486DX, fpus_internal, 100000000, 3.0, 5000, 0x480, 0, 0x361f, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "Cyrix", - .name = "Cx5x86", - .internal_name = "cx5x86", - .cpus = (const CPU[]) { - {"80", CPU_Cx5x86, fpus_internal, 80000000, 2.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, /*If we're including the Pentium 50, might as well include this*/ - {"100", CPU_Cx5x86, fpus_internal, 100000000, 3.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"120", CPU_Cx5x86, fpus_internal, 120000000, 3.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, - {"133", CPU_Cx5x86, fpus_internal, 133333333, 4.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, - {"", 0} - } - }, { - .package = CPU_PKG_STPC, - .manufacturer = "ST", - .name = "STPC-DX", - .internal_name = "stpc_dx", - .cpus = (const CPU[]) { - {"66", CPU_STPC, fpus_internal, 66666666, 1.0, 3300, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, - {"75", CPU_STPC, fpus_internal, 75000000, 1.0, 3300, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, - {"", 0} - } - }, { - .package = CPU_PKG_STPC, - .manufacturer = "ST", - .name = "STPC-DX2", - .internal_name = "stpc_dx2", - .cpus = (const CPU[]) { - {"133", CPU_STPC, fpus_internal, 133333333, 2.0, 3300, 0x430, 0, 0x0b1b, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET4, - .manufacturer = "Intel", - .name = "Pentium", - .internal_name = "pentium_p5", - .cpus = (const CPU[]) { - {"50 (Q0399)", CPU_PENTIUM, fpus_internal, 50000000, 1, 5000, 0x513, 0x513, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 4, 4,3,3, 6}, - {"60", CPU_PENTIUM, fpus_internal, 60000000, 1, 5000, 0x517, 0x517, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6,3,3, 7}, - {"66", CPU_PENTIUM, fpus_internal, 66666666, 1, 5000, 0x517, 0x517, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6,3,3, 8}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET4, - .manufacturer = "Intel", - .name = "Pentium OverDrive", - .internal_name = "pentium_p54c_od5v", - .cpus = (const CPU[]) { - {"100", CPU_PENTIUM, fpus_internal, 100000000, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 8, 8,6,6, 12}, - {"120", CPU_PENTIUM, fpus_internal, 120000000, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,6,6, 14}, - {"133", CPU_PENTIUM, fpus_internal, 133333333, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,6,6, 16}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Pentium", - .internal_name = "pentium_p54c", - .cpus = (const CPU[]) { - {"75", CPU_PENTIUM, fpus_internal, 75000000, 1.5, 3520, 0x522, 0x522, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, - {"90", CPU_PENTIUM, fpus_internal, 90000000, 1.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, - {"100/50", CPU_PENTIUM, fpus_internal, 100000000, 2.0, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10,6,6, 12}, - {"100/66", CPU_PENTIUM, fpus_internal, 100000000, 1.5, 3520, 0x526, 0x526, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, - {"120", CPU_PENTIUM, fpus_internal, 120000000, 2.0, 3520, 0x526, 0x526, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 14}, - {"133", CPU_PENTIUM, fpus_internal, 133333333, 2.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 16}, - {"150", CPU_PENTIUM, fpus_internal, 150000000, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, - {"166", CPU_PENTIUM, fpus_internal, 166666666, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"200", CPU_PENTIUM, fpus_internal, 200000000, 3.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Pentium MMX", - .internal_name = "pentium_p55c", - .cpus = (const CPU[]) { - {"166", CPU_PENTIUMMMX, fpus_internal, 166666666, 2.5, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"233", CPU_PENTIUMMMX, fpus_internal, 233333333, 3.5, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Mobile Pentium MMX", - .internal_name = "pentium_tillamook", - .cpus = (const CPU[]) { - {"120", CPU_PENTIUMMMX, fpus_internal, 120000000, 2.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"133", CPU_PENTIUMMMX, fpus_internal, 133333333, 2.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"150", CPU_PENTIUMMMX, fpus_internal, 150000000, 2.5, 2800, 0x544, 0x544, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, - {"166", CPU_PENTIUMMMX, fpus_internal, 166666666, 2.5, 2800, 0x544, 0x544, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 2800, 0x581, 0x581, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"233", CPU_PENTIUMMMX, fpus_internal, 233333333, 3.5, 2800, 0x581, 0x581, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, - {"266", CPU_PENTIUMMMX, fpus_internal, 266666666, 4.0, 2800, 0x582, 0x582, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, - {"300", CPU_PENTIUMMMX, fpus_internal, 300000000, 4.5, 2800, 0x582, 0x582, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 36}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Pentium OverDrive", - .internal_name = "pentium_p54c_od3v", - .cpus = (const CPU[]) { - {"125", CPU_PENTIUM, fpus_internal, 125000000, 3.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,7,7, 15}, - {"150", CPU_PENTIUM, fpus_internal, 150000000, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 35/2}, - {"166", CPU_PENTIUM, fpus_internal, 166666666, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 20}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Pentium OverDrive MMX", - .internal_name = "pentium_p55c_od", - .cpus = (const CPU[]) { - {"75", CPU_PENTIUMMMX, fpus_internal, 75000000, 1.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 7, 7,4,4, 9}, - {"125", CPU_PENTIUMMMX, fpus_internal, 125000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,7,7, 15}, - {"150/60", CPU_PENTIUMMMX, fpus_internal, 150000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 35/2}, - {"166", CPU_PENTIUMMMX, fpus_internal, 166000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 20}, - {"180", CPU_PENTIUMMMX, fpus_internal, 180000000, 3.0, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18,9,9, 21}, - {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18,9,9, 24}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "IDT", - .name = "WinChip", - .internal_name = "winchip", - .cpus = (const CPU[]) { - {"75", CPU_WINCHIP, fpus_internal, 75000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 4, 4, 9}, - {"90", CPU_WINCHIP, fpus_internal, 90000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 9, 9, 4, 4, 21/2}, - {"100", CPU_WINCHIP, fpus_internal, 100000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 9, 9, 4, 4, 12}, - {"120", CPU_WINCHIP, fpus_internal, 120000000, 2.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 12, 12, 6, 6, 14}, - {"133", CPU_WINCHIP, fpus_internal, 133333333, 2.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 12, 12, 6, 6, 16}, - {"150", CPU_WINCHIP, fpus_internal, 150000000, 2.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 15, 15, 7, 7, 35/2}, - {"166", CPU_WINCHIP, fpus_internal, 166666666, 2.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 15, 15, 7, 7, 40}, - {"180", CPU_WINCHIP, fpus_internal, 180000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 21}, - {"200", CPU_WINCHIP, fpus_internal, 200000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 24}, - {"225", CPU_WINCHIP, fpus_internal, 225000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 27}, - {"240", CPU_WINCHIP, fpus_internal, 240000000, 4.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 28}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "IDT", - .name = "WinChip 2", - .internal_name = "winchip2", - .cpus = (const CPU[]) { - {"200", CPU_WINCHIP2, fpus_internal, 200000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*8}, - {"225", CPU_WINCHIP2, fpus_internal, 225000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*9}, - {"240", CPU_WINCHIP2, fpus_internal, 240000000, 4.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 30}, - {"250", CPU_WINCHIP2, fpus_internal, 250000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 30}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "IDT", - .name = "WinChip 2A", - .internal_name = "winchip2a", - .cpus = (const CPU[]) { - {"200", CPU_WINCHIP2, fpus_internal, 200000000, 3.0, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*8}, - {"233", CPU_WINCHIP2, fpus_internal, 233333333, 3.5, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 21, 21, 9, 9, (7*8)/2}, - {"266", CPU_WINCHIP2, fpus_internal, 233333333, 7.0/3.0, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 21, 21, 7, 7, 28}, - {"300", CPU_WINCHIP2, fpus_internal, 250000000, 2.5, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 8, 8, 30}, - {"", 0} - } + { + .name = "10", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "12", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "16", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_8088_EUROPC, + .manufacturer = "Intel", + .name = "8088", + .internal_name = "8088_europc", + .cpus = (const CPU[]) { + { + .name = "4.77", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 4772728, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "7.16", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "9.54", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 9545456, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_8086, + .manufacturer = "Intel", + .name = "8086", + .internal_name = "8086", + .cpus = (const CPU[]) { + { + .name = "7.16", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "8", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "9.54", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 9545456, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "10", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "12", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "16", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 2 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_188, + .manufacturer = "Intel", + .name = "80188", + .internal_name = "80188", + .cpus = (const CPU[]) { + { + .name = "6", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 6000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "7.16", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "8", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "9.54", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 9545456, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "10", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "12", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "16", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 3 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_8088, + .manufacturer = "NEC", + .name = "V20", + .internal_name = "necv20", + .cpus = (const CPU[]) { + { + .name = "4.77", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 4772728, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "7.16", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "10", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "12", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "16", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 2 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_186, + .manufacturer = "Intel", + .name = "80186", + .internal_name = "80186", + .cpus = (const CPU[]) { + { + .name = "6", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 6000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "7.16", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 7159092, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "8", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 8000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "9.54", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 9545456, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "10", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 10000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "12", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 12000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "16", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 16000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 20000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 25000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 3 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_8086, + .manufacturer = "NEC", + .name = "V30", + .internal_name = "necv30", + .cpus = (const CPU[]) { + { + .name = "5", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 5000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "8", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "10", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "12", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 1 + }, + { + .name = "16", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, + .cache_write_cycles = 0, + .atclk_div = 2 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_286, + .manufacturer = "Intel", + .name = "80286", + .internal_name = "286", + .cpus = (const CPU[]) { + { + .name = "6", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 6000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 2, + .mem_write_cycles = 2, + .cache_read_cycles = 2, + .cache_write_cycles = 2, + .atclk_div = 1 + }, + { + .name = "8", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 2, + .mem_write_cycles = 2, + .cache_read_cycles = 2, + .cache_write_cycles = 2, + .atclk_div = 1 + }, + { + .name = "10", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 2, + .mem_write_cycles = 2, + .cache_read_cycles = 2, + .cache_write_cycles = 2, + .atclk_div = 1 + }, + { + .name = "12", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 12500000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "16", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 3 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386SX, + .manufacturer = "Intel", + .name = "i386SX", + .internal_name = "i386sx", + .cpus = (const CPU[]) { + { + .name = "16", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386SX, + .manufacturer = "AMD", + .name = "Am386SX", + .internal_name = "am386sx", + .cpus = (const CPU[]) { + { + .name = "16", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386DX, + .manufacturer = "Intel", + .name = "i386DX", + .internal_name = "i386dx", + .cpus = (const CPU[]) { + { + .name = "16", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386DX_DESKPRO386, + .manufacturer = "Intel", + .name = "i386DX", + .internal_name = "i386dx_deskpro386", + .cpus = (const CPU[]) { + { + .name = "16", + .cpu_type = CPU_386DX, + .fpus = fpus_80286, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386DX, + .manufacturer = "Intel", + .name = "RapidCAD", + .internal_name = "rapidcad", + .cpus = (const CPU[]) { + { + .name = "25", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386DX, + .manufacturer = "AMD", + .name = "Am386DX", + .internal_name = "am386dx", + .cpus = (const CPU[]) { + { + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_M6117, + .manufacturer = "ALi", + .name = "M6117", + .internal_name = "m6117", + .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ + { + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_none, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2309, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_none, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2309, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386SLC_IBM, + .manufacturer = "IBM", + .name = "386SLC", + .internal_name = "ibm386slc", + .cpus = (const CPU[]) { + { + .name = "16", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386SX, + .manufacturer = "Cyrix", + .name = "Cx486SLC", + .internal_name = "cx486slc", + .cpus = (const CPU[]) { + { + .name = "20", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386SX, + .manufacturer = "Cyrix", + .name = "Cx486SRx2", + .internal_name = "cx486srx2", + .cpus = (const CPU[]) { + { + .name = "32", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 32000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "50", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .name = "486SLC", + .internal_name = "ibm486slc", + .cpus = (const CPU[]) { + { + .name = "33", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA401, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .name = "486SLC2", + .internal_name = "ibm486slc2", + .cpus = (const CPU[]) { + { + .name = "40", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 5 + }, + { + .name = "50", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .name = "486SLC3", + .internal_name = "ibm486slc3", + .cpus = (const CPU[]) { + { + .name = "60", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 60000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 7 + }, + { + .name = "75", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 75000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 + }, + { + .name = "100", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 100000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_486BL, + .manufacturer = "IBM", + .name = "486BL2", + .internal_name = "ibm486bl2", + .cpus = (const CPU[]) { + { + .name = "50", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_486BL, + .manufacturer = "IBM", + .name = "486BL3", + .internal_name = "ibm486bl3", + .cpus = (const CPU[]) { + { + .name = "75", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 75000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 + }, + { + .name = "100", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 100000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386DX, + .manufacturer = "Cyrix", + .name = "Cx486DLC", + .internal_name = "cx486dlc", + .cpus = (const CPU[]) { + { + .name = "25", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_386DX, + .manufacturer = "Cyrix", + .name = "Cx486DRx2", + .internal_name = "cx486drx2", + .cpus = (const CPU[]) { + { + .name = "32", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 32000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "50", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486SX", + .internal_name = "i486sx", + .cpus = (const CPU[]) { + {"16", CPU_i486SX, fpus_486sx, 16000000, 1, 5000, 0x420, 0, 0, CPU_SUPPORTS_DYNAREC, 3, 3,3,3, 2}, + {"20", CPU_i486SX, fpus_486sx, 20000000, 1, 5000, 0x420, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, + {"25", CPU_i486SX, fpus_486sx, 25000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, + {"33", CPU_i486SX, fpus_486sx, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486SX-S", + .internal_name = "i486sx_slenh", + .cpus = (const CPU[]) { + {"25", CPU_i486SX_SLENH, fpus_486sx, 25000000, 1, 5000, 0x423, 0x423, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, + {"33", CPU_i486SX_SLENH, fpus_486sx, 33333333, 1, 5000, 0x42a, 0x42a, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486SX2", + .internal_name = "i486sx2", + .cpus = (const CPU[]) { + {"50", CPU_i486SX_SLENH, fpus_486sx, 50000000, 2, 5000, 0x45b, 0x45b, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, + {"66 (Q0569)", CPU_i486SX_SLENH, fpus_486sx, 66666666, 2, 5000, 0x45b, 0x45b, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 8}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX", + .internal_name = "i486dx", + .cpus = (const CPU[]) { + {"25", CPU_i486DX, fpus_internal, 25000000, 1, 5000, 0x404, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, + {"33", CPU_i486DX, fpus_internal, 33333333, 1, 5000, 0x404, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, + {"50", CPU_i486DX, fpus_internal, 50000000, 1, 5000, 0x411, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8,4,4, 6}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX-S", + .internal_name = "i486dx_slenh", + .cpus = (const CPU[]) { + {"33", CPU_i486DX_SLENH, fpus_internal, 33333333, 1, 5000, 0x414, 0x414, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, + {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 1, 5000, 0x414, 0x414, 0, CPU_SUPPORTS_DYNAREC, 8, 8,4,4, 6}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX2", + .internal_name = "i486dx2", + .cpus = (const CPU[]) { + {"40", CPU_i486DX, fpus_internal, 40000000, 2, 5000, 0x430, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7,6,6, 5}, + {"50", CPU_i486DX, fpus_internal, 50000000, 2, 5000, 0x433, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, + {"66", CPU_i486DX, fpus_internal, 66666666, 2, 5000, 0x433, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX2-S", + .internal_name = "i486dx2_slenh", + .cpus = (const CPU[]) { + {"40", CPU_i486DX_SLENH, fpus_internal, 40000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 7, 7,6,6, 5}, + {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, + {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1 | CPU_PKG_SOCKET3_PC330, + .manufacturer = "Intel", + .name = "i486DX2 WB", + .internal_name = "i486dx2_pc330", + .cpus = (const CPU[]) { + {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x436, 0x436, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, + {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x436, 0x436, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1 | CPU_PKG_SOCKET3_PC330, /*OEM versions are 3.3V, Retail versions are 3.3V with a 5V regulator for installation in older boards. They are functionally identical*/ + .manufacturer = "Intel", + .name = "iDX4", + .internal_name = "idx4", + .cpus = (const CPU[]) { + {"75", CPU_i486DX_SLENH, fpus_internal, 75000000, 3.0, 5000, 0x480, 0x480, 0x0000, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, + {"100", CPU_i486DX_SLENH, fpus_internal, 100000000, 3.0, 5000, 0x483, 0x483, 0x0000, CPU_SUPPORTS_DYNAREC, 18,18, 9, 9, 12}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET3 | CPU_PKG_SOCKET3_PC330, + .manufacturer = "Intel", + .name = "Pentium OverDrive", + .internal_name = "pentium_p24t", + .cpus = (const CPU[]) { + {"63", CPU_P24T, fpus_internal, 62500000, 2.5, 5000, 0x1531, 0x1531, 0x0000, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10,7,7, 15/2}, + {"83", CPU_P24T, fpus_internal, 83333333, 2.5, 5000, 0x1532, 0x1532, 0x0000, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,8,8, 10}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486SX", + .internal_name = "am486sx", + .cpus = (const CPU[]) { + {"33", CPU_Am486SX, fpus_486sx, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, + {"40", CPU_Am486SX, fpus_486sx, 40000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486SX2", + .internal_name = "am486sx2", + .cpus = (const CPU[]) { + {"50", CPU_Am486SX, fpus_486sx, 50000000, 2, 5000, 0x45b, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, + {"66", CPU_Am486SX, fpus_486sx, 66666666, 2, 5000, 0x45b, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486DX", + .internal_name = "am486dx", + .cpus = (const CPU[]) { + {"33", CPU_Am486DX, fpus_internal, 33333333, 1, 5000, 0x412, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, + {"40", CPU_Am486DX, fpus_internal, 40000000, 1, 5000, 0x412, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486DX2", + .internal_name = "am486dx2", + .cpus = (const CPU[]) { + {"50", CPU_Am486DX, fpus_internal, 50000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, + {"66", CPU_Am486DX, fpus_internal, 66666666, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, + {"80", CPU_Am486DX, fpus_internal, 80000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486DXL", + .internal_name = "am486dxl", + .cpus = (const CPU[]) { + {"33", CPU_Am486DXL, fpus_internal, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, + {"40", CPU_Am486DXL, fpus_internal, 40000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486DXL2", + .internal_name = "am486dxl2", + .cpus = (const CPU[]) { + {"50", CPU_Am486DXL, fpus_internal, 50000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, + {"66", CPU_Am486DXL, fpus_internal, 66666666, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, + {"80", CPU_Am486DXL, fpus_internal, 80000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET3, + .manufacturer = "AMD", + .name = "Am486DX4", + .internal_name = "am486dx4", + .cpus = (const CPU[]) { + {"75", CPU_Am486DX, fpus_internal, 75000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, + {"90", CPU_Am486DX, fpus_internal, 90000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, + {"100", CPU_Am486DX, fpus_internal, 100000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, + {"120", CPU_Am486DX, fpus_internal, 120000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET3, + .manufacturer = "AMD", + .name = "Am486DX2 (Enhanced)", + .internal_name = "am486dx2_slenh", + .cpus = (const CPU[]) { + {"66", CPU_ENH_Am486DX, fpus_internal, 66666666, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, + {"80", CPU_ENH_Am486DX, fpus_internal, 80000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET3, + .manufacturer = "AMD", + .name = "Am486DX4 (Enhanced)", + .internal_name = "am486dx4_slenh", + .cpus = (const CPU[]) { + {"75", CPU_ENH_Am486DX, fpus_internal, 75000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, + {"100", CPU_ENH_Am486DX, fpus_internal, 100000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, + {"120", CPU_ENH_Am486DX, fpus_internal, 120000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET3, + .manufacturer = "AMD", + .name = "Am5x86", + .internal_name = "am5x86", + .cpus = (const CPU[]) { + {"133 (P75)", CPU_ENH_Am486DX, fpus_internal, 133333333, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, + {"150 (P75+)", CPU_ENH_Am486DX, fpus_internal, 150000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 28,28,12,12, 20},/*The rare P75+ was indeed a triple-clocked 150 MHz according to research*/ + {"160 (P90)", CPU_ENH_Am486DX, fpus_internal, 160000000, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 28,28,12,12, 20},/*160 MHz on a 40 MHz bus was a common overclock and "5x86/P90" was used by a number of BIOSes to refer to that configuration*/ + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Cyrix", + .name = "Cx486S", + .internal_name = "cx486s", + .cpus = (const CPU[]) { + {"25", CPU_Cx486S, fpus_486sx, 25000000, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 4, 4, 3, 3, 3}, + {"33", CPU_Cx486S, fpus_486sx, 33333333, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, + {"40", CPU_Cx486S, fpus_486sx, 40000000, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Cyrix", + .name = "Cx486DX", + .internal_name = "cx486dx", + .cpus = (const CPU[]) { + {"33", CPU_Cx486DX, fpus_internal, 33333333, 1.0, 5000, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, + {"40", CPU_Cx486DX, fpus_internal, 40000000, 1.0, 5000, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET1, + .manufacturer = "Cyrix", + .name = "Cx486DX2", + .internal_name = "cx486dx2", + .cpus = (const CPU[]) { + {"50", CPU_Cx486DX, fpus_internal, 50000000, 2.0, 5000, 0x430, 0, 0x081b, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, + {"66", CPU_Cx486DX, fpus_internal, 66666666, 2.0, 5000, 0x430, 0, 0x0b1b, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, + {"80", CPU_Cx486DX, fpus_internal, 80000000, 2.0, 5000, 0x430, 0, 0x311b, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET3, + .manufacturer = "Cyrix", + .name = "Cx486DX4", + .internal_name = "cx486dx4", + .cpus = (const CPU[]) { + {"75", CPU_Cx486DX, fpus_internal, 75000000, 3.0, 5000, 0x480, 0, 0x361f, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, + {"100", CPU_Cx486DX, fpus_internal, 100000000, 3.0, 5000, 0x480, 0, 0x361f, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET3, + .manufacturer = "Cyrix", + .name = "Cx5x86", + .internal_name = "cx5x86", + .cpus = (const CPU[]) { + {"80", CPU_Cx5x86, fpus_internal, 80000000, 2.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, /*If we're including the Pentium 50, might as well include this*/ + {"100", CPU_Cx5x86, fpus_internal, 100000000, 3.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, + {"120", CPU_Cx5x86, fpus_internal, 120000000, 3.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, + {"133", CPU_Cx5x86, fpus_internal, 133333333, 4.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_STPC, + .manufacturer = "ST", + .name = "STPC-DX", + .internal_name = "stpc_dx", + .cpus = (const CPU[]) { + {"66", CPU_STPC, fpus_internal, 66666666, 1.0, 3300, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + {"75", CPU_STPC, fpus_internal, 75000000, 1.0, 3300, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_STPC, + .manufacturer = "ST", + .name = "STPC-DX2", + .internal_name = "stpc_dx2", + .cpus = (const CPU[]) { + {"133", CPU_STPC, fpus_internal, 133333333, 2.0, 3300, 0x430, 0, 0x0b1b, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET4, + .manufacturer = "Intel", + .name = "Pentium", + .internal_name = "pentium_p5", + .cpus = (const CPU[]) { + {"50 (Q0399)", CPU_PENTIUM, fpus_internal, 50000000, 1, 5000, 0x513, 0x513, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 4, 4,3,3, 6}, + {"60", CPU_PENTIUM, fpus_internal, 60000000, 1, 5000, 0x517, 0x517, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6,3,3, 7}, + {"66", CPU_PENTIUM, fpus_internal, 66666666, 1, 5000, 0x517, 0x517, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6,3,3, 8}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET4, + .manufacturer = "Intel", + .name = "Pentium OverDrive", + .internal_name = "pentium_p54c_od5v", + .cpus = (const CPU[]) { + {"100", CPU_PENTIUM, fpus_internal, 100000000, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 8, 8,6,6, 12}, + {"120", CPU_PENTIUM, fpus_internal, 120000000, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,6,6, 14}, + {"133", CPU_PENTIUM, fpus_internal, 133333333, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,6,6, 16}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Pentium", + .internal_name = "pentium_p54c", + .cpus = (const CPU[]) { + {"75", CPU_PENTIUM, fpus_internal, 75000000, 1.5, 3520, 0x522, 0x522, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, + {"90", CPU_PENTIUM, fpus_internal, 90000000, 1.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, + {"100/50", CPU_PENTIUM, fpus_internal, 100000000, 2.0, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10,6,6, 12}, + {"100/66", CPU_PENTIUM, fpus_internal, 100000000, 1.5, 3520, 0x526, 0x526, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, + {"120", CPU_PENTIUM, fpus_internal, 120000000, 2.0, 3520, 0x526, 0x526, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 14}, + {"133", CPU_PENTIUM, fpus_internal, 133333333, 2.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 16}, + {"150", CPU_PENTIUM, fpus_internal, 150000000, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, + {"166", CPU_PENTIUM, fpus_internal, 166666666, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, + {"200", CPU_PENTIUM, fpus_internal, 200000000, 3.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Pentium MMX", + .internal_name = "pentium_p55c", + .cpus = (const CPU[]) { + {"166", CPU_PENTIUMMMX, fpus_internal, 166666666, 2.5, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, + {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, + {"233", CPU_PENTIUMMMX, fpus_internal, 233333333, 3.5, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Mobile Pentium MMX", + .internal_name = "pentium_tillamook", + .cpus = (const CPU[]) { + {"120", CPU_PENTIUMMMX, fpus_internal, 120000000, 2.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, + {"133", CPU_PENTIUMMMX, fpus_internal, 133333333, 2.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"150", CPU_PENTIUMMMX, fpus_internal, 150000000, 2.5, 2800, 0x544, 0x544, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, + {"166", CPU_PENTIUMMMX, fpus_internal, 166666666, 2.5, 2800, 0x544, 0x544, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, + {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 2800, 0x581, 0x581, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, + {"233", CPU_PENTIUMMMX, fpus_internal, 233333333, 3.5, 2800, 0x581, 0x581, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, + {"266", CPU_PENTIUMMMX, fpus_internal, 266666666, 4.0, 2800, 0x582, 0x582, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, + {"300", CPU_PENTIUMMMX, fpus_internal, 300000000, 4.5, 2800, 0x582, 0x582, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 36}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Pentium OverDrive", + .internal_name = "pentium_p54c_od3v", + .cpus = (const CPU[]) { + {"125", CPU_PENTIUM, fpus_internal, 125000000, 3.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,7,7, 15}, + {"150", CPU_PENTIUM, fpus_internal, 150000000, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 35/2}, + {"166", CPU_PENTIUM, fpus_internal, 166666666, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 20}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Pentium OverDrive MMX", + .internal_name = "pentium_p55c_od", + .cpus = (const CPU[]) { + {"75", CPU_PENTIUMMMX, fpus_internal, 75000000, 1.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 7, 7,4,4, 9}, + {"125", CPU_PENTIUMMMX, fpus_internal, 125000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,7,7, 15}, + {"150/60", CPU_PENTIUMMMX, fpus_internal, 150000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 35/2}, + {"166", CPU_PENTIUMMMX, fpus_internal, 166000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 20}, + {"180", CPU_PENTIUMMMX, fpus_internal, 180000000, 3.0, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18,9,9, 21}, + {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18,9,9, 24}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "IDT", + .name = "WinChip", + .internal_name = "winchip", + .cpus = (const CPU[]) { + {"75", CPU_WINCHIP, fpus_internal, 75000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 4, 4, 9}, + {"90", CPU_WINCHIP, fpus_internal, 90000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 9, 9, 4, 4, 21/2}, + {"100", CPU_WINCHIP, fpus_internal, 100000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 9, 9, 4, 4, 12}, + {"120", CPU_WINCHIP, fpus_internal, 120000000, 2.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 12, 12, 6, 6, 14}, + {"133", CPU_WINCHIP, fpus_internal, 133333333, 2.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 12, 12, 6, 6, 16}, + {"150", CPU_WINCHIP, fpus_internal, 150000000, 2.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 15, 15, 7, 7, 35/2}, + {"166", CPU_WINCHIP, fpus_internal, 166666666, 2.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 15, 15, 7, 7, 40}, + {"180", CPU_WINCHIP, fpus_internal, 180000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 21}, + {"200", CPU_WINCHIP, fpus_internal, 200000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 24}, + {"225", CPU_WINCHIP, fpus_internal, 225000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 27}, + {"240", CPU_WINCHIP, fpus_internal, 240000000, 4.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 28}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "IDT", + .name = "WinChip 2", + .internal_name = "winchip2", + .cpus = (const CPU[]) { + {"200", CPU_WINCHIP2, fpus_internal, 200000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*8}, + {"225", CPU_WINCHIP2, fpus_internal, 225000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*9}, + {"240", CPU_WINCHIP2, fpus_internal, 240000000, 4.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 30}, + {"250", CPU_WINCHIP2, fpus_internal, 250000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 30}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "IDT", + .name = "WinChip 2A", + .internal_name = "winchip2a", + .cpus = (const CPU[]) { + {"200", CPU_WINCHIP2, fpus_internal, 200000000, 3.0, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*8}, + {"233", CPU_WINCHIP2, fpus_internal, 233333333, 3.5, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 21, 21, 9, 9, (7*8)/2}, + {"266", CPU_WINCHIP2, fpus_internal, 233333333, 7.0/3.0, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 21, 21, 7, 7, 28}, + {"300", CPU_WINCHIP2, fpus_internal, 250000000, 2.5, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 8, 8, 30}, + { .name = "", 0 } + } }, #if defined(DEV_BRANCH) && defined(USE_AMD_K5) { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K5 (Model 0)", - .internal_name = "k5_ssa5", - .cpus = (const CPU[]) { - {"75 (PR75)", CPU_K5, fpus_internal, 75000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, - {"90 (PR90)", CPU_K5, fpus_internal, 90000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, - {"100 (PR100)", CPU_K5, fpus_internal, 100000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K5 (Model 1/2/3)", - .internal_name = "k5_5k86", - .cpus = (const CPU[]) { - {"90 (PR120)", CPU_5K86, fpus_internal, 120000000, 2.0, 3520, 0x511, 0x511, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 14}, - {"100 (PR133)", CPU_5K86, fpus_internal, 133333333, 2.0, 3520, 0x514, 0x514, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 16}, - {"105 (PR150)", CPU_5K86, fpus_internal, 150000000, 2.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,7,7, 35/2}, - {"116.7 (PR166)", CPU_5K86, fpus_internal, 166666666, 2.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,7,7, 20}, - {"133 (PR200)", CPU_5K86, fpus_internal, 200000000, 3.0, 3520, 0x534, 0x534, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18,9,9, 24}, - {"", 0} - } + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K5 (Model 0)", + .internal_name = "k5_ssa5", + .cpus = (const CPU[]) { + {"75 (PR75)", CPU_K5, fpus_internal, 75000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, + {"90 (PR90)", CPU_K5, fpus_internal, 90000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, + {"100 (PR100)", CPU_K5, fpus_internal, 100000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K5 (Model 1/2/3)", + .internal_name = "k5_5k86", + .cpus = (const CPU[]) { + {"90 (PR120)", CPU_5K86, fpus_internal, 120000000, 2.0, 3520, 0x511, 0x511, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 14}, + {"100 (PR133)", CPU_5K86, fpus_internal, 133333333, 2.0, 3520, 0x514, 0x514, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 16}, + {"105 (PR150)", CPU_5K86, fpus_internal, 150000000, 2.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,7,7, 35/2}, + {"116.7 (PR166)", CPU_5K86, fpus_internal, 166666666, 2.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,7,7, 20}, + {"133 (PR200)", CPU_5K86, fpus_internal, 200000000, 3.0, 3520, 0x534, 0x534, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18,9,9, 24}, + { .name = "", 0 } + } }, #endif { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6 (Model 6)", - .internal_name = "k6_m6", - .cpus = (const CPU[]) { - {"66", CPU_K6, fpus_internal, 66666666, 1.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_K6, fpus_internal, 100000000, 1.5, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6, fpus_internal, 133333333, 2.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6, fpus_internal, 166666666, 2.5, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"200", CPU_K6, fpus_internal, 200000000, 3.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"233", CPU_K6, fpus_internal, 233333333, 3.5, 3200, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, - {"", 0} - } + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6 (Model 6)", + .internal_name = "k6_m6", + .cpus = (const CPU[]) { + {"66", CPU_K6, fpus_internal, 66666666, 1.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ + {"100", CPU_K6, fpus_internal, 100000000, 1.5, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6, fpus_internal, 133333333, 2.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6, fpus_internal, 166666666, 2.5, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, + {"200", CPU_K6, fpus_internal, 200000000, 3.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, + {"233", CPU_K6, fpus_internal, 233333333, 3.5, 3200, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, + { .name = "", 0 } + } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6 (Model 7)", - .internal_name = "k6_m7", - .cpus = (const CPU[]) { - {"100", CPU_K6, fpus_internal, 100000000, 1.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6, fpus_internal, 133333333, 2.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6, fpus_internal, 166666666, 2.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6, fpus_internal, 200000000, 3.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"233", CPU_K6, fpus_internal, 233333333, 3.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, - {"266", CPU_K6, fpus_internal, 266666666, 4.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, - {"300", CPU_K6, fpus_internal, 300000000, 4.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 36}, - {"", 0} - } + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6 (Model 7)", + .internal_name = "k6_m7", + .cpus = (const CPU[]) { + {"100", CPU_K6, fpus_internal, 100000000, 1.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6, fpus_internal, 133333333, 2.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6, fpus_internal, 166666666, 2.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6, fpus_internal, 200000000, 3.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, + {"233", CPU_K6, fpus_internal, 233333333, 3.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, + {"266", CPU_K6, fpus_internal, 266666666, 4.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, + {"300", CPU_K6, fpus_internal, 300000000, 4.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 36}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6-2", + .internal_name = "k6_2", + .cpus = (const CPU[]) { + {"100", CPU_K6_2, fpus_internal, 100000000, 1.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6_2, fpus_internal, 133333333, 2.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6_2, fpus_internal, 166666666, 2.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6_2, fpus_internal, 200000000, 3.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ + {"233", CPU_K6_2, fpus_internal, 233333333, 3.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, + {"266", CPU_K6_2, fpus_internal, 266666666, 4.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, + {"300", CPU_K6_2, fpus_internal, 300000000, 3.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, + {"333", CPU_K6_2, fpus_internal, 332500000, 3.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, + {"350", CPU_K6_2C, fpus_internal, 350000000, 3.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, + {"366", CPU_K6_2C, fpus_internal, 366666666, 5.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, + {"380", CPU_K6_2C, fpus_internal, 380000000, 4.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, + {"400/66", CPU_K6_2C, fpus_internal, 400000000, 6.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, + {"400/100", CPU_K6_2C, fpus_internal, 400000000, 4.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, + {"450", CPU_K6_2C, fpus_internal, 450000000, 4.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, + {"475", CPU_K6_2C, fpus_internal, 475000000, 5.0, 2400, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, + {"500", CPU_K6_2C, fpus_internal, 500000000, 5.0, 2400, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, + {"533", CPU_K6_2C, fpus_internal, 533333333, 5.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 48, 48, 17, 17, 64}, + {"550", CPU_K6_2C, fpus_internal, 550000000, 5.5, 2300, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 50, 50, 17, 17, 66}, + { .name = "", 0 } + } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6-2", - .internal_name = "k6_2", - .cpus = (const CPU[]) { - {"100", CPU_K6_2, fpus_internal, 100000000, 1.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6_2, fpus_internal, 133333333, 2.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6_2, fpus_internal, 166666666, 2.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6_2, fpus_internal, 200000000, 3.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ - {"233", CPU_K6_2, fpus_internal, 233333333, 3.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, - {"266", CPU_K6_2, fpus_internal, 266666666, 4.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, - {"300", CPU_K6_2, fpus_internal, 300000000, 3.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, - {"333", CPU_K6_2, fpus_internal, 332500000, 3.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, - {"350", CPU_K6_2C, fpus_internal, 350000000, 3.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, - {"366", CPU_K6_2C, fpus_internal, 366666666, 5.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, - {"380", CPU_K6_2C, fpus_internal, 380000000, 4.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, - {"400/66", CPU_K6_2C, fpus_internal, 400000000, 6.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, - {"400/100", CPU_K6_2C, fpus_internal, 400000000, 4.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, - {"450", CPU_K6_2C, fpus_internal, 450000000, 4.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, - {"475", CPU_K6_2C, fpus_internal, 475000000, 5.0, 2400, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, - {"500", CPU_K6_2C, fpus_internal, 500000000, 5.0, 2400, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, - {"533", CPU_K6_2C, fpus_internal, 533333333, 5.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 48, 48, 17, 17, 64}, - {"550", CPU_K6_2C, fpus_internal, 550000000, 5.5, 2300, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 50, 50, 17, 17, 66}, - {"", 0} - } + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6-2+", + .internal_name = "k6_2p", + .cpus = (const CPU[]) { + {"100", CPU_K6_2P, fpus_internal, 100000000, 1.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6_2P, fpus_internal, 133333333, 2.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6_2P, fpus_internal, 166666666, 2.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6_2P, fpus_internal, 200000000, 3.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ + {"233", CPU_K6_2P, fpus_internal, 233333333, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ + {"266", CPU_K6_2P, fpus_internal, 266666666, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ + {"300", CPU_K6_2P, fpus_internal, 300000000, 3.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ + {"333", CPU_K6_2P, fpus_internal, 332500000, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ + {"350", CPU_K6_2P, fpus_internal, 350000000, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ + {"366", CPU_K6_2P, fpus_internal, 366666666, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ + {"380", CPU_K6_2P, fpus_internal, 380000000, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ + {"400/66", CPU_K6_2P, fpus_internal, 400000000, 6.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, /* out of spec */ + {"400/100", CPU_K6_2P, fpus_internal, 400000000, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, /* out of spec */ + {"450", CPU_K6_2P, fpus_internal, 450000000, 4.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, + {"475", CPU_K6_2P, fpus_internal, 475000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, + {"500", CPU_K6_2P, fpus_internal, 500000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, + {"533", CPU_K6_2P, fpus_internal, 533333333, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 48, 48, 17, 17, 64}, + {"550", CPU_K6_2P, fpus_internal, 550000000, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 50, 50, 17, 17, 66}, + { .name = "", 0 } + } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6-2+", - .internal_name = "k6_2p", - .cpus = (const CPU[]) { - {"100", CPU_K6_2P, fpus_internal, 100000000, 1.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6_2P, fpus_internal, 133333333, 2.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6_2P, fpus_internal, 166666666, 2.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6_2P, fpus_internal, 200000000, 3.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ - {"233", CPU_K6_2P, fpus_internal, 233333333, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ - {"266", CPU_K6_2P, fpus_internal, 266666666, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ - {"300", CPU_K6_2P, fpus_internal, 300000000, 3.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ - {"333", CPU_K6_2P, fpus_internal, 332500000, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ - {"350", CPU_K6_2P, fpus_internal, 350000000, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ - {"366", CPU_K6_2P, fpus_internal, 366666666, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ - {"380", CPU_K6_2P, fpus_internal, 380000000, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ - {"400/66", CPU_K6_2P, fpus_internal, 400000000, 6.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, /* out of spec */ - {"400/100", CPU_K6_2P, fpus_internal, 400000000, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, /* out of spec */ - {"450", CPU_K6_2P, fpus_internal, 450000000, 4.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, - {"475", CPU_K6_2P, fpus_internal, 475000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, - {"500", CPU_K6_2P, fpus_internal, 500000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, - {"533", CPU_K6_2P, fpus_internal, 533333333, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 48, 48, 17, 17, 64}, - {"550", CPU_K6_2P, fpus_internal, 550000000, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 50, 50, 17, 17, 66}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6-III", - .internal_name = "k6_3", - .cpus = (const CPU[]) { - {"100", CPU_K6_3, fpus_internal, 100000000, 1.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6_3, fpus_internal, 133333333, 2.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6_3, fpus_internal, 166666666, 2.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6_3, fpus_internal, 200000000, 3.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ - {"233", CPU_K6_3, fpus_internal, 233333333, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ - {"266", CPU_K6_3, fpus_internal, 266666666, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ - {"300", CPU_K6_3, fpus_internal, 300000000, 3.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ - {"333", CPU_K6_3, fpus_internal, 332500000, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ - {"350", CPU_K6_3, fpus_internal, 350000000, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ - {"366", CPU_K6_3, fpus_internal, 366666666, 5.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ - {"380", CPU_K6_3, fpus_internal, 380000000, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ - {"400", CPU_K6_3, fpus_internal, 400000000, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, - {"450", CPU_K6_3, fpus_internal, 450000000, 4.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6-III+", - .internal_name = "k6_3p", - .cpus = (const CPU[]) { - {"100", CPU_K6_3P, fpus_internal, 100000000, 1.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7, 4, 4, 9}, /* out of spec */ - {"133", CPU_K6_3P, fpus_internal, 133333333, 2.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6_3P, fpus_internal, 166666666, 2.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6_3P, fpus_internal, 200000000, 3.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ - {"233", CPU_K6_3P, fpus_internal, 233333333, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ - {"266", CPU_K6_3P, fpus_internal, 266666666, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ - {"300", CPU_K6_3P, fpus_internal, 300000000, 3.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ - {"333", CPU_K6_3P, fpus_internal, 332500000, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ - {"350", CPU_K6_3P, fpus_internal, 350000000, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ - {"366", CPU_K6_3P, fpus_internal, 366666666, 5.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ - {"380", CPU_K6_3P, fpus_internal, 380000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ - {"400", CPU_K6_3P, fpus_internal, 400000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, - {"450", CPU_K6_3P, fpus_internal, 450000000, 4.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, - {"475", CPU_K6_3P, fpus_internal, 475000000, 5.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, - {"500", CPU_K6_3P, fpus_internal, 500000000, 5.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, - {"", 0} - } + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6-III", + .internal_name = "k6_3", + .cpus = (const CPU[]) { + {"100", CPU_K6_3, fpus_internal, 100000000, 1.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_K6_3, fpus_internal, 133333333, 2.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6_3, fpus_internal, 166666666, 2.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6_3, fpus_internal, 200000000, 3.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ + {"233", CPU_K6_3, fpus_internal, 233333333, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ + {"266", CPU_K6_3, fpus_internal, 266666666, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ + {"300", CPU_K6_3, fpus_internal, 300000000, 3.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ + {"333", CPU_K6_3, fpus_internal, 332500000, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ + {"350", CPU_K6_3, fpus_internal, 350000000, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ + {"366", CPU_K6_3, fpus_internal, 366666666, 5.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ + {"380", CPU_K6_3, fpus_internal, 380000000, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ + {"400", CPU_K6_3, fpus_internal, 400000000, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, + {"450", CPU_K6_3, fpus_internal, 450000000, 4.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6-III+", + .internal_name = "k6_3p", + .cpus = (const CPU[]) { + {"100", CPU_K6_3P, fpus_internal, 100000000, 1.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7, 4, 4, 9}, /* out of spec */ + {"133", CPU_K6_3P, fpus_internal, 133333333, 2.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ + {"166", CPU_K6_3P, fpus_internal, 166666666, 2.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ + {"200", CPU_K6_3P, fpus_internal, 200000000, 3.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ + {"233", CPU_K6_3P, fpus_internal, 233333333, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ + {"266", CPU_K6_3P, fpus_internal, 266666666, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ + {"300", CPU_K6_3P, fpus_internal, 300000000, 3.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ + {"333", CPU_K6_3P, fpus_internal, 332500000, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ + {"350", CPU_K6_3P, fpus_internal, 350000000, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ + {"366", CPU_K6_3P, fpus_internal, 366666666, 5.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ + {"380", CPU_K6_3P, fpus_internal, 380000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ + {"400", CPU_K6_3P, fpus_internal, 400000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, + {"450", CPU_K6_3P, fpus_internal, 450000000, 4.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, + {"475", CPU_K6_3P, fpus_internal, 475000000, 5.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, + {"500", CPU_K6_3P, fpus_internal, 500000000, 5.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, + { .name = "", 0 } + } }, #if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "Cx6x86", - .internal_name = "cx6x86", - .cpus = (const CPU[]) { - {"80 (PR90+)", CPU_Cx6x86, fpus_internal, 80000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 8, 8, 6, 6, 10}, - {"100 (PR120+)", CPU_Cx6x86, fpus_internal, 100000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 12}, - {"110 (PR133+)", CPU_Cx6x86, fpus_internal, 110000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, - {"120 (PR150+)", CPU_Cx6x86, fpus_internal, 120000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"133 (PR166+)", CPU_Cx6x86, fpus_internal, 133333333, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"150 (PR200+)", CPU_Cx6x86, fpus_internal, 150000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 18}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "Cx6x86L", - .internal_name = "cx6x86l", - .cpus = (const CPU[]) { - {"110 (PR133+)", CPU_Cx6x86L, fpus_internal, 110000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, - {"120 (PR150+)", CPU_Cx6x86L, fpus_internal, 120000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"133 (PR166+)", CPU_Cx6x86L, fpus_internal, 133333333, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"150 (PR200+)", CPU_Cx6x86L, fpus_internal, 150000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 18}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "Cx6x86MX", - .internal_name = "cx6x86mx", - .cpus = (const CPU[]) { - {"133 (PR166)", CPU_Cx6x86MX, fpus_internal, 133333333, 2.0, 2900, 0x600, 0x600, 0x0451, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"166 (PR200)", CPU_Cx6x86MX, fpus_internal, 166666666, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"187.5 (PR233)", CPU_Cx6x86MX, fpus_internal, 187500000, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 45/2}, - {"208.3 (PR266)", CPU_Cx6x86MX, fpus_internal, 208333333, 2.5, 2700, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 17,17, 7, 7, 25}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "MII", - .internal_name = "mii", - .cpus = (const CPU[]) { - {"233 (PR300)", CPU_Cx6x86MX, fpus_internal, 233333333, 3.5, 2900, 0x601, 0x601, 0x0852, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, - {"250/83 (PR333)", CPU_Cx6x86MX, fpus_internal, 250000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 9, 9, 30}, - {"250/100 (PR366)", CPU_Cx6x86MX, fpus_internal, 250000000, 2.5, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 7, 7, 30}, - {"285 (PR400)", CPU_Cx6x86MX, fpus_internal, 285000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 34}, - {"300 (PR433)", CPU_Cx6x86MX, fpus_internal, 300000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 36}, - {"", 0} - } + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Cyrix", + .name = "Cx6x86", + .internal_name = "cx6x86", + .cpus = (const CPU[]) { + {"80 (PR90+)", CPU_Cx6x86, fpus_internal, 80000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 8, 8, 6, 6, 10}, + {"100 (PR120+)", CPU_Cx6x86, fpus_internal, 100000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 12}, + {"110 (PR133+)", CPU_Cx6x86, fpus_internal, 110000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, + {"120 (PR150+)", CPU_Cx6x86, fpus_internal, 120000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, + {"133 (PR166+)", CPU_Cx6x86, fpus_internal, 133333333, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"150 (PR200+)", CPU_Cx6x86, fpus_internal, 150000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 18}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Cyrix", + .name = "Cx6x86L", + .internal_name = "cx6x86l", + .cpus = (const CPU[]) { + {"110 (PR133+)", CPU_Cx6x86L, fpus_internal, 110000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, + {"120 (PR150+)", CPU_Cx6x86L, fpus_internal, 120000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, + {"133 (PR166+)", CPU_Cx6x86L, fpus_internal, 133333333, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"150 (PR200+)", CPU_Cx6x86L, fpus_internal, 150000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 18}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Cyrix", + .name = "Cx6x86MX", + .internal_name = "cx6x86mx", + .cpus = (const CPU[]) { + {"133 (PR166)", CPU_Cx6x86MX, fpus_internal, 133333333, 2.0, 2900, 0x600, 0x600, 0x0451, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, + {"166 (PR200)", CPU_Cx6x86MX, fpus_internal, 166666666, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, + {"187.5 (PR233)", CPU_Cx6x86MX, fpus_internal, 187500000, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 45/2}, + {"208.3 (PR266)", CPU_Cx6x86MX, fpus_internal, 208333333, 2.5, 2700, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 17,17, 7, 7, 25}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Cyrix", + .name = "MII", + .internal_name = "mii", + .cpus = (const CPU[]) { + {"233 (PR300)", CPU_Cx6x86MX, fpus_internal, 233333333, 3.5, 2900, 0x601, 0x601, 0x0852, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, + {"250/83 (PR333)", CPU_Cx6x86MX, fpus_internal, 250000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 9, 9, 30}, + {"250/100 (PR366)", CPU_Cx6x86MX, fpus_internal, 250000000, 2.5, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 7, 7, 30}, + {"285 (PR400)", CPU_Cx6x86MX, fpus_internal, 285000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 34}, + {"300 (PR433)", CPU_Cx6x86MX, fpus_internal, 300000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 36}, + { .name = "", 0 } + } }, #endif { - .package = CPU_PKG_SOCKET8, - .manufacturer = "Intel", - .name = "Pentium Pro", - .internal_name = "pentiumpro", - .cpus = (const CPU[]) { - {"60", CPU_PENTIUMPRO, fpus_internal, 60000000, 1.0, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 1, 1, 7}, /* out of spec */ - {"66", CPU_PENTIUMPRO, fpus_internal, 66666666, 1.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 1, 1, 8}, /* out of spec */ - {"90", CPU_PENTIUMPRO, fpus_internal, 90000000, 1.5, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 11}, /* out of spec */ - {"100", CPU_PENTIUMPRO, fpus_internal, 100000000, 1.5, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 12}, /* out of spec */ - {"120", CPU_PENTIUMPRO, fpus_internal, 120000000, 2.0, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 5, 5, 14}, /* out of spec */ - {"133", CPU_PENTIUMPRO, fpus_internal, 133333333, 2.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 5, 5, 16}, /* out of spec */ - {"150", CPU_PENTIUMPRO, fpus_internal, 150000000, 2.5, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, - {"166", CPU_PENTIUMPRO, fpus_internal, 166666666, 2.5, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"180", CPU_PENTIUMPRO, fpus_internal, 180000000, 3.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 21}, - {"200", CPU_PENTIUMPRO, fpus_internal, 200000000, 3.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"", 0} - } + .package = CPU_PKG_SOCKET8, + .manufacturer = "Intel", + .name = "Pentium Pro", + .internal_name = "pentiumpro", + .cpus = (const CPU[]) { + {"60", CPU_PENTIUMPRO, fpus_internal, 60000000, 1.0, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 1, 1, 7}, /* out of spec */ + {"66", CPU_PENTIUMPRO, fpus_internal, 66666666, 1.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 1, 1, 8}, /* out of spec */ + {"90", CPU_PENTIUMPRO, fpus_internal, 90000000, 1.5, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 11}, /* out of spec */ + {"100", CPU_PENTIUMPRO, fpus_internal, 100000000, 1.5, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 12}, /* out of spec */ + {"120", CPU_PENTIUMPRO, fpus_internal, 120000000, 2.0, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 5, 5, 14}, /* out of spec */ + {"133", CPU_PENTIUMPRO, fpus_internal, 133333333, 2.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 5, 5, 16}, /* out of spec */ + {"150", CPU_PENTIUMPRO, fpus_internal, 150000000, 2.5, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, + {"166", CPU_PENTIUMPRO, fpus_internal, 166666666, 2.5, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, + {"180", CPU_PENTIUMPRO, fpus_internal, 180000000, 3.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 21}, + {"200", CPU_PENTIUMPRO, fpus_internal, 200000000, 3.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET8, + .manufacturer = "Intel", + .name = "Pentium II OverDrive", + .internal_name = "pentium2_od", + .cpus = (const CPU[]) { + {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of spec */ + {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12, 6, 6, 16}, /* out of spec */ + {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15, 7, 7, 20}, /* out of spec */ + {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18, 9, 9, 24}, /* out of spec */ + {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 21,21,10,10, 28}, /* out of spec */ + {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 24,24,12,12, 32}, /* out of spec */ + {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 5.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 36}, + {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 40}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SLOT1, + .manufacturer = "Intel", + .name = "Pentium II (Klamath)", + .internal_name = "pentium2_klamath", + .cpus = (const CPU[]) { + {"66", CPU_PENTIUM2, fpus_internal, 66666666, 1.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ + {"100", CPU_PENTIUM2, fpus_internal, 100000000, 1.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ + {"133", CPU_PENTIUM2, fpus_internal, 133333333, 2.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ + {"166", CPU_PENTIUM2, fpus_internal, 166666666, 2.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ + {"200", CPU_PENTIUM2, fpus_internal, 200000000, 3.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, /* out of spec */ + {"233", CPU_PENTIUM2, fpus_internal, 233333333, 3.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, + {"266", CPU_PENTIUM2, fpus_internal, 266666666, 4.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, + {"300", CPU_PENTIUM2, fpus_internal, 300000000, 4.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,12,12, 36}, + { .name = "", 0 } + } }, { - .package = CPU_PKG_SOCKET8, - .manufacturer = "Intel", - .name = "Pentium II OverDrive", - .internal_name = "pentium2_od", - .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15, 7, 7, 20}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18, 9, 9, 24}, /* out of spec */ - {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 21,21,10,10, 28}, /* out of spec */ - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 24,24,12,12, 32}, /* out of spec */ - {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 5.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 36}, - {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 40}, - {"", 0} - } + .package = CPU_PKG_SLOT1, + .manufacturer = "Intel", + .name = "Pentium II (Deschutes)", + .internal_name = "pentium2_deschutes", + .cpus = (const CPU[]) { + {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ + {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 5, 5, 12}, /* out of spec */ + {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ + {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ + {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, /* out of spec */ + {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, /* out of spec */ + {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, + {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,12,12, 36}, + {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 40}, + {"350", CPU_PENTIUM2D, fpus_internal, 350000000, 3.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32,32,11,11, 42}, + {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36,36,12,12, 48}, + {"450", CPU_PENTIUM2D, fpus_internal, 450000000, 4.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41,41,14,14, 54}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SLOT1, + .manufacturer = "Intel", + .name = "Celeron (Covington)", + .internal_name = "celeron_covington", + .cpus = (const CPU[]) { + {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 6, 6, 8}, /* out of spec */ + {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 9, 9, 12}, /* out of spec */ + {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,12,12, 16}, /* out of spec */ + {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,15,15, 20}, /* out of spec */ + {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18,18,18, 24}, /* out of spec */ + {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,21,21, 28}, /* out of spec */ + {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x650, 0x650, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,24,24, 32}, + {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,25,25, 36}, + { .name = "", 0 } + } }, { - .package = CPU_PKG_SLOT1, - .manufacturer = "Intel", - .name = "Pentium II (Klamath)", - .internal_name = "pentium2_klamath", - .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2, fpus_internal, 66666666, 1.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_PENTIUM2, fpus_internal, 100000000, 1.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_PENTIUM2, fpus_internal, 133333333, 2.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_PENTIUM2, fpus_internal, 166666666, 2.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ - {"200", CPU_PENTIUM2, fpus_internal, 200000000, 3.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, /* out of spec */ - {"233", CPU_PENTIUM2, fpus_internal, 233333333, 3.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, - {"266", CPU_PENTIUM2, fpus_internal, 266666666, 4.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, - {"300", CPU_PENTIUM2, fpus_internal, 300000000, 4.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,12,12, 36}, - {"", 0} - } - }, { - .package = CPU_PKG_SLOT1, - .manufacturer = "Intel", - .name = "Pentium II (Deschutes)", - .internal_name = "pentium2_deschutes", - .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 5, 5, 12}, /* out of spec */ - {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, /* out of spec */ - {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, /* out of spec */ - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, - {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,12,12, 36}, - {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 40}, - {"350", CPU_PENTIUM2D, fpus_internal, 350000000, 3.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32,32,11,11, 42}, - {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36,36,12,12, 48}, - {"450", CPU_PENTIUM2D, fpus_internal, 450000000, 4.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41,41,14,14, 54}, - {"", 0} - } - }, { - .package = CPU_PKG_SLOT1, - .manufacturer = "Intel", - .name = "Celeron (Covington)", - .internal_name = "celeron_covington", - .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 6, 6, 8}, /* out of spec */ - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 9, 9, 12}, /* out of spec */ - {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,12,12, 16}, /* out of spec */ - {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,15,15, 20}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18,18,18, 24}, /* out of spec */ - {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,21,21, 28}, /* out of spec */ - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x650, 0x650, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,24,24, 32}, - {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,25,25, 36}, - {"", 0} - } - }, { - .package = CPU_PKG_SLOT2, - .manufacturer = "Intel", - .name = "Pentium II Xeon", - .internal_name = "pentium2_xeon", - .cpus = (const CPU[]) { - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 12}, /* out of spec */ - {"150", CPU_PENTIUM2D, fpus_internal, 150000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 14,14, 4, 4, 18}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 6, 6, 24}, /* out of spec */ - {"250", CPU_PENTIUM2D, fpus_internal, 250000000, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 22,22, 7, 7, 30}, /* out of spec */ - {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 36}, /* out of spec */ - {"350", CPU_PENTIUM2D, fpus_internal, 350000000, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32,32,10,10, 42}, /* out of spec */ - {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36,36,12,12, 48}, - {"450", CPU_PENTIUM2D, fpus_internal, 450000000, 4.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41,41,14,14, 54}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET370, - .manufacturer = "Intel", - .name = "Celeron (Mendocino)", - .internal_name = "celeron_mendocino", - .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 8, 8, 4, 4, 12}, /* out of spec */ - {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 11,11, 5, 5, 16}, /* out of spec */ - {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 14,14, 7, 7, 20}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 17,17, 8, 8, 24}, /* out of spec */ - {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 19,19, 9, 9, 28}, /* out of spec */ - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 22,22,11,11, 32}, /* out of spec */ - {"300A", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 25,25,12,12, 36}, - {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 40}, - {"366", CPU_PENTIUM2D, fpus_internal, 366666666, 5.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 33,33,17,17, 44}, - {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 6.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 36,36,12,12, 48}, - {"433", CPU_PENTIUM2D, fpus_internal, 433333333, 6.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 39,39,13,13, 51}, - {"466", CPU_PENTIUM2D, fpus_internal, 466666666, 7.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 42,42,14,14, 56}, - {"500", CPU_PENTIUM2D, fpus_internal, 500000000, 7.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 45,45,15,15, 60}, - {"533", CPU_PENTIUM2D, fpus_internal, 533333333, 8.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 48,48,17,17, 64}, - {"", 0} - } - }, { - .package = CPU_PKG_SOCKET370, - .manufacturer = "VIA", - .name = "Cyrix III", - .internal_name = "c3_samuel", - .cpus = (const CPU[]) { - {"66", CPU_CYRIX3S, fpus_internal, 66666666, 1.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of multiplier range */ - {"100", CPU_CYRIX3S, fpus_internal, 100000000, 1.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 9, 9, 4, 4, 12}, /* out of multiplier range */ - {"133", CPU_CYRIX3S, fpus_internal, 133333333, 2.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 12, 12, 6, 6, 16}, /* out of multiplier range */ - {"166", CPU_CYRIX3S, fpus_internal, 166666666, 2.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 15, 15, 7, 7, 20}, /* out of multiplier range */ - {"200", CPU_CYRIX3S, fpus_internal, 200000000, 3.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 18, 18, 8, 8, 24}, /* out of multiplier range */ - {"233", CPU_CYRIX3S, fpus_internal, 233333333, 3.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 21, 21, 9, 9, 28}, /* out of multiplier range */ - {"266", CPU_CYRIX3S, fpus_internal, 266666666, 4.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 24, 24, 12, 12, 32}, /* out of multiplier range */ - {"300", CPU_CYRIX3S, fpus_internal, 300000000, 4.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 27, 27, 13, 13, 36}, /* out of spec */ - {"333", CPU_CYRIX3S, fpus_internal, 333333333, 5.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 30, 30, 15, 15, 40}, /* out of spec */ - {"366", CPU_CYRIX3S, fpus_internal, 366666666, 5.5, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 33, 33, 16, 16, 44}, /* out of spec */ - {"400", CPU_CYRIX3S, fpus_internal, 400000000, 6.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 36, 36, 17, 17, 48}, - {"433", CPU_CYRIX3S, fpus_internal, 433333333, 6.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 39, 39, 18, 18, 52}, /* out of spec */ - {"450", CPU_CYRIX3S, fpus_internal, 450000000, 4.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 41, 41, 14, 14, 54}, - {"466", CPU_CYRIX3S, fpus_internal, 466666666, 6.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 42, 42, 14, 14, 56}, /* out of spec */ - {"500", CPU_CYRIX3S, fpus_internal, 500000000, 5.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 45, 45, 15, 15, 60}, - {"533", CPU_CYRIX3S, fpus_internal, 533333333, 8.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 48, 48, 15, 15, 64}, /* out of spec */ - {"550", CPU_CYRIX3S, fpus_internal, 550000000, 5.5, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 50, 50, 17, 17, 66}, - {"600/100", CPU_CYRIX3S, fpus_internal, 600000000, 6.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 54, 54, 18, 18, 72}, - {"600/133", CPU_CYRIX3S, fpus_internal, 600000000, 4.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 54, 54, 13, 13, 72}, - {"650", CPU_CYRIX3S, fpus_internal, 650000000, 6.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 58, 58, 20, 20, 78}, - {"667", CPU_CYRIX3S, fpus_internal, 666666667, 5.0, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 60, 60, 16, 16, 80}, - {"700", CPU_CYRIX3S, fpus_internal, 700000000, 7.0, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 63, 63, 21, 21, 84}, - {"733", CPU_CYRIX3S, fpus_internal, 733333333, 5.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 66, 66, 18, 18, 88}, - {"", 0} - } - }, { - .package = 0, - } + .package = CPU_PKG_SLOT2, + .manufacturer = "Intel", + .name = "Pentium II Xeon", + .internal_name = "pentium2_xeon", + .cpus = (const CPU[]) { + {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 12}, /* out of spec */ + {"150", CPU_PENTIUM2D, fpus_internal, 150000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 14,14, 4, 4, 18}, /* out of spec */ + {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 6, 6, 24}, /* out of spec */ + {"250", CPU_PENTIUM2D, fpus_internal, 250000000, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 22,22, 7, 7, 30}, /* out of spec */ + {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 36}, /* out of spec */ + {"350", CPU_PENTIUM2D, fpus_internal, 350000000, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32,32,10,10, 42}, /* out of spec */ + {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36,36,12,12, 48}, + {"450", CPU_PENTIUM2D, fpus_internal, 450000000, 4.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41,41,14,14, 54}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET370, + .manufacturer = "Intel", + .name = "Celeron (Mendocino)", + .internal_name = "celeron_mendocino", + .cpus = (const CPU[]) { + {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of spec */ + {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 8, 8, 4, 4, 12}, /* out of spec */ + {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 11,11, 5, 5, 16}, /* out of spec */ + {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 14,14, 7, 7, 20}, /* out of spec */ + {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 17,17, 8, 8, 24}, /* out of spec */ + {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 19,19, 9, 9, 28}, /* out of spec */ + {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 22,22,11,11, 32}, /* out of spec */ + {"300A", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 25,25,12,12, 36}, + {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 40}, + {"366", CPU_PENTIUM2D, fpus_internal, 366666666, 5.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 33,33,17,17, 44}, + {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 6.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 36,36,12,12, 48}, + {"433", CPU_PENTIUM2D, fpus_internal, 433333333, 6.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 39,39,13,13, 51}, + {"466", CPU_PENTIUM2D, fpus_internal, 466666666, 7.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 42,42,14,14, 56}, + {"500", CPU_PENTIUM2D, fpus_internal, 500000000, 7.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 45,45,15,15, 60}, + {"533", CPU_PENTIUM2D, fpus_internal, 533333333, 8.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 48,48,17,17, 64}, + { .name = "", 0 } + } + }, + { + .package = CPU_PKG_SOCKET370, + .manufacturer = "VIA", + .name = "Cyrix III", + .internal_name = "c3_samuel", + .cpus = (const CPU[]) { + {"66", CPU_CYRIX3S, fpus_internal, 66666666, 1.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of multiplier range */ + {"100", CPU_CYRIX3S, fpus_internal, 100000000, 1.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 9, 9, 4, 4, 12}, /* out of multiplier range */ + {"133", CPU_CYRIX3S, fpus_internal, 133333333, 2.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 12, 12, 6, 6, 16}, /* out of multiplier range */ + {"166", CPU_CYRIX3S, fpus_internal, 166666666, 2.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 15, 15, 7, 7, 20}, /* out of multiplier range */ + {"200", CPU_CYRIX3S, fpus_internal, 200000000, 3.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 18, 18, 8, 8, 24}, /* out of multiplier range */ + {"233", CPU_CYRIX3S, fpus_internal, 233333333, 3.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 21, 21, 9, 9, 28}, /* out of multiplier range */ + {"266", CPU_CYRIX3S, fpus_internal, 266666666, 4.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 24, 24, 12, 12, 32}, /* out of multiplier range */ + {"300", CPU_CYRIX3S, fpus_internal, 300000000, 4.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 27, 27, 13, 13, 36}, /* out of spec */ + {"333", CPU_CYRIX3S, fpus_internal, 333333333, 5.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 30, 30, 15, 15, 40}, /* out of spec */ + {"366", CPU_CYRIX3S, fpus_internal, 366666666, 5.5, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 33, 33, 16, 16, 44}, /* out of spec */ + {"400", CPU_CYRIX3S, fpus_internal, 400000000, 6.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 36, 36, 17, 17, 48}, + {"433", CPU_CYRIX3S, fpus_internal, 433333333, 6.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 39, 39, 18, 18, 52}, /* out of spec */ + {"450", CPU_CYRIX3S, fpus_internal, 450000000, 4.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 41, 41, 14, 14, 54}, + {"466", CPU_CYRIX3S, fpus_internal, 466666666, 6.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 42, 42, 14, 14, 56}, /* out of spec */ + {"500", CPU_CYRIX3S, fpus_internal, 500000000, 5.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 45, 45, 15, 15, 60}, + {"533", CPU_CYRIX3S, fpus_internal, 533333333, 8.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 48, 48, 15, 15, 64}, /* out of spec */ + {"550", CPU_CYRIX3S, fpus_internal, 550000000, 5.5, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 50, 50, 17, 17, 66}, + {"600/100", CPU_CYRIX3S, fpus_internal, 600000000, 6.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 54, 54, 18, 18, 72}, + {"600/133", CPU_CYRIX3S, fpus_internal, 600000000, 4.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 54, 54, 13, 13, 72}, + {"650", CPU_CYRIX3S, fpus_internal, 650000000, 6.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 58, 58, 20, 20, 78}, + {"667", CPU_CYRIX3S, fpus_internal, 666666667, 5.0, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 60, 60, 16, 16, 80}, + {"700", CPU_CYRIX3S, fpus_internal, 700000000, 7.0, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 63, 63, 21, 21, 84}, + {"733", CPU_CYRIX3S, fpus_internal, 733333333, 5.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 66, 66, 18, 18, 88}, + { .name = "", 0 } + } + }, + { .package = 0, 0 } // clang-format on }; From 232b44323cce2f762d7fb7975a83bece56f2a4da Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 21 Jul 2024 00:06:33 -0400 Subject: [PATCH 146/624] Named initializers for soclet 1 486's --- src/cpu/cpu_table.c | 810 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 765 insertions(+), 45 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index c24167500..6ae963c79 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -2071,10 +2071,74 @@ const cpu_family_t cpu_families[] = { .name = "i486SX", .internal_name = "i486sx", .cpus = (const CPU[]) { - {"16", CPU_i486SX, fpus_486sx, 16000000, 1, 5000, 0x420, 0, 0, CPU_SUPPORTS_DYNAREC, 3, 3,3,3, 2}, - {"20", CPU_i486SX, fpus_486sx, 20000000, 1, 5000, 0x420, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, - {"25", CPU_i486SX, fpus_486sx, 25000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, - {"33", CPU_i486SX, fpus_486sx, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, + { + .name = "16", + .cpu_type = CPU_i486SX, + .fpus = fpus_486sx, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 2 + }, + { + .name = "20", + .cpu_type = CPU_i486SX, + .fpus = fpus_486sx, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "25", + .cpu_type = CPU_i486SX, + .fpus = fpus_486sx, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_i486SX, + .fpus = fpus_486sx, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, { .name = "", 0 } } }, @@ -2084,8 +2148,40 @@ const cpu_family_t cpu_families[] = { .name = "i486SX-S", .internal_name = "i486sx_slenh", .cpus = (const CPU[]) { - {"25", CPU_i486SX_SLENH, fpus_486sx, 25000000, 1, 5000, 0x423, 0x423, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, - {"33", CPU_i486SX_SLENH, fpus_486sx, 33333333, 1, 5000, 0x42a, 0x42a, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, + { + .name = "25", + .cpu_type = CPU_i486SX_SLENH, + .fpus = fpus_486sx, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x423, + .cpuid_model = 0x423, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_i486SX_SLENH, + .fpus = fpus_486sx, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x42a, + .cpuid_model = 0x42a, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, { .name = "", 0 } } }, @@ -2095,8 +2191,40 @@ const cpu_family_t cpu_families[] = { .name = "i486SX2", .internal_name = "i486sx2", .cpus = (const CPU[]) { - {"50", CPU_i486SX_SLENH, fpus_486sx, 50000000, 2, 5000, 0x45b, 0x45b, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66 (Q0569)", CPU_i486SX_SLENH, fpus_486sx, 66666666, 2, 5000, 0x45b, 0x45b, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 8}, + { + .name = "50", + .cpu_type = CPU_i486SX_SLENH, + .fpus = fpus_486sx, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x45b, + .cpuid_model = 0x45b, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66 (Q0569)", + .cpu_type = CPU_i486SX_SLENH, + .fpus = fpus_486sx, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x45b, + .cpuid_model = 0x45b, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, { .name = "", 0 } } }, @@ -2106,9 +2234,57 @@ const cpu_family_t cpu_families[] = { .name = "i486DX", .internal_name = "i486dx", .cpus = (const CPU[]) { - {"25", CPU_i486DX, fpus_internal, 25000000, 1, 5000, 0x404, 0, 0, CPU_SUPPORTS_DYNAREC, 4, 4,3,3, 3}, - {"33", CPU_i486DX, fpus_internal, 33333333, 1, 5000, 0x404, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, - {"50", CPU_i486DX, fpus_internal, 50000000, 1, 5000, 0x411, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8,4,4, 6}, + { + .name = "25", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x404, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x404, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "50", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x411, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 6 + }, { .name = "", 0 } } }, @@ -2118,8 +2294,40 @@ const cpu_family_t cpu_families[] = { .name = "i486DX-S", .internal_name = "i486dx_slenh", .cpus = (const CPU[]) { - {"33", CPU_i486DX_SLENH, fpus_internal, 33333333, 1, 5000, 0x414, 0x414, 0, CPU_SUPPORTS_DYNAREC, 6, 6,3,3, 4}, - {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 1, 5000, 0x414, 0x414, 0, CPU_SUPPORTS_DYNAREC, 8, 8,4,4, 6}, + { + .name = "33", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x414, + .cpuid_model = 0x414, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "50", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x414, + .cpuid_model = 0x414, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 6 + }, { .name = "", 0 } } }, @@ -2129,9 +2337,57 @@ const cpu_family_t cpu_families[] = { .name = "i486DX2", .internal_name = "i486dx2", .cpus = (const CPU[]) { - {"40", CPU_i486DX, fpus_internal, 40000000, 2, 5000, 0x430, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7,6,6, 5}, - {"50", CPU_i486DX, fpus_internal, 50000000, 2, 5000, 0x433, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66", CPU_i486DX, fpus_internal, 66666666, 2, 5000, 0x433, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, + { + .name = "40", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 5 + }, + { + .name = "50", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x433, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x433, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, { .name = "", 0 } } }, @@ -2141,9 +2397,57 @@ const cpu_family_t cpu_families[] = { .name = "i486DX2-S", .internal_name = "i486dx2_slenh", .cpus = (const CPU[]) { - {"40", CPU_i486DX_SLENH, fpus_internal, 40000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 7, 7,6,6, 5}, - {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, + { + .name = "40", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 5 + }, + { + .name = "50", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, { .name = "", 0 } } }, @@ -2153,8 +2457,40 @@ const cpu_family_t cpu_families[] = { .name = "i486DX2 WB", .internal_name = "i486dx2_pc330", .cpus = (const CPU[]) { - {"50", CPU_i486DX_SLENH, fpus_internal, 50000000, 2, 5000, 0x436, 0x436, 0, CPU_SUPPORTS_DYNAREC, 8, 8,6,6, 6}, - {"66", CPU_i486DX_SLENH, fpus_internal, 66666666, 2, 5000, 0x436, 0x436, 0, CPU_SUPPORTS_DYNAREC, 12,12,6,6, 8}, + { + .name = "50", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x436, + .cpuid_model = 0x436, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x436, + .cpuid_model = 0x436, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, { .name = "", 0 } } }, @@ -2164,8 +2500,40 @@ const cpu_family_t cpu_families[] = { .name = "iDX4", .internal_name = "idx4", .cpus = (const CPU[]) { - {"75", CPU_i486DX_SLENH, fpus_internal, 75000000, 3.0, 5000, 0x480, 0x480, 0x0000, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, - {"100", CPU_i486DX_SLENH, fpus_internal, 100000000, 3.0, 5000, 0x483, 0x483, 0x0000, CPU_SUPPORTS_DYNAREC, 18,18, 9, 9, 12}, + { + .name = "75", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0x480, + .cyrix_id = 0x0000, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 + }, + { + .name = "100", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x483, + .cpuid_model = 0x483, + .cyrix_id = 0x0000, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, { .name = "", 0 } } }, @@ -2186,8 +2554,40 @@ const cpu_family_t cpu_families[] = { .name = "Am486SX", .internal_name = "am486sx", .cpus = (const CPU[]) { - {"33", CPU_Am486SX, fpus_486sx, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Am486SX, fpus_486sx, 40000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { + .name = "33", + .cpu_type = CPU_Am486SX, + .fpus = fpus_486sx, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_Am486SX, + .fpus = fpus_486sx, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, { .name = "", 0 } } }, @@ -2197,8 +2597,40 @@ const cpu_family_t cpu_families[] = { .name = "Am486SX2", .internal_name = "am486sx2", .cpus = (const CPU[]) { - {"50", CPU_Am486SX, fpus_486sx, 50000000, 2, 5000, 0x45b, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, - {"66", CPU_Am486SX, fpus_486sx, 66666666, 2, 5000, 0x45b, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, + { + .name = "50", + .cpu_type = CPU_Am486SX, + .fpus = fpus_486sx, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x45b, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_Am486SX, + .fpus = fpus_486sx, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x45b, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, { .name = "", 0 } } }, @@ -2208,8 +2640,40 @@ const cpu_family_t cpu_families[] = { .name = "Am486DX", .internal_name = "am486dx", .cpus = (const CPU[]) { - {"33", CPU_Am486DX, fpus_internal, 33333333, 1, 5000, 0x412, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Am486DX, fpus_internal, 40000000, 1, 5000, 0x412, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { + .name = "33", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x412, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x412, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, { .name = "", 0 } } }, @@ -2219,9 +2683,57 @@ const cpu_family_t cpu_families[] = { .name = "Am486DX2", .internal_name = "am486dx2", .cpus = (const CPU[]) { - {"50", CPU_Am486DX, fpus_internal, 50000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, - {"66", CPU_Am486DX, fpus_internal, 66666666, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"80", CPU_Am486DX, fpus_internal, 80000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { + .name = "50", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { + .name = "80", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 10 + }, { .name = "", 0 } } }, @@ -2231,8 +2743,40 @@ const cpu_family_t cpu_families[] = { .name = "Am486DXL", .internal_name = "am486dxl", .cpus = (const CPU[]) { - {"33", CPU_Am486DXL, fpus_internal, 33333333, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Am486DXL, fpus_internal, 40000000, 1, 5000, 0x422, 0, 0, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { + .name = "33", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, { .name = "", 0 } } }, @@ -2242,9 +2786,57 @@ const cpu_family_t cpu_families[] = { .name = "Am486DXL2", .internal_name = "am486dxl2", .cpus = (const CPU[]) { - {"50", CPU_Am486DXL, fpus_internal, 50000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, - {"66", CPU_Am486DXL, fpus_internal, 66666666, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"80", CPU_Am486DXL, fpus_internal, 80000000, 2, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { + .name = "50", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { + .name = "80", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 10 + }, { .name = "", 0 } } }, @@ -2302,9 +2894,57 @@ const cpu_family_t cpu_families[] = { .name = "Cx486S", .internal_name = "cx486s", .cpus = (const CPU[]) { - {"25", CPU_Cx486S, fpus_486sx, 25000000, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 4, 4, 3, 3, 3}, - {"33", CPU_Cx486S, fpus_486sx, 33333333, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Cx486S, fpus_486sx, 40000000, 1.0, 5000, 0x420, 0, 0x0010, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { + .name = "25", + .cpu_type = CPU_Cx486S, + .fpus = fpus_486sx, + .rspeed = 25000000, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0x0010, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 3 + }, + { + .name = "33", + .cpu_type = CPU_Cx486S, + .fpus = fpus_486sx, + .rspeed = 33333333, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0x0010, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_Cx486S, + .fpus = fpus_486sx, + .rspeed = 40000000, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0x0010, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, { .name = "", 0 } } }, @@ -2314,8 +2954,40 @@ const cpu_family_t cpu_families[] = { .name = "Cx486DX", .internal_name = "cx486dx", .cpus = (const CPU[]) { - {"33", CPU_Cx486DX, fpus_internal, 33333333, 1.0, 5000, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 6, 6, 3, 3, 4}, - {"40", CPU_Cx486DX, fpus_internal, 40000000, 1.0, 5000, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { + .name = "33", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x051a, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 4 + }, + { + .name = "40", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x051a, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, { .name = "", 0 } } }, @@ -2325,9 +2997,57 @@ const cpu_family_t cpu_families[] = { .name = "Cx486DX2", .internal_name = "cx486dx2", .cpus = (const CPU[]) { - {"50", CPU_Cx486DX, fpus_internal, 50000000, 2.0, 5000, 0x430, 0, 0x081b, CPU_SUPPORTS_DYNAREC, 8, 8, 6, 6, 6}, - {"66", CPU_Cx486DX, fpus_internal, 66666666, 2.0, 5000, 0x430, 0, 0x0b1b, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"80", CPU_Cx486DX, fpus_internal, 80000000, 2.0, 5000, 0x430, 0, 0x311b, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { + .name = "50", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x081b, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 6 + }, + { + .name = "66", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x0b1b, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { + .name = "80", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x311b, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 10 + }, { .name = "", 0 } } }, From ed6193abc987aaec30bb0025f6e0af1aed19a9f2 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 21 Jul 2024 18:00:52 -0400 Subject: [PATCH 147/624] Named initializers for soclet 3's --- src/cpu/cpu_table.c | 332 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 312 insertions(+), 20 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 6ae963c79..2ec9a3304 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -2543,8 +2543,40 @@ const cpu_family_t cpu_families[] = { .name = "Pentium OverDrive", .internal_name = "pentium_p24t", .cpus = (const CPU[]) { - {"63", CPU_P24T, fpus_internal, 62500000, 2.5, 5000, 0x1531, 0x1531, 0x0000, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10,7,7, 15/2}, - {"83", CPU_P24T, fpus_internal, 83333333, 2.5, 5000, 0x1532, 0x1532, 0x0000, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,8,8, 10}, + { + .name = "63", + .cpu_type = CPU_P24T, + .fpus = fpus_internal, + .rspeed = 62500000, + .multi = 2.5, + .voltage = 5000, + .edx_reset = 0x1531, + .cpuid_model = 0x1531, + .cyrix_id = 0x0000, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 15/2 + }, + { + .name = "83", + .cpu_type = CPU_P24T, + .fpus = fpus_internal, + .rspeed = 83333333, + .multi = 2.5, + .voltage = 5000, + .edx_reset = 0x1532, + .cpuid_model = 0x1532, + .cyrix_id = 0x0000, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 8, + .cache_write_cycles = 8, + .atclk_div = 10 + }, { .name = "", 0 } } }, @@ -2846,10 +2878,74 @@ const cpu_family_t cpu_families[] = { .name = "Am486DX4", .internal_name = "am486dx4", .cpus = (const CPU[]) { - {"75", CPU_Am486DX, fpus_internal, 75000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, - {"90", CPU_Am486DX, fpus_internal, 90000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"100", CPU_Am486DX, fpus_internal, 100000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"120", CPU_Am486DX, fpus_internal, 120000000, 3.0, 5000, 0x432, 0, 0, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, + { + .name = "75", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 + }, + { + .name = "90", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { + .name = "100", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { + .name = "120", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 15 + }, { .name = "", 0 } } }, @@ -2859,8 +2955,40 @@ const cpu_family_t cpu_families[] = { .name = "Am486DX2 (Enhanced)", .internal_name = "am486dx2_slenh", .cpus = (const CPU[]) { - {"66", CPU_ENH_Am486DX, fpus_internal, 66666666, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 12,12, 6, 6, 8}, - {"80", CPU_ENH_Am486DX, fpus_internal, 80000000, 2, 5000, 0x435, 0x435, 0, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { + .name = "66", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { + .name = "80", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 10 + }, { .name = "", 0 } } }, @@ -2870,9 +2998,57 @@ const cpu_family_t cpu_families[] = { .name = "Am486DX4 (Enhanced)", .internal_name = "am486dx4_slenh", .cpus = (const CPU[]) { - {"75", CPU_ENH_Am486DX, fpus_internal, 75000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, - {"100", CPU_ENH_Am486DX, fpus_internal, 100000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"120", CPU_ENH_Am486DX, fpus_internal, 120000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, + { + .name = "75", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x482, + .cpuid_model = 0x482, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 + }, + { + .name = "100", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x482, + .cpuid_model = 0x482, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { + .name = "120", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x482, + .cpuid_model = 0x482, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 15 + }, { .name = "", 0 } } }, @@ -2882,9 +3058,57 @@ const cpu_family_t cpu_families[] = { .name = "Am5x86", .internal_name = "am5x86", .cpus = (const CPU[]) { - {"133 (P75)", CPU_ENH_Am486DX, fpus_internal, 133333333, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, - {"150 (P75+)", CPU_ENH_Am486DX, fpus_internal, 150000000, 3.0, 5000, 0x482, 0x482, 0, CPU_SUPPORTS_DYNAREC, 28,28,12,12, 20},/*The rare P75+ was indeed a triple-clocked 150 MHz according to research*/ - {"160 (P90)", CPU_ENH_Am486DX, fpus_internal, 160000000, 4.0, 5000, 0x4e0, 0x4e0, 0, CPU_SUPPORTS_DYNAREC, 28,28,12,12, 20},/*160 MHz on a 40 MHz bus was a common overclock and "5x86/P90" was used by a number of BIOSes to refer to that configuration*/ + { + .name = "133 (P75)", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 4.0, + .voltage = 5000, + .edx_reset = 0x4e0, + .cpuid_model = 0x4e0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 16 + }, + { /*The rare P75+ was indeed a triple-clocked 150 MHz according to research*/ + .name = "150 (P75+)", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x482, + .cpuid_model = 0x482, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 28, + .mem_write_cycles = 28, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 20 + }, + { /*160 MHz on a 40 MHz bus was a common overclock and "5x86/P90" was used by a number of BIOSes to refer to that configuration*/ + .name = "160 (P90)", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 160000000, + .multi = 4.0, + .voltage = 5000, + .edx_reset = 0x4e0, + .cpuid_model = 0x4e0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 28, + .mem_write_cycles = 28, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 20 + }, { .name = "", 0 } } }, @@ -3057,8 +3281,12 @@ const cpu_family_t cpu_families[] = { .name = "Cx486DX4", .internal_name = "cx486dx4", .cpus = (const CPU[]) { - {"75", CPU_Cx486DX, fpus_internal, 75000000, 3.0, 5000, 0x480, 0, 0x361f, CPU_SUPPORTS_DYNAREC, 12,12, 9, 9, 9}, - {"100", CPU_Cx486DX, fpus_internal, 100000000, 3.0, 5000, 0x480, 0, 0x361f, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, + { + .name = "75", .cpu_type = CPU_Cx486DX, .fpus = fpus_internal, .rspeed = 75000000, .multi = 3.0, .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x361f, .cpu_flags = CPU_SUPPORTS_DYNAREC, .mem_read_cycles = 12,.mem_write_cycles = 12, .cache_read_cycles = 9, .cache_write_cycles = 9, .atclk_div = 9 + }, + { + .name = "100", .cpu_type = CPU_Cx486DX, .fpus = fpus_internal, .rspeed = 100000000, .multi = 3.0, .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x361f, .cpu_flags = CPU_SUPPORTS_DYNAREC, .mem_read_cycles = 15,.mem_write_cycles = 15, .cache_read_cycles = 9, .cache_write_cycles = 9, .atclk_div = 12 + }, { .name = "", 0 } } }, @@ -3068,10 +3296,74 @@ const cpu_family_t cpu_families[] = { .name = "Cx5x86", .internal_name = "cx5x86", .cpus = (const CPU[]) { - {"80", CPU_Cx5x86, fpus_internal, 80000000, 2.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, /*If we're including the Pentium 50, might as well include this*/ - {"100", CPU_Cx5x86, fpus_internal, 100000000, 3.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 15,15, 9, 9, 12}, - {"120", CPU_Cx5x86, fpus_internal, 120000000, 3.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 21,21, 9, 9, 15}, - {"133", CPU_Cx5x86, fpus_internal, 133333333, 4.0, 5000, 0x480, 0, 0x002f, CPU_SUPPORTS_DYNAREC, 24,24,12,12, 16}, + { /*If we're including the Pentium 50, might as well include this*/ + .name = "80", + .cpu_type = CPU_Cx5x86, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x002f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 10 + }, + { + .name = "100", + .cpu_type = CPU_Cx5x86, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x002f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { + .name = "120", + .cpu_type = CPU_Cx5x86, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x002f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 15 + }, + { + .name = "133", + .cpu_type = CPU_Cx5x86, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 4.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x002f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 16 + }, { .name = "", 0 } } }, From 27f83754b231fdbb346a768d30baef056c6306c3 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 21 Jul 2024 18:52:13 -0400 Subject: [PATCH 148/624] Named initializers for STPC CPU's --- src/cpu/cpu_table.c | 54 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 2ec9a3304..2043f8cb6 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -3373,8 +3373,40 @@ const cpu_family_t cpu_families[] = { .name = "STPC-DX", .internal_name = "stpc_dx", .cpus = (const CPU[]) { - {"66", CPU_STPC, fpus_internal, 66666666, 1.0, 3300, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, - {"75", CPU_STPC, fpus_internal, 75000000, 1.0, 3300, 0x430, 0, 0x051a, CPU_SUPPORTS_DYNAREC, 7, 7, 3, 3, 5}, + { + .name = "66", + .cpu_type = CPU_STPC, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 3300, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x051a, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, + { + .name = "75", + .cpu_type = CPU_STPC, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.0, + .voltage = 3300, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x051a, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 5 + }, { .name = "", 0 } } }, @@ -3384,7 +3416,23 @@ const cpu_family_t cpu_families[] = { .name = "STPC-DX2", .internal_name = "stpc_dx2", .cpus = (const CPU[]) { - {"133", CPU_STPC, fpus_internal, 133333333, 2.0, 3300, 0x430, 0, 0x0b1b, CPU_SUPPORTS_DYNAREC, 14,14, 6, 6, 10}, + { + .name = "133", + .cpu_type = CPU_STPC, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3300, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x0b1b, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 10 + }, { .name = "", 0 } } }, From b5f85ba26774a8cef6dd72e846bc8c096869437e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 21 Jul 2024 19:24:16 -0400 Subject: [PATCH 149/624] Named initializers for soclet 4's --- src/cpu/cpu_table.c | 108 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 102 insertions(+), 6 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 2043f8cb6..34832762f 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -3442,9 +3442,57 @@ const cpu_family_t cpu_families[] = { .name = "Pentium", .internal_name = "pentium_p5", .cpus = (const CPU[]) { - {"50 (Q0399)", CPU_PENTIUM, fpus_internal, 50000000, 1, 5000, 0x513, 0x513, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 4, 4,3,3, 6}, - {"60", CPU_PENTIUM, fpus_internal, 60000000, 1, 5000, 0x517, 0x517, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6,3,3, 7}, - {"66", CPU_PENTIUM, fpus_internal, 66666666, 1, 5000, 0x517, 0x517, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6,3,3, 8}, + { + .name = "50 (Q0399)", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x513, + .cpuid_model = 0x513, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 6 + }, + { + .name = "60", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 60000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x517, + .cpuid_model = 0x517, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 7 + }, + { + .name = "66", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x517, + .cpuid_model = 0x517, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, { .name = "", 0 } } }, @@ -3454,9 +3502,57 @@ const cpu_family_t cpu_families[] = { .name = "Pentium OverDrive", .internal_name = "pentium_p54c_od5v", .cpus = (const CPU[]) { - {"100", CPU_PENTIUM, fpus_internal, 100000000, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 8, 8,6,6, 12}, - {"120", CPU_PENTIUM, fpus_internal, 120000000, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,6,6, 14}, - {"133", CPU_PENTIUM, fpus_internal, 133333333, 2, 5000, 0x51A, 0x51A, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,6,6, 16}, + { + .name = "100", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x51A, + .cpuid_model = 0x51A, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 12 + }, + { + .name = "120", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x51A, + .cpuid_model = 0x51A, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "133", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x51A, + .cpuid_model = 0x51A, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, { .name = "", 0 } } }, From e434b3f837056f75fdacac2364ee4d3f3947dd79 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 02:33:03 +0200 Subject: [PATCH 150/624] Opti x81/391: Fix D0000-DFFFF and E0000-EFFFF shadow RAM and disable excess logging. --- src/chipset/opti391.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/chipset/opti391.c b/src/chipset/opti391.c index 8c5dd7b7c..c4c5534f8 100644 --- a/src/chipset/opti391.c +++ b/src/chipset/opti391.c @@ -106,11 +106,11 @@ opti391_shadow_recalc(opti391_t *dev) for (uint8_t i = 0; i < 8; i++) { base = 0xd0000 + (i << 14); if (base >= 0xe0000) { - sh_master = (dev->regs[0x02] & 0x40); - sh_wp = (dev->regs[0x02] & 0x10); - } else { sh_master = (dev->regs[0x02] & 0x20); sh_wp = (dev->regs[0x02] & 0x08); + } else { + sh_master = (dev->regs[0x02] & 0x40); + sh_wp = (dev->regs[0x02] & 0x10); } sh_enable = dev->regs[0x03] & (1 << i); @@ -253,7 +253,7 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) case 0x02: case 0x03: case 0x06: - pclog("Write %02X: %02X\n", dev->index - dev->reg_base, val); + opti391_log("Write %02X: %02X\n", dev->index - dev->reg_base, val); dev->regs[dev->index - dev->reg_base] = val; opti391_shadow_recalc(dev); break; From 3ccca3991f5ed4e2028483f5ccb2a385e8b489d8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 02:43:24 +0200 Subject: [PATCH 151/624] More moving of SB IRQ's onto a rimer, fixes #1942. --- src/include/86box/snd_sb_dsp.h | 1 + src/sound/snd_sb_dsp.c | 33 ++++++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/include/86box/snd_sb_dsp.h b/src/include/86box/snd_sb_dsp.h index c179fd197..9bc1d2308 100644 --- a/src/include/86box/snd_sb_dsp.h +++ b/src/include/86box/snd_sb_dsp.h @@ -141,6 +141,7 @@ typedef struct sb_dsp_t { int wb_full; pc_timer_t irq_timer; + pc_timer_t irq16_timer; int busy_count; diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index de420c740..53666f71d 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -1722,19 +1722,18 @@ sb_exec_command(sb_dsp_t *dsp) sb_add_data(dsp, dsp->sb_test); break; case 0xF2: /* Trigger 8-bit IRQ */ - sb_dsp_log("Trigger IRQ\n"); - if (IS_ESS(dsp)) { - if (!timer_is_enabled(&dsp->irq_timer)) { - timer_set_delay_u64(&dsp->irq_timer, (100ULL * TIMER_USEC)); - } - } else { - sb_irq(dsp, 1); - dsp->ess_irq_generic = true; + sb_dsp_log("Trigger 8-bit IRQ\n"); + if (!timer_is_enabled(&dsp->irq_timer)) { + timer_set_delay_u64(&dsp->irq_timer, (100ULL * TIMER_USEC)); } break; case 0xF3: /* Trigger 16-bit IRQ */ - sb_dsp_log("Trigger IRQ\n"); - dsp->ess_irq_generic = true; + sb_dsp_log("Trigger 16-bit IRQ\n"); + if (IS_ESS(dsp)) + dsp->ess_irq_generic = true; + else if (!timer_is_enabled(&dsp->irq16_timer)) { + timer_set_delay_u64(&dsp->irq16_timer, (100ULL * TIMER_USEC)); + } break; case 0xF8: if (dsp->sb_type < SB16) @@ -2061,6 +2060,15 @@ sb_dsp_irq_poll(void *priv) dsp->ess_irq_generic = true; } +void +sb_dsp_irq16_poll(void *priv) +{ + sb_dsp_t *dsp = (sb_dsp_t *) priv; + + sb_irq(dsp, 0); + dsp->ess_irq_generic = true; +} + void sb_dsp_init(sb_dsp_t *dsp, int type, int subtype, void *parent) { @@ -2095,15 +2103,18 @@ sb_dsp_init(sb_dsp_t *dsp, int type, int subtype, void *parent) timer_add(&dsp->input_timer, sb_poll_i, dsp, 0); timer_add(&dsp->wb_timer, NULL, dsp, 0); timer_add(&dsp->irq_timer, sb_dsp_irq_poll, dsp, 0); + timer_add(&dsp->irq16_timer, sb_dsp_irq16_poll, dsp, 0); if (IS_ESS(dsp)) /* Initialize ESS filter to 8 kHz. This will be recalculated when a set frequency command is sent. */ recalc_sb16_filter(0, 8000 * 2); - else + else { + timer_add(&dsp->irq16_timer, sb_dsp_irq16_poll, dsp, 0); /* Initialise SB16 filter to same cutoff as 8-bit SBs (3.2 kHz). This will be recalculated when a set frequency command is sent. */ recalc_sb16_filter(0, 3200 * 2); + } if (IS_ESS(dsp) || (dsp->sb_type >= SBPRO2)) { /* OPL3 or dual OPL2 is stereo. */ if (dsp->sb_has_real_opl) From de10429567c860012fc5dbf29cc87ce0f9de8bc5 Mon Sep 17 00:00:00 2001 From: Marcos Alves Date: Mon, 22 Jul 2024 02:02:41 +0100 Subject: [PATCH 152/624] Updated description of Microtouch Emulation As it now emulates more protocols than the TouchPen, I figured it'd be better defined as just 3M Microtouch (as it now does part of SMT3(V) and TouchPen 4 --- src/device/mouse_microtouch_touchscreen.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 72ac9c53a..5d4d6bafb 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -10,7 +10,7 @@ * * * - * Authors: Cacodemon345 + * Authors: Cacodemon345, mourix * * Copyright 2024 Cacodemon345 */ @@ -415,7 +415,7 @@ static const device_config_t mtouch_config[] = { }; const device_t mouse_mtouch_device = { - .name = "3M MicroTouch TouchPen 4", + .name = "3M MicroTouch (Serial)", .internal_name = "microtouch_touchpen", .flags = DEVICE_COM, .local = 0, From 91874e231a634cf11592464f78d941184213e386 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 03:19:40 +0200 Subject: [PATCH 153/624] The monster FDC ROM is now optionally writable (also finally made the SCSI NVR's per-instance), closes #4623. --- src/floppy/fdc_monster.c | 73 +++++++++++++++++++++++++++++++++++++-- src/include/86box/mem.h | 5 +++ src/mem/mem.c | 13 +++++++ src/scsi/scsi_aha154x.c | 9 +++-- src/scsi/scsi_ncr53c8xx.c | 14 ++++---- src/scsi/scsi_pcscsi.c | 3 +- 6 files changed, 104 insertions(+), 13 deletions(-) diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index 1629ac1c4..2feafdf07 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -41,13 +41,71 @@ typedef struct monster_fdc_t { rom_t bios_rom; fdc_t *fdc_pri; fdc_t *fdc_sec; + char *nvr_path; } monster_fdc_t; +static void +rom_write(uint32_t addr, uint8_t val, void *priv) +{ + const rom_t *rom = (rom_t *) priv; + +#ifdef ROM_TRACE + if (rom->mapping.base == ROM_TRACE) + rom_log("ROM: read byte from BIOS at %06lX\n", addr); +#endif + + if (addr < rom->mapping.base) + return; + if (addr >= (rom->mapping.base + rom->sz)) + return; + rom->rom[(addr - rom->mapping.base) & rom->mask] = val; +} + +static void +rom_writew(uint32_t addr, uint16_t val, void *priv) +{ + rom_t *rom = (rom_t *) priv; + +#ifdef ROM_TRACE + if (rom->mapping.base == ROM_TRACE) + rom_log("ROM: read word from BIOS at %06lX\n", addr); +#endif + + if (addr < (rom->mapping.base - 1)) + return; + if (addr >= (rom->mapping.base + rom->sz)) + return; + *(uint16_t *) &rom->rom[(addr - rom->mapping.base) & rom->mask] = val; +} + +static void +rom_writel(uint32_t addr, uint32_t val, void *priv) +{ + rom_t *rom = (rom_t *) priv; + +#ifdef ROM_TRACE + if (rom->mapping.base == ROM_TRACE) + rom_log("ROM: read long from BIOS at %06lX\n", addr); +#endif + + if (addr < (rom->mapping.base - 3)) + return; + if (addr >= (rom->mapping.base + rom->sz)) + return; + *(uint32_t *) &rom->rom[(addr - rom->mapping.base) & rom->mask] = val; +} + static void monster_fdc_close(void *priv) { monster_fdc_t *dev = (monster_fdc_t *) priv; + FILE *f = fopen(dev->nvr_path, "wb"); + if (f != NULL) { + fwrite(dev->bios_rom.rom, 1, 0x2000, f); + fclose(f); + } + free(dev); } @@ -79,9 +137,18 @@ monster_fdc_init(UNUSED(const device_t *info)) fdc_set_dma_ch(dev->fdc_sec, sec_dma); #endif -#if 0 uint8_t rom_writes_enabled = device_get_config_int("rom_writes_enabled"); -#endif + if (rom_writes_enabled) { + mem_mapping_set_write_handler(&dev->bios_rom.mapping, rom_write, rom_writew, rom_writel); + dev->nvr_path = "monster_fdc_0.nvr"; + dev->nvr_path[12] = device_get_instance() + 0x30; + FILE *f = fopen(dev->nvr_path, "rb"); + if (f != NULL) { + fread(dev->bios_rom.rom, 1, 0x2000, f); + fclose(f); + } + } else + dev->nvr_path = NULL; return dev; } @@ -197,6 +264,7 @@ static const device_config_t monster_fdc_config[] = { { .description = "" } } }, +#endif { .name = "rom_writes_enabled", .description = "Enable BIOS extension ROM Writes", @@ -204,7 +272,6 @@ static const device_config_t monster_fdc_config[] = { .default_string = "", .default_int = 0 }, -#endif { .name = "", .description = "", .type = CONFIG_END } // clang-format on }; diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h index beb690918..3c0e0aee0 100644 --- a/src/include/86box/mem.h +++ b/src/include/86box/mem.h @@ -391,6 +391,11 @@ extern void mem_mapping_set_handler(mem_mapping_t *, void (*write_w)(uint32_t addr, uint16_t val, void *priv), void (*write_l)(uint32_t addr, uint32_t val, void *priv)); +extern void mem_mapping_set_write_handler(mem_mapping_t *, + void (*write_b)(uint32_t addr, uint8_t val, void *priv), + void (*write_w)(uint32_t addr, uint16_t val, void *priv), + void (*write_l)(uint32_t addr, uint32_t val, void *priv)); + extern void mem_mapping_set_p(mem_mapping_t *, void *priv); extern void mem_mapping_set_addr(mem_mapping_t *, diff --git a/src/mem/mem.c b/src/mem/mem.c index 8f2e0d935..ae6e4ae00 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -2556,6 +2556,19 @@ mem_mapping_set_handler(mem_mapping_t *map, mem_mapping_recalc(map->base, map->size); } +void +mem_mapping_set_write_handler(mem_mapping_t *map, + void (*write_b)(uint32_t addr, uint8_t val, void *priv), + void (*write_w)(uint32_t addr, uint16_t val, void *priv), + void (*write_l)(uint32_t addr, uint32_t val, void *priv)) +{ + map->write_b = write_b; + map->write_w = write_w; + map->write_l = write_l; + + mem_mapping_recalc(map->base, map->size); +} + void mem_mapping_set_addr(mem_mapping_t *map, uint32_t base, uint32_t size) { diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index 2927d797c..c811c2c87 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -1043,7 +1043,8 @@ aha_init(const device_t *info) case AHA_154xC: strcpy(dev->name, "AHA-154xC"); dev->bios_path = "roms/scsi/adaptec/aha1542c102.bin"; - dev->nvr_path = "aha1542c.nvr"; + dev->nvr_path = "aha1542c_0.nvr"; + dev->nvr_path[9] = device_get_instance() + 0x30; dev->fw_rev = "D001"; dev->rom_shram = 0x3F80; /* shadow RAM address base */ dev->rom_shramsz = 128; /* size of shadow RAM */ @@ -1059,7 +1060,8 @@ aha_init(const device_t *info) case AHA_154xCF: strcpy(dev->name, "AHA-154xCF"); dev->bios_path = "roms/scsi/adaptec/aha1542cf211.bin"; - dev->nvr_path = "aha1542cf.nvr"; + dev->nvr_path = "aha1542cf_0.nvr"; + dev->nvr_path[10] = device_get_instance() + 0x30; dev->fw_rev = "E001"; dev->rom_shram = 0x3F80; /* shadow RAM address base */ dev->rom_shramsz = 128; /* size of shadow RAM */ @@ -1080,7 +1082,8 @@ aha_init(const device_t *info) bios_rev = (char *) device_get_config_bios("bios_rev"); dev->bios_path = (char *) device_get_bios_file(info, bios_rev, 0); dev->mcode_path = (char *) device_get_bios_file(info, bios_rev, 1); - dev->nvr_path = "aha1542cp.nvr"; + dev->nvr_path = "aha1542cp_0.nvr"; + dev->nvr_path[10] = device_get_instance() + 0x30; dev->fw_rev = aha1542cp_rev; dev->rom_shram = 0x3F80; /* shadow RAM address base */ dev->rom_shramsz = 128; /* size of shadow RAM */ diff --git a/src/scsi/scsi_ncr53c8xx.c b/src/scsi/scsi_ncr53c8xx.c index f640c49a6..1fd9fcdba 100644 --- a/src/scsi/scsi_ncr53c8xx.c +++ b/src/scsi/scsi_ncr53c8xx.c @@ -2571,37 +2571,39 @@ ncr53c8xx_init(const device_t *info) switch (dev->chip) { case CHIP_810: - dev->nvr_path = "ncr53c810.nvr"; + dev->nvr_path = "ncr53c810_0.nvr"; dev->wide = 0; break; case CHIP_815: dev->chip_rev = 0x04; - dev->nvr_path = "ncr53c815.nvr"; + dev->nvr_path = "ncr53c815_0.nvr"; dev->wide = 0; break; case CHIP_820: - dev->nvr_path = "ncr53c820.nvr"; + dev->nvr_path = "ncr53c820_0.nvr"; dev->wide = 1; break; case CHIP_825: dev->chip_rev = 0x26; - dev->nvr_path = "ncr53c825a.nvr"; + dev->nvr_path = "ncr53c825_0.nvr"; dev->wide = 1; break; case CHIP_860: scsi_bus_set_speed(dev->bus, 20000000.0); dev->chip_rev = 0x04; - dev->nvr_path = "ncr53c860.nvr"; + dev->nvr_path = "ncr53c860_0.nvr"; dev->wide = 1; break; case CHIP_875: scsi_bus_set_speed(dev->bus, 40000000.0); dev->chip_rev = 0x04; - dev->nvr_path = "ncr53c875.nvr"; + dev->nvr_path = "ncr53c875_0.nvr"; dev->wide = 1; break; } + dev->nvr_path[10] = device_get_instance() + 0x30; + ncr53c8xx_pci_bar[0].addr_regs[0] = 1; ncr53c8xx_pci_bar[1].addr_regs[0] = 0; ncr53c8xx_pci_regs[0x04] = 3; diff --git a/src/scsi/scsi_pcscsi.c b/src/scsi/scsi_pcscsi.c index 674bbdabf..48b2d52fa 100644 --- a/src/scsi/scsi_pcscsi.c +++ b/src/scsi/scsi_pcscsi.c @@ -1856,7 +1856,8 @@ dc390_init(UNUSED(const device_t *info)) if (dev->has_bios) esp_bios_disable(dev); - dev->nvr_path = "dc390.nvr"; + dev->nvr_path = "dc390_0.nvr"; + dev->nvr_path[6] = device_get_instance() + 0x30; /* Load the serial EEPROM. */ dc390_load_eeprom(dev); From e503deb0975423ad6220942d895db702692d2bdf Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 04:16:46 +0200 Subject: [PATCH 154/624] CD-ROM mute and unmute icons. --- src/qt/icons/cdrom_mute.ico | Bin 0 -> 9622 bytes src/qt/icons/cdrom_unmute.ico | Bin 0 -> 9622 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/qt/icons/cdrom_mute.ico create mode 100644 src/qt/icons/cdrom_unmute.ico diff --git a/src/qt/icons/cdrom_mute.ico b/src/qt/icons/cdrom_mute.ico new file mode 100644 index 0000000000000000000000000000000000000000..237c8b0650b870d8744f79621293b59a27fcf38a GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pka$Rvnf2B;k%JunQCgR>!)TCMFg78*NM?exVZ|`BU^L8KFh06Fuo?mtgz16NNcMx{9;%EG1yc*A zVP?T-LYkrSD0*RjfXWd|p_{?*_3{7zuNwdVzsmFf|Eekf|A$Ka|G%p7|Nl_u|NmF5 z|NsAL`2YW_Rzc`rtN#E0ANv3Qe-M53|NsB5|NjS-Ga?L-@`e#y+AuIoU?bK!V0BCd%nF&$?jU$lxh_VoiSzt$i zG=LZod59Z9B{(Vui6hK{*@y5O#4eCIAPg}JTX_pI2ZTYYAQ;^&7$4PLAlHEW3NsU| z7aaaz7L}&l0|F72n{|};nLFz3D1_lNLr1o(FCm|PNl?VGDDPCZFm|_qg9mC|X(y(xV z#W{?ISdL5<)M#J0-G7Sxb(mDeoj6i0A?1NztAA})p2kC{GiB2QA8>9@55q5*j z1et}7LE;eQFtzAr!^9z~P)M-*Vd^3N0GWr3QPe}*G>9|_i9@g&uvuUh5&^RtoyO*0 zm>QUSU}nSkNP56_!PMiTk(>c%!qlRh4dcV)VKlDv1(SyxjKqMM1#>ry4>JoUj!whO zM5mFAhBIM$VP?Z0fi=w_qa0n-ap z2jj!+K(ZUzcoa5F4=%G|X2I0K_%O3!;wXlqabRk2(J-@MG`byV#*xH@*@eu@Jp`r2rSFKwA|7vJBxczlCH1z+gRjdF1 z4GsPOZ`JDm|Nn;m|Nn3G|NsBv|NsBLA3S~l8l!YTYKJv|1}?EVhBz^pU(jh>xcR9%nT6wKaTnZDhE@Fn}*qmPQ%;)6Gw9klD+74Cx{QL z>kxG`HW$FmMyFwR!|X(*k=tY-m6#aRI)Y%3JFvR}-A;5qs+|lBFg_@}K{i6nhxrxN zcL;gx_M_W{&WGs7)*e9iJ1QI11t8af+y=s^Za`0K=ys#?Vg81QW7-LEE8HHqGtk6A z=@DK(5pn}e9!5j#1{sZNKTI6WE|5a#_&?lTVEaK5Ff(B^%nTSGJ+HyUA?i@=2bl*` zkM0IEKG=SkS?DyxY_Mrybzl|}0aK5f_8O4KzQFpB?L=mS+z2xR7Y$N_WF-a@rVoc3 z!1jYQA?(Erdze4bX@uDz6R={i`4D}`aR9Rel*W-UNF0PgVvzg~vjbuVB5%R?#QGni z9^wX6zk=+8V30TngTe~gHxRv;cEj9;tQL(8_CHJ=ga-Ky;SP{}FbuI5B#$r!q6gD% zn44ho2pw=1*lv*7AQ6~47>%$CWFHKJRAOS79@H`g;U<_oQe1%ThKZxQ6(){p6K)Y) zcEiMBX2NKgo#-@79_CggK2FPFYS7Js*$ty%VU4a1oewjQ5;wr?gwe#>4RZ_34KNy~ z=aD2}YGHPw(?q%fKDGce59TH$t8g-5ddRdJUYEhb9%eVpTyz?nLttuPZh-k4M#Id6 z(J;Hv^}+Z^>abadRSc#VMpJ4x%p7#LVznGi5T+NMhAD&j4;Ef9J76?S9;P2A4%1Hw z4KovF2h0sHK8%K`L#HXR8>Sa#2h46H|AEU%m^{pGBzc$-6w@%X(cOSZDzNUCVdgxLwBX=@u!(+S4&|EquG z|E=1<{x{Tt`PZrj#;>7{4_~cn_;59prC`;nCWEV?tOBd{H8q6RI~-i~uYobN-hp}5 zzXj}}wITAWR;~VjH8iw-)v8tdLG-Iti}rsF4GsOZYSsR~p`oGwSAzy7LPP)m2hmqU b|Nnor`~Uy1q5uE?+W-Im-}?Xm|NRF5+>pni literal 0 HcmV?d00001 diff --git a/src/qt/icons/cdrom_unmute.ico b/src/qt/icons/cdrom_unmute.ico new file mode 100644 index 0000000000000000000000000000000000000000..8e4cc70ed71a2ba2b41e0b121360890bb6ff06af GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk6A)emw97=!d6V+Mx* zRXZVR;Xebze`Jhe2Gq?UYhm_-;ti%3WcPss2Qcl28^XW$htAu$aaJDfb0j+P>i7-T>z#Z>?b6@gY*+)Kgc|o86Z6%KY%cZ4aFcO z1Tnf9FbyC6|Nno${{R05c?f3U|NkEuH!%PI-@x$y{{iOz|382tg%KLDpe%d%|9?<9 zBfhzi{ejFTs1Zd0D4szW6v$8vDLX(UD7it>9*Q1Z9B3K@ zc@>61MuJR&;Q!$A1eDI9?#5*jI4wf-f=Ec&24R8NAk&b{f(9#IGeLetav#VnkQ*U1 z!aR@|97FOgrW>JVfz_d#36%r;5#}yr8k?CQJs>qmG}v7rK14lcc?ePu!Vq~>H-hwm zFi0MmMpX+j6C@A9Ftw;^Am+m4L25t_gO!u0Y7ypv)WP(iszEUi6hn#Ze1_lG9_HhCy+&W?zAb(=R#OlYc4wlA{@)Rg7 zfG{|hz{(fwx^atQF&C6yLFU3R*nAKNR6deo52*Y?axchSWDGJAVm63G)O(;j3XOBz z?gq(#+zv7Xiycs5Sm_2SLqPc+iV2zzG8@VLAoGyj4q_vVf!qwkAUQCGgcZo8m>6U} z$lciN0LdX?n7JStY%WM22;(vzq!%QQM8n+*5`*YNq*0I?KyeGwgN`9;QQZ$R1B5|p zk!cVcn|hEKNDibP9fRahO$WD;!2X2kL8h^(2Z_PdkYYZ%T96qav(ViG5(CMhs|WEx za_H)@s0GIzNF1AbkQhh~WF9&VlEY&@$XpNxhZjsgL=S5G!sK8yw9dns51?rR#cXJ9 z0=HX0?u21b;(}tZ9MpbLc@4to&Ij|M=EL0$s@0)+6KWJl1dc&sV6|xN2$1<83^o&; z0J#t3U#Po5egR{UVPJ7kn;QwEnGLEFK^VXJpt1|vMgh4WYBq=hyBB5;G)&Oj7|8W4 zjE&+AkRPC7h3s||^P%nrxf9)dko%!=3`!3uMx$_G_J9nAVwn3ubug%{05c0@56Daq zALM2b8-zh@5JoWQ7#P59CXgK<3=&5-ic~(xe2_mtW`XR!1XNZ+F^CUJ&uFHR#>HVb z*ldu+xcm+lht>g*GMY4dL8_s4gRFtshfIUSK^Wcd$ZFthQr!Tu8&p3){QK~{W z$ZVK6xDLV9)`O`h#SI|)LHh8y0i*^QgVf{0q}mTM8)P238$jY93^5Ou*T7>i;Q9xo z2OEZ{2gNLY3^E&pL1rM)u&@T(f!!>K8$kMSVeI-)-GgK&D2~DQfy@JmgD`$G@Vf!O zUWhwDc7W`|hCy=p%^0@!gYpjo!D4l{Z z*sU=2FdDl)h`q=p$PSPp$YnXm3=js%fiT1@jQj`E21>VJ8l(=U2cjO?7Tj!5p2uc4 zQkx&_Kalw_46+A`!FGcP5FaEDq9OK!#{_X(43&Y}5Ap{BLrZ$7yP(Fy`!Wc1ka8L% z4-x~@AU7b{PgMI3qzB|~FoxI-B0*^Zj6nv2_W#NC15dVUjkGggX{)js88`z zU^jqlg+ z9aS-ncpx{x!eAimhk6SX#~=*lVp9JbK|=@j|9>#Z|Nj7<*8zZ>-@w3Ne}I9({s9An{09aGh93+J;(tJ%Zv+iYfM<`mA*&r8NJ3US{ILK3 L|BwCu|NrU%Ch?S1 literal 0 HcmV?d00001 From 2a5d62398624f9ad4ac94acd8b4018df191a2350 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 04:33:52 +0200 Subject: [PATCH 155/624] CD-ROM folder icon. --- src/qt/icons/cdrom_folder.ico | Bin 0 -> 9622 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/qt/icons/cdrom_folder.ico diff --git a/src/qt/icons/cdrom_folder.ico b/src/qt/icons/cdrom_folder.ico new file mode 100644 index 0000000000000000000000000000000000000000..be8386b87e518ee3c3cc3b0d95a14082dc362399 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5PkBzQFbuL6#D>x!|Do95(C{Aw z823Y$$`Wnx)3DD-!Q%Z8UBOK0hs|3 z2k8N^VKg@VAd|pq82*DGNI%Fc;P3!32o|Nn!^84(6ZdBX@UZ5S9Pu)&QV>I_i0lY=q+jU!)y@*+NrGu=S*Io5Ix zR8~OC8n8Twjjh~(xe}C4VCI4J!Z1i5h>eZLWgavQgYqq?`~jE2AT!W07BfNNfZ|`6 zS)hD?&3!O4v6uz27n^yYd;v=H1l@C#Fz&& z7eu4S2gp1S2AKt-q2__&gcyv|eIWBdm_T|4g)df&oaR6g0V*$H<@d~)|6%n8$c-R3 zfH2q`P&o*)7vvWZ8)goS2Bj5bvp{M=7`YySu^AwxGAJ#8SSV=@W*&$J*#$BKjzKj9 zq>ceO9jq6`fXaiIIL*Rg9^N_wWG*(pg3N+pxEoR326hWbKQbm{7P6U0;R!Megkk=L z`Vmwv!gLTvgWQS@6QLVqKM4O|kpKSyiXSk@|3APW|Gxo>85rdMBe4B{P&9)utS&pi z{Qv(0_W%EX$V2Ka2?hoR1EltG0w)m;8C60!1dNUUGf;|g*+QV)0hQ6jV6gkJ*)enG z{~teoVD=xNWh|&X0@tY^J`BU^9}pi_4ukxUZaygO!_0@O1)GP=Ml%a64-*5?xXcIT zS5RI@HXqqs5Sti`$9!=9M>ikcOpqHvV%TV?7$|;F!XFeaxZDpi3xuJ1!QlboBJVHXxdi`;pB>wiCn#;s4P7BP@PFX2Q${(S*#0nt|dEWHEI2gUknEkl7%bkom~& zM`uIr0fj#Y2M4752AK&n8$?6R2ju~BF|>Ywq<)zBAhSW3$ovbg^I`QhIt?)yLZX`w zwd2EYX#XEQ450F0|HJgcXl(T(Ob%4}Ah$1|;e-;8_{;{GgUx)9FFLC~#MuWsa7{-UuATba| zZwuhE8zc_1AEXb4VdlYTkT^OU#z&?>Y$yhW6 zkQ)fu4>b?Hy@Z#K%m3(h6JtNf&*&K0O)xeZjp2W&-Jp6ArAbGkAJBDL4F6dX<+^b z)1=xDvjZ0mbsxz8pf)$iJ}`#*AKeY0{tCJMC4BmzZA=DicEj8NmLswL1G$$d460i| z7!>v(zhlE7IZzvW=FI>2`dzTR4zd>#J!yr3g>d|SC9Lx*?=>WrSkXbOj zWY`btM}fm1*$gcGHjup_4E8t3y&!vGG_qb?Zh)x;>4Rdh-B31$8xZDz=VU>71cbrr zKzd;2foNjv2bl*_3o-=M_kxYtgUkY9kQ@j@%mVd^AQ&WuUS5F2V0s|xL8cSNAak(U zjnwA^`wwJ341?@}Vvy58c?L{_ Date: Mon, 22 Jul 2024 04:35:37 +0200 Subject: [PATCH 156/624] CD-ROM host drive icon. --- src/qt/icons/cdrom_host.ico | Bin 0 -> 9622 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/qt/icons/cdrom_host.ico diff --git a/src/qt/icons/cdrom_host.ico b/src/qt/icons/cdrom_host.ico new file mode 100644 index 0000000000000000000000000000000000000000..5065f347a5a8099644ed619ed19da23e3beae68c GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk;Ddq{~!$Y6Q+KsUXWUl`@#C4Vjz7W z43-1A4H7O8GoWffdSLQkwIFebI(T@%OtZlF%TO@gY<*=APg0Q`xg{fQ2k&rkUWS1qCx6GdOXrVD&IFKynZavK{PqxL&Ax!Dc}9!q{*c zq6?J-*+r~>QFTIiQ2iixfHBOiP#WxhWH&=}p^_jopl$}Mhw6of6DYl-s>j8HnuFKB zNP7SC|NsAo`TzePj1c^R;s5^w4FCT(KrsX3|Nmgj{Qo}#|Ns9D@(_H${{R0E|Ns97 zl`|p?kn)BRT-q=&OkhK@fHWq^pV%;Iroh4g6p&C1N{0E>A%54vj0^W+IsdF#|+GFvuj39UyZ+7{mr+eCY=2Pml>9wWu`6M2Oo!a&U~z zJg7O~Gz0P@x;vrrDDDEOgJEPdVR}J&K=Md5*nJ>AL_KDC2vQHi5P3-62Jt}{qz{B) zY#7bJ01kh!|3LacYG4>i4LDMu;&69>+u140aDp4x}E0p<#n!KS&=`4y*^nhw1~F1Hxc&kQf*u-481II1MKCoI)y#Z4X zHxpzU!fjx;z|_EKnA@Q4!!Qf14iR23d5~Ek46+}LA?AR}1&~Py40j96AE<5u=NFI~ zbc`?ol?74anVq7F~SX(dL;4xjsO4uW2pcChr#~;4+eQKe!#&0{{RF3{{|># zVBr4`!SeqZ7(m$mKLbPk{|3hYV0?i2|NjT<|NsAxhtyjV3=9kgNbTbUP9zJ-V}im2 z8z#>*m@Zhjfx;e&LGb~?;8>?LKA>j8;umBt41>)FaX@*L6njAF2hCiV`5+o(B*bhG z38|-Gc>!F0!TgSk289X85G-~;g<&l^aQy%?8$=T{A7nO?`$6V`+>DHo#Xx4lFkB5J ztWaGKH5Z)zLGH$82eKNFJS-1_!XKmuhSALjsRhY_^rO*mw}Rv#`VeUpqz~O}kbV$` zsD=0eq!%OxqCptOhS4A~kb011$ZiISf#g8y&@o63WI9M5eQ|sVCQbn3*v1 zL40Hk5{I@WP~s9~CrA!iEsTvU2U7#1VQQf61;;s5J;;2NbOO_ZPD9m$^@7X;$%8P6 z4K)|VERY;X4>HCVt{`41d2gsp<|E~SPa>Gs2wO~gWZO^-2yiUtPa+efVZtcc^hOZ0uu;t za9DxVfDDFWusdPqL)?pLF2V+QdkzvJm|+4o4-{tDFvNUh(=gc}eK_J0r0jV9<02;W&<0cBEKw*jvQ(z+}W2AK&Ggkp5R!`y~Klj;VL-JtRd$u1Q0(8Mw898C8@(W`OJgnS)G&*wD5uj`&3A2kAw}*z5+3YR!^bOAT=O&g3JKvg{lXc4b}q^17WB<$X*Zz$-^;74um0QVdOuUIba&34rU%i zJ;-)QdPkB2s|67-wIFwa+HIgP2Z_Nkw6q0@gY+X~xEhE-Aoqe;aR0;Xhv@;S2eF|v zSS^$d(u3h|9Bo#RJ=ieJJTMKi2ibm@J?Jzxbs#lRyFtDOxeJUz27~3Wl=Ve1{6Sq#N^?MJs8 zZXRZsf&2!FcdX?qQhEfbgIW!yaN3W}ZXEW5%!HeR9tR*jAPf?RVz9+f0T2yc%s-1P3Pe7KsOuYKPU#f z0YrfKAax)b;$BR)>|>UA)M;(v&pusjLVNqrjX4vc(G1)KhZCV*g*KOY$Q z|36@0|9=2HxWM?ofdP#FFxW8sV31?@z`)1wfPszS00R?40|NsHGd6&hL4mLX12aPc k13N Date: Mon, 22 Jul 2024 04:42:45 +0200 Subject: [PATCH 157/624] CD-ROM image icon. --- src/qt/icons/cdrom_image.ico | Bin 0 -> 9622 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/qt/icons/cdrom_image.ico diff --git a/src/qt/icons/cdrom_image.ico b/src/qt/icons/cdrom_image.ico new file mode 100644 index 0000000000000000000000000000000000000000..84fc233e20e4b686d45a949d5767d76358d7df77 GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk3}%DmA$b8qD_8&| z549UzKimv_`ay<(%mDcXWFgou(6j*22MTkLD#93Q4me&wYyvv|F#i9Kj6X2`|9^n- z|NjOkW?=mPpMm-Re+Ksd{~7rI|8J0o-~;ym|9|-Z|39dl5n+IoH;mxYhJj%M8v#pE zr9plp6{DJf!~?}QD4h_CL1_(1I|dVE9yCe_QXo6&Y#!EphRdNi-3Ll1ApHM7<>o=t zFeu%FFh${qWERLz)G!Z}FJNYYXtLc03NH`_~?2l)@=erVXC7=yxrn+b9q1K9r{y&w$M zk8CcaE;&pDLg@DfiT=Wh&iD6#Ht;qAkH6SGZFv$N$#y=S3|36@m z|9^l%{(l1$Gcd^iN5%I485rvSH!wizvjfck|36^=|Nn`2h40xR;DO?u$c|>52T!Dz-2y299kBD^C21=Ny{gGi7$Ff*Yvs6Hhod_d-b%*Saqn)x7eK^X2AkllFV7i2z~ z*`RO&nTm=*X$GV10;$hI{s5T+awj?liGwgwxTBg2<3Y`byBn>q3Ni!TY!DwL4mKMU zuF$xG8HquI!UCiY+>3^`LqL9lw&_4-VZ$JMz;<95h$a9w9}*^@H~?diW++DZ4bpxB z@j+4`nke%@)`9GRh7~d9L(Rn=ry%oiVVFH22SPE}o#62M4>AviahX7zIMg0c8bZOu z=?1I%-@yDI8UJHo{{Mr4`Tqk3=KlwvxPgKBKL|50F#l(0fMNFk3=RDM85sEC?Xv?6 z_Wwcn0Ym-&AB_M1|6_-=!$4z{4oK~=2GGDI*mjBuSU6HblkEsldI#lyaxpZ0QDi?f zd67(k+&pSOc>H@b{K*UfQ2Hl1;XyT!nf_4nIbG~WE@Po?hfy@QA7nSI&OoB+Vm|@9 zL2jU#|8dw2t3yF{gIWqSu^(zT#12GT1KDnf9QHX7kQ^}>Yx)P-4Qii2;~HcR%wA*~ zCQfz#gX{;{jn54rHBd|w`$1-7a|1{mgdy!za5+F#`$1-dFw|~vcq4@axP1k&8(vxx zYd=UGw5|oa8;uPy4~yL}H(;|HqzPm$C@m1e$m&4p4#bDL0b~pW!|Vt7A030_(EJY4 z1Tu$^-5`0GI-GVx3Sz!UN8+R?IC?m za9n`g0mEQ;{owyFp;{mn5Dd4QNc$H#a+6|&`+D|RJVQvA10~CYog<%x?A$EfEBupDk zXsA0d@*ou~0}ncY1|D$X1_tIo3=GUa7#Ns8FfcGbU|?WAz`(%VfP@(=7?>F<7}yyq z82A|~7~~l$80;A=80s59V|WaV{~H(>!DAW^7})=RVBr4`nq&IIVE_Mr Date: Mon, 22 Jul 2024 05:05:45 +0200 Subject: [PATCH 158/624] Attempt to make QT actually use them. --- src/qt/qt_mediamenu.cpp | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index 5f1289740..c80d9d17f 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -144,10 +144,10 @@ MediaMenu::refresh(QMenu *parentMenu) MachineStatus::iterateCDROM([this, parentMenu](int i) { auto *menu = parentMenu->addMenu(""); cdromMutePos = menu->children().count(); - menu->addAction(QApplication::style()->standardIcon(QStyle::SP_MediaVolumeMuted), tr("&Mute"), [this, i]() { cdromMute(i); })->setCheckable(true); + menu->addAction(ProgSettings::loadIcon("/cdrom_mute.ico"), tr("&Mute"), [this, i]() { cdromMute(i); })->setCheckable(true); menu->addSeparator(); - menu->addAction(ProgSettings::loadIcon("/cdrom.ico"), tr("&Image..."), [this, i]() { cdromMount(i, 0, nullptr); })->setCheckable(false); - menu->addAction(QApplication::style()->standardIcon(QStyle::SP_DirIcon), tr("&Folder..."), [this, i]() { cdromMount(i, 1, nullptr); })->setCheckable(false); + menu->addAction(ProgSettings::loadIcon("/cdrom_image.ico"), tr("&Image..."), [this, i]() { cdromMount(i, 0, nullptr); })->setCheckable(false); + menu->addAction(ProgSettings::loadIcon("/cdrom_folder.ico"), tr("&Folder..."), [this, i]() { cdromMount(i, 1, nullptr); })->setCheckable(false); menu->addSeparator(); for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { cdromImageHistoryPos[slot] = menu->children().count(); @@ -160,7 +160,7 @@ MediaMenu::refresh(QMenu *parentMenu) for (const auto &letter : driveLetters) { auto drive = QString("%1:\\").arg(letter); if (GetDriveType(drive.toUtf8().constData()) == DRIVE_CDROM) - menu->addAction(QApplication::style()->standardIcon(QStyle::SP_DriveCDIcon), tr("Host CD/DVD Drive (%1:)").arg(letter), [this, i, letter] { cdromMount(i, 2, QString(R"(\\.\%1:)").arg(letter)); })->setCheckable(false); + menu->addAction(ProgSettings::loadIcon("/cdrom_host.ico"), tr("Host CD/DVD Drive (%1:)").arg(letter), [this, i, letter] { cdromMount(i, 2, QString(R"(\\.\%1:)").arg(letter)); })->setCheckable(false); } menu->addSeparator(); #endif // Q_OS_WINDOWS @@ -587,7 +587,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) children = menu->children(); imageHistoryUpdatePos = dynamic_cast(children[cdromImageHistoryPos[slot]]); if (fn.left(8) == "ioctl://") { - menu_icon = QApplication::style()->standardIcon(QStyle::SP_DriveCDIcon); + menu_icon = ProgSettings::loadIcon("/cdrom_host.ico"); #ifdef Q_OS_WINDOWS menu_item_name = tr("Host CD/DVD Drive (%1)").arg(fn.right(2)).toUtf8().constData(); #else @@ -595,7 +595,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) #endif } else { fi.setFile(fn); - menu_icon = fi.isDir() ? QApplication::style()->standardIcon(QStyle::SP_DirIcon) : ProgSettings::loadIcon("/cdrom.ico"); + menu_icon = fi.isDir() ? ProgSettings::loadIcon("/cdrom_folder.ico") : ProgSettings::loadIcon("/cdrom_image.ico"); menu_item_name = fn.isEmpty() ? tr("previous image").toUtf8().constData() : fn.toUtf8().constData(); } imageHistoryUpdatePos->setIcon(menu_icon); @@ -642,7 +642,7 @@ MediaMenu::cdromUpdateMenu(int i) auto childs = menu->children(); auto *muteMenu = dynamic_cast(childs[cdromMutePos]); - muteMenu->setIcon(QApplication::style()->standardIcon((cdrom[i].sound_on == 0) ? QStyle::SP_MediaVolume : QStyle::SP_MediaVolumeMuted)); + muteMenu->setIcon(ProgSettings::loadIcon((cdrom[i].sound_on == 0) ? "/cdrom_unmute.ico" : "/cdrom_mute.ico")); muteMenu->setText((cdrom[i].sound_on == 0) ? tr("&Unmute") : tr("&Mute")); auto *imageMenu = dynamic_cast(childs[cdromImagePos]); @@ -655,13 +655,13 @@ MediaMenu::cdromUpdateMenu(int i) menu_item_name = tr("Host CD/DVD Drive (%1)").arg(name.right(name.length() - 8)); #endif name2 = menu_item_name; - menu_icon = QApplication::style()->standardIcon(QStyle::SP_DriveCDIcon); + menu_icon = ProgSettings::loadIcon("/cdrom_host.ico"); } else { QFileInfo fi(cdrom[i].image_path); menu_item_name = name.isEmpty() ? QString().toUtf8().constData() : name.toUtf8().constData(); name2 = name; - menu_icon = fi.isDir() ? QApplication::style()->standardIcon(QStyle::SP_DirIcon) : ProgSettings::loadIcon("/cdrom.ico"); + menu_icon = fi.isDir() ? ProgSettings::loadIcon("/cdrom_folder.ico") : ProgSettings::loadIcon("/cdrom_image.ico"); } imageMenu->setIcon(menu_icon); imageMenu->setText(QString::asprintf(tr("Eject %s").toUtf8().constData(), menu_item_name.toUtf8().constData())); From af357b5ee5206c8e723b45be6417508477a0bfc8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 05:09:36 +0200 Subject: [PATCH 159/624] Updated qt_resources.qrc, now they actually work. --- src/qt_resources.qrc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qt_resources.qrc b/src/qt_resources.qrc index 265fb6376..2c4e9775a 100644 --- a/src/qt_resources.qrc +++ b/src/qt_resources.qrc @@ -11,6 +11,11 @@ qt/icons/cdrom_disabled.ico qt/icons/cdrom_empty.ico qt/icons/cdrom_empty_active.ico + qt/icons/cdrom_mute.ico + qt/icons/cdrom_unmute.ico + qt/icons/cdrom_image.ico + qt/icons/cdrom_folder.ico + qt/icons/cdrom_host.ico qt/icons/display.ico qt/icons/floppy_35.ico qt/icons/floppy_35_active.ico From 62c3fdb2ce8f50f0f49bafe6f8d2c8b18f96015e Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 16:13:46 +0200 Subject: [PATCH 160/624] Correct the maximum RAM amount of the Genoa Unknown 486 to 16 MB. --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 38abd77b8..c26c9b580 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5697,7 +5697,7 @@ const machine_t machines[] = { .flags = MACHINE_APM, .ram = { .min = 1024, - .max = 65536, + .max = 16384, .step = 1024 }, .nvrmask = 127, From 46db537b74c04b27bd4c17ae28228a50c97ca350 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 16:42:40 +0200 Subject: [PATCH 161/624] Compaq Genoa device now also adds Compaq 386 device, for some reason, that's necessary for shadow RAM to work. --- src/chipset/compaq_386.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/chipset/compaq_386.c b/src/chipset/compaq_386.c index 4eb21de72..6a015937e 100644 --- a/src/chipset/compaq_386.c +++ b/src/chipset/compaq_386.c @@ -37,6 +37,7 @@ #include <86box/vid_cga.h> #include <86box/vid_cga_comp.h> #include <86box/plat_unused.h> +#include <86box/chipset.h> #define RAM_DIAG_L_BASE_MEM_640KB 0x00 #define RAM_DIAG_L_BASE_MEM_INV 0x10 @@ -749,18 +750,22 @@ compaq_386_init(UNUSED(const device_t *info)) static void compaq_genoa_outw(uint16_t port, uint16_t val, void *priv) { - if (port == 0x0c02) { + if (port == 0x0c02) { if (val) - mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); + mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); else mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); + + flushmmucache_nopc(); } } static void * compaq_genoa_init(UNUSED(const device_t *info)) { - io_sethandler(0x0c02, 3, NULL, NULL, NULL, NULL, compaq_genoa_outw, NULL, ram); + io_sethandler(0x0c02, 2, NULL, NULL, NULL, NULL, compaq_genoa_outw, NULL, NULL); + + device_add(&compaq_386_device); return ram; } From 95894198bf8691a095021819da1224e05e8a4911 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 18:26:10 +0200 Subject: [PATCH 162/624] Genoa Unknown 486: Reset BIOS memory state on soft reset, fixes hangs on soft reset after saving CMOS Setup. --- src/chipset/compaq_386.c | 12 +++++++++--- src/cpu/x86.c | 4 ++-- src/include/86box/device.h | 1 + 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/chipset/compaq_386.c b/src/chipset/compaq_386.c index 6a015937e..a0bd036f3 100644 --- a/src/chipset/compaq_386.c +++ b/src/chipset/compaq_386.c @@ -752,7 +752,7 @@ compaq_genoa_outw(uint16_t port, uint16_t val, void *priv) { if (port == 0x0c02) { if (val) - mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_INTERNAL); + mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); else mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); @@ -760,6 +760,12 @@ compaq_genoa_outw(uint16_t port, uint16_t val, void *priv) } } +static void +compaq_genoa_reset(void *priv) +{ + mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); +} + static void * compaq_genoa_init(UNUSED(const device_t *info)) { @@ -787,11 +793,11 @@ const device_t compaq_386_device = { const device_t compaq_genoa_device = { .name = "Compaq Genoa Memory Control", .internal_name = "compaq_genoa", - .flags = 0, + .flags = DEVICE_SOFTRESET, .local = 0, .init = compaq_genoa_init, .close = NULL, - .reset = NULL, + .reset = compaq_genoa_reset, { .available = NULL }, .speed_changed = NULL, .force_redraw = NULL, diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 32b274f06..5435f366d 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -240,7 +240,6 @@ reset_common(int hard) if (!hard && reset_on_hlt) { hlt_reset_pending++; - pclog("hlt_reset_pending = %i\n", hlt_reset_pending); if (hlt_reset_pending == 2) hlt_reset_pending = 0; else @@ -352,7 +351,8 @@ reset_common(int hard) /* If we have an AT or PS/2 keyboard controller, make sure the A20 state is correct. */ device_reset_all(DEVICE_KBC); - } + } else + device_reset_all(DEVICE_SOFTRESET); if (!is286) reset_808x(hard); diff --git a/src/include/86box/device.h b/src/include/86box/device.h index 1a2a6fd8b..67a30b1c8 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -101,6 +101,7 @@ enum { DEVICE_COM = 0x100000, /* requires a serial port */ DEVICE_LPT = 0x200000, /* requires a parallel port */ DEVICE_KBC = 0x400000, /* is a keyboard controller */ + DEVICE_SOFTRESET = 0x800000, /* requires to be reset on soft reset */ DEVICE_ONBOARD = 0x40000000, /* is on-board */ DEVICE_PIT = 0x80000000, /* device is a PIT */ From 8225f270f3a21f479d78e28383fc4755c4c34e79 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 19:24:15 +0200 Subject: [PATCH 163/624] Fix the generation of instantiated NVR paths, fixes #4642. --- src/floppy/fdc_monster.c | 25 +++++++++++++------------ src/include/86box/scsi_x54x.h | 3 ++- src/scsi/scsi_aha154x.c | 11 ++++------- src/scsi/scsi_ncr53c8xx.c | 16 +++++++--------- src/scsi/scsi_pcscsi.c | 5 ++--- 5 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index 2feafdf07..d2dedb5c0 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -26,6 +26,8 @@ #include <86box/device.h> #include <86box/io.h> #include <86box/mem.h> +#include <86box/timer.h> +#include <86box/nvr.h> #include <86box/rom.h> #include <86box/machine.h> #include <86box/timer.h> @@ -41,7 +43,7 @@ typedef struct monster_fdc_t { rom_t bios_rom; fdc_t *fdc_pri; fdc_t *fdc_sec; - char *nvr_path; + char nvr_path[64]; } monster_fdc_t; static void @@ -100,10 +102,12 @@ monster_fdc_close(void *priv) { monster_fdc_t *dev = (monster_fdc_t *) priv; - FILE *f = fopen(dev->nvr_path, "wb"); - if (f != NULL) { - fwrite(dev->bios_rom.rom, 1, 0x2000, f); - fclose(f); + if (dev->nvr_path[0] != 0x00) { + FILE *f = nvr_fopen(dev->nvr_path, "wb"); + if (f != NULL) { + fwrite(dev->bios_rom.rom, 1, 0x2000, f); + fclose(f); + } } free(dev); @@ -114,8 +118,7 @@ monster_fdc_init(UNUSED(const device_t *info)) { monster_fdc_t *dev; - dev = (monster_fdc_t *) malloc(sizeof(monster_fdc_t)); - memset(dev, 0, sizeof(monster_fdc_t)); + dev = (monster_fdc_t *) calloc(1, sizeof(monster_fdc_t)); #if 0 uint8_t sec_irq = device_get_config_int("sec_irq"); @@ -140,15 +143,13 @@ monster_fdc_init(UNUSED(const device_t *info)) uint8_t rom_writes_enabled = device_get_config_int("rom_writes_enabled"); if (rom_writes_enabled) { mem_mapping_set_write_handler(&dev->bios_rom.mapping, rom_write, rom_writew, rom_writel); - dev->nvr_path = "monster_fdc_0.nvr"; - dev->nvr_path[12] = device_get_instance() + 0x30; - FILE *f = fopen(dev->nvr_path, "rb"); + sprintf(dev->nvr_path, "monster_fdc_%i.nvr", device_get_instance()); + FILE *f = nvr_fopen(dev->nvr_path, "rb"); if (f != NULL) { fread(dev->bios_rom.rom, 1, 0x2000, f); fclose(f); } - } else - dev->nvr_path = NULL; + } return dev; } diff --git a/src/include/86box/scsi_x54x.h b/src/include/86box/scsi_x54x.h index 0f1874302..8d5964de5 100644 --- a/src/include/86box/scsi_x54x.h +++ b/src/include/86box/scsi_x54x.h @@ -476,7 +476,8 @@ typedef struct x54x_t { /* 8 bytes */ char *bios_path; /* path to BIOS image file */ char *mcode_path; /* path to microcode image file, needed by the AHA-1542CP */ - char *nvr_path; /* path to NVR image file */ + + char nvr_path[64]; /* path to NVR image file */ /* 56 bytes */ /* Pointer to a structure of vendor-specific data that only the vendor-specific code can understand */ diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index c811c2c87..7d9f1ba24 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -921,7 +921,7 @@ aha_setnvr(x54x_t *dev) FILE *fp; /* Only if this device has an EEPROM. */ - if (dev->nvr_path == NULL) + if (dev->nvr_path[0] == 0x00) return; /* Allocate and initialize the EEPROM. */ @@ -1043,8 +1043,7 @@ aha_init(const device_t *info) case AHA_154xC: strcpy(dev->name, "AHA-154xC"); dev->bios_path = "roms/scsi/adaptec/aha1542c102.bin"; - dev->nvr_path = "aha1542c_0.nvr"; - dev->nvr_path[9] = device_get_instance() + 0x30; + sprintf(dev->nvr_path, "aha1542c_%i.nvr", device_get_instance()); dev->fw_rev = "D001"; dev->rom_shram = 0x3F80; /* shadow RAM address base */ dev->rom_shramsz = 128; /* size of shadow RAM */ @@ -1060,8 +1059,7 @@ aha_init(const device_t *info) case AHA_154xCF: strcpy(dev->name, "AHA-154xCF"); dev->bios_path = "roms/scsi/adaptec/aha1542cf211.bin"; - dev->nvr_path = "aha1542cf_0.nvr"; - dev->nvr_path[10] = device_get_instance() + 0x30; + sprintf(dev->nvr_path, "aha1542cf_%i.nvr", device_get_instance()); dev->fw_rev = "E001"; dev->rom_shram = 0x3F80; /* shadow RAM address base */ dev->rom_shramsz = 128; /* size of shadow RAM */ @@ -1082,8 +1080,7 @@ aha_init(const device_t *info) bios_rev = (char *) device_get_config_bios("bios_rev"); dev->bios_path = (char *) device_get_bios_file(info, bios_rev, 0); dev->mcode_path = (char *) device_get_bios_file(info, bios_rev, 1); - dev->nvr_path = "aha1542cp_0.nvr"; - dev->nvr_path[10] = device_get_instance() + 0x30; + sprintf(dev->nvr_path, "aha1542cp_%i.nvr", device_get_instance()); dev->fw_rev = aha1542cp_rev; dev->rom_shram = 0x3F80; /* shadow RAM address base */ dev->rom_shramsz = 128; /* size of shadow RAM */ diff --git a/src/scsi/scsi_ncr53c8xx.c b/src/scsi/scsi_ncr53c8xx.c index 1fd9fcdba..1395c2f6f 100644 --- a/src/scsi/scsi_ncr53c8xx.c +++ b/src/scsi/scsi_ncr53c8xx.c @@ -205,7 +205,7 @@ typedef enum { } scsi_state_t; typedef struct ncr53c8xx_t { - char *nvr_path; + char nvr_path[64]; uint8_t pci_slot; uint8_t chip, wide; int has_bios; @@ -2571,39 +2571,37 @@ ncr53c8xx_init(const device_t *info) switch (dev->chip) { case CHIP_810: - dev->nvr_path = "ncr53c810_0.nvr"; + sprintf(dev->nvr_path, "ncr53c810_%i.nvr", device_get_instance()); dev->wide = 0; break; case CHIP_815: dev->chip_rev = 0x04; - dev->nvr_path = "ncr53c815_0.nvr"; + sprintf(dev->nvr_path, "ncr53c815_%i.nvr", device_get_instance()); dev->wide = 0; break; case CHIP_820: - dev->nvr_path = "ncr53c820_0.nvr"; + sprintf(dev->nvr_path, "ncr53c820_%i.nvr", device_get_instance()); dev->wide = 1; break; case CHIP_825: dev->chip_rev = 0x26; - dev->nvr_path = "ncr53c825_0.nvr"; + sprintf(dev->nvr_path, "ncr53c825a_%i.nvr", device_get_instance()); dev->wide = 1; break; case CHIP_860: scsi_bus_set_speed(dev->bus, 20000000.0); dev->chip_rev = 0x04; - dev->nvr_path = "ncr53c860_0.nvr"; + sprintf(dev->nvr_path, "ncr53c860_%i.nvr", device_get_instance()); dev->wide = 1; break; case CHIP_875: scsi_bus_set_speed(dev->bus, 40000000.0); dev->chip_rev = 0x04; - dev->nvr_path = "ncr53c875_0.nvr"; + sprintf(dev->nvr_path, "ncr53c875_%i.nvr", device_get_instance()); dev->wide = 1; break; } - dev->nvr_path[10] = device_get_instance() + 0x30; - ncr53c8xx_pci_bar[0].addr_regs[0] = 1; ncr53c8xx_pci_bar[1].addr_regs[0] = 0; ncr53c8xx_pci_regs[0x04] = 3; diff --git a/src/scsi/scsi_pcscsi.c b/src/scsi/scsi_pcscsi.c index 48b2d52fa..a714ada96 100644 --- a/src/scsi/scsi_pcscsi.c +++ b/src/scsi/scsi_pcscsi.c @@ -152,7 +152,7 @@ typedef struct esp_t { mem_mapping_t mmio_mapping; mem_mapping_t ram_mapping; - char *nvr_path; + char nvr_path[64]; uint8_t pci_slot; int has_bios; int BIOSBase; @@ -1856,8 +1856,7 @@ dc390_init(UNUSED(const device_t *info)) if (dev->has_bios) esp_bios_disable(dev); - dev->nvr_path = "dc390_0.nvr"; - dev->nvr_path[6] = device_get_instance() + 0x30; + sprintf(dev->nvr_path, "dc390_%i.nvr", device_get_instance()); /* Load the serial EEPROM. */ dc390_load_eeprom(dev); From 74c4af579ad6861bd61b13e81e56768e33cbacd3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 22 Jul 2024 19:46:27 +0200 Subject: [PATCH 164/624] Genoa Unknown 486: Redirect 0C02h writes directly to Compaq 80C00000h writes, fixes the soft reset hang without having to reset the memory mapping on soft reset. --- src/chipset/compaq_386.c | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) diff --git a/src/chipset/compaq_386.c b/src/chipset/compaq_386.c index a0bd036f3..3b40734aa 100644 --- a/src/chipset/compaq_386.c +++ b/src/chipset/compaq_386.c @@ -750,28 +750,18 @@ compaq_386_init(UNUSED(const device_t *info)) static void compaq_genoa_outw(uint16_t port, uint16_t val, void *priv) { - if (port == 0x0c02) { - if (val) - mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); - else - mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); - - flushmmucache_nopc(); - } -} - -static void -compaq_genoa_reset(void *priv) -{ - mem_set_mem_state(0x000e0000, 0x00020000, MEM_READ_EXTANY | MEM_WRITE_EXTANY); + if (port == 0x0c02) + cpq_write_regs(0x80c00000, val, priv); } static void * compaq_genoa_init(UNUSED(const device_t *info)) { - io_sethandler(0x0c02, 2, NULL, NULL, NULL, NULL, compaq_genoa_outw, NULL, NULL); + void *cpq = device_add(&compaq_386_device); - device_add(&compaq_386_device); + pclog_toggle_suppr(); + + io_sethandler(0x0c02, 2, NULL, NULL, NULL, NULL, compaq_genoa_outw, NULL, cpq); return ram; } @@ -793,11 +783,11 @@ const device_t compaq_386_device = { const device_t compaq_genoa_device = { .name = "Compaq Genoa Memory Control", .internal_name = "compaq_genoa", - .flags = DEVICE_SOFTRESET, + .flags = 0, .local = 0, .init = compaq_genoa_init, .close = NULL, - .reset = compaq_genoa_reset, + .reset = NULL, { .available = NULL }, .speed_changed = NULL, .force_redraw = NULL, From b6e802e361d1f5571d4e21a399507b3b620ee7fd Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 23 Jul 2024 01:07:49 +0200 Subject: [PATCH 165/624] IMD: Fix loading HxC images with lots of empty tracks. --- src/floppy/fdd_imd.c | 47 +++++++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/floppy/fdd_imd.c b/src/floppy/fdd_imd.c index a5cd8f056..fd6c59d01 100644 --- a/src/floppy/fdd_imd.c +++ b/src/floppy/fdd_imd.c @@ -45,6 +45,7 @@ typedef struct imd_track_t { uint32_t gap3_len; uint16_t side_flags; uint8_t max_sector_size; + uint8_t spt; } imd_track_t; typedef struct imd_t { @@ -711,6 +712,9 @@ imd_load(int drive, char *fn) imd[drive] = dev; while (1) { + imd_log("In : %02X %02X %02X %02X %02X\n", + buffer2[0], buffer2[1], buffer2[2], buffer2[3], buffer2[4]); + track = buffer2[1]; side = buffer2[2]; if (side & 1) @@ -718,16 +722,20 @@ imd_load(int drive, char *fn) extra = side & 0xC0; side &= 0x3F; + track_spt = buffer2[3]; + dev->tracks[track][side].spt = track_spt; + sector_size = buffer2[4]; + dev->tracks[track][side].side_flags = (buffer2[0] % 3); - if (!dev->tracks[track][side].side_flags) + if ((track_spt != 0x00) && (!dev->tracks[track][side].side_flags)) dev->disk_flags |= 0x02; - dev->tracks[track][side].side_flags |= (!(buffer2[0] - dev->tracks[track][side].side_flags) ? 0 : 8); + dev->tracks[track][side].side_flags |= + (!(buffer2[0] - dev->tracks[track][side].side_flags) ? 0 : 8); mfm = dev->tracks[track][side].side_flags & 8; track_total = mfm ? 146 : 73; pre_sector = mfm ? 60 : 42; - track_spt = buffer2[3]; - sector_size = buffer2[4]; + imd_log("Out : %02X %02X %02X %02X %02X\n", buffer2[0], track, side, track_spt, sector_size); if ((track_spt == 15) && (sector_size == 2)) dev->tracks[track][side].side_flags |= 0x20; if ((track_spt == 16) && (sector_size == 2)) @@ -744,7 +752,7 @@ imd_load(int drive, char *fn) dev->tracks[track][side].max_sector_size = 5; if (!mfm) dev->tracks[track][side].max_sector_size--; - imd_log("Side flags for (%02i)(%01i): %02X\n", track, side, dev->tracks[track][side].side_flags); + imd_log("Side flags for (%02i)(%01i): %02X\n", track, side, dev->tracks[track] [side].side_flags); dev->tracks[track][side].is_present = 1; dev->tracks[track][side].file_offs = (buffer2 - buffer); memcpy(dev->tracks[track][side].params, buffer2, 5); @@ -762,7 +770,6 @@ imd_load(int drive, char *fn) } if (track_spt == 0x00) { - dev->tracks[track][side].n_map_offs = last_offset; buffer2 = buffer + last_offset; last_offset += track_spt; dev->tracks[track][side].is_present = 0; @@ -872,7 +879,7 @@ imd_load(int drive, char *fn) } dev->tracks[track][side].gap3_len = (size_diff - minimum_gap4) / track_spt; - } else if ((track_spt == 0x00) || (gap3_sizes[converted_rate][sector_size][track_spt] != 0x00)) + } else dev->tracks[track][side].gap3_len = gap3_sizes[converted_rate][sector_size][track_spt]; /* imd_log("GAP3 length for (%02i)(%01i): %i bytes\n", track, side, dev->tracks[track][side].gap3_len); */ @@ -886,6 +893,32 @@ imd_load(int drive, char *fn) /* If more than 43 tracks, then the tracks are thin (96 tpi). */ dev->track_count++; + imd_log("In : dev->track_count = %i\n", dev->track_count); + + int empty_tracks = 0; + for (int i = 0; i < dev->track_count; i++) { + if ((dev->sides == 2) && (dev->tracks[i][0].spt == 0x00) && (dev->tracks[i][1].spt == 0x00)) + empty_tracks++; + else if ((dev->sides == 1) && (dev->tracks[i][0].spt == 0x00)) + empty_tracks++; + } + imd_log("empty_tracks = %i\n", empty_tracks); + + if (empty_tracks >= (dev->track_count >> 1)) { + for (int i = 0; i < dev->track_count; i += 2) { + imd_log("Thick %02X = Thin %02X\n", i >> 1, i); + dev->tracks[i >> 1][0] = dev->tracks[i][0]; + dev->tracks[i >> 1][1] = dev->tracks[i][1]; + } + for (int i = (dev->track_count >> 1); i < dev->track_count; i++) { + imd_log("Emptying %02X....\n", i); + memset(&(dev->tracks[i][0]), 1, sizeof(imd_track_t)); + memset(&(dev->tracks[i][1]), 1, sizeof(imd_track_t)); + } + dev->track_count >>= 1; + } + imd_log("Out: dev->track_count = %i\n", dev->track_count); + dev->track_width = 0; if (dev->track_count > 43) dev->track_width = 1; From 59c743ed07205bf72e7a24daeb45aeb476db8689 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 23 Jul 2024 03:26:10 +0200 Subject: [PATCH 166/624] Implement ESS activity flags and improve the timed IRQ triggering via SB DSP commands F2 and F3, fixes ESSCFG 2.01C and the LBA 2 ES(1)688 driver. --- src/include/86box/snd_sb.h | 2 + src/include/86box/snd_sb_dsp.h | 2 + src/sound/snd_sb.c | 333 ++++++++++++++++++++++++++++++--- src/sound/snd_sb_dsp.c | 30 ++- 4 files changed, 335 insertions(+), 32 deletions(-) diff --git a/src/include/86box/snd_sb.h b/src/include/86box/snd_sb.h index b26c5f06e..70fcff387 100644 --- a/src/include/86box/snd_sb.h +++ b/src/include/86box/snd_sb.h @@ -187,6 +187,8 @@ typedef struct sb_t { uint8_t pnp_rom[512]; uint16_t opl_pnp_addr; + + uint16_t midi_addr; uint16_t gameport_addr; void *opl_mixer; diff --git a/src/include/86box/snd_sb_dsp.h b/src/include/86box/snd_sb_dsp.h index 9bc1d2308..0bc719d98 100644 --- a/src/include/86box/snd_sb_dsp.h +++ b/src/include/86box/snd_sb_dsp.h @@ -91,6 +91,8 @@ typedef struct sb_dsp_t { uint8_t sbref; int8_t sbstep; + uint8_t activity; + int sbdacpos; int sbleftright; diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 364c01557..882eaceea 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -1374,6 +1374,70 @@ sb_ct1745_mixer_reset(sb_t *sb) } } +static void +ess_base_write(uint16_t addr, uint8_t val, void *priv) +{ + sb_t * ess = (sb_t *) priv; + + switch (addr & 0x000f) { + case 0x0002: + case 0x0003: + case 0x0006: + case 0x000c: + ess->dsp.activity &= 0xdf; + break; + case 0x0008: + case 0x0009: + ess->dsp.activity &= 0x7f; + break; + } +} + +static uint8_t +ess_base_read(uint16_t addr, void *priv) +{ + sb_t * ess = (sb_t *) priv; + + switch (addr & 0x000f) { + case 0x0002: + case 0x0003: + case 0x0004: /* Undocumented but tested by the LBA 2 ES688 driver. */ + case 0x000a: + ess->dsp.activity &= 0xdf; + break; + case 0x0008: + case 0x0009: + ess->dsp.activity &= 0x7f; + break; + case 0x000c: + case 0x000e: + ess->dsp.activity &= 0xbf; + break; + } + + sb_log("ess_base_read(%04X): %04X, activity now: %02X\n", addr, addr & 0x000f, ess->dsp.activity); + + return 0xff; +} + +static void +ess_fm_midi_write(uint16_t addr, uint8_t val, void *priv) +{ + sb_t * ess = (sb_t *) priv; + + ess->dsp.activity &= 0x7f; +} + +static uint8_t +ess_fm_midi_read(uint16_t addr, void *priv) +{ + sb_t * ess = (sb_t *) priv; + + ess->dsp.activity &= 0x7f; + + return 0xff; +} + void ess_mixer_write(uint16_t addr, uint8_t val, void *priv) { @@ -1500,6 +1564,12 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv) { uint16_t mpu401_base_addr = 0x300 | ((mixer->regs[0x40] << 1) & 0x30); sb_log("mpu401_base_addr = %04X\n", mpu401_base_addr); + + io_removehandler(ess->midi_addr, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + gameport_remap(ess->gameport, !(mixer->regs[0x40] & 0x2) ? 0x00 : 0x200); if (ess->dsp.sb_subtype != SB_SUBTYPE_ESS_ES1688) { @@ -1519,7 +1589,8 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv) default: break; case 0: - mpu401_change_addr(ess->mpu, 0x00); + mpu401_base_addr = 0x0000; + mpu401_change_addr(ess->mpu, mpu401_base_addr); mpu401_setirq(ess->mpu, -1); break; case 1: @@ -1551,6 +1622,11 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv) mpu401_setirq(ess->mpu, 10); break; } + ess->midi_addr = mpu401_base_addr; + io_sethandler(addr, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); break; } @@ -2166,15 +2242,36 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); + io_removehandler(addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + ess->mixer_ess.ess_id_str[2] = 0x00; ess->mixer_ess.ess_id_str[3] = 0x00; @@ -2185,10 +2282,23 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); } - if (ess->pnp == 3) - mpu401_change_addr(ess->mpu, 0); + if (ess->pnp == 3) { + addr = ess->midi_addr; + if (addr) { + ess->midi_addr = 0; + mpu401_change_addr(ess->mpu, 0); + io_removehandler(addr, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } + } sb_dsp_setaddr(&ess->dsp, 0); sb_dsp_setirq(&ess->dsp, 0); @@ -2204,16 +2314,36 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); sb_dsp_setaddr(&ess->dsp, addr); + io_sethandler(addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); ess->mixer_ess.ess_id_str[2] = (addr >> 8) & 0xff; ess->mixer_ess.ess_id_str[3] = addr & 0xff; @@ -2226,12 +2356,21 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); } if (ess->pnp == 3) { addr = config->io[2].base; - if (addr != ISAPNP_IO_DISABLED) + if (addr != ISAPNP_IO_DISABLED) { mpu401_change_addr(ess->mpu, addr); + io_sethandler(addr, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } } val = config->irq[0].irq; @@ -2312,27 +2451,58 @@ ess_soundpiper_mca_write(const int port, const uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(ess->dsp.sb_addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(ess->dsp.sb_addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(0x0388, 0x0004, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(ess->dsp.sb_addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); + + io_removehandler(ess->dsp.sb_addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(ess->dsp.sb_addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(ess->dsp.sb_addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); } /* DSP I/O handler is activated in sb_dsp_setaddr */ sb_dsp_setaddr(&ess->dsp, 0); gameport_remap(ess->gameport, 0); - if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) + if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) { mpu401_change_addr(ess->mpu, 0); + io_removehandler(0x0330, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } + ess->pos_regs[port & 7] = val; if (ess->pos_regs[2] & 1) { @@ -2353,20 +2523,52 @@ ess_soundpiper_mca_write(const int port, const uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(ess->dsp.sb_addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(ess->dsp.sb_addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(0x0388, 0x0004, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(ess->dsp.sb_addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); - if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) + io_sethandler(ess->dsp.sb_addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(ess->dsp.sb_addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(ess->dsp.sb_addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + + if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) { mpu401_change_addr(ess->mpu, ess->pos_regs[3] & 0x02 ? 0x0330 : 0); + + if (ess->pos_regs[3] & 0x02) + io_sethandler(0x0330, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } } /* DSP I/O handler is activated in sb_dsp_setaddr */ @@ -2420,25 +2622,57 @@ ess_chipchat_mca_write(int port, uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(ess->dsp.sb_addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(ess->dsp.sb_addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(0x0388, 0x0004, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_removehandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_removehandler(ess->dsp.sb_addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); + + io_removehandler(ess->dsp.sb_addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(ess->dsp.sb_addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_removehandler(ess->dsp.sb_addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); } /* DSP I/O handler is activated in sb_dsp_setaddr */ sb_dsp_setaddr(&ess->dsp, 0); gameport_remap(ess->gameport, 0); - mpu401_change_addr(ess->mpu, 0); + if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) { + mpu401_change_addr(ess->mpu, 0); + + io_removehandler(0x0330, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } ess->pos_regs[port & 7] = val; @@ -2450,20 +2684,52 @@ ess_chipchat_mca_write(int port, uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(ess->dsp.sb_addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(ess->dsp.sb_addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(0x0388, 0x0004, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); + io_sethandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); io_sethandler(ess->dsp.sb_addr + 4, 0x0002, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); - if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) + io_sethandler(ess->dsp.sb_addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(ess->dsp.sb_addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(ess->dsp.sb_addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + + if (ess->dsp.sb_subtype == SB_SUBTYPE_ESS_ES1688) { mpu401_change_addr(ess->mpu, (ess->pos_regs[2] == 0x51) ? 0x0330 : 0); + + if (ess->pos_regs[2] == 0x51) + io_sethandler(0x0330, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + } } /* DSP I/O handler is activated in sb_dsp_setaddr */ @@ -3452,20 +3718,43 @@ ess_x688_init(UNUSED(const device_t *info)) ess_mixer_reset(ess); /* DSP I/O handler is activated in sb_dsp_setaddr */ - { - io_sethandler(addr, 0x0004, - ess->opl.read, NULL, NULL, - ess->opl.write, NULL, NULL, - ess->opl.priv); - io_sethandler(addr + 8, 0x0002, - ess->opl.read, NULL, NULL, - ess->opl.write, NULL, NULL, - ess->opl.priv); - io_sethandler(0x0388, 0x0004, - ess->opl.read, NULL, NULL, - ess->opl.write, NULL, NULL, - ess->opl.priv); - } + io_sethandler(addr, 0x0004, + ess->opl.read, NULL, NULL, + ess->opl.write, NULL, NULL, + ess->opl.priv); + io_sethandler(addr, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + io_sethandler(addr + 8, 0x0002, + ess->opl.read, NULL, NULL, + ess->opl.write, NULL, NULL, + ess->opl.priv); + io_sethandler(addr + 8, 0x0002, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + io_sethandler(0x0388, 0x0004, + ess->opl.read, NULL, NULL, + ess->opl.write, NULL, NULL, + ess->opl.priv); + io_sethandler(0x0388, 0x0004, + ess_fm_midi_read, NULL, NULL, + ess_fm_midi_write, NULL, NULL, + ess); + + io_sethandler(addr + 2, 0x0004, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(addr + 6, 0x0001, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); + io_sethandler(addr + 0x0a, 0x0006, + ess_base_read, NULL, NULL, + ess_base_write, NULL, NULL, + ess); ess->mixer_enabled = 1; ess->mixer_ess.regs[0x40] = 0x0a; diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index 53666f71d..f51ff4d25 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -726,6 +726,8 @@ sb_8_read_dma(void *priv) sb_dsp_t *dsp = (sb_dsp_t *) priv; int ret; + dsp->activity &= 0xdf; + if (dsp->sb_8_dmanum >= 4) { if (dsp->dma_ff) { uint32_t temp = (dsp->dma_data & 0xff00) >> 8; @@ -750,7 +752,9 @@ sb_8_read_dma(void *priv) int sb_8_write_dma(void *priv, uint8_t val) { - const sb_dsp_t *dsp = (sb_dsp_t *) priv; + sb_dsp_t *dsp = (sb_dsp_t *) priv; + + dsp->activity &= 0xdf; return dma_channel_write(dsp->sb_8_dmanum, val) == DMA_NODATA; } @@ -770,11 +774,13 @@ sb_8_write_dma(void *priv, uint8_t val) int sb_16_read_dma(void *priv) { - const sb_dsp_t *dsp = (sb_dsp_t *) priv; + sb_dsp_t *dsp = (sb_dsp_t *) priv; int ret; int dma_ch = dsp->sb_16_dmanum; + dsp->activity &= 0xdf; + if (dsp->sb_16_dma_enabled && dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate && (dma_ch != 4)) ret = dma_channel_read(dma_ch); else { @@ -808,10 +814,12 @@ sb_16_read_dma(void *priv) int sb_16_write_dma(void *priv, uint16_t val) { - const sb_dsp_t *dsp = (sb_dsp_t *) priv; + sb_dsp_t *dsp = (sb_dsp_t *) priv; int dma_ch = dsp->sb_16_dmanum; int ret; + dsp->activity &= 0xdf; + if (dsp->sb_16_dma_enabled && dsp->sb_16_dma_supported && !dsp->sb_16_dma_translate && (dma_ch != 4)) ret = dma_channel_write(dma_ch, val) == DMA_NODATA; else { @@ -1723,17 +1731,14 @@ sb_exec_command(sb_dsp_t *dsp) break; case 0xF2: /* Trigger 8-bit IRQ */ sb_dsp_log("Trigger 8-bit IRQ\n"); - if (!timer_is_enabled(&dsp->irq_timer)) { - timer_set_delay_u64(&dsp->irq_timer, (100ULL * TIMER_USEC)); - } + timer_set_delay_u64(&dsp->irq_timer, (10ULL * TIMER_USEC)); break; case 0xF3: /* Trigger 16-bit IRQ */ sb_dsp_log("Trigger 16-bit IRQ\n"); if (IS_ESS(dsp)) dsp->ess_irq_generic = true; - else if (!timer_is_enabled(&dsp->irq16_timer)) { - timer_set_delay_u64(&dsp->irq16_timer, (100ULL * TIMER_USEC)); - } + else + timer_set_delay_u64(&dsp->irq16_timer, (10ULL * TIMER_USEC)); break; case 0xF8: if (dsp->sb_type < SB16) @@ -1886,7 +1891,11 @@ sb_read(uint16_t a, void *priv) switch (a & 0xf) { case 0x6: - ret = IS_ESS(dsp) ? 0x00 : 0xff; + if (IS_ESS(dsp)) { + ret = (dsp->espcm_fifo_reset & 0x03) | 0x08 | (dsp->activity & 0xe0); + dsp->activity |= 0xe0; + } else + ret = 0xff; break; case 0xA: /* Read data */ if (dsp->mpu && dsp->uart_midi) @@ -2075,6 +2084,7 @@ sb_dsp_init(sb_dsp_t *dsp, int type, int subtype, void *parent) dsp->sb_type = type; dsp->sb_subtype = subtype; dsp->parent = parent; + dsp->activity = 0xe0; /* Default values. Use sb_dsp_setxxx() methods to change. */ dsp->sb_irqnum = 7; From 3b4a9c1b112d5a7371d1996cc954b0e9981244e0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 23 Jul 2024 18:20:28 +0200 Subject: [PATCH 167/624] Small fixes for ESS activity flags. --- src/sound/snd_sb.c | 30 +----------------------------- 1 file changed, 1 insertion(+), 29 deletions(-) diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 882eaceea..b9e2dea5a 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -2242,10 +2242,6 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); - io_removehandler(addr, 0x0004, - ess_fm_midi_read, NULL, NULL, - ess_fm_midi_write, NULL, NULL, - ess); io_removehandler(addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, @@ -2314,10 +2310,6 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); - io_sethandler(addr, 0x0004, - ess_fm_midi_read, NULL, NULL, - ess_fm_midi_write, NULL, NULL, - ess); io_sethandler(addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, @@ -2451,10 +2443,6 @@ ess_soundpiper_mca_write(const int port, const uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); - io_removehandler(ess->dsp.sb_addr, 0x0004, - ess_fm_midi_read, NULL, NULL, - ess_fm_midi_write, NULL, NULL, - ess); io_removehandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, @@ -2523,10 +2511,6 @@ ess_soundpiper_mca_write(const int port, const uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); - io_sethandler(ess->dsp.sb_addr, 0x0004, - ess_fm_midi_read, NULL, NULL, - ess_fm_midi_write, NULL, NULL, - ess); io_sethandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, @@ -2622,10 +2606,6 @@ ess_chipchat_mca_write(int port, uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); - io_removehandler(ess->dsp.sb_addr, 0x0004, - ess_fm_midi_read, NULL, NULL, - ess_fm_midi_write, NULL, NULL, - ess); io_removehandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, @@ -2684,10 +2664,6 @@ ess_chipchat_mca_write(int port, uint8_t val, void *priv) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); - io_sethandler(ess->dsp.sb_addr, 0x0004, - ess_fm_midi_read, NULL, NULL, - ess_fm_midi_write, NULL, NULL, - ess); io_sethandler(ess->dsp.sb_addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, @@ -2703,7 +2679,7 @@ ess_chipchat_mca_write(int port, uint8_t val, void *priv) ess_fm_midi_read, NULL, NULL, ess_fm_midi_write, NULL, NULL, ess); - io_sethandler(ess->dsp.sb_addr + 4, 0x0002, + io_sethandler(ess->dsp.sb_addr + 4, 0x0004, ess_mixer_read, NULL, NULL, ess_mixer_write, NULL, NULL, ess); @@ -3722,10 +3698,6 @@ ess_x688_init(UNUSED(const device_t *info)) ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, ess->opl.priv); - io_sethandler(addr, 0x0004, - ess_fm_midi_read, NULL, NULL, - ess_fm_midi_write, NULL, NULL, - ess); io_sethandler(addr + 8, 0x0002, ess->opl.read, NULL, NULL, ess->opl.write, NULL, NULL, From 52c3d9abdaa367695f473f5d6f6a35b28194391a Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 23 Jul 2024 18:28:35 +0200 Subject: [PATCH 168/624] Removed the trailed space of the Wells American and corrected the machine type of the Acer M3A. --- src/machine/machine_table.c | 84 ++++++++++++++++++------------------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c26c9b580..e09707008 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -2965,7 +2965,7 @@ const machine_t machines[] = { }, /* Has Chips & Technologies KBC firmware. */ { - .name = "[ISA] Wells American A*Star ", + .name = "[ISA] Wells American A*Star", .internal_name = "wellamerastar", .type = MACHINE_TYPE_286, .chipset = MACHINE_CHIPSET_DISCRETE, @@ -10767,47 +10767,6 @@ const machine_t machines[] = { }, /* 430HX */ - /* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix - MultiKey/42 (version 1.38) KBC firmware. */ - { - .name = "[i430HX] Acer M3A", - .internal_name = "acerm3a", - .type = MACHINE_TYPE_SOCKET7_3V, - .chipset = MACHINE_CHIPSET_INTEL_430HX, - .init = machine_at_acerm3a_init, - .p1_handler = NULL, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 50000000, - .max_bus = 66666667, - .min_voltage = 3300, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.0 - }, - .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_GAMEPORT | MACHINE_USB, /* Machine has internal SCSI */ - .ram = { - .min = 8192, - .max = 196608, - .step = 8192 - }, - .nvrmask = 511, - .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 - }, /* Has AMIKey-2 or VIA VT82C42N KBC (depending on the revision) with AMIKEY 'F' KBC firmware. */ { .name = "[i430HX] AOpen AP53", @@ -11219,6 +11178,47 @@ const machine_t machines[] = { /* Socket 7 (Dual Voltage) machines */ /* 430HX */ + /* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix + MultiKey/42 (version 1.38) KBC firmware. */ + { + .name = "[i430HX] Acer M3A", + .internal_name = "acerm3a", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430HX, + .init = machine_at_acerm3a_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK(CPU_Cx6x86MX), + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 2800, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_GAMEPORT | MACHINE_USB, /* Machine has internal SCSI */ + .ram = { + .min = 8192, + .max = 196608, + .step = 8192 + }, + .nvrmask = 511, + .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 + }, /* Has SST Flash. */ /* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix MultiKey/42 (version 1.38) KBC firmware. */ From 2634b206c8692df604d35565ce585c1ffdec552a Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 23 Jul 2024 18:40:38 +0200 Subject: [PATCH 169/624] AT KBC: Fix on the fly AT / PS/2 mode switching, fixes PS/2 mouse on machines with VLSI VL82C113 on-chip KBC. --- src/device/kbc_at.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index 9ba84888c..d38a9bb72 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -1201,6 +1201,9 @@ kbc_at_set_ps2(void *priv, const uint8_t ps2) kbc_at_do_poll = kbc_at_poll_ps2; } else kbc_at_do_poll = kbc_at_poll_at; + + write_cmd(dev, ~dev->mem[0x20]); + write_cmd(dev, dev->mem[0x20]); } static uint8_t @@ -2230,7 +2233,11 @@ static void kbc_at_close(void *priv) { atkbc_t *dev = (atkbc_t *) priv; +#ifdef OLD_CODE int max_ports = ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) ? 2 : 1; +#else + int max_ports = 2; +#endif /* Stop timers. */ timer_disable(&dev->kbc_dev_poll_timer); @@ -2372,7 +2379,11 @@ kbc_at_init(const device_t *info) break; } +#ifdef OLD_CODE max_ports = ((dev->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) ? 2 : 1; +#else + max_ports = 2; +#endif for (int i = 0; i < max_ports; i++) { kbc_at_ports[i] = (kbc_at_port_t *) malloc(sizeof(kbc_at_port_t)); From fe9817d379b9255838deb7907697596df438d7b9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 24 Jul 2024 00:01:54 +0200 Subject: [PATCH 170/624] The Alaris Cougar now allows the IBM 486BL CPU's as well. --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index e09707008..c9e3b1dd6 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -6418,7 +6418,7 @@ const machine_t machines[] = { .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { - .package = CPU_PKG_SOCKET3, + .package = CPU_PKG_SOCKET3 | CPU_PKG_486BL, .block = CPU_BLOCK_NONE, .min_bus = 0, .max_bus = 0, From 3d5093481256411bedefae41620950280775f5a4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 24 Jul 2024 00:07:21 +0200 Subject: [PATCH 171/624] Fixed the IBM 486BL EDX reset values and the Tandy 1000 CPU's. --- src/cpu/cpu_table.c | 8 ++++---- src/machine/machine_table.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 34832762f..2541c5875 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -1855,7 +1855,7 @@ const cpu_family_t cpu_families[] = { .rspeed = 50000000, .multi = 2, .voltage = 5000, - .edx_reset = 0xA439, + .edx_reset = 0x8439, .cpuid_model = 0, .cyrix_id = 0, .cpu_flags = 0, @@ -1872,7 +1872,7 @@ const cpu_family_t cpu_families[] = { .rspeed = 66666666, .multi = 2, .voltage = 5000, - .edx_reset = 0xA439, + .edx_reset = 0x8439, .cpuid_model = 0, .cyrix_id = 0, .cpu_flags = 0, @@ -1898,7 +1898,7 @@ const cpu_family_t cpu_families[] = { .rspeed = 75000000, .multi = 3, .voltage = 5000, - .edx_reset = 0xA439, + .edx_reset = 0x8439, .cpuid_model = 0, .cyrix_id = 0, .cpu_flags = 0, @@ -1915,7 +1915,7 @@ const cpu_family_t cpu_families[] = { .rspeed = 100000000, .multi = 3, .voltage = 5000, - .edx_reset = 0xA439, + .edx_reset = 0x8439, .cpuid_model = 0, .cyrix_id = 0, .cpu_flags = 0, diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c9e3b1dd6..a7c5d1cbf 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1509,7 +1509,7 @@ const machine_t machines[] = { .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { - .package = CPU_PKG_8088_EUROPC, + .package = CPU_PKG_8088, .block = CPU_BLOCK_NONE, .min_bus = 0, .max_bus = 0, From 30390da91cd1a8a3f76577e0972476eaf7fb9c68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Wed, 24 Jul 2024 02:18:54 +0200 Subject: [PATCH 172/624] Update control --- debian/control | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/debian/control b/debian/control index d67f5965b..a718aee33 100644 --- a/debian/control +++ b/debian/control @@ -13,6 +13,7 @@ Build-Depends: cmake (>= 3.21), libsdl2-dev, libslirp-dev, libxkbcommon-x11-dev, + libsndfile-dev, ninja-build, qttools5-dev, qtbase5-private-dev @@ -31,4 +32,4 @@ Recommends: libpcap0.8-dev Description: An emulator for classic IBM PC clones 86Box is a low level x86 emulator that runs older operating systems and software designed for IBM PC systems and compatibles from 1981 through - fairly recent system designs based on the PCI bus. \ No newline at end of file + fairly recent system designs based on the PCI bus. From d72b2ca4ff9c1519cfb225536a7e3e86207105df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Wed, 24 Jul 2024 02:19:58 +0200 Subject: [PATCH 173/624] Update dependencies_macports.txt --- .ci/dependencies_macports.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/dependencies_macports.txt b/.ci/dependencies_macports.txt index 5ec71d07c..b23ac441d 100644 --- a/.ci/dependencies_macports.txt +++ b/.ci/dependencies_macports.txt @@ -15,3 +15,4 @@ fluidsynth ghostscript libslirp vde2 +libsndfile From ff68e08f57efedd77d5e8808c7d1b721f577820b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Wed, 24 Jul 2024 02:20:12 +0200 Subject: [PATCH 174/624] Update dependencies_msys.txt --- .ci/dependencies_msys.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/dependencies_msys.txt b/.ci/dependencies_msys.txt index 694fe3e28..eacdb8b36 100644 --- a/.ci/dependencies_msys.txt +++ b/.ci/dependencies_msys.txt @@ -13,3 +13,4 @@ fluidsynth qt5-static qt5-translations vulkan-headers +libsndfile From 74ba3a897a6702527799e04fcf31d01ca7dbced7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Wed, 24 Jul 2024 02:21:22 +0200 Subject: [PATCH 175/624] Update AppImageBuilder.yml --- .ci/AppImageBuilder.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.ci/AppImageBuilder.yml b/.ci/AppImageBuilder.yml index 22db9f151..f6e04ab9f 100644 --- a/.ci/AppImageBuilder.yml +++ b/.ci/AppImageBuilder.yml @@ -59,6 +59,7 @@ AppDir: - libqt5widgets5 # if QT:BOOL=ON - libsixel1 # if CLI:BOOL=ON - libslirp0 + - libsndfile-dev - libsndio7.0 # if OPENAL:BOOL=ON - libvdeplug-dev # -dev also pulls in libvdeplug2. -dev is required to get the proper .so symlink to the library - libx11-6 # if QT:BOOL=ON From 0fedbf9b469595fb7bd7fa23b5d6f409b1566e57 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 21 Jul 2024 21:46:13 -0400 Subject: [PATCH 176/624] Named initializers for socket 5's and 7's --- src/cpu/cpu_table.c | 2718 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 2566 insertions(+), 152 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 2541c5875..d9b5247ea 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -3562,15 +3562,159 @@ const cpu_family_t cpu_families[] = { .name = "Pentium", .internal_name = "pentium_p54c", .cpus = (const CPU[]) { - {"75", CPU_PENTIUM, fpus_internal, 75000000, 1.5, 3520, 0x522, 0x522, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, - {"90", CPU_PENTIUM, fpus_internal, 90000000, 1.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, - {"100/50", CPU_PENTIUM, fpus_internal, 100000000, 2.0, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10,6,6, 12}, - {"100/66", CPU_PENTIUM, fpus_internal, 100000000, 1.5, 3520, 0x526, 0x526, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, - {"120", CPU_PENTIUM, fpus_internal, 120000000, 2.0, 3520, 0x526, 0x526, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 14}, - {"133", CPU_PENTIUM, fpus_internal, 133333333, 2.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 16}, - {"150", CPU_PENTIUM, fpus_internal, 150000000, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, - {"166", CPU_PENTIUM, fpus_internal, 166666666, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"200", CPU_PENTIUM, fpus_internal, 200000000, 3.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, + { + .name = "75", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x522, + .cpuid_model = 0x522, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 9 + }, + { + .name = "90", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x524, + .cpuid_model = 0x524, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 21/2 + }, + { + .name = "100/50", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x524, + .cpuid_model = 0x524, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 12 + }, + { + .name = "100/66", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x526, + .cpuid_model = 0x526, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { + .name = "120", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x526, + .cpuid_model = 0x526, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "133", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { + .name = "150", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 35/2 + }, + { + .name = "166", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "200", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, { .name = "", 0 } } }, @@ -3580,9 +3724,57 @@ const cpu_family_t cpu_families[] = { .name = "Pentium MMX", .internal_name = "pentium_p55c", .cpus = (const CPU[]) { - {"166", CPU_PENTIUMMMX, fpus_internal, 166666666, 2.5, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"233", CPU_PENTIUMMMX, fpus_internal, 233333333, 3.5, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, + { + .name = "166", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "200", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { + .name = "233", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, { .name = "", 0 } } }, @@ -3592,14 +3784,142 @@ const cpu_family_t cpu_families[] = { .name = "Mobile Pentium MMX", .internal_name = "pentium_tillamook", .cpus = (const CPU[]) { - {"120", CPU_PENTIUMMMX, fpus_internal, 120000000, 2.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"133", CPU_PENTIUMMMX, fpus_internal, 133333333, 2.0, 2800, 0x543, 0x543, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"150", CPU_PENTIUMMMX, fpus_internal, 150000000, 2.5, 2800, 0x544, 0x544, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, - {"166", CPU_PENTIUMMMX, fpus_internal, 166666666, 2.5, 2800, 0x544, 0x544, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 2800, 0x581, 0x581, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"233", CPU_PENTIUMMMX, fpus_internal, 233333333, 3.5, 2800, 0x581, 0x581, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, - {"266", CPU_PENTIUMMMX, fpus_internal, 266666666, 4.0, 2800, 0x582, 0x582, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, - {"300", CPU_PENTIUMMMX, fpus_internal, 300000000, 4.5, 2800, 0x582, 0x582, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 36}, + { + .name = "120", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "133", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { + .name = "150", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 2800, + .edx_reset = 0x544, + .cpuid_model = 0x544, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 35/2 + }, + { + .name = "166", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2800, + .edx_reset = 0x544, + .cpuid_model = 0x544, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "200", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2800, + .edx_reset = 0x581, + .cpuid_model = 0x581, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { + .name = "233", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2800, + .edx_reset = 0x581, + .cpuid_model = 0x581, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, + { + .name = "266", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2800, + .edx_reset = 0x582, + .cpuid_model = 0x582, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { + .name = "300", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2800, + .edx_reset = 0x582, + .cpuid_model = 0x582, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 36 + }, { .name = "", 0 } } }, @@ -3609,9 +3929,57 @@ const cpu_family_t cpu_families[] = { .name = "Pentium OverDrive", .internal_name = "pentium_p54c_od3v", .cpus = (const CPU[]) { - {"125", CPU_PENTIUM, fpus_internal, 125000000, 3.0, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,7,7, 15}, - {"150", CPU_PENTIUM, fpus_internal, 150000000, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 35/2}, - {"166", CPU_PENTIUM, fpus_internal, 166666666, 2.5, 3520, 0x52c, 0x52c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 20}, + { + .name = "125", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 125000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 15 + }, + { + .name = "150", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 35/2 + }, + { + .name = "166", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, { .name = "", 0 } } }, @@ -3621,12 +3989,98 @@ const cpu_family_t cpu_families[] = { .name = "Pentium OverDrive MMX", .internal_name = "pentium_p55c_od", .cpus = (const CPU[]) { - {"75", CPU_PENTIUMMMX, fpus_internal, 75000000, 1.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 7, 7,4,4, 9}, - {"125", CPU_PENTIUMMMX, fpus_internal, 125000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12,7,7, 15}, - {"150/60", CPU_PENTIUMMMX, fpus_internal, 150000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 35/2}, - {"166", CPU_PENTIUMMMX, fpus_internal, 166000000, 2.5, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15,7,7, 20}, - {"180", CPU_PENTIUMMMX, fpus_internal, 180000000, 3.0, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18,9,9, 21}, - {"200", CPU_PENTIUMMMX, fpus_internal, 200000000, 3.0, 3520, 0x1542, 0x1542, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18,9,9, 24}, + { + .name = "75", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.5, + .voltage = 3520, .edx_reset = 0x1542, .cpuid_model = 0x1542, .cyrix_id = 0, .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, .mem_read_cycles = 7, .mem_write_cycles = 7,.cache_read_cycles = 4,.cache_write_cycles = 4, .atclk_div = 9}, + { + .name = "125", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 125000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 15 + }, + { + .name = "150/60", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 35/2 + }, + { + .name = "166", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 166000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "180", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 180000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 21 + }, + { + .name = "200", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, { .name = "", 0 } } }, @@ -3636,17 +4090,193 @@ const cpu_family_t cpu_families[] = { .name = "WinChip", .internal_name = "winchip", .cpus = (const CPU[]) { - {"75", CPU_WINCHIP, fpus_internal, 75000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 8, 8, 4, 4, 9}, - {"90", CPU_WINCHIP, fpus_internal, 90000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 9, 9, 4, 4, 21/2}, - {"100", CPU_WINCHIP, fpus_internal, 100000000, 1.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 9, 9, 4, 4, 12}, - {"120", CPU_WINCHIP, fpus_internal, 120000000, 2.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 12, 12, 6, 6, 14}, - {"133", CPU_WINCHIP, fpus_internal, 133333333, 2.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 12, 12, 6, 6, 16}, - {"150", CPU_WINCHIP, fpus_internal, 150000000, 2.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 15, 15, 7, 7, 35/2}, - {"166", CPU_WINCHIP, fpus_internal, 166666666, 2.5, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 15, 15, 7, 7, 40}, - {"180", CPU_WINCHIP, fpus_internal, 180000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 21}, - {"200", CPU_WINCHIP, fpus_internal, 200000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 24}, - {"225", CPU_WINCHIP, fpus_internal, 225000000, 3.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 27}, - {"240", CPU_WINCHIP, fpus_internal, 240000000, 4.0, 3520, 0x540, 0x540, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 28}, + { + .name = "75", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 9 + }, + { + .name = "90", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 21/2 + }, + { + .name = "100", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { + .name = "120", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "133", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { + .name = "150", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 35/2 + }, + { + .name = "166", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 40 + }, + { + .name = "180", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 180000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 21 + }, + { + .name = "200", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { + .name = "225", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 225000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 27 + }, + { + .name = "240", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 240000000, + .multi = 4.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 28 + }, { .name = "", 0 } } }, @@ -3656,10 +4286,74 @@ const cpu_family_t cpu_families[] = { .name = "WinChip 2", .internal_name = "winchip2", .cpus = (const CPU[]) { - {"200", CPU_WINCHIP2, fpus_internal, 200000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*8}, - {"225", CPU_WINCHIP2, fpus_internal, 225000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*9}, - {"240", CPU_WINCHIP2, fpus_internal, 240000000, 4.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 30}, - {"250", CPU_WINCHIP2, fpus_internal, 250000000, 3.0, 3520, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 12, 12, 30}, + { + .name = "200", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 3*8 + }, + { + .name = "225", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 225000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 3*9 + }, + { + .name = "240", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 240000000, + .multi = 4.0, + .voltage = 3520, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 30 + }, + { + .name = "250", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 30 + }, { .name = "", 0 } } }, @@ -3669,10 +4363,74 @@ const cpu_family_t cpu_families[] = { .name = "WinChip 2A", .internal_name = "winchip2a", .cpus = (const CPU[]) { - {"200", CPU_WINCHIP2, fpus_internal, 200000000, 3.0, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 18, 18, 9, 9, 3*8}, - {"233", CPU_WINCHIP2, fpus_internal, 233333333, 3.5, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 21, 21, 9, 9, (7*8)/2}, - {"266", CPU_WINCHIP2, fpus_internal, 233333333, 7.0/3.0, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 21, 21, 7, 7, 28}, - {"300", CPU_WINCHIP2, fpus_internal, 250000000, 2.5, 3520, 0x587, 0x587, 0, CPU_SUPPORTS_DYNAREC, 24, 24, 8, 8, 30}, + { + .name = "200", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x587, + .cpuid_model = 0x587, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 3*8 + }, + { + .name = "233", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 3520, + .edx_reset = 0x587, + .cpuid_model = 0x587, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = (7*8)/2 + }, + { + .name = "266", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 7.0/3.0, + .voltage = 3520, + .edx_reset = 0x587, + .cpuid_model = 0x587, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 28 + }, + { + .name = "300", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x587, + .cpuid_model = 0x587, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 8, + .cache_write_cycles = 8, + .atclk_div = 30 + }, { .name = "", 0 } } }, @@ -3683,9 +4441,57 @@ const cpu_family_t cpu_families[] = { .name = "K5 (Model 0)", .internal_name = "k5_ssa5", .cpus = (const CPU[]) { - {"75 (PR75)", CPU_K5, fpus_internal, 75000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7,4,4, 9}, - {"90 (PR90)", CPU_K5, fpus_internal, 90000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 21/2}, - {"100 (PR100)", CPU_K5, fpus_internal, 100000000, 1.5, 3520, 0x501, 0x501, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9,4,4, 12}, + { + .name = "75 (PR75)", + .cpu_type = CPU_K5, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x501, + .cpuid_model = 0x501, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 9 + }, + { + .name = "90 (PR90)", + .cpu_type = CPU_K5, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x501, + .cpuid_model = 0x501, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 21/2 + }, + { + .name = "100 (PR100)", + .cpu_type = CPU_K5, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x501, + .cpuid_model = 0x501, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, { .name = "", 0 } } }, @@ -3695,11 +4501,91 @@ const cpu_family_t cpu_families[] = { .name = "K5 (Model 1/2/3)", .internal_name = "k5_5k86", .cpus = (const CPU[]) { - {"90 (PR120)", CPU_5K86, fpus_internal, 120000000, 2.0, 3520, 0x511, 0x511, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 14}, - {"100 (PR133)", CPU_5K86, fpus_internal, 133333333, 2.0, 3520, 0x514, 0x514, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,6,6, 16}, - {"105 (PR150)", CPU_5K86, fpus_internal, 150000000, 2.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,7,7, 35/2}, - {"116.7 (PR166)", CPU_5K86, fpus_internal, 166666666, 2.5, 3520, 0x524, 0x524, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,7,7, 20}, - {"133 (PR200)", CPU_5K86, fpus_internal, 200000000, 3.0, 3520, 0x534, 0x534, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18,9,9, 24}, + { + .name = "90 (PR120)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x511, + .cpuid_model = 0x511, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "100 (PR133)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x514, + .cpuid_model = 0x514, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { + .name = "105 (PR150)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x524, + .cpuid_model = 0x524, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 35/2 + }, + { + .name = "116.7 (PR166)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x524, + .cpuid_model = 0x524, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "133 (PR200)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x534, + .cpuid_model = 0x534, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, { .name = "", 0 } } }, @@ -3710,12 +4596,108 @@ const cpu_family_t cpu_families[] = { .name = "K6 (Model 6)", .internal_name = "k6_m6", .cpus = (const CPU[]) { - {"66", CPU_K6, fpus_internal, 66666666, 1.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_K6, fpus_internal, 100000000, 1.5, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6, fpus_internal, 133333333, 2.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6, fpus_internal, 166666666, 2.5, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"200", CPU_K6, fpus_internal, 200000000, 3.0, 2900, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"233", CPU_K6, fpus_internal, 233333333, 3.5, 3200, 0x561, 0x561, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, + { /* out of spec */ + .name = "66", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { + .name = "166", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "200", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { + .name = "233", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 3200, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, { .name = "", 0 } } }, { @@ -3724,13 +4706,117 @@ const cpu_family_t cpu_families[] = { .name = "K6 (Model 7)", .internal_name = "k6_m7", .cpus = (const CPU[]) { - {"100", CPU_K6, fpus_internal, 100000000, 1.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6, fpus_internal, 133333333, 2.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6, fpus_internal, 166666666, 2.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6, fpus_internal, 200000000, 3.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, - {"233", CPU_K6, fpus_internal, 233333333, 3.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, - {"266", CPU_K6, fpus_internal, 266666666, 4.0, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, - {"300", CPU_K6, fpus_internal, 300000000, 4.5, 2200, 0x570, 0x570, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 36}, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2200, + .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2200, + .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 166666666, .multi = 2.5, + .voltage = 2200, .edx_reset = 0x570, + .cpuid_model = 0x570, .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "200", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 200000000, .multi = 3.0, + .voltage = 2200, .edx_reset = 0x570, + .cpuid_model = 0x570, .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { + .name = "233", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 233333333, .multi = 3.5, + .voltage = 2200, .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, + { + .name = "266", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { + .name = "300", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2200, + .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 36 + }, { .name = "", 0 } } }, @@ -3740,24 +4826,312 @@ const cpu_family_t cpu_families[] = { .name = "K6-2", .internal_name = "k6_2", .cpus = (const CPU[]) { - {"100", CPU_K6_2, fpus_internal, 100000000, 1.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6_2, fpus_internal, 133333333, 2.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6_2, fpus_internal, 166666666, 2.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6_2, fpus_internal, 200000000, 3.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ - {"233", CPU_K6_2, fpus_internal, 233333333, 3.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, - {"266", CPU_K6_2, fpus_internal, 266666666, 4.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, - {"300", CPU_K6_2, fpus_internal, 300000000, 3.0, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, - {"333", CPU_K6_2, fpus_internal, 332500000, 3.5, 2200, 0x580, 0x580, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, - {"350", CPU_K6_2C, fpus_internal, 350000000, 3.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, - {"366", CPU_K6_2C, fpus_internal, 366666666, 5.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, - {"380", CPU_K6_2C, fpus_internal, 380000000, 4.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, - {"400/66", CPU_K6_2C, fpus_internal, 400000000, 6.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, - {"400/100", CPU_K6_2C, fpus_internal, 400000000, 4.0, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, - {"450", CPU_K6_2C, fpus_internal, 450000000, 4.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, - {"475", CPU_K6_2C, fpus_internal, 475000000, 5.0, 2400, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, - {"500", CPU_K6_2C, fpus_internal, 500000000, 5.0, 2400, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, - {"533", CPU_K6_2C, fpus_internal, 533333333, 5.5, 2200, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 48, 48, 17, 17, 64}, - {"550", CPU_K6_2C, fpus_internal, 550000000, 5.5, 2300, 0x58c, 0x58c, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 50, 50, 17, 17, 66}, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { + .name = "233", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, + { + .name = "266", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { + .name = "300", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 36 + }, + { + .name = "333", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 332500000, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 40 + }, + { + .name = "350", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 42 + }, + { + .name = "366", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 44 + }, + { + .name = "380", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 380000000, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 34, + .mem_write_cycles = 34, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 46 + }, + { + .name = "400/66", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 6.0, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { + .name = "400/100", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { + .name = "450", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 54 + }, + { + .name = "475", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 475000000, + .multi = 5.0, + .voltage = 2400, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 43, + .mem_write_cycles = 43, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 57 + }, + { + .name = "500", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 5.0, + .voltage = 2400, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 60 + }, + { + .name = "533", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 533333333, + .multi = 5.5, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 48, + .mem_write_cycles = 48, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 64 + }, + { + .name = "550", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 550000000, + .multi = 5.5, + .voltage = 2300, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 50, + .mem_write_cycles = 50, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 66 + }, { .name = "", 0 } } }, { @@ -3766,24 +5140,312 @@ const cpu_family_t cpu_families[] = { .name = "K6-2+", .internal_name = "k6_2p", .cpus = (const CPU[]) { - {"100", CPU_K6_2P, fpus_internal, 100000000, 1.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6_2P, fpus_internal, 133333333, 2.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6_2P, fpus_internal, 166666666, 2.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6_2P, fpus_internal, 200000000, 3.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ - {"233", CPU_K6_2P, fpus_internal, 233333333, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ - {"266", CPU_K6_2P, fpus_internal, 266666666, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ - {"300", CPU_K6_2P, fpus_internal, 300000000, 3.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ - {"333", CPU_K6_2P, fpus_internal, 332500000, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ - {"350", CPU_K6_2P, fpus_internal, 350000000, 3.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ - {"366", CPU_K6_2P, fpus_internal, 366666666, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ - {"380", CPU_K6_2P, fpus_internal, 380000000, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ - {"400/66", CPU_K6_2P, fpus_internal, 400000000, 6.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, /* out of spec */ - {"400/100", CPU_K6_2P, fpus_internal, 400000000, 4.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, /* out of spec */ - {"450", CPU_K6_2P, fpus_internal, 450000000, 4.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, - {"475", CPU_K6_2P, fpus_internal, 475000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, - {"500", CPU_K6_2P, fpus_internal, 500000000, 5.0, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, - {"533", CPU_K6_2P, fpus_internal, 533333333, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 48, 48, 17, 17, 64}, - {"550", CPU_K6_2P, fpus_internal, 550000000, 5.5, 2000, 0x5d4, 0x5d4, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 50, 50, 17, 17, 66}, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { /* out of spec */ + .name = "233", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, + { /* out of spec */ + .name = "266", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { /* out of spec */ + .name = "300", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 36 + }, + { /* out of spec */ + .name = "333", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 332500000, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 40 + }, + { /* out of spec */ + .name = "350", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 42 + }, + { /* out of spec */ + .name = "366", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 44 + }, + { /* out of spec */ + .name = "380", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 380000000, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 34, + .mem_write_cycles = 34, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 46 + }, + { /* out of spec */ + .name = "400/66", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 6.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { /* out of spec */ + .name = "400/100", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { + .name = "450", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 54 + }, + { + .name = "475", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 475000000, + .multi = 5.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 43, + .mem_write_cycles = 43, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 57 + }, + { + .name = "500", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 5.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 60 + }, + { + .name = "533", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 533333333, + .multi = 5.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 48, + .mem_write_cycles = 48, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 64 + }, + { + .name = "550", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 550000000, + .multi = 5.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 50, + .mem_write_cycles = 50, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 66 + }, { .name = "", 0 } } }, { @@ -3792,19 +5454,227 @@ const cpu_family_t cpu_families[] = { .name = "K6-III", .internal_name = "k6_3", .cpus = (const CPU[]) { - {"100", CPU_K6_3, fpus_internal, 100000000, 1.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_K6_3, fpus_internal, 133333333, 2.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6_3, fpus_internal, 166666666, 2.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6_3, fpus_internal, 200000000, 3.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ - {"233", CPU_K6_3, fpus_internal, 233333333, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ - {"266", CPU_K6_3, fpus_internal, 266666666, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ - {"300", CPU_K6_3, fpus_internal, 300000000, 3.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ - {"333", CPU_K6_3, fpus_internal, 332500000, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ - {"350", CPU_K6_3, fpus_internal, 350000000, 3.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ - {"366", CPU_K6_3, fpus_internal, 366666666, 5.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ - {"380", CPU_K6_3, fpus_internal, 380000000, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ - {"400", CPU_K6_3, fpus_internal, 400000000, 4.0, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, - {"450", CPU_K6_3, fpus_internal, 450000000, 4.5, 2200, 0x591, 0x591, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { /* out of spec */ + .name = "233", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, + { /* out of spec */ + .name = "266", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { /* out of spec */ + .name = "300", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 36 + }, + { /* out of spec */ + .name = "333", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 332500000, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 40 + }, + { /* out of spec */ + .name = "350", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 42 + }, + { /* out of spec */ + .name = "366", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 44 + }, + { /* out of spec */ + .name = "380", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 380000000, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 34, + .mem_write_cycles = 34, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 46 + }, + { + .name = "400", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { + .name = "450", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 54 + }, { .name = "", 0 } } }, @@ -3814,21 +5684,261 @@ const cpu_family_t cpu_families[] = { .name = "K6-III+", .internal_name = "k6_3p", .cpus = (const CPU[]) { - {"100", CPU_K6_3P, fpus_internal, 100000000, 1.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 7, 7, 4, 4, 9}, /* out of spec */ - {"133", CPU_K6_3P, fpus_internal, 133333333, 2.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12, 12, 6, 6, 16}, /* out of spec */ - {"166", CPU_K6_3P, fpus_internal, 166666666, 2.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15, 15, 7, 7, 20}, /* out of spec */ - {"200", CPU_K6_3P, fpus_internal, 200000000, 3.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18, 18, 9, 9, 24}, /* out of spec */ - {"233", CPU_K6_3P, fpus_internal, 233333333, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21, 21, 10, 10, 28}, /* out of spec */ - {"266", CPU_K6_3P, fpus_internal, 266666666, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24, 24, 12, 12, 32}, /* out of spec */ - {"300", CPU_K6_3P, fpus_internal, 300000000, 3.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27, 27, 9, 9, 36}, /* out of spec */ - {"333", CPU_K6_3P, fpus_internal, 332500000, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 30, 30, 11, 11, 40}, /* out of spec */ - {"350", CPU_K6_3P, fpus_internal, 350000000, 3.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32, 32, 11, 11, 42}, /* out of spec */ - {"366", CPU_K6_3P, fpus_internal, 366666666, 5.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 33, 33, 17, 17, 44}, /* out of spec */ - {"380", CPU_K6_3P, fpus_internal, 380000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 34, 34, 12, 12, 46}, /* out of spec */ - {"400", CPU_K6_3P, fpus_internal, 400000000, 4.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36, 36, 12, 12, 48}, - {"450", CPU_K6_3P, fpus_internal, 450000000, 4.5, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41, 41, 14, 14, 54}, - {"475", CPU_K6_3P, fpus_internal, 475000000, 5.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 43, 43, 15, 15, 57}, - {"500", CPU_K6_3P, fpus_internal, 500000000, 5.0, 2000, 0x5d0, 0x5d0, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 45, 45, 15, 15, 60}, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 9 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { /* out of spec */ + .name = "233", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, + { /* out of spec */ + .name = "266", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { /* out of spec */ + .name = "300", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 36 + }, + { /* out of spec */ + .name = "333", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 332500000, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 40 + }, + { /* out of spec */ + .name = "350", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 42 + }, + { /* out of spec */ + .name = "366", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 44 + }, + { /* out of spec */ + .name = "380", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 380000000, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 34, + .mem_write_cycles = 34, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 46 + }, + { + .name = "400", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { + .name = "450", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 54 + }, + { + .name = "475", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 475000000, + .multi = 5.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 43, + .mem_write_cycles = 43, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 57 + }, + { + .name = "500", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 5.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 60 + }, { .name = "", 0 } } }, @@ -3839,12 +5949,108 @@ const cpu_family_t cpu_families[] = { .name = "Cx6x86", .internal_name = "cx6x86", .cpus = (const CPU[]) { - {"80 (PR90+)", CPU_Cx6x86, fpus_internal, 80000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 8, 8, 6, 6, 10}, - {"100 (PR120+)", CPU_Cx6x86, fpus_internal, 100000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 12}, - {"110 (PR133+)", CPU_Cx6x86, fpus_internal, 110000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, - {"120 (PR150+)", CPU_Cx6x86, fpus_internal, 120000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"133 (PR166+)", CPU_Cx6x86, fpus_internal, 133333333, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"150 (PR200+)", CPU_Cx6x86, fpus_internal, 150000000, 2.0, 3520, 0x520, 0x520, 0x1731, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 18}, + { + .name = "80 (PR90+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 10 + }, + { + .name = "100 (PR120+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 12 + }, + { + .name = "110 (PR133+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 110000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "120 (PR150+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "133 (PR166+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { + .name = "150 (PR200+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 18 + }, { .name = "", 0 } } }, @@ -3854,10 +6060,74 @@ const cpu_family_t cpu_families[] = { .name = "Cx6x86L", .internal_name = "cx6x86l", .cpus = (const CPU[]) { - {"110 (PR133+)", CPU_Cx6x86L, fpus_internal, 110000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 10,10, 6, 6, 14}, - {"120 (PR150+)", CPU_Cx6x86L, fpus_internal, 120000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 14}, - {"133 (PR166+)", CPU_Cx6x86L, fpus_internal, 133333333, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"150 (PR200+)", CPU_Cx6x86L, fpus_internal, 150000000, 2.0, 2800, 0x540, 0x540, 0x2231, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 18}, + { + .name = "110 (PR133+)", + .cpu_type = CPU_Cx6x86L, + .fpus = fpus_internal, + .rspeed = 110000000, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0x2231, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "120 (PR150+)", + .cpu_type = CPU_Cx6x86L, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0x2231, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 14 + }, + { + .name = "133 (PR166+)", + .cpu_type = CPU_Cx6x86L, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0x2231, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { + .name = "150 (PR200+)", + .cpu_type = CPU_Cx6x86L, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0x2231, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 18 + }, { .name = "", 0 } } }, @@ -3867,10 +6137,74 @@ const cpu_family_t cpu_families[] = { .name = "Cx6x86MX", .internal_name = "cx6x86mx", .cpus = (const CPU[]) { - {"133 (PR166)", CPU_Cx6x86MX, fpus_internal, 133333333, 2.0, 2900, 0x600, 0x600, 0x0451, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, - {"166 (PR200)", CPU_Cx6x86MX, fpus_internal, 166666666, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"187.5 (PR233)", CPU_Cx6x86MX, fpus_internal, 187500000, 2.5, 2900, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 45/2}, - {"208.3 (PR266)", CPU_Cx6x86MX, fpus_internal, 208333333, 2.5, 2700, 0x600, 0x600, 0x0452, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 17,17, 7, 7, 25}, + { + .name = "133 (PR166)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2900, + .edx_reset = 0x600, + .cpuid_model = 0x600, + .cyrix_id = 0x0451, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { + .name = "166 (PR200)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2900, + .edx_reset = 0x600, + .cpuid_model = 0x600, + .cyrix_id = 0x0452, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "187.5 (PR233)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 187500000, + .multi = 2.5, + .voltage = 2900, + .edx_reset = 0x600, + .cpuid_model = 0x600, + .cyrix_id = 0x0452, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 45/2 + }, + { + .name = "208.3 (PR266)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 208333333, + .multi = 2.5, + .voltage = 2700, + .edx_reset = 0x600, + .cpuid_model = 0x600, + .cyrix_id = 0x0452, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 17, + .mem_write_cycles = 17, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 25 + }, { .name = "", 0 } } }, @@ -3880,11 +6214,91 @@ const cpu_family_t cpu_families[] = { .name = "MII", .internal_name = "mii", .cpus = (const CPU[]) { - {"233 (PR300)", CPU_Cx6x86MX, fpus_internal, 233333333, 3.5, 2900, 0x601, 0x601, 0x0852, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, - {"250/83 (PR333)", CPU_Cx6x86MX, fpus_internal, 250000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 9, 9, 30}, - {"250/100 (PR366)", CPU_Cx6x86MX, fpus_internal, 250000000, 2.5, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 23,23, 7, 7, 30}, - {"285 (PR400)", CPU_Cx6x86MX, fpus_internal, 285000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 34}, - {"300 (PR433)", CPU_Cx6x86MX, fpus_internal, 300000000, 3.0, 2900, 0x601, 0x601, 0x0853, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 36}, + { + .name = "233 (PR300)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0852, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 28 + }, + { + .name = "250/83 (PR333)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 3.0, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0853, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 23, + .mem_write_cycles = 23, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 30 + }, + { + .name = "250/100 (PR366)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 2.5, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0853, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 23, + .mem_write_cycles = 23, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 30 + }, + { + .name = "285 (PR400)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 285000000, + .multi = 3.0, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0853, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 34 + }, + { + .name = "300 (PR433)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0853, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 36 + }, { .name = "", 0 } } }, From 6141577347109391f4889b32a1ca668afe58d978 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 07:53:11 -0400 Subject: [PATCH 177/624] Named initializers for socket 8's --- src/cpu/cpu_table.c | 342 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 323 insertions(+), 19 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index d9b5247ea..c2b7e1ce7 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -6309,16 +6309,176 @@ const cpu_family_t cpu_families[] = { .name = "Pentium Pro", .internal_name = "pentiumpro", .cpus = (const CPU[]) { - {"60", CPU_PENTIUMPRO, fpus_internal, 60000000, 1.0, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 1, 1, 7}, /* out of spec */ - {"66", CPU_PENTIUMPRO, fpus_internal, 66666666, 1.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 1, 1, 8}, /* out of spec */ - {"90", CPU_PENTIUMPRO, fpus_internal, 90000000, 1.5, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 11}, /* out of spec */ - {"100", CPU_PENTIUMPRO, fpus_internal, 100000000, 1.5, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 12}, /* out of spec */ - {"120", CPU_PENTIUMPRO, fpus_internal, 120000000, 2.0, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 5, 5, 14}, /* out of spec */ - {"133", CPU_PENTIUMPRO, fpus_internal, 133333333, 2.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 5, 5, 16}, /* out of spec */ - {"150", CPU_PENTIUMPRO, fpus_internal, 150000000, 2.5, 3100, 0x612, 0x612, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 35/2}, - {"166", CPU_PENTIUMPRO, fpus_internal, 166666666, 2.5, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, - {"180", CPU_PENTIUMPRO, fpus_internal, 180000000, 3.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 21}, - {"200", CPU_PENTIUMPRO, fpus_internal, 200000000, 3.0, 3300, 0x617, 0x617, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, + { /* out of spec */ + .name = "60", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 60000000, + .multi = 1.0, + .voltage = 3100, + .edx_reset = 0x612, + .cpuid_model = 0x612, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 1, + .cache_write_cycles = 1, + .atclk_div = 7 + }, + { /* out of spec */ + .name = "66", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 1, + .cache_write_cycles = 1, + .atclk_div = 8 + }, + { /* out of spec */ + .name = "90", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 1.5, + .voltage = 3100, + .edx_reset = 0x612, + .cpuid_model = 0x612, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 11 + }, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "120", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3100, + .edx_reset = 0x612, + .cpuid_model = 0x612, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 5, + .cache_write_cycles = 5, + .atclk_div = 14 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 5, + .cache_write_cycles = 5, + .atclk_div = 16 + }, /* out of spec */ + { + .name = "150", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3100, + .edx_reset = 0x612, + .cpuid_model = 0x612, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 35/2 + }, + { + .name = "166", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { + .name = "180", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 180000000, + .multi = 3.0, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 21 + }, + { + .name = "200", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, { .name = "", 0 } } }, @@ -6328,15 +6488,159 @@ const cpu_family_t cpu_families[] = { .name = "Pentium II OverDrive", .internal_name = "pentium2_od", .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 15,15, 7, 7, 20}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 18,18, 9, 9, 24}, /* out of spec */ - {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 21,21,10,10, 28}, /* out of spec */ - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 24,24,12,12, 32}, /* out of spec */ - {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 5.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 36}, - {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 3300, 0x1632, 0x1632, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 40}, + { /* out of spec */ + .name = "66", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { /* out of spec */ + .name = "233", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, + { /* out of spec */ + .name = "266", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { + .name = "300", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 5.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 36 + }, + { + .name = "333", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 333333333, + .multi = 5.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 40 + }, { .name = "", 0 } } }, From a880c9a020eb408d3db53a05011483752b04272e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 08:39:30 -0400 Subject: [PATCH 178/624] Named initializers for Slot 1's --- src/cpu/cpu_table.c | 504 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 476 insertions(+), 28 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index c2b7e1ce7..0c11b08c6 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -6650,14 +6650,142 @@ const cpu_family_t cpu_families[] = { .name = "Pentium II (Klamath)", .internal_name = "pentium2_klamath", .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2, fpus_internal, 66666666, 1.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_PENTIUM2, fpus_internal, 100000000, 1.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 4, 4, 12}, /* out of spec */ - {"133", CPU_PENTIUM2, fpus_internal, 133333333, 2.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_PENTIUM2, fpus_internal, 166666666, 2.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ - {"200", CPU_PENTIUM2, fpus_internal, 200000000, 3.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, /* out of spec */ - {"233", CPU_PENTIUM2, fpus_internal, 233333333, 3.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,10,10, 28}, - {"266", CPU_PENTIUM2, fpus_internal, 266666666, 4.0, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, - {"300", CPU_PENTIUM2, fpus_internal, 300000000, 4.5, 2800, 0x634, 0x634, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,12,12, 36}, + { /* out of spec */ + .name = "66", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { + .name = "233", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 28 + }, + { + .name = "266", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { + .name = "300", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 25, + .mem_write_cycles = 25, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 36 + }, { .name = "", 0 } } }, { @@ -6666,18 +6794,210 @@ const cpu_family_t cpu_families[] = { .name = "Pentium II (Deschutes)", .internal_name = "pentium2_deschutes", .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 5, 5, 12}, /* out of spec */ - {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12, 6, 6, 16}, /* out of spec */ - {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15, 7, 7, 20}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 9, 9, 24}, /* out of spec */ - {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,11,11, 28}, /* out of spec */ - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,12,12, 32}, - {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,12,12, 36}, - {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27,13,13, 40}, - {"350", CPU_PENTIUM2D, fpus_internal, 350000000, 3.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32,32,11,11, 42}, - {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36,36,12,12, 48}, - {"450", CPU_PENTIUM2D, fpus_internal, 450000000, 4.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41,41,14,14, 54}, + { /* out of spec */ + .name = "66", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 5, + .cache_write_cycles = 5, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 24 + }, + { /* out of spec */ + .name = "233", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 28 + }, + { + .name = "266", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { + .name = "300", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x651, + .cpuid_model = 0x651, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 25, + .mem_write_cycles = 25, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 36 + }, + { + .name = "333", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 333333333, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x651, + .cpuid_model = 0x651, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 40 + }, + { + .name = "350", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x651, + .cpuid_model = 0x651, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 42 + }, + { + .name = "400", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { + .name = "450", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 54 + }, { .name = "", 0 } } }, @@ -6687,14 +7007,142 @@ const cpu_family_t cpu_families[] = { .name = "Celeron (Covington)", .internal_name = "celeron_covington", .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 6, 6, 6, 6, 8}, /* out of spec */ - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 9, 9, 12}, /* out of spec */ - {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 12,12,12,12, 16}, /* out of spec */ - {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 15,15,15,15, 20}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18,18,18, 24}, /* out of spec */ - {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 21,21,21,21, 28}, /* out of spec */ - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x650, 0x650, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 24,24,24,24, 32}, - {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x651, 0x651, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 25,25,25,25, 36}, + { /* out of spec */ + .name = "66", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 8 + }, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 18, + .cache_write_cycles = 18, + .atclk_div = 24 + }, + { /* out of spec */ + .name = "233", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 21, + .cache_write_cycles = 21, + .atclk_div = 28 + }, + { + .name = "266", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x650, + .cpuid_model = 0x650, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 24, + .cache_write_cycles = 24, + .atclk_div = 32 + }, + { + .name = "300", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x651, + .cpuid_model = 0x651, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 25, + .mem_write_cycles = 25, + .cache_read_cycles = 25, + .cache_write_cycles = 25, + .atclk_div = 36 + }, { .name = "", 0 } } }, { From 8af310e0a2983976c291a09e1d4c693dc6c55296 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 18:00:21 -0400 Subject: [PATCH 179/624] Named initializers for Slot 2's --- src/cpu/cpu_table.c | 144 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 136 insertions(+), 8 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 0c11b08c6..bc626492f 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -7151,14 +7151,142 @@ const cpu_family_t cpu_families[] = { .name = "Pentium II Xeon", .internal_name = "pentium2_xeon", .cpus = (const CPU[]) { - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 9, 9, 3, 3, 12}, /* out of spec */ - {"150", CPU_PENTIUM2D, fpus_internal, 150000000, 1.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 14,14, 4, 4, 18}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 2.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 18,18, 6, 6, 24}, /* out of spec */ - {"250", CPU_PENTIUM2D, fpus_internal, 250000000, 2.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 22,22, 7, 7, 30}, /* out of spec */ - {"300", CPU_PENTIUM2D, fpus_internal, 300000000, 3.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 27,27, 9, 9, 36}, /* out of spec */ - {"350", CPU_PENTIUM2D, fpus_internal, 350000000, 3.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 32,32,10,10, 42}, /* out of spec */ - {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 4.0, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 36,36,12,12, 48}, - {"450", CPU_PENTIUM2D, fpus_internal, 450000000, 4.5, 2050, 0x652, 0x652, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, 41,41,14,14, 54}, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "150", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 18 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 24 + }, + { /* out of spec */ + .name = "250", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 22, + .mem_write_cycles = 22, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 30 + }, + { /* out of spec */ + .name = "300", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 36 + }, + { /* out of spec */ + .name = "350", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 10, + .cache_write_cycles = 10, + .atclk_div = 42 + }, + { + .name = "400", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { + .name = "450", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 54 + }, { .name = "", 0 } } }, From decce7720483edab212c7fac19940f48d4893cd4 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 18:47:11 -0400 Subject: [PATCH 180/624] Named initializers for Socket 370's --- src/cpu/cpu_table.c | 684 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 646 insertions(+), 38 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index bc626492f..e461ed7b5 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -7296,21 +7296,261 @@ const cpu_family_t cpu_families[] = { .name = "Celeron (Mendocino)", .internal_name = "celeron_mendocino", .cpus = (const CPU[]) { - {"66", CPU_PENTIUM2D, fpus_internal, 66666666, 1.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of spec */ - {"100", CPU_PENTIUM2D, fpus_internal, 100000000, 1.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 8, 8, 4, 4, 12}, /* out of spec */ - {"133", CPU_PENTIUM2D, fpus_internal, 133333333, 2.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 11,11, 5, 5, 16}, /* out of spec */ - {"166", CPU_PENTIUM2D, fpus_internal, 166666666, 2.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 14,14, 7, 7, 20}, /* out of spec */ - {"200", CPU_PENTIUM2D, fpus_internal, 200000000, 3.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 17,17, 8, 8, 24}, /* out of spec */ - {"233", CPU_PENTIUM2D, fpus_internal, 233333333, 3.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 19,19, 9, 9, 28}, /* out of spec */ - {"266", CPU_PENTIUM2D, fpus_internal, 266666666, 4.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 22,22,11,11, 32}, /* out of spec */ - {"300A", CPU_PENTIUM2D, fpus_internal, 300000000, 4.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 25,25,12,12, 36}, - {"333", CPU_PENTIUM2D, fpus_internal, 333333333, 5.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 27,27,13,13, 40}, - {"366", CPU_PENTIUM2D, fpus_internal, 366666666, 5.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 33,33,17,17, 44}, - {"400", CPU_PENTIUM2D, fpus_internal, 400000000, 6.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 36,36,12,12, 48}, - {"433", CPU_PENTIUM2D, fpus_internal, 433333333, 6.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 39,39,13,13, 51}, - {"466", CPU_PENTIUM2D, fpus_internal, 466666666, 7.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 42,42,14,14, 56}, - {"500", CPU_PENTIUM2D, fpus_internal, 500000000, 7.5, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 45,45,15,15, 60}, - {"533", CPU_PENTIUM2D, fpus_internal, 533333333, 8.0, 2050, 0x665, 0x665, 0, CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, 48,48,17,17, 64}, + { /* out of spec */ + .name = "66", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, + { /* out of spec */ + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of spec */ + .name = "133", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 11, + .mem_write_cycles = 11, + .cache_read_cycles = 5, + .cache_write_cycles = 5, + .atclk_div = 16 + }, + { /* out of spec */ + .name = "166", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of spec */ + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 17, + .mem_write_cycles = 17, + .cache_read_cycles = 8, + .cache_write_cycles = 8, + .atclk_div = 24 + }, + { /* out of spec */ + .name = "233", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 19, + .mem_write_cycles = 19, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 28 + }, + { /* out of spec */ + .name = "266", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 22, + .mem_write_cycles = 22, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 32 + }, + { + .name = "300A", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 25, + .mem_write_cycles = 25, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 36 + }, + { + .name = "333", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 333333333, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 40 + }, + { + .name = "366", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 44 + }, + { + .name = "400", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 6.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, + { + .name = "433", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 433333333, + .multi = 6.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 39, + .mem_write_cycles = 39, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 51 + }, + { + .name = "466", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 466666666, + .multi = 7.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 42, + .mem_write_cycles = 42, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 56 + }, + { + .name = "500", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 7.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 60 + }, + { + .name = "533", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 533333333, + .multi = 8.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 48, + .mem_write_cycles = 48, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 64 + }, { .name = "", 0 } } }, @@ -7320,29 +7560,397 @@ const cpu_family_t cpu_families[] = { .name = "Cyrix III", .internal_name = "c3_samuel", .cpus = (const CPU[]) { - {"66", CPU_CYRIX3S, fpus_internal, 66666666, 1.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 6, 6, 3, 3, 8}, /* out of multiplier range */ - {"100", CPU_CYRIX3S, fpus_internal, 100000000, 1.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 9, 9, 4, 4, 12}, /* out of multiplier range */ - {"133", CPU_CYRIX3S, fpus_internal, 133333333, 2.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 12, 12, 6, 6, 16}, /* out of multiplier range */ - {"166", CPU_CYRIX3S, fpus_internal, 166666666, 2.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 15, 15, 7, 7, 20}, /* out of multiplier range */ - {"200", CPU_CYRIX3S, fpus_internal, 200000000, 3.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 18, 18, 8, 8, 24}, /* out of multiplier range */ - {"233", CPU_CYRIX3S, fpus_internal, 233333333, 3.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 21, 21, 9, 9, 28}, /* out of multiplier range */ - {"266", CPU_CYRIX3S, fpus_internal, 266666666, 4.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 24, 24, 12, 12, 32}, /* out of multiplier range */ - {"300", CPU_CYRIX3S, fpus_internal, 300000000, 4.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 27, 27, 13, 13, 36}, /* out of spec */ - {"333", CPU_CYRIX3S, fpus_internal, 333333333, 5.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 30, 30, 15, 15, 40}, /* out of spec */ - {"366", CPU_CYRIX3S, fpus_internal, 366666666, 5.5, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 33, 33, 16, 16, 44}, /* out of spec */ - {"400", CPU_CYRIX3S, fpus_internal, 400000000, 6.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 36, 36, 17, 17, 48}, - {"433", CPU_CYRIX3S, fpus_internal, 433333333, 6.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 39, 39, 18, 18, 52}, /* out of spec */ - {"450", CPU_CYRIX3S, fpus_internal, 450000000, 4.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 41, 41, 14, 14, 54}, - {"466", CPU_CYRIX3S, fpus_internal, 466666666, 6.5, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 42, 42, 14, 14, 56}, /* out of spec */ - {"500", CPU_CYRIX3S, fpus_internal, 500000000, 5.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 45, 45, 15, 15, 60}, - {"533", CPU_CYRIX3S, fpus_internal, 533333333, 8.0, 2050, 0x660, 0x660, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 48, 48, 15, 15, 64}, /* out of spec */ - {"550", CPU_CYRIX3S, fpus_internal, 550000000, 5.5, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 50, 50, 17, 17, 66}, - {"600/100", CPU_CYRIX3S, fpus_internal, 600000000, 6.0, 2050, 0x662, 0x662, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 54, 54, 18, 18, 72}, - {"600/133", CPU_CYRIX3S, fpus_internal, 600000000, 4.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 54, 54, 13, 13, 72}, - {"650", CPU_CYRIX3S, fpus_internal, 650000000, 6.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 58, 58, 20, 20, 78}, - {"667", CPU_CYRIX3S, fpus_internal, 666666667, 5.0, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 60, 60, 16, 16, 80}, - {"700", CPU_CYRIX3S, fpus_internal, 700000000, 7.0, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 63, 63, 21, 21, 84}, - {"733", CPU_CYRIX3S, fpus_internal, 733333333, 5.5, 2050, 0x663, 0x663, 0, CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, 66, 66, 18, 18, 88}, + { /* out of multiplier range */ + .name = "66", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, + { /* out of multiplier range */ + .name = "100", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, + { /* out of multiplier range */ + .name = "133", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, + { /* out of multiplier range */ + .name = "166", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, + { /* out of multiplier range */ + .name = "200", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 8, + .cache_write_cycles = 8, + .atclk_div = 24 + }, + { /* out of multiplier range */ + .name = "233", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 28 + }, + { /* out of multiplier range */ + .name = "266", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, + { /* out of spec */ + .name = "300", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 36 + }, + { /* out of spec */ + .name = "333", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 333333333, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 40 + }, + { /* out of spec */ + .name = "366", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 16, + .cache_write_cycles = 16, + .atclk_div = 44 + }, + { + .name = "400", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 6.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 48 + }, + { /* out of spec */ + .name = "433", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 433333333, + .multi = 6.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 39, + .mem_write_cycles = 39, + .cache_read_cycles = 18, + .cache_write_cycles = 18, + .atclk_div = 52 + }, + { + .name = "450", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 54 + }, + { /* out of spec */ + .name = "466", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 466666666, + .multi = 6.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 42, + .mem_write_cycles = 42, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 56 + }, + { + .name = "500", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 60 + }, + { /* out of spec */ + .name = "533", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 533333333, + .multi = 8.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 48, + .mem_write_cycles = 48, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 64 + }, + { + .name = "550", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 550000000, + .multi = 5.5, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 50, + .mem_write_cycles = 50, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 66 + }, + { + .name = "600/100", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 600000000, + .multi = 6.0, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 54, + .mem_write_cycles = 54, + .cache_read_cycles = 18, + .cache_write_cycles = 18, + .atclk_div = 72 + }, + { + .name = "600/133", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 600000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 54, + .mem_write_cycles = 54, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 72 + }, + { + .name = "650", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 650000000, + .multi = 6.5, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 58, + .mem_write_cycles = 58, + .cache_read_cycles = 20, + .cache_write_cycles = 20, + .atclk_div = 78 + }, + { + .name = "667", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 666666667, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 60, + .mem_write_cycles = 60, + .cache_read_cycles = 16, + .cache_write_cycles = 16, + .atclk_div = 80 + }, + { + .name = "700", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 700000000, + .multi = 7.0, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 63, + .mem_write_cycles = 63, + .cache_read_cycles = 21, + .cache_write_cycles = 21, + .atclk_div = 84 + }, + { + .name = "733", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 733333333, + .multi = 5.5, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 66, + .mem_write_cycles = 66, + .cache_read_cycles = 18, + .cache_write_cycles = 18, + .atclk_div = 88 + }, { .name = "", 0 } } }, From cb6cc140d2a01d3bd694cb27b4cb891180399dcd Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 19:39:32 -0400 Subject: [PATCH 181/624] Bits of cpu_table formatting which escaped --- src/cpu/cpu_table.c | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index e461ed7b5..e363f3983 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -80,7 +80,7 @@ const cpu_family_t cpu_families[] = { .name = "4.77", .cpu_type = CPU_8088, .fpus = fpus_8088, - .rspeed = 4772728, + .rspeed = 4772728, .multi = 1, .voltage = 5000, .edx_reset = 0, @@ -97,7 +97,7 @@ const cpu_family_t cpu_families[] = { .name = "7.16", .cpu_type = CPU_8088, .fpus = fpus_8088, - .rspeed = 7159092, + .rspeed = 7159092, .multi = 1, .voltage = 5000, .edx_reset = 0, @@ -114,7 +114,7 @@ const cpu_family_t cpu_families[] = { .name = "8", .cpu_type = CPU_8088, .fpus = fpus_8088, - .rspeed = 8000000, + .rspeed = 8000000, .multi = 1, .voltage = 5000, .edx_reset = 0, @@ -132,7 +132,7 @@ const cpu_family_t cpu_families[] = { .name = "9.54", .cpu_type = CPU_8088, .fpus = fpus_8088, - .rspeed = 9545456, + .rspeed = 9545456, .multi = 1, .voltage = 5000, .edx_reset = 0, @@ -3282,10 +3282,38 @@ const cpu_family_t cpu_families[] = { .internal_name = "cx486dx4", .cpus = (const CPU[]) { { - .name = "75", .cpu_type = CPU_Cx486DX, .fpus = fpus_internal, .rspeed = 75000000, .multi = 3.0, .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x361f, .cpu_flags = CPU_SUPPORTS_DYNAREC, .mem_read_cycles = 12,.mem_write_cycles = 12, .cache_read_cycles = 9, .cache_write_cycles = 9, .atclk_div = 9 + .name = "75", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x361f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 }, { - .name = "100", .cpu_type = CPU_Cx486DX, .fpus = fpus_internal, .rspeed = 100000000, .multi = 3.0, .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x361f, .cpu_flags = CPU_SUPPORTS_DYNAREC, .mem_read_cycles = 15,.mem_write_cycles = 15, .cache_read_cycles = 9, .cache_write_cycles = 9, .atclk_div = 12 + .name = "100", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x361f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 }, { .name = "", 0 } } From 56cc182e61ce05b13c02ef07d03a3b6f82cb8a32 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 19:53:27 -0400 Subject: [PATCH 182/624] Align assignments in cpu_table --- src/cpu/cpu_table.c | 12636 +++++++++++++++++++++--------------------- 1 file changed, 6323 insertions(+), 6313 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index e363f3983..199e197df 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -71,7914 +71,7924 @@ FPU fpus_internal[] = { const cpu_family_t cpu_families[] = { // clang-format off { - .package = CPU_PKG_8088, - .manufacturer = "Intel", - .name = "8088", + .package = CPU_PKG_8088, + .manufacturer = "Intel", + .name = "8088", .internal_name = "8088", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "4.77", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 4772728, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "4.77", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 4772728, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "7.16", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "7.16", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "8", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "8", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, #if 0 { - .name = "9.54", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 9545456, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "9.54", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 9545456, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, #endif { - .name = "10", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "10", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "12", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "12", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "16", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "16", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { .name = "", 0 } } }, { - .package = CPU_PKG_8088_EUROPC, - .manufacturer = "Intel", - .name = "8088", + .package = CPU_PKG_8088_EUROPC, + .manufacturer = "Intel", + .name = "8088", .internal_name = "8088_europc", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "4.77", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 4772728, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "4.77", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 4772728, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "7.16", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "7.16", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "9.54", - .cpu_type = CPU_8088, - .fpus = fpus_8088, - .rspeed = 9545456, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "9.54", + .cpu_type = CPU_8088, + .fpus = fpus_8088, + .rspeed = 9545456, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { .name = "", 0 } } }, { - .package = CPU_PKG_8086, - .manufacturer = "Intel", - .name = "8086", + .package = CPU_PKG_8086, + .manufacturer = "Intel", + .name = "8086", .internal_name = "8086", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "7.16", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "7.16", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "8", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "8", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "9.54", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 9545456, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "9.54", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 9545456, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "10", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "10", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "12", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "12", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "16", - .cpu_type = CPU_8086, - .fpus = fpus_8088, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "16", + .cpu_type = CPU_8086, + .fpus = fpus_8088, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 2 + .atclk_div = 2 }, { .name = "", 0 } } }, { - .package = CPU_PKG_188, - .manufacturer = "Intel", - .name = "80188", + .package = CPU_PKG_188, + .manufacturer = "Intel", + .name = "80188", .internal_name = "80188", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "6", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 6000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "6", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 6000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "7.16", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "7.16", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "8", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "8", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "9.54", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 9545456, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "9.54", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 9545456, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "10", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "10", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "12", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "12", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "16", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "16", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "20", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_188, - .fpus = fpus_8088, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "25", + .cpu_type = CPU_188, + .fpus = fpus_8088, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 3 + .atclk_div = 3 }, { .name = "", 0 } } }, { - .package = CPU_PKG_8088, - .manufacturer = "NEC", - .name = "V20", + .package = CPU_PKG_8088, + .manufacturer = "NEC", + .name = "V20", .internal_name = "necv20", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "4.77", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 4772728, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "4.77", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 4772728, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "7.16", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 7159092, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "7.16", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 7159092, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "10", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "10", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "12", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "12", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "16", - .cpu_type = CPU_V20, - .fpus = fpus_8088, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "16", + .cpu_type = CPU_V20, + .fpus = fpus_8088, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 2 + .atclk_div = 2 }, { .name = "", 0 } } }, { - .package = CPU_PKG_186, - .manufacturer = "Intel", - .name = "80186", + .package = CPU_PKG_186, + .manufacturer = "Intel", + .name = "80186", .internal_name = "80186", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "6", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 6000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "6", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 6000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "7.16", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 7159092, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "7.16", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 7159092, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "8", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 8000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "8", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 8000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "9.54", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 9545456, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_ALTERNATE_XTAL, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "9.54", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 9545456, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_ALTERNATE_XTAL, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "10", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 10000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "10", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 10000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "12", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 12000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "12", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 12000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "16", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 16000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "16", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 16000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 20000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "20", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 20000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_186, - .fpus = fpus_80186, - .rspeed = 25000000, - .multi = 1, - .voltage = 0, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "25", + .cpu_type = CPU_186, + .fpus = fpus_80186, + .rspeed = 25000000, + .multi = 1, + .voltage = 0, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 3 + .atclk_div = 3 }, { .name = "", 0 } } }, { - .package = CPU_PKG_8086, - .manufacturer = "NEC", - .name = "V30", + .package = CPU_PKG_8086, + .manufacturer = "NEC", + .name = "V30", .internal_name = "necv30", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "5", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 5000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "5", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 5000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "8", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "8", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "10", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "10", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "12", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 12000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "12", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 12000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "16", - .cpu_type = CPU_V30, - .fpus = fpus_80186, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 0, - .mem_write_cycles = 0, - .cache_read_cycles = 0, + .name = "16", + .cpu_type = CPU_V30, + .fpus = fpus_80186, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 0, + .mem_write_cycles = 0, + .cache_read_cycles = 0, .cache_write_cycles = 0, - .atclk_div = 2 + .atclk_div = 2 }, { .name = "", 0 } } }, { - .package = CPU_PKG_286, - .manufacturer = "Intel", - .name = "80286", + .package = CPU_PKG_286, + .manufacturer = "Intel", + .name = "80286", .internal_name = "286", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "6", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 6000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 2, - .mem_write_cycles = 2, - .cache_read_cycles = 2, + .name = "6", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 6000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 2, + .mem_write_cycles = 2, + .cache_read_cycles = 2, .cache_write_cycles = 2, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "8", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 8000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 2, - .mem_write_cycles = 2, - .cache_read_cycles = 2, + .name = "8", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 8000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 2, + .mem_write_cycles = 2, + .cache_read_cycles = 2, .cache_write_cycles = 2, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "10", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 10000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 2, - .mem_write_cycles = 2, - .cache_read_cycles = 2, + .name = "10", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 10000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 2, + .mem_write_cycles = 2, + .cache_read_cycles = 2, .cache_write_cycles = 2, - .atclk_div = 1 + .atclk_div = 1 }, { - .name = "12", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 12500000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, + .name = "12", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 12500000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "16", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, + .name = "16", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 4, + .name = "20", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_286, - .fpus = fpus_80286, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 4, + .name = "25", + .cpu_type = CPU_286, + .fpus = fpus_80286, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 3 + .atclk_div = 3 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Intel", - .name = "i386SX", + .package = CPU_PKG_386SX, + .manufacturer = "Intel", + .name = "i386SX", .internal_name = "i386sx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "16", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, + .name = "16", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "20", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386SX, - .manufacturer = "AMD", - .name = "Am386SX", + .package = CPU_PKG_386SX, + .manufacturer = "AMD", + .name = "Am386SX", .internal_name = "am386sx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "16", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, + .name = "16", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "20", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_386SX, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Intel", - .name = "i386DX", + .package = CPU_PKG_386DX, + .manufacturer = "Intel", + .name = "i386DX", .internal_name = "i386dx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "16", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, + .name = "16", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "20", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386DX_DESKPRO386, - .manufacturer = "Intel", - .name = "i386DX", + .package = CPU_PKG_386DX_DESKPRO386, + .manufacturer = "Intel", + .name = "i386DX", .internal_name = "i386dx_deskpro386", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "16", - .cpu_type = CPU_386DX, - .fpus = fpus_80286, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, + .name = "16", + .cpu_type = CPU_386DX, + .fpus = fpus_80286, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "20", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Intel", - .name = "RapidCAD", + .package = CPU_PKG_386DX, + .manufacturer = "Intel", + .name = "RapidCAD", .internal_name = "rapidcad", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "25", - .cpu_type = CPU_RAPIDCAD, - .fpus = fpus_internal, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0340, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_RAPIDCAD, - .fpus = fpus_internal, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0340, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_RAPIDCAD, - .fpus = fpus_internal, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0340, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_RAPIDCAD, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0340, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386DX, - .manufacturer = "AMD", - .name = "Am386DX", + .package = CPU_PKG_386DX, + .manufacturer = "AMD", + .name = "Am386DX", .internal_name = "am386dx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "25", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_386DX, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x0308, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_386DX, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x0308, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_M6117, - .manufacturer = "ALi", - .name = "M6117", + .package = CPU_PKG_M6117, + .manufacturer = "ALi", + .name = "M6117", .internal_name = "m6117", - .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ + .cpus = (const CPU[]) { /* All timings and edx_reset values assumed. */ { - .name = "33", - .cpu_type = CPU_386SX, - .fpus = fpus_none, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2309, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_386SX, + .fpus = fpus_none, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2309, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_386SX, - .fpus = fpus_none, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x2309, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_386SX, + .fpus = fpus_none, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x2309, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386SLC_IBM, - .manufacturer = "IBM", - .name = "386SLC", + .package = CPU_PKG_386SLC_IBM, + .manufacturer = "IBM", + .name = "386SLC", .internal_name = "ibm386slc", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "16", - .cpu_type = CPU_IBM386SLC, - .fpus = fpus_80386, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0xA301, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, + .name = "16", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_IBM386SLC, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0xA301, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "20", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_IBM386SLC, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0xA301, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_IBM386SLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA301, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Cyrix", - .name = "Cx486SLC", + .package = CPU_PKG_386SX, + .manufacturer = "Cyrix", + .name = "Cx486SLC", .internal_name = "cx486slc", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "20", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x400, - .cpuid_model = 0, - .cyrix_id = 0x0000, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "20", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x400, - .cpuid_model = 0, - .cyrix_id = 0x0000, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x400, - .cpuid_model = 0, - .cyrix_id = 0x0000, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x400, + .cpuid_model = 0, + .cyrix_id = 0x0000, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386SX, - .manufacturer = "Cyrix", - .name = "Cx486SRx2", + .package = CPU_PKG_386SX, + .manufacturer = "Cyrix", + .name = "Cx486SRx2", .internal_name = "cx486srx2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "32", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 32000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x406, - .cpuid_model = 0, - .cyrix_id = 0x0006, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 6, + .name = "32", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 32000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x406, - .cpuid_model = 0, - .cyrix_id = 0x0006, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "40", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "50", - .cpu_type = CPU_486SLC, - .fpus = fpus_80386, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x406, - .cpuid_model = 0, - .cyrix_id = 0x0006, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_486SLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x406, + .cpuid_model = 0, + .cyrix_id = 0x0006, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { .name = "", 0 } } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .name = "486SLC", + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .name = "486SLC", .internal_name = "ibm486slc", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "33", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0xA401, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0xA401, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { .name = "", 0 } } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .name = "486SLC2", + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .name = "486SLC2", .internal_name = "ibm486slc2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "40", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0xA421, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 6, + .name = "40", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 5 + .atclk_div = 5 }, { - .name = "50", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0xA421, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0xA421, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0xA421, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, { - .package = CPU_PKG_486SLC_IBM, - .manufacturer = "IBM", - .name = "486SLC3", + .package = CPU_PKG_486SLC_IBM, + .manufacturer = "IBM", + .name = "486SLC3", .internal_name = "ibm486slc3", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "60", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 60000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, + .name = "60", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 60000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 7 + .atclk_div = 7 }, { - .name = "75", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 75000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, + .name = "75", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 75000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 9 + .atclk_div = 9 }, { - .name = "100", - .cpu_type = CPU_IBM486SLC, - .fpus = fpus_80386, - .rspeed = 100000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0xA439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "100", + .cpu_type = CPU_IBM486SLC, + .fpus = fpus_80386, + .rspeed = 100000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0xA439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 12 + .atclk_div = 12 }, { .name = "", 0 } } }, { - .package = CPU_PKG_486BL, - .manufacturer = "IBM", - .name = "486BL2", + .package = CPU_PKG_486BL, + .manufacturer = "IBM", + .name = "486BL2", .internal_name = "ibm486bl2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "50", - .cpu_type = CPU_IBM486BL, - .fpus = fpus_80386, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x8439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x8439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_IBM486BL, - .fpus = fpus_80386, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x8439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x8439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, { - .package = CPU_PKG_486BL, - .manufacturer = "IBM", - .name = "486BL3", + .package = CPU_PKG_486BL, + .manufacturer = "IBM", + .name = "486BL3", .internal_name = "ibm486bl3", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75", - .cpu_type = CPU_IBM486BL, - .fpus = fpus_80386, - .rspeed = 75000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0x8439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, + .name = "75", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 75000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0x8439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 9 + .atclk_div = 9 }, { - .name = "100", - .cpu_type = CPU_IBM486BL, - .fpus = fpus_80386, - .rspeed = 100000000, - .multi = 3, - .voltage = 5000, - .edx_reset = 0x8439, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = 0, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "100", + .cpu_type = CPU_IBM486BL, + .fpus = fpus_80386, + .rspeed = 100000000, + .multi = 3, + .voltage = 5000, + .edx_reset = 0x8439, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = 0, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 12 + .atclk_div = 12 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Cyrix", - .name = "Cx486DLC", + .package = CPU_PKG_386DX, + .manufacturer = "Cyrix", + .name = "Cx486DLC", .internal_name = "cx486dlc", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "25", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x401, - .cpuid_model = 0, - .cyrix_id = 0x0001, - .cpu_flags = 0, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x401, - .cpuid_model = 0, - .cyrix_id = 0x0001, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x401, - .cpuid_model = 0, - .cyrix_id = 0x0001, - .cpu_flags = 0, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x401, + .cpuid_model = 0, + .cyrix_id = 0x0001, + .cpu_flags = 0, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_386DX, - .manufacturer = "Cyrix", - .name = "Cx486DRx2", + .package = CPU_PKG_386DX, + .manufacturer = "Cyrix", + .name = "Cx486DRx2", .internal_name = "cx486drx2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "32", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 32000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x407, - .cpuid_model = 0, - .cyrix_id = 0x0007, - .cpu_flags = 0, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 6, + .name = "32", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 32000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 40000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x407, - .cpuid_model = 0, - .cyrix_id = 0x0007, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "40", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "50", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x407, - .cpuid_model = 0, - .cyrix_id = 0x0007, - .cpu_flags = 0, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_486DLC, - .fpus = fpus_80386, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x407, - .cpuid_model = 0, - .cyrix_id = 0x0007, - .cpu_flags = 0, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_486DLC, + .fpus = fpus_80386, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x407, + .cpuid_model = 0, + .cyrix_id = 0x0007, + .cpu_flags = 0, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486SX", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486SX", .internal_name = "i486sx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "16", - .cpu_type = CPU_i486SX, - .fpus = fpus_486sx, - .rspeed = 16000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x420, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 3, - .mem_write_cycles = 3, - .cache_read_cycles = 3, + .name = "16", + .cpu_type = CPU_i486SX, + .fpus = fpus_486sx, + .rspeed = 16000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 3, + .mem_write_cycles = 3, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 2 + .atclk_div = 2 }, { - .name = "20", - .cpu_type = CPU_i486SX, - .fpus = fpus_486sx, - .rspeed = 20000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x420, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "20", + .cpu_type = CPU_i486SX, + .fpus = fpus_486sx, + .rspeed = 20000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "25", - .cpu_type = CPU_i486SX, - .fpus = fpus_486sx, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x422, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_i486SX, + .fpus = fpus_486sx, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_i486SX, - .fpus = fpus_486sx, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x422, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_i486SX, + .fpus = fpus_486sx, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486SX-S", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486SX-S", .internal_name = "i486sx_slenh", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "25", - .cpu_type = CPU_i486SX_SLENH, - .fpus = fpus_486sx, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x423, - .cpuid_model = 0x423, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_i486SX_SLENH, + .fpus = fpus_486sx, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x423, + .cpuid_model = 0x423, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_i486SX_SLENH, - .fpus = fpus_486sx, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x42a, - .cpuid_model = 0x42a, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_i486SX_SLENH, + .fpus = fpus_486sx, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x42a, + .cpuid_model = 0x42a, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486SX2", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486SX2", .internal_name = "i486sx2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "50", - .cpu_type = CPU_i486SX_SLENH, - .fpus = fpus_486sx, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x45b, - .cpuid_model = 0x45b, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_i486SX_SLENH, + .fpus = fpus_486sx, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x45b, + .cpuid_model = 0x45b, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66 (Q0569)", - .cpu_type = CPU_i486SX_SLENH, - .fpus = fpus_486sx, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x45b, - .cpuid_model = 0x45b, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "66 (Q0569)", + .cpu_type = CPU_i486SX_SLENH, + .fpus = fpus_486sx, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x45b, + .cpuid_model = 0x45b, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486DX", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX", .internal_name = "i486dx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "25", - .cpu_type = CPU_i486DX, - .fpus = fpus_internal, - .rspeed = 25000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x404, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 25000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x404, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_i486DX, - .fpus = fpus_internal, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x404, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x404, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "50", - .cpu_type = CPU_i486DX, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x411, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 4, + .name = "50", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x411, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 6 + .atclk_div = 6 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486DX-S", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX-S", .internal_name = "i486dx_slenh", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "33", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x414, - .cpuid_model = 0x414, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x414, + .cpuid_model = 0x414, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "50", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x414, - .cpuid_model = 0x414, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 4, + .name = "50", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x414, + .cpuid_model = 0x414, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 6 + .atclk_div = 6 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486DX2", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX2", .internal_name = "i486dx2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "40", - .cpu_type = CPU_i486DX, - .fpus = fpus_internal, - .rspeed = 40000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 6, + .name = "40", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 5 + .atclk_div = 5 }, { - .name = "50", - .cpu_type = CPU_i486DX, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x433, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x433, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_i486DX, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x433, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_i486DX, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x433, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Intel", - .name = "i486DX2-S", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Intel", + .name = "i486DX2-S", .internal_name = "i486dx2_slenh", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "40", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 40000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x435, - .cpuid_model = 0x435, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 6, + .name = "40", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 5 + .atclk_div = 5 }, { - .name = "50", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x435, - .cpuid_model = 0x435, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x435, - .cpuid_model = 0x435, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1 | CPU_PKG_SOCKET3_PC330, - .manufacturer = "Intel", - .name = "i486DX2 WB", + .package = CPU_PKG_SOCKET1 | CPU_PKG_SOCKET3_PC330, + .manufacturer = "Intel", + .name = "i486DX2 WB", .internal_name = "i486dx2_pc330", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "50", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x436, - .cpuid_model = 0x436, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x436, + .cpuid_model = 0x436, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x436, - .cpuid_model = 0x436, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x436, + .cpuid_model = 0x436, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, - { - .package = CPU_PKG_SOCKET1 | CPU_PKG_SOCKET3_PC330, /*OEM versions are 3.3V, Retail versions are 3.3V with a 5V regulator for installation in older boards. They are functionally identical*/ - .manufacturer = "Intel", - .name = "iDX4", + { /*OEM versions are 3.3V, Retail versions are 3.3V with a 5V regulator for installation in older boards. They are functionally identical*/ + .package = CPU_PKG_SOCKET1 | CPU_PKG_SOCKET3_PC330, + .manufacturer = "Intel", + .name = "iDX4", .internal_name = "idx4", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x480, - .cpuid_model = 0x480, - .cyrix_id = 0x0000, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, + .name = "75", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0x480, + .cyrix_id = 0x0000, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 9 + .atclk_div = 9 }, { - .name = "100", - .cpu_type = CPU_i486DX_SLENH, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x483, - .cpuid_model = 0x483, - .cyrix_id = 0x0000, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "100", + .cpu_type = CPU_i486DX_SLENH, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x483, + .cpuid_model = 0x483, + .cyrix_id = 0x0000, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 12 + .atclk_div = 12 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET3 | CPU_PKG_SOCKET3_PC330, - .manufacturer = "Intel", - .name = "Pentium OverDrive", + .package = CPU_PKG_SOCKET3 | CPU_PKG_SOCKET3_PC330, + .manufacturer = "Intel", + .name = "Pentium OverDrive", .internal_name = "pentium_p24t", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "63", - .cpu_type = CPU_P24T, - .fpus = fpus_internal, - .rspeed = 62500000, - .multi = 2.5, - .voltage = 5000, - .edx_reset = 0x1531, - .cpuid_model = 0x1531, - .cyrix_id = 0x0000, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 10, - .mem_write_cycles = 10, - .cache_read_cycles = 7, + .name = "63", + .cpu_type = CPU_P24T, + .fpus = fpus_internal, + .rspeed = 62500000, + .multi = 2.5, + .voltage = 5000, + .edx_reset = 0x1531, + .cpuid_model = 0x1531, + .cyrix_id = 0x0000, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 15/2 + .atclk_div = 15/2 }, { - .name = "83", - .cpu_type = CPU_P24T, - .fpus = fpus_internal, - .rspeed = 83333333, - .multi = 2.5, - .voltage = 5000, - .edx_reset = 0x1532, - .cpuid_model = 0x1532, - .cyrix_id = 0x0000, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 8, + .name = "83", + .cpu_type = CPU_P24T, + .fpus = fpus_internal, + .rspeed = 83333333, + .multi = 2.5, + .voltage = 5000, + .edx_reset = 0x1532, + .cpuid_model = 0x1532, + .cyrix_id = 0x0000, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 8, .cache_write_cycles = 8, - .atclk_div = 10 + .atclk_div = 10 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486SX", + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486SX", .internal_name = "am486sx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "33", - .cpu_type = CPU_Am486SX, - .fpus = fpus_486sx, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x422, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_Am486SX, + .fpus = fpus_486sx, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_Am486SX, - .fpus = fpus_486sx, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x422, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_Am486SX, + .fpus = fpus_486sx, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486SX2", + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486SX2", .internal_name = "am486sx2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "50", - .cpu_type = CPU_Am486SX, - .fpus = fpus_486sx, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x45b, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_Am486SX, + .fpus = fpus_486sx, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x45b, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_Am486SX, - .fpus = fpus_486sx, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x45b, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_Am486SX, + .fpus = fpus_486sx, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x45b, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486DX", + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486DX", .internal_name = "am486dx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "33", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x412, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x412, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x412, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x412, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486DX2", + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486DX2", .internal_name = "am486dx2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "50", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { - .name = "80", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 80000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 14, - .mem_write_cycles = 14, - .cache_read_cycles = 6, + .name = "80", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 10 + .atclk_div = 10 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486DXL", + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486DXL", .internal_name = "am486dxl", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "33", - .cpu_type = CPU_Am486DXL, - .fpus = fpus_internal, - .rspeed = 33333333, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x422, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_Am486DXL, - .fpus = fpus_internal, - .rspeed = 40000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x422, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x422, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "AMD", - .name = "Am486DXL2", + .package = CPU_PKG_SOCKET1, + .manufacturer = "AMD", + .name = "Am486DXL2", .internal_name = "am486dxl2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "50", - .cpu_type = CPU_Am486DXL, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_Am486DXL, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { - .name = "80", - .cpu_type = CPU_Am486DXL, - .fpus = fpus_internal, - .rspeed = 80000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 14, - .mem_write_cycles = 14, - .cache_read_cycles = 6, + .name = "80", + .cpu_type = CPU_Am486DXL, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 10 + .atclk_div = 10 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "AMD", - .name = "Am486DX4", + .package = CPU_PKG_SOCKET3, + .manufacturer = "AMD", + .name = "Am486DX4", .internal_name = "am486dx4", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, + .name = "75", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 9 + .atclk_div = 9 }, { - .name = "90", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 90000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 9, + .name = "90", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "100", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 9, + .name = "100", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "120", - .cpu_type = CPU_Am486DX, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x432, - .cpuid_model = 0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 9, + .name = "120", + .cpu_type = CPU_Am486DX, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x432, + .cpuid_model = 0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 15 + .atclk_div = 15 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "AMD", - .name = "Am486DX2 (Enhanced)", + .package = CPU_PKG_SOCKET3, + .manufacturer = "AMD", + .name = "Am486DX2 (Enhanced)", .internal_name = "am486dx2_slenh", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "66", - .cpu_type = CPU_ENH_Am486DX, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x435, - .cpuid_model = 0x435, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { - .name = "80", - .cpu_type = CPU_ENH_Am486DX, - .fpus = fpus_internal, - .rspeed = 80000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x435, - .cpuid_model = 0x435, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 14, - .mem_write_cycles = 14, - .cache_read_cycles = 6, + .name = "80", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x435, + .cpuid_model = 0x435, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 10 + .atclk_div = 10 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "AMD", - .name = "Am486DX4 (Enhanced)", + .package = CPU_PKG_SOCKET3, + .manufacturer = "AMD", + .name = "Am486DX4 (Enhanced)", .internal_name = "am486dx4_slenh", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75", - .cpu_type = CPU_ENH_Am486DX, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x482, - .cpuid_model = 0x482, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, + .name = "75", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x482, + .cpuid_model = 0x482, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 9 + .atclk_div = 9 }, { - .name = "100", - .cpu_type = CPU_ENH_Am486DX, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x482, - .cpuid_model = 0x482, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 9, + .name = "100", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x482, + .cpuid_model = 0x482, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "120", - .cpu_type = CPU_ENH_Am486DX, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x482, - .cpuid_model = 0x482, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 9, + .name = "120", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x482, + .cpuid_model = 0x482, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 15 + .atclk_div = 15 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "AMD", - .name = "Am5x86", + .package = CPU_PKG_SOCKET3, + .manufacturer = "AMD", + .name = "Am5x86", .internal_name = "am5x86", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "133 (P75)", - .cpu_type = CPU_ENH_Am486DX, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 4.0, - .voltage = 5000, - .edx_reset = 0x4e0, - .cpuid_model = 0x4e0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "133 (P75)", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 4.0, + .voltage = 5000, + .edx_reset = 0x4e0, + .cpuid_model = 0x4e0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 16 + .atclk_div = 16 }, { /*The rare P75+ was indeed a triple-clocked 150 MHz according to research*/ - .name = "150 (P75+)", - .cpu_type = CPU_ENH_Am486DX, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x482, - .cpuid_model = 0x482, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 28, - .mem_write_cycles = 28, - .cache_read_cycles = 12, + .name = "150 (P75+)", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x482, + .cpuid_model = 0x482, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 28, + .mem_write_cycles = 28, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 20 + .atclk_div = 20 }, { /*160 MHz on a 40 MHz bus was a common overclock and "5x86/P90" was used by a number of BIOSes to refer to that configuration*/ - .name = "160 (P90)", - .cpu_type = CPU_ENH_Am486DX, - .fpus = fpus_internal, - .rspeed = 160000000, - .multi = 4.0, - .voltage = 5000, - .edx_reset = 0x4e0, - .cpuid_model = 0x4e0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 28, - .mem_write_cycles = 28, - .cache_read_cycles = 12, + .name = "160 (P90)", + .cpu_type = CPU_ENH_Am486DX, + .fpus = fpus_internal, + .rspeed = 160000000, + .multi = 4.0, + .voltage = 5000, + .edx_reset = 0x4e0, + .cpuid_model = 0x4e0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 28, + .mem_write_cycles = 28, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 20 + .atclk_div = 20 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Cyrix", - .name = "Cx486S", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Cyrix", + .name = "Cx486S", .internal_name = "cx486s", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "25", - .cpu_type = CPU_Cx486S, - .fpus = fpus_486sx, - .rspeed = 25000000, - .multi = 1.0, - .voltage = 5000, - .edx_reset = 0x420, - .cpuid_model = 0, - .cyrix_id = 0x0010, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "25", + .cpu_type = CPU_Cx486S, + .fpus = fpus_486sx, + .rspeed = 25000000, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0x0010, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 3 + .atclk_div = 3 }, { - .name = "33", - .cpu_type = CPU_Cx486S, - .fpus = fpus_486sx, - .rspeed = 33333333, - .multi = 1.0, - .voltage = 5000, - .edx_reset = 0x420, - .cpuid_model = 0, - .cyrix_id = 0x0010, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_Cx486S, + .fpus = fpus_486sx, + .rspeed = 33333333, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0x0010, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_Cx486S, - .fpus = fpus_486sx, - .rspeed = 40000000, - .multi = 1.0, - .voltage = 5000, - .edx_reset = 0x420, - .cpuid_model = 0, - .cyrix_id = 0x0010, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_Cx486S, + .fpus = fpus_486sx, + .rspeed = 40000000, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x420, + .cpuid_model = 0, + .cyrix_id = 0x0010, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Cyrix", - .name = "Cx486DX", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Cyrix", + .name = "Cx486DX", .internal_name = "cx486dx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "33", - .cpu_type = CPU_Cx486DX, - .fpus = fpus_internal, - .rspeed = 33333333, - .multi = 1.0, - .voltage = 5000, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0x051a, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "33", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 33333333, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x051a, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 4 + .atclk_div = 4 }, { - .name = "40", - .cpu_type = CPU_Cx486DX, - .fpus = fpus_internal, - .rspeed = 40000000, - .multi = 1.0, - .voltage = 5000, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0x051a, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "40", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 40000000, + .multi = 1.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x051a, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET1, - .manufacturer = "Cyrix", - .name = "Cx486DX2", + .package = CPU_PKG_SOCKET1, + .manufacturer = "Cyrix", + .name = "Cx486DX2", .internal_name = "cx486dx2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "50", - .cpu_type = CPU_Cx486DX, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 2.0, - .voltage = 5000, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0x081b, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "50", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 2.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x081b, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "66", - .cpu_type = CPU_Cx486DX, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 2.0, - .voltage = 5000, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0x0b1b, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 2.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x0b1b, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { - .name = "80", - .cpu_type = CPU_Cx486DX, - .fpus = fpus_internal, - .rspeed = 80000000, - .multi = 2.0, - .voltage = 5000, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0x311b, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 14, - .mem_write_cycles = 14, - .cache_read_cycles = 6, + .name = "80", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2.0, + .voltage = 5000, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x311b, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 10 + .atclk_div = 10 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "Cyrix", - .name = "Cx486DX4", + .package = CPU_PKG_SOCKET3, + .manufacturer = "Cyrix", + .name = "Cx486DX4", .internal_name = "cx486dx4", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75", - .cpu_type = CPU_Cx486DX, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x480, - .cpuid_model = 0, - .cyrix_id = 0x361f, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 9 + .name = "75", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x361f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 9 }, { - .name = "100", - .cpu_type = CPU_Cx486DX, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x480, - .cpuid_model = 0, - .cyrix_id = 0x361f, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 12 + .name = "100", + .cpu_type = CPU_Cx486DX, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x361f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 12 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET3, - .manufacturer = "Cyrix", - .name = "Cx5x86", + .package = CPU_PKG_SOCKET3, + .manufacturer = "Cyrix", + .name = "Cx5x86", .internal_name = "cx5x86", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /*If we're including the Pentium 50, might as well include this*/ - .name = "80", - .cpu_type = CPU_Cx5x86, - .fpus = fpus_internal, - .rspeed = 80000000, - .multi = 2.0, - .voltage = 5000, - .edx_reset = 0x480, - .cpuid_model = 0, - .cyrix_id = 0x002f, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 14, - .mem_write_cycles = 14, - .cache_read_cycles = 6, + .name = "80", + .cpu_type = CPU_Cx5x86, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x002f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 10 + .atclk_div = 10 }, { - .name = "100", - .cpu_type = CPU_Cx5x86, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x480, - .cpuid_model = 0, - .cyrix_id = 0x002f, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 9, + .name = "100", + .cpu_type = CPU_Cx5x86, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x002f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "120", - .cpu_type = CPU_Cx5x86, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 3.0, - .voltage = 5000, - .edx_reset = 0x480, - .cpuid_model = 0, - .cyrix_id = 0x002f, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 9, + .name = "120", + .cpu_type = CPU_Cx5x86, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 3.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x002f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 15 + .atclk_div = 15 }, { - .name = "133", - .cpu_type = CPU_Cx5x86, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 4.0, - .voltage = 5000, - .edx_reset = 0x480, - .cpuid_model = 0, - .cyrix_id = 0x002f, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "133", + .cpu_type = CPU_Cx5x86, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 4.0, + .voltage = 5000, + .edx_reset = 0x480, + .cpuid_model = 0, + .cyrix_id = 0x002f, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 16 + .atclk_div = 16 }, { .name = "", 0 } } }, { - .package = CPU_PKG_STPC, - .manufacturer = "ST", - .name = "STPC-DX", + .package = CPU_PKG_STPC, + .manufacturer = "ST", + .name = "STPC-DX", .internal_name = "stpc_dx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "66", - .cpu_type = CPU_STPC, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 3300, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0x051a, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "66", + .cpu_type = CPU_STPC, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 3300, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x051a, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { - .name = "75", - .cpu_type = CPU_STPC, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 1.0, - .voltage = 3300, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0x051a, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 3, + .name = "75", + .cpu_type = CPU_STPC, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.0, + .voltage = 3300, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x051a, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 5 + .atclk_div = 5 }, { .name = "", 0 } } }, { - .package = CPU_PKG_STPC, - .manufacturer = "ST", - .name = "STPC-DX2", + .package = CPU_PKG_STPC, + .manufacturer = "ST", + .name = "STPC-DX2", .internal_name = "stpc_dx2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "133", - .cpu_type = CPU_STPC, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 3300, - .edx_reset = 0x430, - .cpuid_model = 0, - .cyrix_id = 0x0b1b, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 14, - .mem_write_cycles = 14, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_STPC, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3300, + .edx_reset = 0x430, + .cpuid_model = 0, + .cyrix_id = 0x0b1b, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 10 + .atclk_div = 10 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET4, - .manufacturer = "Intel", - .name = "Pentium", + .package = CPU_PKG_SOCKET4, + .manufacturer = "Intel", + .name = "Pentium", .internal_name = "pentium_p5", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "50 (Q0399)", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 50000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x513, - .cpuid_model = 0x513, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 4, - .mem_write_cycles = 4, - .cache_read_cycles = 3, + .name = "50 (Q0399)", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 50000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x513, + .cpuid_model = 0x513, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 4, + .mem_write_cycles = 4, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 6 + .atclk_div = 6 }, { - .name = "60", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 60000000, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x517, - .cpuid_model = 0x517, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "60", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 60000000, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x517, + .cpuid_model = 0x517, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 7 + .atclk_div = 7 }, { - .name = "66", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1, - .voltage = 5000, - .edx_reset = 0x517, - .cpuid_model = 0x517, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "66", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1, + .voltage = 5000, + .edx_reset = 0x517, + .cpuid_model = 0x517, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 8 + .atclk_div = 8 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET4, - .manufacturer = "Intel", - .name = "Pentium OverDrive", + .package = CPU_PKG_SOCKET4, + .manufacturer = "Intel", + .name = "Pentium OverDrive", .internal_name = "pentium_p54c_od5v", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "100", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x51A, - .cpuid_model = 0x51A, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "100", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x51A, + .cpuid_model = 0x51A, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "120", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x51A, - .cpuid_model = 0x51A, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "120", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x51A, + .cpuid_model = 0x51A, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "133", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2, - .voltage = 5000, - .edx_reset = 0x51A, - .cpuid_model = 0x51A, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2, + .voltage = 5000, + .edx_reset = 0x51A, + .cpuid_model = 0x51A, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Pentium", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Pentium", .internal_name = "pentium_p54c", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x522, - .cpuid_model = 0x522, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 4, + .name = "75", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x522, + .cpuid_model = 0x522, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 9 + .atclk_div = 9 }, { - .name = "90", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 90000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x524, - .cpuid_model = 0x524, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "90", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x524, + .cpuid_model = 0x524, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 21/2 + .atclk_div = 21/2 }, { - .name = "100/50", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x524, - .cpuid_model = 0x524, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 10, - .mem_write_cycles = 10, - .cache_read_cycles = 6, + .name = "100/50", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x524, + .cpuid_model = 0x524, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "100/66", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x526, - .cpuid_model = 0x526, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100/66", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x526, + .cpuid_model = 0x526, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "120", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x526, - .cpuid_model = 0x526, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "120", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x526, + .cpuid_model = 0x526, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "133", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x52c, - .cpuid_model = 0x52c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { - .name = "150", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x52c, - .cpuid_model = 0x52c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "150", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 35/2 + .atclk_div = 35/2 }, { - .name = "166", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x52c, - .cpuid_model = 0x52c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "200", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x52c, - .cpuid_model = 0x52c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Pentium MMX", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Pentium MMX", .internal_name = "pentium_p55c", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "166", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2800, - .edx_reset = 0x543, - .cpuid_model = 0x543, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "200", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2800, - .edx_reset = 0x543, - .cpuid_model = 0x543, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { - .name = "233", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2800, - .edx_reset = 0x543, - .cpuid_model = 0x543, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Mobile Pentium MMX", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Mobile Pentium MMX", .internal_name = "pentium_tillamook", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "120", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 2.0, - .voltage = 2800, - .edx_reset = 0x543, - .cpuid_model = 0x543, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "120", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "133", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2800, - .edx_reset = 0x543, - .cpuid_model = 0x543, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x543, + .cpuid_model = 0x543, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { - .name = "150", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.5, - .voltage = 2800, - .edx_reset = 0x544, - .cpuid_model = 0x544, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "150", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 2800, + .edx_reset = 0x544, + .cpuid_model = 0x544, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 35/2 + .atclk_div = 35/2 }, { - .name = "166", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2800, - .edx_reset = 0x544, - .cpuid_model = 0x544, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2800, + .edx_reset = 0x544, + .cpuid_model = 0x544, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "200", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2800, - .edx_reset = 0x581, - .cpuid_model = 0x581, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2800, + .edx_reset = 0x581, + .cpuid_model = 0x581, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { - .name = "233", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2800, - .edx_reset = 0x581, - .cpuid_model = 0x581, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2800, + .edx_reset = 0x581, + .cpuid_model = 0x581, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { - .name = "266", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2800, - .edx_reset = 0x582, - .cpuid_model = 0x582, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2800, + .edx_reset = 0x582, + .cpuid_model = 0x582, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { - .name = "300", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 4.5, - .voltage = 2800, - .edx_reset = 0x582, - .cpuid_model = 0x582, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 13, + .name = "300", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2800, + .edx_reset = 0x582, + .cpuid_model = 0x582, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, .cache_write_cycles = 13, - .atclk_div = 36 + .atclk_div = 36 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Pentium OverDrive", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Pentium OverDrive", .internal_name = "pentium_p54c_od3v", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "125", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 125000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x52c, - .cpuid_model = 0x52c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 7, + .name = "125", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 125000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 15 + .atclk_div = 15 }, { - .name = "150", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x52c, - .cpuid_model = 0x52c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "150", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 35/2 + .atclk_div = 35/2 }, { - .name = "166", - .cpu_type = CPU_PENTIUM, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x52c, - .cpuid_model = 0x52c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUM, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x52c, + .cpuid_model = 0x52c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Intel", - .name = "Pentium OverDrive MMX", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Intel", + .name = "Pentium OverDrive MMX", .internal_name = "pentium_p55c_od", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 1.5, - .voltage = 3520, .edx_reset = 0x1542, .cpuid_model = 0x1542, .cyrix_id = 0, .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, .mem_read_cycles = 7, .mem_write_cycles = 7,.cache_read_cycles = 4,.cache_write_cycles = 4, .atclk_div = 9}, + .name = "75", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 9 + }, { - .name = "125", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 125000000, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x1542, - .cpuid_model = 0x1542, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 7, + .name = "125", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 125000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 15 + .atclk_div = 15 }, { - .name = "150/60", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x1542, - .cpuid_model = 0x1542, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "150/60", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 35/2 + .atclk_div = 35/2 }, { - .name = "166", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 166000000, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x1542, - .cpuid_model = 0x1542, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 166000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "180", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 180000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x1542, - .cpuid_model = 0x1542, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "180", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 180000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 21 + .atclk_div = 21 }, { - .name = "200", - .cpu_type = CPU_PENTIUMMMX, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x1542, - .cpuid_model = 0x1542, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_PENTIUMMMX, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x1542, + .cpuid_model = 0x1542, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "IDT", - .name = "WinChip", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "IDT", + .name = "WinChip", .internal_name = "winchip", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 4, + .name = "75", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 9 + .atclk_div = 9 }, { - .name = "90", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 90000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "90", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 21/2 + .atclk_div = 21/2 }, { - .name = "100", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "120", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "120", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "133", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { - .name = "150", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "150", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 35/2 + .atclk_div = 35/2 }, { - .name = "166", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 40 + .atclk_div = 40 }, { - .name = "180", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 180000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "180", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 180000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 21 + .atclk_div = 21 }, { - .name = "200", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { - .name = "225", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 225000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "225", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 225000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 27 + .atclk_div = 27 }, { - .name = "240", - .cpu_type = CPU_WINCHIP, - .fpus = fpus_internal, - .rspeed = 240000000, - .multi = 4.0, - .voltage = 3520, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "240", + .cpu_type = CPU_WINCHIP, + .fpus = fpus_internal, + .rspeed = 240000000, + .multi = 4.0, + .voltage = 3520, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 28 + .atclk_div = 28 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "IDT", - .name = "WinChip 2", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "IDT", + .name = "WinChip 2", .internal_name = "winchip2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "200", - .cpu_type = CPU_WINCHIP2, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 3*8 + .atclk_div = 3*8 }, { - .name = "225", - .cpu_type = CPU_WINCHIP2, - .fpus = fpus_internal, - .rspeed = 225000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "225", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 225000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 3*9 + .atclk_div = 3*9 }, { - .name = "240", - .cpu_type = CPU_WINCHIP2, - .fpus = fpus_internal, - .rspeed = 240000000, - .multi = 4.0, - .voltage = 3520, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "240", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 240000000, + .multi = 4.0, + .voltage = 3520, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 30 + .atclk_div = 30 }, { - .name = "250", - .cpu_type = CPU_WINCHIP2, - .fpus = fpus_internal, - .rspeed = 250000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "250", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 30 + .atclk_div = 30 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "IDT", - .name = "WinChip 2A", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "IDT", + .name = "WinChip 2A", .internal_name = "winchip2a", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "200", - .cpu_type = CPU_WINCHIP2, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x587, - .cpuid_model = 0x587, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x587, + .cpuid_model = 0x587, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 3*8 + .atclk_div = 3*8 }, { - .name = "233", - .cpu_type = CPU_WINCHIP2, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 3520, - .edx_reset = 0x587, - .cpuid_model = 0x587, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 9, + .name = "233", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 3520, + .edx_reset = 0x587, + .cpuid_model = 0x587, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = (7*8)/2 + .atclk_div = (7*8)/2 }, { - .name = "266", - .cpu_type = CPU_WINCHIP2, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 7.0/3.0, - .voltage = 3520, - .edx_reset = 0x587, - .cpuid_model = 0x587, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 7, + .name = "266", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 7.0/3.0, + .voltage = 3520, + .edx_reset = 0x587, + .cpuid_model = 0x587, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 28 + .atclk_div = 28 }, { - .name = "300", - .cpu_type = CPU_WINCHIP2, - .fpus = fpus_internal, - .rspeed = 250000000, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x587, - .cpuid_model = 0x587, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 8, + .name = "300", + .cpu_type = CPU_WINCHIP2, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x587, + .cpuid_model = 0x587, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 8, .cache_write_cycles = 8, - .atclk_div = 30 + .atclk_div = 30 }, { .name = "", 0 } } }, #if defined(DEV_BRANCH) && defined(USE_AMD_K5) { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K5 (Model 0)", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K5 (Model 0)", .internal_name = "k5_ssa5", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "75 (PR75)", - .cpu_type = CPU_K5, - .fpus = fpus_internal, - .rspeed = 75000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x501, - .cpuid_model = 0x501, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 4, + .name = "75 (PR75)", + .cpu_type = CPU_K5, + .fpus = fpus_internal, + .rspeed = 75000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x501, + .cpuid_model = 0x501, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 9 + .atclk_div = 9 }, { - .name = "90 (PR90)", - .cpu_type = CPU_K5, - .fpus = fpus_internal, - .rspeed = 90000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x501, - .cpuid_model = 0x501, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "90 (PR90)", + .cpu_type = CPU_K5, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x501, + .cpuid_model = 0x501, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 21/2 + .atclk_div = 21/2 }, { - .name = "100 (PR100)", - .cpu_type = CPU_K5, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 3520, - .edx_reset = 0x501, - .cpuid_model = 0x501, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100 (PR100)", + .cpu_type = CPU_K5, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3520, + .edx_reset = 0x501, + .cpuid_model = 0x501, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K5 (Model 1/2/3)", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K5 (Model 1/2/3)", .internal_name = "k5_5k86", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "90 (PR120)", - .cpu_type = CPU_5K86, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x511, - .cpuid_model = 0x511, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "90 (PR120)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x511, + .cpuid_model = 0x511, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "100 (PR133)", - .cpu_type = CPU_5K86, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x514, - .cpuid_model = 0x514, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "100 (PR133)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x514, + .cpuid_model = 0x514, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { - .name = "105 (PR150)", - .cpu_type = CPU_5K86, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x524, - .cpuid_model = 0x524, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "105 (PR150)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x524, + .cpuid_model = 0x524, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 35/2 + .atclk_div = 35/2 }, { - .name = "116.7 (PR166)", - .cpu_type = CPU_5K86, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 3520, - .edx_reset = 0x524, - .cpuid_model = 0x524, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "116.7 (PR166)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3520, + .edx_reset = 0x524, + .cpuid_model = 0x524, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "133 (PR200)", - .cpu_type = CPU_5K86, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 3520, - .edx_reset = 0x534, - .cpuid_model = 0x534, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "133 (PR200)", + .cpu_type = CPU_5K86, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3520, + .edx_reset = 0x534, + .cpuid_model = 0x534, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { .name = "", 0 } } }, #endif { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6 (Model 6)", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6 (Model 6)", .internal_name = "k6_m6", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "66", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 2900, - .edx_reset = 0x561, - .cpuid_model = 0x561, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "66", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 8 + .atclk_div = 8 }, { /* out of spec */ - .name = "100", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2900, - .edx_reset = 0x561, - .cpuid_model = 0x561, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2900, - .edx_reset = 0x561, - .cpuid_model = 0x561, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { - .name = "166", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2900, - .edx_reset = 0x561, - .cpuid_model = 0x561, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "200", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2900, - .edx_reset = 0x561, - .cpuid_model = 0x561, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2900, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { - .name = "233", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 3200, - .edx_reset = 0x561, - .cpuid_model = 0x561, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 3200, + .edx_reset = 0x561, + .cpuid_model = 0x561, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6 (Model 7)", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6 (Model 7)", .internal_name = "k6_m7", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "100", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2200, - .edx_reset = 0x570, - .cpuid_model = 0x570, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2200, + .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2200, - .edx_reset = 0x570, - .cpuid_model = 0x570, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2200, + .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 166666666, .multi = 2.5, - .voltage = 2200, .edx_reset = 0x570, - .cpuid_model = 0x570, .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 166666666, .multi = 2.5, + .voltage = 2200, .edx_reset = 0x570, + .cpuid_model = 0x570, .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "200", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 200000000, .multi = 3.0, - .voltage = 2200, .edx_reset = 0x570, - .cpuid_model = 0x570, .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 200000000, .multi = 3.0, + .voltage = 2200, .edx_reset = 0x570, + .cpuid_model = 0x570, .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { - .name = "233", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 233333333, .multi = 3.5, - .voltage = 2200, .edx_reset = 0x570, - .cpuid_model = 0x570, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 233333333, .multi = 3.5, + .voltage = 2200, .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { - .name = "266", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2200, - .edx_reset = 0x570, - .cpuid_model = 0x570, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { - .name = "300", - .cpu_type = CPU_K6, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 4.5, - .voltage = 2200, - .edx_reset = 0x570, - .cpuid_model = 0x570, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 13, + .name = "300", + .cpu_type = CPU_K6, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2200, + .edx_reset = 0x570, + .cpuid_model = 0x570, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, .cache_write_cycles = 13, - .atclk_div = 36 + .atclk_div = 36 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6-2", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6-2", .internal_name = "k6_2", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "100", - .cpu_type = CPU_K6_2, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2200, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_K6_2, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2200, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_K6_2, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2200, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_K6_2, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2200, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { - .name = "233", - .cpu_type = CPU_K6_2, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2200, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { - .name = "266", - .cpu_type = CPU_K6_2, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2200, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { - .name = "300", - .cpu_type = CPU_K6_2, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 3.0, - .voltage = 2200, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 9, + .name = "300", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 36 + .atclk_div = 36 }, { - .name = "333", - .cpu_type = CPU_K6_2, - .fpus = fpus_internal, - .rspeed = 332500000, - .multi = 3.5, - .voltage = 2200, - .edx_reset = 0x580, - .cpuid_model = 0x580, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 30, - .mem_write_cycles = 30, - .cache_read_cycles = 11, + .name = "333", + .cpu_type = CPU_K6_2, + .fpus = fpus_internal, + .rspeed = 332500000, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x580, + .cpuid_model = 0x580, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 40 + .atclk_div = 40 }, { - .name = "350", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 350000000, - .multi = 3.5, - .voltage = 2200, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 32, - .mem_write_cycles = 32, - .cache_read_cycles = 11, + .name = "350", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 42 + .atclk_div = 42 }, { - .name = "366", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 366666666, - .multi = 5.5, - .voltage = 2200, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 33, - .mem_write_cycles = 33, - .cache_read_cycles = 17, + .name = "366", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, .cache_write_cycles = 17, - .atclk_div = 44 + .atclk_div = 44 }, { - .name = "380", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 380000000, - .multi = 4.0, - .voltage = 2200, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 34, - .mem_write_cycles = 34, - .cache_read_cycles = 12, + .name = "380", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 380000000, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 34, + .mem_write_cycles = 34, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 46 + .atclk_div = 46 }, { - .name = "400/66", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 6.0, - .voltage = 2200, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, + .name = "400/66", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 6.0, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 48 + .atclk_div = 48 }, { - .name = "400/100", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 4.0, - .voltage = 2200, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, + .name = "400/100", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 48 + .atclk_div = 48 }, { - .name = "450", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 450000000, - .multi = 4.5, - .voltage = 2200, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 41, - .mem_write_cycles = 41, - .cache_read_cycles = 14, + .name = "450", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, .cache_write_cycles = 14, - .atclk_div = 54 + .atclk_div = 54 }, { - .name = "475", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 475000000, - .multi = 5.0, - .voltage = 2400, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 43, - .mem_write_cycles = 43, - .cache_read_cycles = 15, + .name = "475", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 475000000, + .multi = 5.0, + .voltage = 2400, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 43, + .mem_write_cycles = 43, + .cache_read_cycles = 15, .cache_write_cycles = 15, - .atclk_div = 57 + .atclk_div = 57 }, { - .name = "500", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 500000000, - .multi = 5.0, - .voltage = 2400, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 45, - .mem_write_cycles = 45, - .cache_read_cycles = 15, + .name = "500", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 5.0, + .voltage = 2400, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, .cache_write_cycles = 15, - .atclk_div = 60 + .atclk_div = 60 }, { - .name = "533", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 533333333, - .multi = 5.5, - .voltage = 2200, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 48, - .mem_write_cycles = 48, - .cache_read_cycles = 17, + .name = "533", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 533333333, + .multi = 5.5, + .voltage = 2200, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 48, + .mem_write_cycles = 48, + .cache_read_cycles = 17, .cache_write_cycles = 17, - .atclk_div = 64 + .atclk_div = 64 }, { - .name = "550", - .cpu_type = CPU_K6_2C, - .fpus = fpus_internal, - .rspeed = 550000000, - .multi = 5.5, - .voltage = 2300, - .edx_reset = 0x58c, - .cpuid_model = 0x58c, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 50, - .mem_write_cycles = 50, - .cache_read_cycles = 17, + .name = "550", + .cpu_type = CPU_K6_2C, + .fpus = fpus_internal, + .rspeed = 550000000, + .multi = 5.5, + .voltage = 2300, + .edx_reset = 0x58c, + .cpuid_model = 0x58c, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 50, + .mem_write_cycles = 50, + .cache_read_cycles = 17, .cache_write_cycles = 17, - .atclk_div = 66 + .atclk_div = 66 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6-2+", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6-2+", .internal_name = "k6_2p", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "100", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { /* out of spec */ - .name = "233", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { /* out of spec */ - .name = "266", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { /* out of spec */ - .name = "300", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 3.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 9, + .name = "300", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 36 + .atclk_div = 36 }, { /* out of spec */ - .name = "333", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 332500000, - .multi = 3.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 30, - .mem_write_cycles = 30, - .cache_read_cycles = 11, + .name = "333", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 332500000, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 40 + .atclk_div = 40 }, { /* out of spec */ - .name = "350", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 350000000, - .multi = 3.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 32, - .mem_write_cycles = 32, - .cache_read_cycles = 11, + .name = "350", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 42 + .atclk_div = 42 }, { /* out of spec */ - .name = "366", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 366666666, - .multi = 5.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 33, - .mem_write_cycles = 33, - .cache_read_cycles = 17, + .name = "366", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, .cache_write_cycles = 17, - .atclk_div = 44 + .atclk_div = 44 }, { /* out of spec */ - .name = "380", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 380000000, - .multi = 4.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 34, - .mem_write_cycles = 34, - .cache_read_cycles = 12, + .name = "380", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 380000000, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 34, + .mem_write_cycles = 34, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 46 + .atclk_div = 46 }, { /* out of spec */ - .name = "400/66", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 6.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, + .name = "400/66", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 6.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 48 + .atclk_div = 48 }, { /* out of spec */ - .name = "400/100", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 4.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, + .name = "400/100", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 48 + .atclk_div = 48 }, { - .name = "450", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 450000000, - .multi = 4.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 41, - .mem_write_cycles = 41, - .cache_read_cycles = 14, + .name = "450", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, .cache_write_cycles = 14, - .atclk_div = 54 + .atclk_div = 54 }, { - .name = "475", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 475000000, - .multi = 5.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 43, - .mem_write_cycles = 43, - .cache_read_cycles = 15, + .name = "475", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 475000000, + .multi = 5.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 43, + .mem_write_cycles = 43, + .cache_read_cycles = 15, .cache_write_cycles = 15, - .atclk_div = 57 + .atclk_div = 57 }, { - .name = "500", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 500000000, - .multi = 5.0, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 45, - .mem_write_cycles = 45, - .cache_read_cycles = 15, + .name = "500", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 5.0, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, .cache_write_cycles = 15, - .atclk_div = 60 + .atclk_div = 60 }, { - .name = "533", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 533333333, - .multi = 5.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 48, - .mem_write_cycles = 48, - .cache_read_cycles = 17, + .name = "533", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 533333333, + .multi = 5.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 48, + .mem_write_cycles = 48, + .cache_read_cycles = 17, .cache_write_cycles = 17, - .atclk_div = 64 + .atclk_div = 64 }, { - .name = "550", - .cpu_type = CPU_K6_2P, - .fpus = fpus_internal, - .rspeed = 550000000, - .multi = 5.5, - .voltage = 2000, - .edx_reset = 0x5d4, - .cpuid_model = 0x5d4, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 50, - .mem_write_cycles = 50, - .cache_read_cycles = 17, + .name = "550", + .cpu_type = CPU_K6_2P, + .fpus = fpus_internal, + .rspeed = 550000000, + .multi = 5.5, + .voltage = 2000, + .edx_reset = 0x5d4, + .cpuid_model = 0x5d4, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 50, + .mem_write_cycles = 50, + .cache_read_cycles = 17, .cache_write_cycles = 17, - .atclk_div = 66 + .atclk_div = 66 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6-III", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6-III", .internal_name = "k6_3", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "100", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { /* out of spec */ - .name = "233", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { /* out of spec */ - .name = "266", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { /* out of spec */ - .name = "300", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 3.0, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 9, + .name = "300", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 36 + .atclk_div = 36 }, { /* out of spec */ - .name = "333", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 332500000, - .multi = 3.5, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 30, - .mem_write_cycles = 30, - .cache_read_cycles = 11, + .name = "333", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 332500000, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 40 + .atclk_div = 40 }, { /* out of spec */ - .name = "350", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 350000000, - .multi = 3.5, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 32, - .mem_write_cycles = 32, - .cache_read_cycles = 11, + .name = "350", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 42 + .atclk_div = 42 }, { /* out of spec */ - .name = "366", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 366666666, - .multi = 5.5, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 33, - .mem_write_cycles = 33, - .cache_read_cycles = 17, + .name = "366", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, .cache_write_cycles = 17, - .atclk_div = 44 + .atclk_div = 44 }, { /* out of spec */ - .name = "380", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 380000000, - .multi = 4.0, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 34, - .mem_write_cycles = 34, - .cache_read_cycles = 12, + .name = "380", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 380000000, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 34, + .mem_write_cycles = 34, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 46 + .atclk_div = 46 }, { - .name = "400", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 4.0, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, + .name = "400", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 48 + .atclk_div = 48 }, { - .name = "450", - .cpu_type = CPU_K6_3, - .fpus = fpus_internal, - .rspeed = 450000000, - .multi = 4.5, - .voltage = 2200, - .edx_reset = 0x591, - .cpuid_model = 0x591, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 41, - .mem_write_cycles = 41, - .cache_read_cycles = 14, + .name = "450", + .cpu_type = CPU_K6_3, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2200, + .edx_reset = 0x591, + .cpuid_model = 0x591, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, .cache_write_cycles = 14, - .atclk_div = 54 + .atclk_div = 54 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "AMD", - .name = "K6-III+", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "AMD", + .name = "K6-III+", .internal_name = "k6_3p", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "100", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 7, - .mem_write_cycles = 7, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 7, + .mem_write_cycles = 7, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 9 + .atclk_div = 9 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { /* out of spec */ - .name = "233", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { /* out of spec */ - .name = "266", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { /* out of spec */ - .name = "300", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 3.0, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 9, + .name = "300", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 36 + .atclk_div = 36 }, { /* out of spec */ - .name = "333", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 332500000, - .multi = 3.5, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 30, - .mem_write_cycles = 30, - .cache_read_cycles = 11, + .name = "333", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 332500000, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 40 + .atclk_div = 40 }, { /* out of spec */ - .name = "350", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 350000000, - .multi = 3.5, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 32, - .mem_write_cycles = 32, - .cache_read_cycles = 11, + .name = "350", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 42 + .atclk_div = 42 }, { /* out of spec */ - .name = "366", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 366666666, - .multi = 5.5, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 33, - .mem_write_cycles = 33, - .cache_read_cycles = 17, + .name = "366", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, .cache_write_cycles = 17, - .atclk_div = 44 + .atclk_div = 44 }, { /* out of spec */ - .name = "380", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 380000000, - .multi = 4.0, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 34, - .mem_write_cycles = 34, - .cache_read_cycles = 12, + .name = "380", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 380000000, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 34, + .mem_write_cycles = 34, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 46 + .atclk_div = 46 }, { - .name = "400", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 4.0, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, + .name = "400", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 48 + .atclk_div = 48 }, { - .name = "450", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 450000000, - .multi = 4.5, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 41, - .mem_write_cycles = 41, - .cache_read_cycles = 14, + .name = "450", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, .cache_write_cycles = 14, - .atclk_div = 54 + .atclk_div = 54 }, { - .name = "475", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 475000000, - .multi = 5.0, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 43, - .mem_write_cycles = 43, - .cache_read_cycles = 15, + .name = "475", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 475000000, + .multi = 5.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 43, + .mem_write_cycles = 43, + .cache_read_cycles = 15, .cache_write_cycles = 15, - .atclk_div = 57 + .atclk_div = 57 }, { - .name = "500", - .cpu_type = CPU_K6_3P, - .fpus = fpus_internal, - .rspeed = 500000000, - .multi = 5.0, - .voltage = 2000, - .edx_reset = 0x5d0, - .cpuid_model = 0x5d0, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 45, - .mem_write_cycles = 45, - .cache_read_cycles = 15, + .name = "500", + .cpu_type = CPU_K6_3P, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 5.0, + .voltage = 2000, + .edx_reset = 0x5d0, + .cpuid_model = 0x5d0, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, .cache_write_cycles = 15, - .atclk_div = 60 + .atclk_div = 60 }, { .name = "", 0 } } }, #if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "Cx6x86", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Cyrix", + .name = "Cx6x86", .internal_name = "cx6x86", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "80 (PR90+)", - .cpu_type = CPU_Cx6x86, - .fpus = fpus_internal, - .rspeed = 80000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x520, - .cpuid_model = 0x520, - .cyrix_id = 0x1731, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 6, + .name = "80 (PR90+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 80000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 10 + .atclk_div = 10 }, { - .name = "100 (PR120+)", - .cpu_type = CPU_Cx6x86, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x520, - .cpuid_model = 0x520, - .cyrix_id = 0x1731, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 10, - .mem_write_cycles = 10, - .cache_read_cycles = 6, + .name = "100 (PR120+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 12 + .atclk_div = 12 }, { - .name = "110 (PR133+)", - .cpu_type = CPU_Cx6x86, - .fpus = fpus_internal, - .rspeed = 110000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x520, - .cpuid_model = 0x520, - .cyrix_id = 0x1731, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 10, - .mem_write_cycles = 10, - .cache_read_cycles = 6, + .name = "110 (PR133+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 110000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "120 (PR150+)", - .cpu_type = CPU_Cx6x86, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x520, - .cpuid_model = 0x520, - .cyrix_id = 0x1731, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "120 (PR150+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "133 (PR166+)", - .cpu_type = CPU_Cx6x86, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x520, - .cpuid_model = 0x520, - .cyrix_id = 0x1731, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133 (PR166+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { - .name = "150 (PR200+)", - .cpu_type = CPU_Cx6x86, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.0, - .voltage = 3520, - .edx_reset = 0x520, - .cpuid_model = 0x520, - .cyrix_id = 0x1731, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "150 (PR200+)", + .cpu_type = CPU_Cx6x86, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.0, + .voltage = 3520, + .edx_reset = 0x520, + .cpuid_model = 0x520, + .cyrix_id = 0x1731, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 18 + .atclk_div = 18 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "Cx6x86L", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Cyrix", + .name = "Cx6x86L", .internal_name = "cx6x86l", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "110 (PR133+)", - .cpu_type = CPU_Cx6x86L, - .fpus = fpus_internal, - .rspeed = 110000000, - .multi = 2.0, - .voltage = 2800, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0x2231, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 10, - .mem_write_cycles = 10, - .cache_read_cycles = 6, + .name = "110 (PR133+)", + .cpu_type = CPU_Cx6x86L, + .fpus = fpus_internal, + .rspeed = 110000000, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0x2231, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 10, + .mem_write_cycles = 10, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "120 (PR150+)", - .cpu_type = CPU_Cx6x86L, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 2.0, - .voltage = 2800, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0x2231, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "120 (PR150+)", + .cpu_type = CPU_Cx6x86L, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0x2231, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 14 + .atclk_div = 14 }, { - .name = "133 (PR166+)", - .cpu_type = CPU_Cx6x86L, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2800, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0x2231, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133 (PR166+)", + .cpu_type = CPU_Cx6x86L, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0x2231, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { - .name = "150 (PR200+)", - .cpu_type = CPU_Cx6x86L, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.0, - .voltage = 2800, - .edx_reset = 0x540, - .cpuid_model = 0x540, - .cyrix_id = 0x2231, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "150 (PR200+)", + .cpu_type = CPU_Cx6x86L, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x540, + .cpuid_model = 0x540, + .cyrix_id = 0x2231, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 18 + .atclk_div = 18 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "Cx6x86MX", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Cyrix", + .name = "Cx6x86MX", .internal_name = "cx6x86mx", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "133 (PR166)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2900, - .edx_reset = 0x600, - .cpuid_model = 0x600, - .cyrix_id = 0x0451, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133 (PR166)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2900, + .edx_reset = 0x600, + .cpuid_model = 0x600, + .cyrix_id = 0x0451, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { - .name = "166 (PR200)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2900, - .edx_reset = 0x600, - .cpuid_model = 0x600, - .cyrix_id = 0x0452, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166 (PR200)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2900, + .edx_reset = 0x600, + .cpuid_model = 0x600, + .cyrix_id = 0x0452, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "187.5 (PR233)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 187500000, - .multi = 2.5, - .voltage = 2900, - .edx_reset = 0x600, - .cpuid_model = 0x600, - .cyrix_id = 0x0452, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "187.5 (PR233)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 187500000, + .multi = 2.5, + .voltage = 2900, + .edx_reset = 0x600, + .cpuid_model = 0x600, + .cyrix_id = 0x0452, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 45/2 + .atclk_div = 45/2 }, { - .name = "208.3 (PR266)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 208333333, - .multi = 2.5, - .voltage = 2700, - .edx_reset = 0x600, - .cpuid_model = 0x600, - .cyrix_id = 0x0452, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 17, - .mem_write_cycles = 17, - .cache_read_cycles = 7, + .name = "208.3 (PR266)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 208333333, + .multi = 2.5, + .voltage = 2700, + .edx_reset = 0x600, + .cpuid_model = 0x600, + .cyrix_id = 0x0452, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 17, + .mem_write_cycles = 17, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 25 + .atclk_div = 25 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET5_7, - .manufacturer = "Cyrix", - .name = "MII", + .package = CPU_PKG_SOCKET5_7, + .manufacturer = "Cyrix", + .name = "MII", .internal_name = "mii", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { - .name = "233 (PR300)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2900, - .edx_reset = 0x601, - .cpuid_model = 0x601, - .cyrix_id = 0x0852, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 11, + .name = "233 (PR300)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0852, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 28 + .atclk_div = 28 }, { - .name = "250/83 (PR333)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 250000000, - .multi = 3.0, - .voltage = 2900, - .edx_reset = 0x601, - .cpuid_model = 0x601, - .cyrix_id = 0x0853, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 23, - .mem_write_cycles = 23, - .cache_read_cycles = 9, + .name = "250/83 (PR333)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 3.0, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0853, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 23, + .mem_write_cycles = 23, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 30 + .atclk_div = 30 }, { - .name = "250/100 (PR366)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 250000000, - .multi = 2.5, - .voltage = 2900, - .edx_reset = 0x601, - .cpuid_model = 0x601, - .cyrix_id = 0x0853, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 23, - .mem_write_cycles = 23, - .cache_read_cycles = 7, + .name = "250/100 (PR366)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 2.5, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0853, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 23, + .mem_write_cycles = 23, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 30 + .atclk_div = 30 }, { - .name = "285 (PR400)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 285000000, - .multi = 3.0, - .voltage = 2900, - .edx_reset = 0x601, - .cpuid_model = 0x601, - .cyrix_id = 0x0853, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 9, + .name = "285 (PR400)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 285000000, + .multi = 3.0, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0853, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 34 + .atclk_div = 34 }, { - .name = "300 (PR433)", - .cpu_type = CPU_Cx6x86MX, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 3.0, - .voltage = 2900, - .edx_reset = 0x601, - .cpuid_model = 0x601, - .cyrix_id = 0x0853, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 9, + .name = "300 (PR433)", + .cpu_type = CPU_Cx6x86MX, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2900, + .edx_reset = 0x601, + .cpuid_model = 0x601, + .cyrix_id = 0x0853, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 36 + .atclk_div = 36 }, { .name = "", 0 } } }, #endif { - .package = CPU_PKG_SOCKET8, - .manufacturer = "Intel", - .name = "Pentium Pro", + .package = CPU_PKG_SOCKET8, + .manufacturer = "Intel", + .name = "Pentium Pro", .internal_name = "pentiumpro", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "60", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 60000000, - .multi = 1.0, - .voltage = 3100, - .edx_reset = 0x612, - .cpuid_model = 0x612, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 1, + .name = "60", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 60000000, + .multi = 1.0, + .voltage = 3100, + .edx_reset = 0x612, + .cpuid_model = 0x612, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 1, .cache_write_cycles = 1, - .atclk_div = 7 + .atclk_div = 7 }, { /* out of spec */ - .name = "66", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 3300, - .edx_reset = 0x617, - .cpuid_model = 0x617, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 1, + .name = "66", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 1, .cache_write_cycles = 1, - .atclk_div = 8 + .atclk_div = 8 }, { /* out of spec */ - .name = "90", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 90000000, - .multi = 1.5, - .voltage = 3100, - .edx_reset = 0x612, - .cpuid_model = 0x612, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 3, + .name = "90", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 90000000, + .multi = 1.5, + .voltage = 3100, + .edx_reset = 0x612, + .cpuid_model = 0x612, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 11 + .atclk_div = 11 }, { /* out of spec */ - .name = "100", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 3300, - .edx_reset = 0x617, - .cpuid_model = 0x617, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 3, + .name = "100", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "120", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 120000000, - .multi = 2.0, - .voltage = 3100, - .edx_reset = 0x612, - .cpuid_model = 0x612, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 5, + .name = "120", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 120000000, + .multi = 2.0, + .voltage = 3100, + .edx_reset = 0x612, + .cpuid_model = 0x612, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 5, .cache_write_cycles = 5, - .atclk_div = 14 + .atclk_div = 14 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 3300, - .edx_reset = 0x617, - .cpuid_model = 0x617, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 5, + .name = "133", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 5, .cache_write_cycles = 5, - .atclk_div = 16 + .atclk_div = 16 }, /* out of spec */ { - .name = "150", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 2.5, - .voltage = 3100, - .edx_reset = 0x612, - .cpuid_model = 0x612, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "150", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 2.5, + .voltage = 3100, + .edx_reset = 0x612, + .cpuid_model = 0x612, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 35/2 + .atclk_div = 35/2 }, { - .name = "166", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 3300, - .edx_reset = 0x617, - .cpuid_model = 0x617, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { - .name = "180", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 180000000, - .multi = 3.0, - .voltage = 3300, - .edx_reset = 0x617, - .cpuid_model = 0x617, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "180", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 180000000, + .multi = 3.0, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 21 + .atclk_div = 21 }, { - .name = "200", - .cpu_type = CPU_PENTIUMPRO, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 3300, - .edx_reset = 0x617, - .cpuid_model = 0x617, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_PENTIUMPRO, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3300, + .edx_reset = 0x617, + .cpuid_model = 0x617, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET8, - .manufacturer = "Intel", - .name = "Pentium II OverDrive", + .package = CPU_PKG_SOCKET8, + .manufacturer = "Intel", + .name = "Pentium II OverDrive", .internal_name = "pentium2_od", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "66", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "66", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 8 + .atclk_div = 8 }, { /* out of spec */ - .name = "100", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { /* out of spec */ - .name = "233", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { /* out of spec */ - .name = "266", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { - .name = "300", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 5.0, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 13, + .name = "300", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 5.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, .cache_write_cycles = 13, - .atclk_div = 36 + .atclk_div = 36 }, { - .name = "333", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 333333333, - .multi = 5.0, - .voltage = 3300, - .edx_reset = 0x1632, - .cpuid_model = 0x1632, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 13, + .name = "333", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 333333333, + .multi = 5.0, + .voltage = 3300, + .edx_reset = 0x1632, + .cpuid_model = 0x1632, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, .cache_write_cycles = 13, - .atclk_div = 40 + .atclk_div = 40 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SLOT1, - .manufacturer = "Intel", - .name = "Pentium II (Klamath)", + .package = CPU_PKG_SLOT1, + .manufacturer = "Intel", + .name = "Pentium II (Klamath)", .internal_name = "pentium2_klamath", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "66", - .cpu_type = CPU_PENTIUM2, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 2800, - .edx_reset = 0x634, - .cpuid_model = 0x634, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "66", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 8 + .atclk_div = 8 }, { /* out of spec */ - .name = "100", - .cpu_type = CPU_PENTIUM2, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2800, - .edx_reset = 0x634, - .cpuid_model = 0x634, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, + .name = "100", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_PENTIUM2, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2800, - .edx_reset = 0x634, - .cpuid_model = 0x634, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_PENTIUM2, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2800, - .edx_reset = 0x634, - .cpuid_model = 0x634, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_PENTIUM2, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2800, - .edx_reset = 0x634, - .cpuid_model = 0x634, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { - .name = "233", - .cpu_type = CPU_PENTIUM2, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2800, - .edx_reset = 0x634, - .cpuid_model = 0x634, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 10, + .name = "233", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 28 + .atclk_div = 28 }, { - .name = "266", - .cpu_type = CPU_PENTIUM2, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2800, - .edx_reset = 0x634, - .cpuid_model = 0x634, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { - .name = "300", - .cpu_type = CPU_PENTIUM2, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 4.5, - .voltage = 2800, - .edx_reset = 0x634, - .cpuid_model = 0x634, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 25, - .mem_write_cycles = 25, - .cache_read_cycles = 12, + .name = "300", + .cpu_type = CPU_PENTIUM2, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2800, + .edx_reset = 0x634, + .cpuid_model = 0x634, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 25, + .mem_write_cycles = 25, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 36 + .atclk_div = 36 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SLOT1, - .manufacturer = "Intel", - .name = "Pentium II (Deschutes)", + .package = CPU_PKG_SLOT1, + .manufacturer = "Intel", + .name = "Pentium II (Deschutes)", .internal_name = "pentium2_deschutes", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "66", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, + .name = "66", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 8 + .atclk_div = 8 }, { /* out of spec */ - .name = "100", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 5, + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 5, .cache_write_cycles = 5, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, + .name = "133", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, + .name = "166", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 20 + .atclk_div = 20 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 9, + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 24 + .atclk_div = 24 }, { /* out of spec */ - .name = "233", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 11, + .name = "233", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 28 + .atclk_div = 28 }, { - .name = "266", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, + .name = "266", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 32 + .atclk_div = 32 }, { - .name = "300", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 4.5, - .voltage = 2050, - .edx_reset = 0x651, - .cpuid_model = 0x651, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 25, - .mem_write_cycles = 25, - .cache_read_cycles = 12, + .name = "300", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x651, + .cpuid_model = 0x651, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 25, + .mem_write_cycles = 25, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 36 + .atclk_div = 36 }, { - .name = "333", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 333333333, - .multi = 5.0, - .voltage = 2050, - .edx_reset = 0x651, - .cpuid_model = 0x651, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 13, + .name = "333", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 333333333, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x651, + .cpuid_model = 0x651, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, .cache_write_cycles = 13, - .atclk_div = 40 + .atclk_div = 40 }, { - .name = "350", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 350000000, - .multi = 3.5, - .voltage = 2050, - .edx_reset = 0x651, - .cpuid_model = 0x651, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 32, - .mem_write_cycles = 32, - .cache_read_cycles = 11, + .name = "350", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x651, + .cpuid_model = 0x651, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 11, .cache_write_cycles = 11, - .atclk_div = 42 + .atclk_div = 42 }, { - .name = "400", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 4.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, + .name = "400", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 48 + .atclk_div = 48 }, { - .name = "450", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 450000000, - .multi = 4.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 41, - .mem_write_cycles = 41, - .cache_read_cycles = 14, + .name = "450", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, .cache_write_cycles = 14, - .atclk_div = 54 + .atclk_div = 54 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SLOT1, - .manufacturer = "Intel", - .name = "Celeron (Covington)", + .package = CPU_PKG_SLOT1, + .manufacturer = "Intel", + .name = "Celeron (Covington)", .internal_name = "celeron_covington", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "66", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 6, + .name = "66", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 8 + .atclk_div = 8 }, { /* out of spec */ - .name = "100", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 9, + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 12, + .name = "133", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 16 + .atclk_div = 16 }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 15, + .name = "166", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 15, .cache_write_cycles = 15, - .atclk_div = 20 + .atclk_div = 20 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 18, + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 18, .cache_write_cycles = 18, - .atclk_div = 24 + .atclk_div = 24 }, { /* out of spec */ - .name = "233", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 21, + .name = "233", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 21, .cache_write_cycles = 21, - .atclk_div = 28 + .atclk_div = 28 }, { - .name = "266", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2050, - .edx_reset = 0x650, - .cpuid_model = 0x650, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 24, + .name = "266", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x650, + .cpuid_model = 0x650, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 24, .cache_write_cycles = 24, - .atclk_div = 32 + .atclk_div = 32 }, { - .name = "300", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 4.5, - .voltage = 2050, - .edx_reset = 0x651, - .cpuid_model = 0x651, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 25, - .mem_write_cycles = 25, - .cache_read_cycles = 25, + .name = "300", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x651, + .cpuid_model = 0x651, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 25, + .mem_write_cycles = 25, + .cache_read_cycles = 25, .cache_write_cycles = 25, - .atclk_div = 36 + .atclk_div = 36 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SLOT2, - .manufacturer = "Intel", - .name = "Pentium II Xeon", + .package = CPU_PKG_SLOT2, + .manufacturer = "Intel", + .name = "Pentium II Xeon", .internal_name = "pentium2_xeon", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "100", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 3, + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 3, .cache_write_cycles = 3, - .atclk_div = 12 + .atclk_div = 12 }, { /* out of spec */ - .name = "150", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 150000000, - .multi = 1.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 14, - .mem_write_cycles = 14, - .cache_read_cycles = 4, + .name = "150", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 150000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 4, .cache_write_cycles = 4, - .atclk_div = 18 + .atclk_div = 18 }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 2.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 6, + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 6, .cache_write_cycles = 6, - .atclk_div = 24 + .atclk_div = 24 }, { /* out of spec */ - .name = "250", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 250000000, - .multi = 2.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 22, - .mem_write_cycles = 22, - .cache_read_cycles = 7, + .name = "250", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 250000000, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 22, + .mem_write_cycles = 22, + .cache_read_cycles = 7, .cache_write_cycles = 7, - .atclk_div = 30 + .atclk_div = 30 }, { /* out of spec */ - .name = "300", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 3.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 9, + .name = "300", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 9, .cache_write_cycles = 9, - .atclk_div = 36 + .atclk_div = 36 }, { /* out of spec */ - .name = "350", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 350000000, - .multi = 3.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 32, - .mem_write_cycles = 32, - .cache_read_cycles = 10, + .name = "350", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 350000000, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 32, + .mem_write_cycles = 32, + .cache_read_cycles = 10, .cache_write_cycles = 10, - .atclk_div = 42 + .atclk_div = 42 }, { - .name = "400", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 4.0, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, + .name = "400", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, .cache_write_cycles = 12, - .atclk_div = 48 + .atclk_div = 48 }, { - .name = "450", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 450000000, - .multi = 4.5, - .voltage = 2050, - .edx_reset = 0x652, - .cpuid_model = 0x652, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, - .mem_read_cycles = 41, - .mem_write_cycles = 41, - .cache_read_cycles = 14, + .name = "450", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x652, + .cpuid_model = 0x652, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, .cache_write_cycles = 14, - .atclk_div = 54 + .atclk_div = 54 }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET370, - .manufacturer = "Intel", - .name = "Celeron (Mendocino)", + .package = CPU_PKG_SOCKET370, + .manufacturer = "Intel", + .name = "Celeron (Mendocino)", .internal_name = "celeron_mendocino", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of spec */ - .name = "66", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 8 - }, + .name = "66", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, { /* out of spec */ - .name = "100", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 8, - .mem_write_cycles = 8, - .cache_read_cycles = 4, - .cache_write_cycles = 4, - .atclk_div = 12 - }, + .name = "100", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 8, + .mem_write_cycles = 8, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, { /* out of spec */ - .name = "133", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 11, - .mem_write_cycles = 11, - .cache_read_cycles = 5, - .cache_write_cycles = 5, - .atclk_div = 16 - }, + .name = "133", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 11, + .mem_write_cycles = 11, + .cache_read_cycles = 5, + .cache_write_cycles = 5, + .atclk_div = 16 + }, { /* out of spec */ - .name = "166", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 14, - .mem_write_cycles = 14, - .cache_read_cycles = 7, - .cache_write_cycles = 7, - .atclk_div = 20 - }, + .name = "166", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 14, + .mem_write_cycles = 14, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, { /* out of spec */ - .name = "200", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 17, - .mem_write_cycles = 17, - .cache_read_cycles = 8, - .cache_write_cycles = 8, - .atclk_div = 24 - }, + .name = "200", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 17, + .mem_write_cycles = 17, + .cache_read_cycles = 8, + .cache_write_cycles = 8, + .atclk_div = 24 + }, { /* out of spec */ - .name = "233", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 19, - .mem_write_cycles = 19, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 28 - }, + .name = "233", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 19, + .mem_write_cycles = 19, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 28 + }, { /* out of spec */ - .name = "266", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 22, - .mem_write_cycles = 22, - .cache_read_cycles = 11, - .cache_write_cycles = 11, - .atclk_div = 32 - }, + .name = "266", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 22, + .mem_write_cycles = 22, + .cache_read_cycles = 11, + .cache_write_cycles = 11, + .atclk_div = 32 + }, { - .name = "300A", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 4.5, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 25, - .mem_write_cycles = 25, - .cache_read_cycles = 12, - .cache_write_cycles = 12, - .atclk_div = 36 - }, + .name = "300A", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 25, + .mem_write_cycles = 25, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 36 + }, { - .name = "333", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 333333333, - .multi = 5.0, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 13, - .cache_write_cycles = 13, - .atclk_div = 40 - }, + .name = "333", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 333333333, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 40 + }, { - .name = "366", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 366666666, - .multi = 5.5, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 33, - .mem_write_cycles = 33, - .cache_read_cycles = 17, - .cache_write_cycles = 17, - .atclk_div = 44 - }, + .name = "366", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 44 + }, { - .name = "400", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 6.0, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 12, - .cache_write_cycles = 12, - .atclk_div = 48 - }, + .name = "400", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 6.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 48 + }, { - .name = "433", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 433333333, - .multi = 6.5, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 39, - .mem_write_cycles = 39, - .cache_read_cycles = 13, - .cache_write_cycles = 13, - .atclk_div = 51 - }, + .name = "433", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 433333333, + .multi = 6.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 39, + .mem_write_cycles = 39, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 51 + }, { - .name = "466", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 466666666, - .multi = 7.0, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 42, - .mem_write_cycles = 42, - .cache_read_cycles = 14, - .cache_write_cycles = 14, - .atclk_div = 56 - }, + .name = "466", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 466666666, + .multi = 7.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 42, + .mem_write_cycles = 42, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 56 + }, { - .name = "500", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 500000000, - .multi = 7.5, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 45, - .mem_write_cycles = 45, - .cache_read_cycles = 15, - .cache_write_cycles = 15, - .atclk_div = 60 - }, + .name = "500", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 7.5, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 60 + }, { - .name = "533", - .cpu_type = CPU_PENTIUM2D, - .fpus = fpus_internal, - .rspeed = 533333333, - .multi = 8.0, - .voltage = 2050, - .edx_reset = 0x665, - .cpuid_model = 0x665, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 48, - .mem_write_cycles = 48, - .cache_read_cycles = 17, - .cache_write_cycles = 17, - .atclk_div = 64 - }, + .name = "533", + .cpu_type = CPU_PENTIUM2D, + .fpus = fpus_internal, + .rspeed = 533333333, + .multi = 8.0, + .voltage = 2050, + .edx_reset = 0x665, + .cpuid_model = 0x665, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_REQUIRES_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 48, + .mem_write_cycles = 48, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 64 + }, { .name = "", 0 } } }, { - .package = CPU_PKG_SOCKET370, - .manufacturer = "VIA", - .name = "Cyrix III", + .package = CPU_PKG_SOCKET370, + .manufacturer = "VIA", + .name = "Cyrix III", .internal_name = "c3_samuel", - .cpus = (const CPU[]) { + .cpus = (const CPU[]) { { /* out of multiplier range */ - .name = "66", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 66666666, - .multi = 1.0, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 6, - .mem_write_cycles = 6, - .cache_read_cycles = 3, - .cache_write_cycles = 3, - .atclk_div = 8 - }, + .name = "66", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 66666666, + .multi = 1.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 6, + .mem_write_cycles = 6, + .cache_read_cycles = 3, + .cache_write_cycles = 3, + .atclk_div = 8 + }, { /* out of multiplier range */ - .name = "100", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 100000000, - .multi = 1.5, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 9, - .mem_write_cycles = 9, - .cache_read_cycles = 4, - .cache_write_cycles = 4, - .atclk_div = 12 - }, + .name = "100", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 100000000, + .multi = 1.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 9, + .mem_write_cycles = 9, + .cache_read_cycles = 4, + .cache_write_cycles = 4, + .atclk_div = 12 + }, { /* out of multiplier range */ - .name = "133", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 133333333, - .multi = 2.0, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 12, - .mem_write_cycles = 12, - .cache_read_cycles = 6, - .cache_write_cycles = 6, - .atclk_div = 16 - }, + .name = "133", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 133333333, + .multi = 2.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 12, + .mem_write_cycles = 12, + .cache_read_cycles = 6, + .cache_write_cycles = 6, + .atclk_div = 16 + }, { /* out of multiplier range */ - .name = "166", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 166666666, - .multi = 2.5, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 15, - .mem_write_cycles = 15, - .cache_read_cycles = 7, - .cache_write_cycles = 7, - .atclk_div = 20 - }, + .name = "166", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 166666666, + .multi = 2.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 15, + .mem_write_cycles = 15, + .cache_read_cycles = 7, + .cache_write_cycles = 7, + .atclk_div = 20 + }, { /* out of multiplier range */ - .name = "200", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 200000000, - .multi = 3.0, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 18, - .mem_write_cycles = 18, - .cache_read_cycles = 8, - .cache_write_cycles = 8, - .atclk_div = 24 - }, + .name = "200", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 200000000, + .multi = 3.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 18, + .mem_write_cycles = 18, + .cache_read_cycles = 8, + .cache_write_cycles = 8, + .atclk_div = 24 + }, { /* out of multiplier range */ - .name = "233", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 233333333, - .multi = 3.5, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 21, - .mem_write_cycles = 21, - .cache_read_cycles = 9, - .cache_write_cycles = 9, - .atclk_div = 28 - }, + .name = "233", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 233333333, + .multi = 3.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 21, + .mem_write_cycles = 21, + .cache_read_cycles = 9, + .cache_write_cycles = 9, + .atclk_div = 28 + }, { /* out of multiplier range */ - .name = "266", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 266666666, - .multi = 4.0, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 24, - .mem_write_cycles = 24, - .cache_read_cycles = 12, - .cache_write_cycles = 12, - .atclk_div = 32 - }, + .name = "266", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 266666666, + .multi = 4.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 24, + .mem_write_cycles = 24, + .cache_read_cycles = 12, + .cache_write_cycles = 12, + .atclk_div = 32 + }, { /* out of spec */ - .name = "300", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 300000000, - .multi = 4.5, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 27, - .mem_write_cycles = 27, - .cache_read_cycles = 13, - .cache_write_cycles = 13, - .atclk_div = 36 - }, + .name = "300", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 300000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 27, + .mem_write_cycles = 27, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 36 + }, { /* out of spec */ - .name = "333", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 333333333, - .multi = 5.0, - .voltage = 2050, - .edx_reset = 0x662, - .cpuid_model = 0x662, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 30, - .mem_write_cycles = 30, - .cache_read_cycles = 15, - .cache_write_cycles = 15, - .atclk_div = 40 - }, + .name = "333", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 333333333, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 30, + .mem_write_cycles = 30, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 40 + }, { /* out of spec */ - .name = "366", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 366666666, - .multi = 5.5, - .voltage = 2050, - .edx_reset = 0x662, - .cpuid_model = 0x662, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 33, - .mem_write_cycles = 33, - .cache_read_cycles = 16, - .cache_write_cycles = 16, - .atclk_div = 44 - }, + .name = "366", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 366666666, + .multi = 5.5, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 33, + .mem_write_cycles = 33, + .cache_read_cycles = 16, + .cache_write_cycles = 16, + .atclk_div = 44 + }, { - .name = "400", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 400000000, - .multi = 6.0, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 36, - .mem_write_cycles = 36, - .cache_read_cycles = 17, - .cache_write_cycles = 17, - .atclk_div = 48 - }, + .name = "400", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 400000000, + .multi = 6.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 36, + .mem_write_cycles = 36, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 48 + }, { /* out of spec */ - .name = "433", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 433333333, - .multi = 6.5, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 39, - .mem_write_cycles = 39, - .cache_read_cycles = 18, - .cache_write_cycles = 18, - .atclk_div = 52 - }, + .name = "433", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 433333333, + .multi = 6.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 39, + .mem_write_cycles = 39, + .cache_read_cycles = 18, + .cache_write_cycles = 18, + .atclk_div = 52 + }, { - .name = "450", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 450000000, - .multi = 4.5, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 41, - .mem_write_cycles = 41, - .cache_read_cycles = 14, - .cache_write_cycles = 14, - .atclk_div = 54 - }, + .name = "450", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 450000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 41, + .mem_write_cycles = 41, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 54 + }, { /* out of spec */ - .name = "466", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 466666666, - .multi = 6.5, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 42, - .mem_write_cycles = 42, - .cache_read_cycles = 14, - .cache_write_cycles = 14, - .atclk_div = 56 - }, + .name = "466", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 466666666, + .multi = 6.5, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 42, + .mem_write_cycles = 42, + .cache_read_cycles = 14, + .cache_write_cycles = 14, + .atclk_div = 56 + }, { - .name = "500", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 500000000, - .multi = 5.0, - .voltage = 2050, - .edx_reset = 0x662, - .cpuid_model = 0x662, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 45, - .mem_write_cycles = 45, - .cache_read_cycles = 15, - .cache_write_cycles = 15, - .atclk_div = 60 - }, + .name = "500", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 500000000, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 45, + .mem_write_cycles = 45, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 60 + }, { /* out of spec */ - .name = "533", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 533333333, - .multi = 8.0, - .voltage = 2050, - .edx_reset = 0x660, - .cpuid_model = 0x660, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 48, - .mem_write_cycles = 48, - .cache_read_cycles = 15, - .cache_write_cycles = 15, - .atclk_div = 64 - }, + .name = "533", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 533333333, + .multi = 8.0, + .voltage = 2050, + .edx_reset = 0x660, + .cpuid_model = 0x660, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 48, + .mem_write_cycles = 48, + .cache_read_cycles = 15, + .cache_write_cycles = 15, + .atclk_div = 64 + }, { - .name = "550", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 550000000, - .multi = 5.5, - .voltage = 2050, - .edx_reset = 0x662, - .cpuid_model = 0x662, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 50, - .mem_write_cycles = 50, - .cache_read_cycles = 17, - .cache_write_cycles = 17, - .atclk_div = 66 - }, + .name = "550", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 550000000, + .multi = 5.5, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 50, + .mem_write_cycles = 50, + .cache_read_cycles = 17, + .cache_write_cycles = 17, + .atclk_div = 66 + }, { - .name = "600/100", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 600000000, - .multi = 6.0, - .voltage = 2050, - .edx_reset = 0x662, - .cpuid_model = 0x662, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 54, - .mem_write_cycles = 54, - .cache_read_cycles = 18, - .cache_write_cycles = 18, - .atclk_div = 72 - }, + .name = "600/100", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 600000000, + .multi = 6.0, + .voltage = 2050, + .edx_reset = 0x662, + .cpuid_model = 0x662, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 54, + .mem_write_cycles = 54, + .cache_read_cycles = 18, + .cache_write_cycles = 18, + .atclk_div = 72 + }, { - .name = "600/133", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 600000000, - .multi = 4.5, - .voltage = 2050, - .edx_reset = 0x663, - .cpuid_model = 0x663, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 54, - .mem_write_cycles = 54, - .cache_read_cycles = 13, - .cache_write_cycles = 13, - .atclk_div = 72 - }, + .name = "600/133", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 600000000, + .multi = 4.5, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 54, + .mem_write_cycles = 54, + .cache_read_cycles = 13, + .cache_write_cycles = 13, + .atclk_div = 72 + }, { - .name = "650", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 650000000, - .multi = 6.5, - .voltage = 2050, - .edx_reset = 0x663, - .cpuid_model = 0x663, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 58, - .mem_write_cycles = 58, - .cache_read_cycles = 20, - .cache_write_cycles = 20, - .atclk_div = 78 - }, + .name = "650", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 650000000, + .multi = 6.5, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 58, + .mem_write_cycles = 58, + .cache_read_cycles = 20, + .cache_write_cycles = 20, + .atclk_div = 78 + }, { - .name = "667", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 666666667, - .multi = 5.0, - .voltage = 2050, - .edx_reset = 0x663, - .cpuid_model = 0x663, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 60, - .mem_write_cycles = 60, - .cache_read_cycles = 16, - .cache_write_cycles = 16, - .atclk_div = 80 - }, + .name = "667", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 666666667, + .multi = 5.0, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 60, + .mem_write_cycles = 60, + .cache_read_cycles = 16, + .cache_write_cycles = 16, + .atclk_div = 80 + }, { - .name = "700", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 700000000, - .multi = 7.0, - .voltage = 2050, - .edx_reset = 0x663, - .cpuid_model = 0x663, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 63, - .mem_write_cycles = 63, - .cache_read_cycles = 21, - .cache_write_cycles = 21, - .atclk_div = 84 - }, + .name = "700", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 700000000, + .multi = 7.0, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 63, + .mem_write_cycles = 63, + .cache_read_cycles = 21, + .cache_write_cycles = 21, + .atclk_div = 84 + }, { - .name = "733", - .cpu_type = CPU_CYRIX3S, - .fpus = fpus_internal, - .rspeed = 733333333, - .multi = 5.5, - .voltage = 2050, - .edx_reset = 0x663, - .cpuid_model = 0x663, - .cyrix_id = 0, - .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, - .mem_read_cycles = 66, - .mem_write_cycles = 66, - .cache_read_cycles = 18, - .cache_write_cycles = 18, - .atclk_div = 88 - }, + .name = "733", + .cpu_type = CPU_CYRIX3S, + .fpus = fpus_internal, + .rspeed = 733333333, + .multi = 5.5, + .voltage = 2050, + .edx_reset = 0x663, + .cpuid_model = 0x663, + .cyrix_id = 0, + .cpu_flags = CPU_SUPPORTS_DYNAREC | CPU_FIXED_MULTIPLIER, + .mem_read_cycles = 66, + .mem_write_cycles = 66, + .cache_read_cycles = 18, + .cache_write_cycles = 18, + .atclk_div = 88 + }, { .name = "", 0 } } }, From 60be3e786e75dce514c81f7ea049d362a570ccbe Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 20:03:24 -0400 Subject: [PATCH 183/624] Update cpu_table copyright --- src/cpu/cpu_table.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 199e197df..574cf3fd5 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -16,13 +16,15 @@ * Fred N. van Kempen, * RichardG, * dob205, + * Jasmine Iwanek, * * Copyright 2008-2019 Sarah Walker. * Copyright 2016-2019 leilei. - * Copyright 2016-2019 Miran Grca. + * Copyright 2016-2024 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. * Copyright 2020 RichardG. * Copyright 2021 dob205. + * Copyright 2022-2024 Jasmine Iwanek. */ #include #include From 963a92cfcc245518e8f9de35408e6c32b0524750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Wed, 24 Jul 2024 02:21:59 +0200 Subject: [PATCH 184/624] Update AppImageBuilder.yml --- .ci/AppImageBuilder.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/AppImageBuilder.yml b/.ci/AppImageBuilder.yml index f6e04ab9f..64f8f91ed 100644 --- a/.ci/AppImageBuilder.yml +++ b/.ci/AppImageBuilder.yml @@ -59,7 +59,7 @@ AppDir: - libqt5widgets5 # if QT:BOOL=ON - libsixel1 # if CLI:BOOL=ON - libslirp0 - - libsndfile-dev + - libsndfile1 - libsndio7.0 # if OPENAL:BOOL=ON - libvdeplug-dev # -dev also pulls in libvdeplug2. -dev is required to get the proper .so symlink to the library - libx11-6 # if QT:BOOL=ON From 47e462648bc6fad8770b73990663a41de264c44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Wed, 24 Jul 2024 02:22:33 +0200 Subject: [PATCH 185/624] Update build.sh --- .ci/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/build.sh b/.ci/build.sh index 1b1e5825e..a53ea0671 100755 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -605,7 +605,7 @@ else # ...and the ones we do want listed. Non-dev packages fill missing spots on the list. libpkgs="" longest_libpkg=0 - for pkg in libc6-dev libstdc++6 libopenal-dev libfreetype6-dev libx11-dev libsdl2-dev libpng-dev librtmidi-dev qtdeclarative5-dev libwayland-dev libevdev-dev libxkbcommon-x11-dev libglib2.0-dev libslirp-dev libfaudio-dev libaudio-dev libjack-jackd2-dev libpipewire-0.3-dev libsamplerate0-dev libsndio-dev libvdeplug-dev libfluidsynth-dev + for pkg in libc6-dev libstdc++6 libopenal-dev libfreetype6-dev libx11-dev libsdl2-dev libpng-dev librtmidi-dev qtdeclarative5-dev libwayland-dev libevdev-dev libxkbcommon-x11-dev libglib2.0-dev libslirp-dev libfaudio-dev libaudio-dev libjack-jackd2-dev libpipewire-0.3-dev libsamplerate0-dev libsndio-dev libvdeplug-dev libfluidsynth-dev libsndfile1-dev do libpkgs="$libpkgs $pkg:$arch_deb" length=$(echo -n $pkg | sed 's/-dev$//' | sed "s/qtdeclarative/qt/" | wc -c) From fc409288f863157dbca3ccedd3cd20a4e4c60038 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 20:25:54 -0400 Subject: [PATCH 186/624] Fixed the Tandy 1000HX CPU's. --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index a7c5d1cbf..29bafb65b 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1548,7 +1548,7 @@ const machine_t machines[] = { .available_flag = MACHINE_AVAILABLE, .gpio_acpi_handler = NULL, .cpu = { - .package = CPU_PKG_8088_EUROPC, + .package = CPU_PKG_8088, .block = CPU_BLOCK_NONE, .min_bus = 0, .max_bus = 0, From cf26ed11bfa5b242b98f3cb35bb8d808a68eb14d Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 23 Jul 2024 21:11:09 -0400 Subject: [PATCH 187/624] experimental preset renamed to dev_debug --- .github/workflows/cmake_linux.yml | 4 ++-- .github/workflows/cmake_macos.yml | 8 ++++---- .github/workflows/cmake_windows_msys2.yml | 4 ++-- .github/workflows/codeql_linux.yml | 2 +- .github/workflows/codeql_macos.yml | 2 +- .github/workflows/codeql_windows_msys2.yml | 2 +- CMakePresets.json | 8 +++----- 7 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.github/workflows/cmake_linux.yml b/.github/workflows/cmake_linux.yml index f1ef973c4..ed0f055a2 100644 --- a/.github/workflows/cmake_linux.yml +++ b/.github/workflows/cmake_linux.yml @@ -40,10 +40,10 @@ jobs: # - name: Regular # preset: regular - name: Debug - preset: debug + preset: dev_debug slug: -Debug - name: Dev - preset: experimental + preset: development slug: -Dev dynarec: - name: ODR diff --git a/.github/workflows/cmake_macos.yml b/.github/workflows/cmake_macos.yml index 045626cd1..dc45312f5 100644 --- a/.github/workflows/cmake_macos.yml +++ b/.github/workflows/cmake_macos.yml @@ -40,10 +40,10 @@ jobs: # - name: Regular # preset: regular - name: Debug - preset: debug + preset: dev_debug slug: -Debug - name: Dev - preset: experimental + preset: development slug: -Dev dynarec: - name: ODR @@ -138,10 +138,10 @@ jobs: # - name: Regular # preset: regular - name: Debug - preset: debug + preset: dev_debug slug: -Debug - name: Dev - preset: experimental + preset: development slug: -Dev dynarec: # - name: ODR diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index d415c7821..91442eafd 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -44,10 +44,10 @@ jobs: # - name: Regular # preset: regular - name: Debug - preset: debug + preset: dev_debug slug: -Debug - name: Dev - preset: experimental + preset: development slug: -Dev dynarec: - name: ODR diff --git a/.github/workflows/codeql_linux.yml b/.github/workflows/codeql_linux.yml index 73ccfb214..fee26a0a6 100644 --- a/.github/workflows/codeql_linux.yml +++ b/.github/workflows/codeql_linux.yml @@ -47,7 +47,7 @@ jobs: # preset: debug # slug: -Debug - name: Dev - preset: experimental + preset: dev_debug slug: -Dev dynarec: - name: ODR diff --git a/.github/workflows/codeql_macos.yml b/.github/workflows/codeql_macos.yml index adf34cb54..266a1f051 100644 --- a/.github/workflows/codeql_macos.yml +++ b/.github/workflows/codeql_macos.yml @@ -47,7 +47,7 @@ jobs: # preset: debug # slug: -Debug - name: Dev - preset: experimental + preset: dev_debug slug: -Dev dynarec: - name: ODR diff --git a/.github/workflows/codeql_windows_msys2.yml b/.github/workflows/codeql_windows_msys2.yml index 2b468f996..652a1986a 100644 --- a/.github/workflows/codeql_windows_msys2.yml +++ b/.github/workflows/codeql_windows_msys2.yml @@ -51,7 +51,7 @@ jobs: # preset: debug # slug: -Debug - name: Dev - preset: experimental + preset: dev_debug slug: -Dev dynarec: - name: ODR diff --git a/CMakePresets.json b/CMakePresets.json index 0dbaf1988..c19a7abc0 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -43,17 +43,15 @@ "name": "development", "cacheVariables": { "CMAKE_BUILD_TYPE": "Release", - "DEV_BRANCH": "ON", - "NEW_DYNAREC": "OFF" + "DEV_BRANCH": "ON" }, "inherits": "base" }, { - "name": "experimental", + "name": "dev_debug", "cacheVariables": { "CMAKE_BUILD_TYPE": "Debug", - "DEV_BRANCH": "ON", - "NEW_DYNAREC": "ON" + "DEV_BRANCH": "ON" }, "inherits": "base" }, From ad9009bfe9de29a0905154894f9ce0994adbfc95 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 24 Jul 2024 05:36:44 +0200 Subject: [PATCH 188/624] Removed an excess timer_process() call from src/game/joystick_sw_pad.c. --- src/game/joystick_sw_pad.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/game/joystick_sw_pad.c b/src/game/joystick_sw_pad.c index 7962c38e3..ba862d1e6 100644 --- a/src/game/joystick_sw_pad.c +++ b/src/game/joystick_sw_pad.c @@ -173,8 +173,6 @@ sw_write(void *priv) if (!JOYSTICK_PRESENT(0)) return; - timer_process(); - if (!sw->poll_left) { sw->poll_clock = 1; timer_set_delay_u64(&sw->poll_timer, TIMER_USEC * 50); From be944a15e69736f3c8dd1cd286195ca85986ff06 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 24 Jul 2024 17:43:12 +0200 Subject: [PATCH 189/624] Ported more Sidewinder Pad changes from PCem. --- src/game/joystick_sw_pad.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/game/joystick_sw_pad.c b/src/game/joystick_sw_pad.c index ba862d1e6..cab008d0a 100644 --- a/src/game/joystick_sw_pad.c +++ b/src/game/joystick_sw_pad.c @@ -92,9 +92,7 @@ sw_timer_over(void *priv) if (sw->poll_left == 1 && !sw->poll_clock) timer_advance_u64(&sw->poll_timer, TIMER_USEC * 160); else if (sw->poll_left) - timer_advance_u64(&sw->poll_timer, TIMER_USEC * 5); - else - timer_disable(&sw->poll_timer); + timer_set_delay_u64(&sw->poll_timer, TIMER_USEC * 5); } static void @@ -175,7 +173,7 @@ sw_write(void *priv) if (!sw->poll_left) { sw->poll_clock = 1; - timer_set_delay_u64(&sw->poll_timer, TIMER_USEC * 50); + timer_set_delay_u64(&sw->poll_timer, TIMER_USEC * 40); if (time_since_last > 9900 && time_since_last < 9940) { sw->poll_mode = 0; From 81ae79c3cac46b5003dd5da764fe691723213170 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 24 Jul 2024 13:11:41 -0400 Subject: [PATCH 190/624] Remove dead code in scsi_ncr5380.h --- src/include/86box/scsi_ncr5380.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/include/86box/scsi_ncr5380.h b/src/include/86box/scsi_ncr5380.h index 8baa4f9d8..55692075b 100644 --- a/src/include/86box/scsi_ncr5380.h +++ b/src/include/86box/scsi_ncr5380.h @@ -138,9 +138,6 @@ extern const device_t scsi_t128_device; extern const device_t scsi_t228_device; extern const device_t scsi_t130b_device; extern const device_t scsi_ls2000_device; -#if defined(DEV_BRANCH) && defined(USE_SUMO) -extern const device_t scsi_scsiat_device; -#endif #endif #endif /*SCSI_NCR5380_H*/ From f36c813ca57571cab8f5357ce4d96123f6301b81 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 00:46:33 +0200 Subject: [PATCH 191/624] HxC MFM format: Add heuristic to default to a sane RPM when the RPM in the image is set to 0, fixes #4357. --- src/floppy/fdd_mfm.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/floppy/fdd_mfm.c b/src/floppy/fdd_mfm.c index b4c859d5d..f998a6201 100644 --- a/src/floppy/fdd_mfm.c +++ b/src/floppy/fdd_mfm.c @@ -450,13 +450,20 @@ mfm_load(int drive, char *fn) } if (!(dev->hdr.if_type & 0x80)) { + pclog("Bit rate = %i\n", dev->hdr.bit_rate); dbr = round(((double) dev->hdr.bit_rate) / 50.0) * 50.0; dev->br_rounded = (int) dbr; mfm_log("Rounded bit rate: %i kbps\n", dev->br_rounded); + pclog("Rounded bit rate: %i kbps\n", dev->br_rounded); - dbr = round(((double) dev->hdr.rpm) / 60.0) * 60.0; + pclog("RPM = %i\n", dev->hdr.rpm); + if (dev->hdr.rpm != 0) + dbr = round(((double) dev->hdr.rpm) / 60.0) * 60.0; + else + dbr = (dev->br_rounded == 300) ? 360 : 300; dev->rpm_rounded = (int) dbr; mfm_log("Rounded RPM: %i kbps\n", dev->rpm_rounded); + pclog("Rounded RPM: %i kbps\n", dev->rpm_rounded); } /* Set up the drive unit. */ From 0af09b05786f095a5f2d1e5efa7aa3829db0f63e Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 00:48:46 +0200 Subject: [PATCH 192/624] Removed the excess logging from fdd_mfm.c. --- src/floppy/fdd_mfm.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/floppy/fdd_mfm.c b/src/floppy/fdd_mfm.c index f998a6201..a332d25c9 100644 --- a/src/floppy/fdd_mfm.c +++ b/src/floppy/fdd_mfm.c @@ -450,20 +450,16 @@ mfm_load(int drive, char *fn) } if (!(dev->hdr.if_type & 0x80)) { - pclog("Bit rate = %i\n", dev->hdr.bit_rate); dbr = round(((double) dev->hdr.bit_rate) / 50.0) * 50.0; dev->br_rounded = (int) dbr; mfm_log("Rounded bit rate: %i kbps\n", dev->br_rounded); - pclog("Rounded bit rate: %i kbps\n", dev->br_rounded); - pclog("RPM = %i\n", dev->hdr.rpm); if (dev->hdr.rpm != 0) dbr = round(((double) dev->hdr.rpm) / 60.0) * 60.0; else - dbr = (dev->br_rounded == 300) ? 360 : 300; + dbr = (dev->br_rounded == 300) ? 360.0 : 300.0; dev->rpm_rounded = (int) dbr; - mfm_log("Rounded RPM: %i kbps\n", dev->rpm_rounded); - pclog("Rounded RPM: %i kbps\n", dev->rpm_rounded); + mfm_log("Rounded RPM: %i rpm\n", dev->rpm_rounded); } /* Set up the drive unit. */ From 3ea7f2ad928fbf4830ad168142d3fe8e085d78f4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 06:54:26 +0200 Subject: [PATCH 193/624] OPTi chipset mask and CPU fixes, fixes #895. --- src/chipset/opti283.c | 35 +++++++++++++++++++------- src/chipset/opti391.c | 32 ++++++++++++++++-------- src/chipset/opti495.c | 55 ++++++++++++++++++++++++++++++++--------- src/chipset/opti499.c | 41 ++++++++++++++++-------------- src/chipset/opti895.c | 14 ++++++++--- src/cpu/x86_ops_pmode.h | 21 +++++++++++----- 6 files changed, 139 insertions(+), 59 deletions(-) diff --git a/src/chipset/opti283.c b/src/chipset/opti283.c index 1fa59f2f0..63976985b 100644 --- a/src/chipset/opti283.c +++ b/src/chipset/opti283.c @@ -31,6 +31,7 @@ #include <86box/mem.h> #include <86box/plat_fallthrough.h> #include <86box/plat_unused.h> +#include <86box/port_92.h> #include <86box/chipset.h> #ifdef ENABLE_OPTI283_LOG @@ -215,16 +216,27 @@ opti283_write(uint16_t addr, uint8_t val, void *priv) opti283_t *dev = (opti283_t *) priv; switch (addr) { + default: + break; + case 0x22: dev->index = val; break; + case 0x23: + if (dev->index == 0x01) + dev->regs[dev->index] = val; + break; + case 0x24: opti283_log("OPTi 283: dev->regs[%02x] = %02x\n", dev->index, val); switch (dev->index) { + default: + break; + case 0x10: - dev->regs[dev->index] = val; + dev->regs[dev->index] = (dev->regs[dev->index] & 0x80) | (val & 0x7f); break; case 0x14: @@ -236,13 +248,9 @@ opti283_write(uint16_t addr, uint8_t val, void *priv) dev->regs[dev->index] = val; opti283_shadow_recalc(dev); break; - - default: - break; } - break; - default: + dev->index = 0xff; break; } } @@ -250,11 +258,17 @@ opti283_write(uint16_t addr, uint8_t val, void *priv) static uint8_t opti283_read(uint16_t addr, void *priv) { - const opti283_t *dev = (opti283_t *) priv; - uint8_t ret = 0xff; + opti283_t *dev = (opti283_t *) priv; + uint8_t ret = 0xff; - if (addr == 0x24) + if ((addr == 0x23) && (dev->index == 0x01)) ret = dev->regs[dev->index]; + else if (addr == 0x24) { + if ((dev->index >= 0x10) && (dev->index <= 0x14)) + ret = dev->regs[dev->index]; + + dev->index = 0xff; + } return ret; } @@ -274,6 +288,7 @@ opti283_init(UNUSED(const device_t *info)) memset(dev, 0x00, sizeof(opti283_t)); io_sethandler(0x0022, 0x0001, opti283_read, NULL, NULL, opti283_write, NULL, NULL, dev); + io_sethandler(0x0023, 0x0001, opti283_read, NULL, NULL, opti283_write, NULL, NULL, dev); io_sethandler(0x0024, 0x0001, opti283_read, NULL, NULL, opti283_write, NULL, NULL, dev); dev->regs[0x10] = 0x3f; @@ -296,6 +311,8 @@ opti283_init(UNUSED(const device_t *info)) opti283_shadow_recalc(dev); + device_add(&port_92_device); + return dev; } diff --git a/src/chipset/opti391.c b/src/chipset/opti391.c index c4c5534f8..c22c2a04b 100644 --- a/src/chipset/opti391.c +++ b/src/chipset/opti391.c @@ -178,6 +178,9 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) opti391_log("[W] %04X = %02X\n", addr, val); switch (addr) { + default: + break; + case 0x22: dev->index = val; break; @@ -200,6 +203,9 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) reset_on_hlt = !!(val & 0x02); break; } else switch (dev->index - dev->reg_base) { + default: + break; + case 0x00: if (dev->type == 2) { reset_on_hlt = !!(val & 0x02); @@ -222,8 +228,14 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) opti391_recalcremap(dev); break; - case 0x04: case 0x05: + if (dev->type == 2) + dev->regs[dev->index - dev->reg_base] = val & 0xf8; + else + dev->regs[dev->index - dev->reg_base] = val; + break; + + case 0x04: case 0x09: case 0x0a: case 0x0b: @@ -238,8 +250,10 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) } break; case 0x08: - dev->regs[dev->index - dev->reg_base] = val; - if (dev->type < 2) { + if (dev->type == 2) + dev->regs[dev->index - dev->reg_base] = val & 0xe3; + else { + dev->regs[dev->index - dev->reg_base] = val; cpu_cache_ext_enabled = !!(dev->regs[0x02] & 0x40); cpu_update_waitstates(); } @@ -257,13 +271,9 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) dev->regs[dev->index - dev->reg_base] = val; opti391_shadow_recalc(dev); break; - - default: - break; } - break; - default: + dev->index = 0xff; break; } } @@ -271,14 +281,16 @@ opti391_write(uint16_t addr, uint8_t val, void *priv) static uint8_t opti391_read(uint16_t addr, void *priv) { - const opti391_t *dev = (opti391_t *) priv; - uint8_t ret = 0xff; + opti391_t *dev = (opti391_t *) priv; + uint8_t ret = 0xff; if (addr == 0x24) { if ((dev->index <= 0x01) && (dev->type < 2)) ret = dev->regs[dev->index + 0x10]; else if ((dev->index >= dev->min_reg) && (dev->index <= dev->max_reg)) ret = dev->regs[dev->index - dev->reg_base]; + + dev->index = 0xff; } opti391_log("[R] %04X = %02X\n", addr, ret); diff --git a/src/chipset/opti495.c b/src/chipset/opti495.c index 13bc2a124..84ef6a202 100644 --- a/src/chipset/opti495.c +++ b/src/chipset/opti495.c @@ -32,6 +32,8 @@ #include <86box/chipset.h> typedef struct opti495_t { + uint8_t type; + uint8_t max; uint8_t idx; uint8_t regs[256]; uint8_t scratch[2]; @@ -55,6 +57,22 @@ opti495_log(const char *fmt, ...) # define opti495_log(fmt, ...) #endif +enum { + OPTI493 = 0, + OPTI495, + OPTI495SLC, + OPTI495SX, + OPTI495XLC, + TMAX +}; + +/* OPTi 82C493: According to The Last Byte, bit 1 of register 22h, while unused, must still be writable. */ +static uint8_t masks[TMAX][0x1c] = { { 0x3f, 0xff, 0xff, 0xff, 0xf7, 0xfb, 0x7f, 0x9f, 0xe3, 0xff, 0xe3, 0xff }, + { 0x3a, 0x7f, 0xff, 0xff, 0xf0, 0xfb, 0x7f, 0xbf, 0xe3, 0xff, 0x00, 0x00 }, + { 0x3a, 0x7f, 0xfc, 0xff, 0xf0, 0xfb, 0xff, 0xbf, 0xe3, 0xff, 0x00, 0x00 }, + { 0x3a, 0xff, 0xfd, 0xff, 0xf0, 0xfb, 0x7f, 0xbf, 0xe3, 0xff, 0x00, 0x00 }, + { 0x3a, 0xff, 0xfc, 0xff, 0xf0, 0xfb, 0xff, 0xbf, 0xe3, 0xff, 0x00, 0x00 } }; + static void opti495_recalc(opti495_t *dev) { @@ -119,16 +137,25 @@ opti495_write(uint16_t addr, uint8_t val, void *priv) opti495_t *dev = (opti495_t *) priv; switch (addr) { + default: + break; + case 0x22: opti495_log("[%04X:%08X] [W] dev->idx = %02X\n", CS, cpu_state.pc, val); dev->idx = val; break; case 0x24: - if ((dev->idx >= 0x20) && (dev->idx <= 0x2d)) { - dev->regs[dev->idx] = val; + if ((dev->idx >= 0x20) && (dev->idx <= dev->max)) { opti495_log("[%04X:%08X] [W] dev->regs[%04X] = %02X\n", CS, cpu_state.pc, dev->idx, val); + dev->regs[dev->idx] = val & masks[dev->type][dev->idx - 0x20]; + if ((dev->type == OPTI493) && (dev->idx == 0x20)) + val |= 0x40; + switch (dev->idx) { + default: + break; + case 0x21: cpu_cache_ext_enabled = !!(dev->regs[0x21] & 0x10); cpu_update_waitstates(); @@ -139,36 +166,36 @@ opti495_write(uint16_t addr, uint8_t val, void *priv) case 0x26: opti495_recalc(dev); break; - default: - break; } } + + dev->idx = 0xff; break; case 0xe1: case 0xe2: dev->scratch[~addr & 0x01] = val; break; - default: - break; } } static uint8_t opti495_read(uint16_t addr, void *priv) { - uint8_t ret = 0xff; - const opti495_t *dev = (opti495_t *) priv; + uint8_t ret = 0xff; + opti495_t *dev = (opti495_t *) priv; switch (addr) { case 0x22: opti495_log("[%04X:%08X] [R] dev->idx = %02X\n", CS, cpu_state.pc, ret); break; case 0x24: - if ((dev->idx >= 0x20) && (dev->idx <= 0x2d)) { + if ((dev->idx >= 0x20) && (dev->idx <= dev->max)) { ret = dev->regs[dev->idx]; opti495_log("[%04X:%08X] [R] dev->regs[%04X] = %02X\n", CS, cpu_state.pc, dev->idx, ret); } + + dev->idx = 0xff; break; case 0xe1: case 0xe2: @@ -202,8 +229,11 @@ opti495_init(const device_t *info) dev->scratch[0] = dev->scratch[1] = 0xff; - if (info->local == 1) { + dev->type = info->local; + + if (info->local >= OPTI495) { /* 85C495 */ + dev->max = 0x29; dev->regs[0x20] = 0x02; dev->regs[0x21] = 0x20; dev->regs[0x22] = 0xe4; @@ -214,6 +244,7 @@ opti495_init(const device_t *info) dev->regs[0x29] = 0x10; } else { /* 85C493 */ + dev->max = 0x2b; dev->regs[0x20] = 0x40; dev->regs[0x22] = 0x84; dev->regs[0x24] = 0x87; @@ -236,7 +267,7 @@ const device_t opti493_device = { .name = "OPTi 82C493", .internal_name = "opti493", .flags = 0, - .local = 0, + .local = OPTI493, .init = opti495_init, .close = opti495_close, .reset = NULL, @@ -250,7 +281,7 @@ const device_t opti495_device = { .name = "OPTi 82C495", .internal_name = "opti495", .flags = 0, - .local = 1, + .local = OPTI495XLC, .init = opti495_init, .close = opti495_close, .reset = NULL, diff --git a/src/chipset/opti499.c b/src/chipset/opti499.c index d976e0198..ecadd2224 100644 --- a/src/chipset/opti499.c +++ b/src/chipset/opti499.c @@ -38,6 +38,9 @@ typedef struct opti499_t { uint8_t scratch[2]; } opti499_t; +/* According to The Last Byte, register 2Dh bit 7 must still be writable, even if it is unused. */ +static uint8_t masks[0x0e] = { 0x3f, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xe3, 0xff, 0xfb, 0xff, 0x00, 0xff }; + #ifdef ENABLE_OPTI499_LOG int opti499_do_log = ENABLE_OPTI499_LOG; @@ -126,19 +129,25 @@ opti499_write(uint16_t addr, uint8_t val, void *priv) opti499_t *dev = (opti499_t *) priv; switch (addr) { + default: + break; + case 0x22: opti499_log("[%04X:%08X] [W] dev->idx = %02X\n", CS, cpu_state.pc, val); dev->idx = val; break; case 0x24: - if ((dev->idx >= 0x20) && (dev->idx <= 0x2d)) { - if (dev->idx == 0x20) - dev->regs[dev->idx] = (dev->regs[dev->idx] & 0xc0) | (val & 0x3f); - else - dev->regs[dev->idx] = val; + if ((dev->idx >= 0x20) && (dev->idx <= 0x2d) && (dev->idx != 0x2c)) { opti499_log("[%04X:%08X] [W] dev->regs[%04X] = %02X\n", CS, cpu_state.pc, dev->idx, val); + dev->regs[dev->idx] = val & masks[dev->idx - 0x20]; + if (dev->idx == 0x2a) + dev->regs[dev->idx] |= 0x04; + switch (dev->idx) { + default: + break; + case 0x20: reset_on_hlt = !(val & 0x02); break; @@ -154,20 +163,16 @@ opti499_write(uint16_t addr, uint8_t val, void *priv) case 0x2d: opti499_recalc(dev); break; - - default: - break; } } + + dev->idx = 0xff; break; case 0xe1: case 0xe2: dev->scratch[~addr & 0x01] = val; break; - - default: - break; } } @@ -178,25 +183,23 @@ opti499_read(uint16_t addr, void *priv) opti499_t *dev = (opti499_t *) priv; switch (addr) { + default: + break; + case 0x22: opti499_log("[%04X:%08X] [R] dev->idx = %02X\n", CS, cpu_state.pc, ret); break; case 0x24: - if ((dev->idx >= 0x20) && (dev->idx <= 0x2d)) { - if (dev->idx == 0x2d) - ret = dev->regs[dev->idx] & 0xbf; - else - ret = dev->regs[dev->idx]; + if ((dev->idx >= 0x20) && (dev->idx <= 0x2d) && (dev->idx != 0x2c)) { + ret = dev->regs[dev->idx]; opti499_log("[%04X:%08X] [R] dev->regs[%04X] = %02X\n", CS, cpu_state.pc, dev->idx, ret); } + dev->idx = 0xff; break; case 0xe1: case 0xe2: ret = dev->scratch[~addr & 0x01]; break; - - default: - break; } return ret; diff --git a/src/chipset/opti895.c b/src/chipset/opti895.c index 77297ae95..f1878a51b 100644 --- a/src/chipset/opti895.c +++ b/src/chipset/opti895.c @@ -42,6 +42,9 @@ typedef struct opti895_t { smram_t *smram; } opti895_t; +static uint8_t masks[0x10] = { 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xe3, 0xff, 0xe3, 0xff, 0x00, 0xff, 0xff, 0xff }; + #ifdef ENABLE_OPTI895_LOG int opti895_do_log = ENABLE_OPTI895_LOG; @@ -153,8 +156,12 @@ opti895_write(uint16_t addr, uint8_t val, void *priv) } break; case 0x24: - if (((dev->idx >= 0x20) && (dev->idx <= 0x2f)) || ((dev->idx >= 0xe0) && (dev->idx <= 0xef))) { - dev->regs[dev->idx] = val; + if (((dev->idx >= 0x20) && (dev->idx <= 0x2f) && (dev->idx != 0x2c)) || + ((dev->idx >= 0xe0) && (dev->idx <= 0xef))) { + if (dev->idx > 0x2f) + dev->regs[dev->idx] = val; + else + dev->regs[dev->idx] = val & masks[dev->idx - 0x20]; opti895_log("dev->regs[%04x] = %08x\n", dev->idx, val); /* TODO: Registers 0x30-0x3F for OPTi 802GP and 898. */ @@ -217,7 +224,8 @@ opti895_read(uint16_t addr, void *priv) break; case 0x24: /* TODO: Registers 0x30-0x3F for OPTi 802GP and 898. */ - if (((dev->idx >= 0x20) && (dev->idx <= 0x2f)) || ((dev->idx >= 0xe0) && (dev->idx <= 0xef))) { + if (((dev->idx >= 0x20) && (dev->idx <= 0x2f) && (dev->idx != 0x2c)) || + ((dev->idx >= 0xe0) && (dev->idx <= 0xef))) { ret = dev->regs[dev->idx]; if (dev->idx == 0xe0) ret = (ret & 0xf6) | (in_smm ? 0x00 : 0x08) | !!dev->forced_green; diff --git a/src/cpu/x86_ops_pmode.h b/src/cpu/x86_ops_pmode.h index e84847a7b..4f32b0e37 100644 --- a/src/cpu/x86_ops_pmode.h +++ b/src/cpu/x86_ops_pmode.h @@ -430,12 +430,21 @@ op0F01_common(uint32_t fetchdat, int is32, int is286, int ea32) case 0x20: /*SMSW*/ if (cpu_mod != 3) SEG_CHECK_WRITE(cpu_state.ea_seg); - if (is486 || isibm486) - seteaw(msw); - else if (is386) - seteaw(msw | /* 0xFF00 */ 0xFFE0); - else - seteaw(msw | 0xFFF0); + if (is386 && is32 && (cpu_mod == 3)) { + if (is486 || isibm486) + seteaw(cr0); + else if (is386 && !cpu_16bitbus) + seteaw(cr0 | /* 0x7FFFFF00 */ 0x7FFFFFE0); + else + seteaw(cr0 | 0x7FFFFFF0); + } else { + if (is486 || isibm486) + seteaw(msw); + else if (is386 && !cpu_16bitbus) + seteaw(msw | /* 0xFF00 */ 0xFFE0); + else + seteaw(msw | 0xFFF0); + } CLOCK_CYCLES(2); PREFETCH_RUN(2, 2, rmdat, 0, 0, (cpu_mod == 3) ? 0 : 1, 0, ea32); break; From 8264b70825dc7754182bc7f52905dd2ef37cf1a2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 06:56:24 +0200 Subject: [PATCH 194/624] Removed an excess line from Compaq Genoa init. --- src/chipset/compaq_386.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/chipset/compaq_386.c b/src/chipset/compaq_386.c index 3b40734aa..8c241e087 100644 --- a/src/chipset/compaq_386.c +++ b/src/chipset/compaq_386.c @@ -759,8 +759,6 @@ compaq_genoa_init(UNUSED(const device_t *info)) { void *cpq = device_add(&compaq_386_device); - pclog_toggle_suppr(); - io_sethandler(0x0c02, 2, NULL, NULL, NULL, NULL, compaq_genoa_outw, NULL, cpq); return ram; From 5912a88a1b9a4f38a1ee91010d2481c37e31b683 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 19:05:05 +0200 Subject: [PATCH 195/624] Fixed initializations in the CD-ROM code, fixes #4653. --- src/cdrom/cdrom_image_backend.c | 8 ++++---- src/cpu/x87_ops_sf.h | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index e588a1938..25085285c 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -242,7 +242,7 @@ bin_close(void *priv) static track_file_t * bin_init(const char *filename, int *error) { - track_file_t *tf = (track_file_t *) malloc(sizeof(track_file_t)); + track_file_t *tf = (track_file_t *) calloc(1, sizeof(track_file_t)); struct stat stats; if (tf == NULL) { @@ -534,7 +534,7 @@ cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint3 to get sector size? */ const int sector_size = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE; const uint32_t buf_len = num * sector_size; - uint8_t *buf = (uint8_t *) malloc(buf_len * sizeof(uint8_t)); + uint8_t *buf = (uint8_t *) calloc(1, buf_len * sizeof(uint8_t)); for (uint32_t i = 0; i < num; i++) { success = cdi_read_sector(cdi, &buf[i * sector_size], raw, sector + i); @@ -646,7 +646,7 @@ cdi_track_push_back(cd_img_t *cdi, track_t *trk) int cdi_get_iso_track(cd_img_t *cdi, track_t *trk, const char *filename) { - int error; + int error = 0; int ret = 2; memset(trk, 0, sizeof(track_t)); @@ -712,7 +712,7 @@ int cdi_load_iso(cd_img_t *cdi, const char *filename) { int ret = 2; - track_t trk; + track_t trk = { 0 }; cdi->tracks = NULL; cdi->tracks_num = 0; diff --git a/src/cpu/x87_ops_sf.h b/src/cpu/x87_ops_sf.h index ea3715c41..af94897c9 100644 --- a/src/cpu/x87_ops_sf.h +++ b/src/cpu/x87_ops_sf.h @@ -606,7 +606,6 @@ static int sf_FNOP(uint32_t fetchdat) { FP_ENTER(); - pclog("FNOP.\n"); FPU_check_pending_exceptions(); cpu_state.pc++; CLOCK_CYCLES_FPU((fpu_type >= FPU_487SX) ? (x87_timings.fnop) : (x87_timings.fnop * cpu_multi)); From a94f9d8381980d79e2b238a796b522c24500b6b3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 19:13:38 +0200 Subject: [PATCH 196/624] All the requested machine table corrections except for the 486's. --- src/machine/machine_table.c | 310 ++++++++++++++++-------------------- 1 file changed, 135 insertions(+), 175 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 29bafb65b..673c9997d 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -57,7 +57,7 @@ extern const device_t compaq_plasma_device; extern const device_t ps1_2011_device; const machine_filter_t machine_types[] = { - { "None", MACHINE_TYPE_NONE }, + { "None", MACHINE_TYPE_NONE }, { "[1979] 8088", MACHINE_TYPE_8088 }, { "[1978] 8086", MACHINE_TYPE_8086 }, { "[1982] 80286", MACHINE_TYPE_286 }, @@ -72,15 +72,15 @@ const machine_filter_t machine_types[] = { { "[1993] Socket 4", MACHINE_TYPE_SOCKET4 }, { "[1994] Socket 5", MACHINE_TYPE_SOCKET5 }, { "[1995] Socket 7 (Single Voltage)", MACHINE_TYPE_SOCKET7_3V }, - { "[1995] Socket 7 (Dual Voltage)", MACHINE_TYPE_SOCKET7 }, + { "[1996] Socket 7 (Dual Voltage)", MACHINE_TYPE_SOCKET7 }, { "[1998] Super Socket 7", MACHINE_TYPE_SOCKETS7 }, { "[1995] Socket 8", MACHINE_TYPE_SOCKET8 }, - { "[1996] Slot 1", MACHINE_TYPE_SLOT1 }, + { "[1997] Slot 1", MACHINE_TYPE_SLOT1 }, { "[1998] Slot 1/2", MACHINE_TYPE_SLOT1_2 }, { "[1998] Slot 1/Socket 370", MACHINE_TYPE_SLOT1_370 }, { "[1998] Slot 2", MACHINE_TYPE_SLOT2 }, { "[1998] Socket 370", MACHINE_TYPE_SOCKET370 }, - { "Miscellaneous", MACHINE_TYPE_MISC } + { "Miscellaneous", MACHINE_TYPE_MISC } }; const machine_filter_t machine_chipsets[] = { @@ -10767,6 +10767,48 @@ const machine_t machines[] = { }, /* 430HX */ + /* Has SST Flash. */ + /* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix + MultiKey/42 (version 1.38) KBC firmware. */ + { + .name = "[i430HX] Acer V35N", + .internal_name = "acerv35n", + .type = MACHINE_TYPE_SOCKET7_3V, + .chipset = MACHINE_CHIPSET_INTEL_430HX, + .init = machine_at_acerv35n_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 3450, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, + .ram = { + .min = 8192, + .max = 196608, + .step = 8192 + }, + .nvrmask = 511, + .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 + }, /* Has AMIKey-2 or VIA VT82C42N KBC (depending on the revision) with AMIKEY 'F' KBC firmware. */ { .name = "[i430HX] AOpen AP53", @@ -10847,89 +10889,8 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* [TEST] The board doesn't seem to have a KBC at all, which probably means it's an on-chip one on the PC87306 SIO. - A list on a Danish site shows the BIOS as having a -0 string, indicating non-AMI KBC firmware. */ - { - .name = "[i430HX] Supermicro P55T2S", - .internal_name = "p55t2s", - .type = MACHINE_TYPE_SOCKET7_3V, - .chipset = MACHINE_CHIPSET_INTEL_430HX, - .init = machine_at_p55t2s_init, - .p1_handler = NULL, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 50000000, - .max_bus = 66666667, - .min_voltage = 3300, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.0 - }, - .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, - .ram = { - .min = 8192, - .max = 786432, - .step = 8192 - }, - .nvrmask = 255, - .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 - }, /* 430VX */ - /* Has AMIKey H KBC firmware (AMIKey-2). */ - { - .name = "[i430VX] ECS P5VX-B", - .internal_name = "p5vxb", - .type = MACHINE_TYPE_SOCKET7_3V, - .chipset = MACHINE_CHIPSET_INTEL_430VX, - .init = machine_at_p5vxb_init, - .p1_handler = NULL, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 50000000, - .max_bus = 66666667, - .min_voltage = 3380, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.0 - }, - .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, - .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, - .ram = { - .min = 8192, - .max = 131072, - .step = 8192 - }, - .nvrmask = 127, - .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 - }, /* Has a SM(S)C FDC37C932FR Super I/O chip with on-chip KBC with AMI MegaKey (revision '5') KBC firmware. */ { @@ -11219,48 +11180,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* Has SST Flash. */ - /* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix - MultiKey/42 (version 1.38) KBC firmware. */ - { - .name = "[i430HX] Acer V35N", - .internal_name = "acerv35n", - .type = MACHINE_TYPE_SOCKET7, - .chipset = MACHINE_CHIPSET_INTEL_430HX, - .init = machine_at_acerv35n_init, - .p1_handler = NULL, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK(CPU_Cx6x86MX), - .min_bus = 50000000, - .max_bus = 66666667, - .min_voltage = 2800, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.0 - }, - .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM, - .ram = { - .min = 8192, - .max = 196608, - .step = 8192 - }, - .nvrmask = 511, - .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 - }, /* Has AMIKey H KBC firmware (AMIKey-2). */ { .name = "[i430HX] ASUS P/I-P55T2P4", @@ -11301,6 +11220,46 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* The base board has a Holtek HT6542B with the AMIKey-2 (updated 'H') KBC firmware. */ + { + .name = "[i430HX] ASUS P/I-P65UP5 (C-P55T2D)", + .internal_name = "p65up5_cp55t2d", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430HX, + .init = machine_at_p65up5_cp55t2d_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 2500, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Machine has AMB */ + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, + .ram = { + .min = 8192, + .max = 524288, + .step = 8192 + }, + .nvrmask = 127, + .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 + }, /* Has a SM(S)C FDC37C935 Super I/O chip with on-chip KBC with Phoenix MultiKey/42 (version 1.38) KBC firmware. */ { @@ -11547,13 +11506,14 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* The base board has a Holtek HT6542B with the AMIKey-2 (updated 'H') KBC firmware. */ + /* [TEST] The board doesn't seem to have a KBC at all, which probably means it's an on-chip one on the PC87306 SIO. + A list on a Danish site shows the BIOS as having a -0 string, indicating non-AMI KBC firmware. */ { - .name = "[i430HX] ASUS P/I-P65UP5 (C-P55T2D)", - .internal_name = "p65up5_cp55t2d", + .name = "[i430HX] Supermicro P55T2S", + .internal_name = "p55t2s", .type = MACHINE_TYPE_SOCKET7, .chipset = MACHINE_CHIPSET_INTEL_430HX, - .init = machine_at_p65up5_cp55t2d_init, + .init = machine_at_p55t2s_init, .p1_handler = NULL, .gpio_handler = NULL, .available_flag = MACHINE_AVAILABLE, @@ -11563,59 +11523,19 @@ const machine_t machines[] = { .block = CPU_BLOCK_NONE, .min_bus = 50000000, .max_bus = 66666667, - .min_voltage = 2500, + .min_voltage = 2800, .max_voltage = 3520, .min_multi = 1.5, .max_multi = 3.0 }, - .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, /* Machine has AMB */ + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, - .max = 524288, + .max = 786432, .step = 8192 }, - .nvrmask = 127, - .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 - }, - /* Unknown PS/2 KBC. */ - { - .name = "[i430HX] Radisys EPC-2102", - .internal_name = "epc2102", - .type = MACHINE_TYPE_SOCKET7, - .chipset = MACHINE_CHIPSET_INTEL_430HX, - .init = machine_at_epc2102_init, - .p1_handler = NULL, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET5_7, - .block = CPU_BLOCK_NONE, - .min_bus = 50000000, - .max_bus = 83333333, - .min_voltage = 2500, - .max_voltage = 3520, - .min_multi = 1.5, - .max_multi = 3.0 - }, - .bus_flags = MACHINE_PS2_PCI, - .flags = MACHINE_IDE_DUAL | MACHINE_APM, - .ram = { - .min = 8192, - .max = 262144, - .step = 8192 - }, - .nvrmask = 127, + .nvrmask = 255, .kbc_device = NULL, .kbc_p1 = 0xff, .gpio = 0xffffffff, @@ -11913,6 +11833,46 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has AMIKey H KBC firmware (AMIKey-2). */ + { + .name = "[i430VX] ECS P5VX-B", + .internal_name = "p5vxb", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430VX, + .init = machine_at_p5vxb_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 66666667, + .min_voltage = 2500, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, + .ram = { + .min = 8192, + .max = 131072, + .step = 8192 + }, + .nvrmask = 127, + .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 + }, /* Has a SM(S)C FDC37C932FR Super I/O chip with on-chip KBC with AMI MegaKey (revision '5') KBC firmware. */ { From 9cee5b41af81496e3c61bc37cc9c54e1d8e04673 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 19:20:00 +0200 Subject: [PATCH 197/624] And the 486's. --- src/machine/machine_table.c | 248 ++++++++++++++++++------------------ 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 673c9997d..b154437e4 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5752,50 +5752,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* Has JetKey 5 KBC Firmware which looks like it is a clone of AMIKey type F. - It also has those Ex commands also seen on the VIA VT82C42N (the BIOS - supposedly sends command EF. - The board was also seen in 2003 with a -H string - perhaps someone swapped - the KBC? */ - { - .name = "[ALi M1429] Olystar LIL1429", - .internal_name = "ali1429", - .type = MACHINE_TYPE_486, - .chipset = MACHINE_CHIPSET_ALI_M1429, - .init = machine_at_ali1429_init, - .p1_handler = NULL, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET1, - .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_VLB, - .flags = MACHINE_APM, - .ram = { - .min = 1024, - .max = 32768, - .step = 1024 - }, - .nvrmask = 127, - .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 - }, /* Has JetKey 5 KBC Firmware - but the BIOS string ends in a hardcoded -F, and the BIOS also explicitly expects command A1 to return a 'F', so it looks like the JetKey 5 is a clone of AMIKey type F. */ @@ -6000,86 +5956,6 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, - /* Uses an NEC 90M002A (UPD82C42C, 8042 clone) with unknown firmware. */ - { - .name = "[SiS 461] Acer V10", - .internal_name = "acerv10", - .type = MACHINE_TYPE_486, - .chipset = MACHINE_CHIPSET_SIS_461, - .init = machine_at_acerv10_init, - .p1_handler = NULL, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET1, - .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_PS2_VLB, - .flags = MACHINE_IDE | MACHINE_APM, /* Machine has internal SCSI: Adaptec AIC-6360 */ - .ram = { - .min = 1024, - .max = 32768, - .step = 1024 - }, - .nvrmask = 127, - .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 - }, - /* Has MR (!) KBC firmware, which is a clone of the standard IBM PS/2 KBC firmware. */ - { - .name = "[SiS 471] SiS VL-BUS 471 REV. A1", - .internal_name = "px471", - .type = MACHINE_TYPE_486, - .chipset = MACHINE_CHIPSET_SIS_471, - .init = machine_at_px471_init, - .p1_handler = NULL, - .gpio_handler = NULL, - .available_flag = MACHINE_AVAILABLE, - .gpio_acpi_handler = NULL, - .cpu = { - .package = CPU_PKG_SOCKET1, - .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_VLB, - .flags = MACHINE_IDE | MACHINE_APM, - .ram = { - .min = 1024, - .max = 131072, - .step = 1024 - }, - .nvrmask = 127, - .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 - }, /* The chip is a Lance LT38C41, a clone of the Intel 8041, and the BIOS sends commands BC, BD, and C9 which exist on both AMIKey and Phoenix MultiKey/42, but it does not write a byte after C9, which is consistent with AMIKey, so @@ -6366,6 +6242,50 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has JetKey 5 KBC Firmware which looks like it is a clone of AMIKey type F. + It also has those Ex commands also seen on the VIA VT82C42N (the BIOS + supposedly sends command EF. + The board was also seen in 2003 with a -H string - perhaps someone swapped + the KBC? */ + { + .name = "[ALi M1429] Olystar LIL1429", + .internal_name = "ali1429", + .type = MACHINE_TYPE_486_S2, + .chipset = MACHINE_CHIPSET_ALI_M1429, + .init = machine_at_ali1429_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET3, + .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_VLB, + .flags = MACHINE_APM, + .ram = { + .min = 1024, + .max = 32768, + .step = 1024 + }, + .nvrmask = 127, + .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 standalone AMI Megakey 1993, which is type 'P'. */ { .name = "[IMS 8848] Tekram G486IP", @@ -6811,6 +6731,46 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Uses an NEC 90M002A (UPD82C42C, 8042 clone) with unknown firmware. */ + { + .name = "[SiS 461] Acer V10", + .internal_name = "acerv10", + .type = MACHINE_TYPE_486_S3, + .chipset = MACHINE_CHIPSET_SIS_461, + .init = machine_at_acerv10_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET3, + .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_PS2_VLB, + .flags = MACHINE_IDE | MACHINE_APM, /* Machine has internal SCSI: Adaptec AIC-6360 */ + .ram = { + .min = 1024, + .max = 32768, + .step = 1024 + }, + .nvrmask = 127, + .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 + }, /* The BIOS string ends in -U, unless command 0xA1 (AMIKey get version) returns an 'F', in which case, it ends in -F, so it has an AMIKey F KBC firmware. The photo of the board shows an AMIKey KBC which is indeed F. */ @@ -7013,6 +6973,46 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has MR (!) KBC firmware, which is a clone of the standard IBM PS/2 KBC firmware. */ + { + .name = "[SiS 471] SiS VL-BUS 471 REV. A1", + .internal_name = "px471", + .type = MACHINE_TYPE_486_S3, + .chipset = MACHINE_CHIPSET_SIS_471, + .init = machine_at_px471_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET3, + .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_VLB, + .flags = MACHINE_IDE | MACHINE_APM, + .ram = { + .min = 1024, + .max = 131072, + .step = 1024 + }, + .nvrmask = 127, + .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 + }, /* TriGem AMIBIOS Pre-Color with TriGem AMI 'Z' keyboard controller */ { .name = "[SiS 471] TriGem 486G", From 06877f97c7731487f58a01804d8b3c79d71a7754 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 19:53:45 +0200 Subject: [PATCH 198/624] Reverted the accidental removal of the RadiSys. --- src/machine/machine_table.c | 44 +++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index b154437e4..5710ac283 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -12079,6 +12079,50 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Unknown PS/2 KBC. */ + { + .name = "[i430HX] Radisys EPC-2102", + .internal_name = "epc2102", + .type = MACHINE_TYPE_SOCKET7, + .chipset = MACHINE_CHIPSET_INTEL_430HX, + .init = machine_at_epc2102_init, + .p1_handler = NULL, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET5_7, + .block = CPU_BLOCK_NONE, + .min_bus = 50000000, + .max_bus = 83333333, + .min_voltage = 2500, + .max_voltage = 3520, + .min_multi = 1.5, + .max_multi = 3.0 + }, + .bus_flags = MACHINE_PS2_PCI, + .flags = MACHINE_IDE_DUAL | MACHINE_APM, + .ram = { + .min = 8192, + .max = 262144, + .max = 786432, + .step = 8192 + }, + .nvrmask = 127, + .nvrmask = 255, + .kbc_device = NULL, + .kbc_p1 = 0xff, + .gpio = 0xffffffff, + .snd_device = NULL, + .net_device = NULL + .gpio_acpi = 0xffffffff, + .device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* This has a Holtek KBC and the BIOS does not send a single non-standard KBC command, so it must be an ASIC that clones the standard IBM PS/2 KBC. */ { From 5453f2c3b72edbe8fbb6e32a09830d4ece58f0b7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 19:58:21 +0200 Subject: [PATCH 199/624] Fixed a compile-breaking mistake in machine_table.c. --- src/machine/machine_table.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 5710ac283..c02d67886 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -12113,8 +12113,6 @@ const machine_t machines[] = { .kbc_device = NULL, .kbc_p1 = 0xff, .gpio = 0xffffffff, - .snd_device = NULL, - .net_device = NULL .gpio_acpi = 0xffffffff, .device = NULL, .fdc_device = NULL, From 93b5c2f5d44e57c9336a108965921b92bd9e4809 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 25 Jul 2024 20:03:43 +0200 Subject: [PATCH 200/624] RadiSys EPC-2012: Give it a different keyboard controllers, fixes CMOS settings saving. --- src/machine/m_at_socket7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index d13f0039a..b921b9a4e 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -454,7 +454,7 @@ machine_at_epc2102_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); device_add(&i430hx_device); device_add(&piix3_device); - device_add(&keyboard_ps2_pci_device); + device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&i82091aa_device); device_add(&intel_flash_bxt_device); From ec6cb0091868a1a98fee63a11bae6dad46c81b11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Thu, 25 Jul 2024 20:21:11 +0200 Subject: [PATCH 201/624] Update machine_table.c --- src/machine/machine_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c02d67886..ba3c6ca88 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5486,8 +5486,8 @@ const machine_t machines[] = { .block = CPU_BLOCK_NONE, .min_bus = 0, .max_bus = 0, - .min_voltage = 0, - .max_voltage = 0, + .min_voltage = 5000, + .max_voltage = 5000, .min_multi = 0, .max_multi = 0 }, From ae01932e3b160a5daf1f4c13170acaad0f1b7c76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Thu, 25 Jul 2024 20:25:42 +0200 Subject: [PATCH 202/624] Update machine_table.c --- src/machine/machine_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index ba3c6ca88..9b13c9234 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5484,8 +5484,8 @@ const machine_t machines[] = { .cpu = { .package = CPU_PKG_386DX | CPU_PKG_SOCKET1, .block = CPU_BLOCK_NONE, - .min_bus = 0, - .max_bus = 0, + .min_bus = 25000000, + .max_bus = 66666667, .min_voltage = 5000, .max_voltage = 5000, .min_multi = 0, From b91a0d1a144d2a93364f8ae7b6f45601912d4b01 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 25 Jul 2024 21:40:37 +0200 Subject: [PATCH 203/624] Initial implementation of the timed FIFO on the ViRGE See above. --- src/video/vid_s3_virge.c | 438 +++++++++++++++++++++++++-------------- 1 file changed, 278 insertions(+), 160 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index d62ebbbab..b2087aa4e 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -54,12 +54,10 @@ static int dither[4][4] = { #define RB_FULL (RB_ENTRIES == RB_SIZE) #define RB_EMPTY (!RB_ENTRIES) -#define FIFO_SIZE 65536 -#define FIFO_MASK (FIFO_SIZE - 1) -#define FIFO_ENTRY_SIZE (1 << 31) +#define FIFO_SIZE (16 * 4096) #define FIFO_ENTRIES (virge->fifo_write_idx - virge->fifo_read_idx) -#define FIFO_FULL ((virge->fifo_write_idx - virge->fifo_read_idx) >= (FIFO_SIZE - 4)) +#define FIFO_FULL ((virge->fifo_write_idx - virge->fifo_read_idx) >= FIFO_SIZE) #define FIFO_EMPTY (virge->fifo_read_idx == virge->fifo_write_idx) #define FIFO_TYPE 0xff000000 @@ -76,6 +74,9 @@ static int dither[4][4] = { #define ROM_DIAMOND_STEALTH3D_4000 "roms/video/s3virge/86c357.bin" #define ROM_TRIO3D2X "roms/video/s3virge/TRIO3D2X_8mbsdr.VBI" +#define FIFO_STATE_IDLE 0 +#define FIFO_STATE_RUN 1 + enum { S3_VIRGE_325, S3_DIAMOND_STEALTH3D_2000, @@ -185,11 +186,6 @@ typedef struct virge_t { uint32_t memory_size; uint32_t vram_mask; - thread_t *render_thread; - event_t *wake_render_thread; - event_t *wake_main_thread; - event_t *not_full_event; - uint32_t hwc_fg_col, hwc_bg_col; int hwc_col_stack_pos; @@ -282,14 +278,21 @@ typedef struct virge_t { uint64_t blitter_time; int fifo_slots_num; - pc_timer_t tri_timer; + struct { + uint32_t addr_type; + uint32_t val; + } fifo[FIFO_SIZE]; + atomic_int fifo_write_idx, fifo_read_idx; - int virge_busy, local; + pc_timer_t fifo_timer; + pc_timer_t render_timer; + + atomic_int virge_busy; + int local; + int fifo_state; uint8_t subsys_stat, subsys_cntl, advfunc_cntl; - uint8_t render_thread_run; - uint8_t serialport; void *i2c, *ddc; @@ -392,32 +395,21 @@ s3_virge_log(const char *fmt, ...) # define s3_virge_log(fmt, ...) #endif -static void -s3_virge_tri_timer(void *priv) -{ - virge_t *virge = (virge_t *) priv; - - thread_set_event(virge->wake_render_thread); /*Wake up FIFO thread if moving from idle*/ -} - static void queue_triangle(virge_t *virge) { if (RB_FULL) { - thread_reset_event(virge->not_full_event); - thread_reset_event(virge->wake_main_thread); - if (RB_FULL) { - thread_wait_event(virge->not_full_event, -1); /*Wait for room in ringbuffer*/ - thread_wait_event(virge->wake_main_thread, -1); - } + s3_virge_log("RB FULL, TBD.\n"); + return; } - virge->s3d_buffer[virge->s3d_write_idx & RB_MASK] = virge->s3d_tri; - virge->s3d_write_idx++; - if (!virge->s3d_busy) { - if (!(timer_is_enabled(&virge->tri_timer))) - timer_set_delay_u64(&virge->tri_timer, 100 * TIMER_USEC); - } + virge->s3d_buffer[virge->s3d_write_idx] = virge->s3d_tri; + virge->s3d_write_idx++; + if (virge->s3d_write_idx >= RB_SIZE) + virge->s3d_write_idx = 0; + + if (!virge->s3d_busy) + timer_set_delay_u64(&virge->render_timer, 100 * TIMER_USEC); } static void @@ -430,26 +422,25 @@ s3_virge_update_irqs(virge_t *virge) } static void -render_thread(void *param) +s3_virge_render_timer(void *priv) { - virge_t *virge = (virge_t *) param; + virge_t *virge = (virge_t *) priv; - while (virge->render_thread_run) { - thread_wait_event(virge->wake_render_thread, -1); - thread_reset_event(virge->wake_render_thread); - virge->s3d_busy = 1; - while (!RB_EMPTY) { - s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx & RB_MASK]); - virge->s3d_read_idx++; - if (RB_ENTRIES == RB_MASK) { - thread_set_event(virge->not_full_event); - thread_set_event(virge->wake_main_thread); - } - } - virge->s3d_busy = 0; - virge->subsys_stat |= INT_S3D_DONE; - s3_virge_update_irqs(virge); + virge->s3d_busy = 1; + while (virge->s3d_read_idx < virge->s3d_write_idx) { + s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx]); + virge->s3d_read_idx++; + if (virge->s3d_read_idx >= RB_SIZE) + virge->s3d_read_idx = 0; + + if (RB_ENTRIES == RB_MASK) + timer_disable(&virge->render_timer); } + virge->s3d_busy = 0; + virge->s3d_read_idx = 0; + virge->s3d_write_idx = 0; + virge->subsys_stat |= INT_S3D_DONE; + s3_virge_update_irqs(virge); } static void @@ -1333,146 +1324,153 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) } break; - case 0xa4d4: - case 0xa8d4: + case 0xa4d4: /*2D BitBLT SRC Base*/ + case 0xa8d4: /*2D Line SRC Base*/ + case 0xacd4: /*2D Polygon SRC Base*/ virge->s3d.src_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); s3_virge_log("PortWrite = %04x, SRC Base = %08x, memsize = %i\n", addr & 0xfffc, val, virge->memory_size); break; - case 0xa4d8: - case 0xa8d8: + case 0xa4d8: /*2D BitBLT DEST Base*/ + case 0xa8d8: /*2D Line DEST Base*/ + case 0xacd8: /*2D Polygon DEST Base*/ virge->s3d.dest_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); s3_virge_log("PortWrite = %04x, DST Base = %08x, memsize = %i\n", addr & 0xfffc, val, virge->memory_size); break; - case 0xa4dc: - case 0xa8dc: + case 0xa4dc: /*2D BitBLT Left/Right Clipping*/ + case 0xa8dc: /*2D Line Left/Right Clipping*/ + case 0xacdc: /*2D Polygon Left/Right Clipping*/ virge->s3d.clip_l = (val >> 16) & 0x7ff; virge->s3d.clip_r = val & 0x7ff; break; - case 0xa4e0: - case 0xa8e0: + case 0xa4e0: /*2D BitBLT Top/Bottom Clipping*/ + case 0xa8e0: /*2D Line Top/Bottom Clipping*/ + case 0xace0: /*2D Polygon Top/Bottom Clipping*/ virge->s3d.clip_t = (val >> 16) & 0x7ff; virge->s3d.clip_b = val & 0x7ff; break; - case 0xa4e4: - case 0xa8e4: + case 0xa4e4: /*2D BitBLT DEST/SRC Stride*/ + case 0xa8e4: /*2D Line DEST/SRC Stride*/ + case 0xace4: /*2D Polygon DEST/SRC Stride*/ virge->s3d.dest_str = (val >> 16) & 0xff8; virge->s3d.src_str = val & 0xff8; break; - case 0xa4e8: - case 0xace8: + case 0xa4e8: /*2D BitBLT Mono Pattern 0*/ + case 0xace8: /*2D Polygon Mono Pattern 0*/ virge->s3d.mono_pat_0 = val; break; - case 0xa4ec: - case 0xacec: - virge->s3d.mono_pat_1 = val; + case 0xa4ec: /*2D BitBLT Mono Pattern 1*/ + case 0xacec: /*2D Polygon Mono Pattern 1*/ + virge->s3d.mono_pat_1 = val; break; - case 0xa4f0: - case 0xacf0: + case 0xa4f0: /*2D BitBLT Mono Pattern Background*/ + case 0xacf0: /*2D Polygon Mono Pattern Background*/ virge->s3d.pat_bg_clr = val; break; - case 0xa4f4: - case 0xa8f4: - case 0xacf4: + case 0xa4f4: /*2D BitBLT Mono Pattern Foreground*/ + case 0xa8f4: /*2D Line Mono Pattern Foreground*/ + case 0xacf4: /*2D Polygon Mono Pattern Foreground*/ virge->s3d.pat_fg_clr = val; break; - case 0xa4f8: + case 0xa4f8: /*2D BitBLT SRC Background*/ virge->s3d.src_bg_clr = val; break; - case 0xa4fc: + case 0xa4fc: /*2D BitBLT SRC Foreground*/ virge->s3d.src_fg_clr = val; break; - case 0xa500: - case 0xa900: + case 0xa500: /*2D BitBLT Command Set*/ + case 0xa900: /*2D Line Command Set*/ + case 0xad00: /*2D Polygon Command Set*/ virge->s3d.cmd_set = val; if (!(val & CMD_SET_AE)) { + s3_virge_log("MMIO WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; - case 0xa504: + case 0xa504: /*2D BitBLT Rectangle Width/Height*/ virge->s3d.r_width = (val >> 16) & 0x7ff; virge->s3d.r_height = val & 0x7ff; break; - case 0xa508: + case 0xa508: /*2D BitBLT Rectangle SRC X/Y*/ virge->s3d.rsrc_x = (val >> 16) & 0x7ff; virge->s3d.rsrc_y = val & 0x7ff; break; - case 0xa50c: + case 0xa50c: /*2D BitBLT Rectangle DEST X/Y*/ virge->s3d.rdest_x = (val >> 16) & 0x7ff; virge->s3d.rdest_y = val & 0x7ff; if (virge->s3d.cmd_set & CMD_SET_AE) { + s3_virge_log("MMIO WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; - case 0xa96c: + case 0xa96c: /*2D Line Draw Endpoints*/ virge->s3d.lxend0 = (val >> 16) & 0x7ff; virge->s3d.lxend1 = val & 0x7ff; break; - case 0xa970: + case 0xa970: /*2D Line X Delta*/ virge->s3d.ldx = (int32_t) val; break; - case 0xa974: + case 0xa974: /*2D Line X Start*/ virge->s3d.lxstart = val; break; - case 0xa978: + case 0xa978: /*2D Line Y Start*/ virge->s3d.lystart = val & 0x7ff; break; - case 0xa97c: + case 0xa97c: /*2D Line Y Count*/ virge->s3d.lycnt = val & 0x7ff; virge->s3d.line_dir = val >> 31; - if (virge->s3d.cmd_set & CMD_SET_AE) + if (virge->s3d.cmd_set & CMD_SET_AE) { + s3_virge_log("MMIO WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); + } break; - case 0xad00: - virge->s3d.cmd_set = val; - if (!(val & CMD_SET_AE)) - s3_virge_bitblt(virge, -1, 0); - break; - case 0xad68: + case 0xad68: /*2D Polygon Right X Delta*/ virge->s3d.prdx = val; break; - case 0xad6c: + case 0xad6c: /*2D Polygon Right X Start*/ virge->s3d.prxstart = val; break; - case 0xad70: + case 0xad70: /*2D Polygon Left X Delta*/ virge->s3d.pldx = val; break; - case 0xad74: + case 0xad74: /*2D Polygon Left X Start*/ virge->s3d.plxstart = val; break; - case 0xad78: + case 0xad78: /*2D Polygon Y Start*/ virge->s3d.pystart = val & 0x7ff; break; - case 0xad7c: + case 0xad7c: /*2D Polygon Y Count*/ virge->s3d.pycnt = val & 0x300007ff; - if (virge->s3d.cmd_set & CMD_SET_AE) + if (virge->s3d.cmd_set & CMD_SET_AE) { + s3_virge_log("MMIO WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); + } break; - case 0xb0f4: - case 0xb4f4: - virge->s3d_tri.fog_b = val & 0xff; - virge->s3d_tri.fog_g = (val >> 8) & 0xff; - virge->s3d_tri.fog_r = (val >> 16) & 0xff; - break; + case 0xb0d4: case 0xb4d4: virge->s3d_tri.z_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); break; + case 0xb0d8: case 0xb4d8: virge->s3d_tri.dest_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); break; + case 0xb0dc: case 0xb4dc: virge->s3d_tri.clip_l = (val >> 16) & 0x7ff; virge->s3d_tri.clip_r = val & 0x7ff; break; + case 0xb0e0: case 0xb4e0: virge->s3d_tri.clip_t = (val >> 16) & 0x7ff; virge->s3d_tri.clip_b = val & 0x7ff; break; + case 0xb0e4: case 0xb4e4: virge->s3d_tri.dest_str = (val >> 16) & 0xff8; virge->s3d.src_str = val & 0xff8; break; + case 0xb0e8: case 0xb4e8: virge->s3d_tri.z_str = val & 0xff8; break; @@ -1482,6 +1480,13 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) case 0xb4f0: virge->s3d_tri.tex_bdr_clr = val & 0xffffff; break; + case 0xb0f4: + case 0xb4f4: + virge->s3d_tri.fog_b = val & 0xff; + virge->s3d_tri.fog_g = (val >> 8) & 0xff; + virge->s3d_tri.fog_r = (val >> 16) & 0xff; + break; + case 0xb100: case 0xb500: virge->s3d_tri.cmd_set = val; if (!(val & CMD_SET_AE)) @@ -1588,9 +1593,8 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) virge->s3d_tri.ty01 = (val >> 16) & 0x7ff; virge->s3d_tri.ty12 = val & 0x7ff; virge->s3d_tri.tlr = val >> 31; - if (virge->s3d_tri.cmd_set & CMD_SET_AE) { + if (virge->s3d_tri.cmd_set & CMD_SET_AE) queue_triangle(virge); - } break; default: @@ -1609,14 +1613,20 @@ s3_virge_mmio_read(uint32_t addr, void *priv) switch (addr & 0xffff) { case 0x8504: - virge->subsys_stat |= (INT_3DF_EMP | INT_FIFO_EMP); + if (!virge->virge_busy) + virge->fifo_state = FIFO_STATE_RUN; + ret = virge->subsys_stat; - s3_virge_update_irqs(virge); return ret; case 0x8505: - ret = 0xd0; - if (!virge->s3d_busy) - ret |= 0x20; + ret = 0xc0; + if (virge->s3d_busy || virge->virge_busy || (virge->fifo_read_idx < virge->fifo_write_idx)) + ret |= 0x10; + else + ret |= 0x30; + + if (!virge->virge_busy) + virge->fifo_state = FIFO_STATE_RUN; return ret; case 0x850c: @@ -1705,12 +1715,15 @@ s3_virge_mmio_read_w(uint32_t addr, void *priv) switch (addr & 0xfffe) { case 0x8504: - ret = 0xd000; - if (!virge->s3d_busy) - ret |= 0x2000; - virge->subsys_stat |= (INT_3DF_EMP | INT_FIFO_EMP); + ret = 0xc000; + if (virge->s3d_busy || virge->virge_busy || (virge->fifo_read_idx < virge->fifo_write_idx)) + ret |= 0x1000; + else + ret |= 0x3000; + ret |= virge->subsys_stat; - s3_virge_update_irqs(virge); + if (!virge->virge_busy) + virge->fifo_state = FIFO_STATE_RUN; return ret; case 0x850c: @@ -1734,8 +1747,6 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) virge_t *virge = (virge_t *) priv; uint32_t ret = 0xffffffff; - s3_virge_log("[%04X:%08X]: MMIO ReadL addr = %04x\n", CS, cpu_state.pc, addr & 0xfffc); - switch (addr & 0xfffc) { case 0x8180: ret = virge->streams.pri_ctrl; @@ -1805,12 +1816,15 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) break; case 0x8504: - ret = 0x0000d000; - if (!virge->s3d_busy) - ret |= 0x00002000; - virge->subsys_stat |= (INT_3DF_EMP | INT_FIFO_EMP); + ret = 0x0000c000; + if (virge->s3d_busy || virge->virge_busy || (virge->fifo_read_idx < virge->fifo_write_idx)) + ret |= 0x00001000; + else + ret |= 0x00003000; + ret |= virge->subsys_stat; - s3_virge_update_irqs(virge); + if (!virge->virge_busy) + virge->fifo_state = FIFO_STATE_RUN; break; case 0x850c: @@ -1831,18 +1845,28 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) break; case 0xa4d4: + case 0xa8d4: + case 0xacd4: ret = virge->s3d.src_base; break; case 0xa4d8: + case 0xa8d8: + case 0xacd8: ret = virge->s3d.dest_base; break; case 0xa4dc: + case 0xa8dc: + case 0xacdc: ret = (virge->s3d.clip_l << 16) | virge->s3d.clip_r; break; case 0xa4e0: + case 0xa8e0: + case 0xace0: ret = (virge->s3d.clip_t << 16) | virge->s3d.clip_b; break; case 0xa4e4: + case 0xa8e4: + case 0xace4: ret = (virge->s3d.dest_str << 16) | virge->s3d.src_str; break; case 0xa4e8: @@ -1854,9 +1878,12 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) ret = virge->s3d.mono_pat_1; break; case 0xa4f0: + case 0xacf0: ret = virge->s3d.pat_bg_clr; break; case 0xa4f4: + case 0xa8f4: + case 0xacf4: ret = virge->s3d.pat_fg_clr; break; case 0xa4f8: @@ -1866,6 +1893,8 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) ret = virge->s3d.src_fg_clr; break; case 0xa500: + case 0xa900: + case 0xad00: ret = virge->s3d.cmd_set; break; case 0xa504: @@ -1877,28 +1906,115 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) case 0xa50c: ret = (virge->s3d.rdest_x << 16) | virge->s3d.rdest_y; break; + case 0xa96c: + ret = (virge->s3d.lxend0 << 16) | virge->s3d.lxend1; + break; + case 0xa970: + ret = virge->s3d.ldx; + break; + case 0xa974: + ret = virge->s3d.lxstart; + break; + case 0xa978: + ret = virge->s3d.lystart; + break; + case 0xa97c: + ret = (virge->s3d.line_dir << 31) | virge->s3d.lycnt; + break; + case 0xad68: + ret = virge->s3d.prdx; + break; + case 0xad6c: + ret = virge->s3d.prxstart; + break; + case 0xad70: + ret = virge->s3d.pldx; + break; + case 0xad74: + ret = virge->s3d.plxstart; + break; + case 0xad78: + ret = virge->s3d.pystart; + break; + case 0xad7c: + ret = virge->s3d.pycnt; + break; default: ret = s3_virge_mmio_read(addr, virge) | (s3_virge_mmio_read(addr + 1, virge) << 8) | (s3_virge_mmio_read(addr + 2, virge) << 16) | (s3_virge_mmio_read(addr + 3, virge) << 24); break; } - s3_virge_log("MMIO ReadL addr = %04x, val = %08x\n", addr & 0xfffc, ret); + s3_virge_log("MMIO ReadL addr = %04x, val = %08x.\n", addr & 0xfffc, ret); return ret; } +static void +s3_virge_fifo_timer(void *priv) +{ + virge_t *virge = (virge_t *)priv; + + timer_advance_u64(&virge->fifo_timer, 100 * TIMER_USEC); + + while (virge->fifo_state == FIFO_STATE_RUN) { + virge->virge_busy = 1; + while (virge->fifo_read_idx < virge->fifo_write_idx) { + switch (virge->fifo[virge->fifo_read_idx].addr_type & FIFO_TYPE) { + case FIFO_WRITE_BYTE: + s3_virge_mmio_fifo_write(virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val, virge); + break; + case FIFO_WRITE_WORD: + s3_virge_mmio_fifo_write_w(virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val, virge); + break; + case FIFO_WRITE_DWORD: + s3_virge_mmio_fifo_write_l(virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val, virge); + break; + default: + break; + } + + virge->fifo[virge->fifo_read_idx].addr_type = FIFO_INVALID; + virge->fifo_read_idx++; + if (virge->fifo_read_idx >= FIFO_SIZE) + virge->fifo_read_idx = 0; + + s3_virge_log("ReadIDX=%d.\n", virge->fifo_read_idx); + } + virge->virge_busy = 0; + virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; + s3_virge_update_irqs(virge); + virge->fifo_read_idx = 0; + virge->fifo_write_idx = 0; + virge->fifo_state = FIFO_STATE_IDLE; + } +} + +static void +s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) +{ + if (FIFO_FULL) { + s3_virge_log("FIFO FULL, TBD.\n"); + return; + } + + virge->fifo[virge->fifo_write_idx].val = val; + virge->fifo[virge->fifo_write_idx].addr_type = (addr & FIFO_ADDR) | type; + virge->fifo_write_idx++; + if (virge->fifo_write_idx >= FIFO_SIZE) + virge->fifo_write_idx = 0; + + s3_virge_log("WriteIDX=%d.\n", virge->fifo_write_idx); + virge->fifo_state = FIFO_STATE_RUN; +} + static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) { virge_t *virge = (virge_t *) priv; s3_virge_log("MMIO WriteB addr = %04x, val = %02x\n", addr & 0xffff, val); - if (((addr & 0xffff) >= 0x8590) || ((addr & 0xffff) < 0x8000)) { - if ((addr & 0xffff) == 0xff20) { - virge->serialport = val; - i2c_gpio_set(virge->i2c, !!(val & SERIAL_PORT_SCW), !!(val & SERIAL_PORT_SDW)); - } else - s3_virge_mmio_fifo_write(addr, val, virge); - } else { + if ((addr & 0xffff) < 0x8000) + s3_virge_queue(virge, addr, val, FIFO_WRITE_BYTE); + else { switch (addr & 0xffff) { case 0x83b0: case 0x83b1: @@ -1951,6 +2067,11 @@ s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) s3_virge_out(addr & 0x3ff, val, virge); break; + case 0xff20: + virge->serialport = val; + i2c_gpio_set(virge->i2c, !!(val & SERIAL_PORT_SCW), !!(val & SERIAL_PORT_SDW)); + break; + default: break; } @@ -1962,16 +2083,14 @@ s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv) { virge_t *virge = (virge_t *) priv; s3_virge_log("[%04X:%08X]: MMIO WriteW addr = %04x, val = %04x\n", CS, cpu_state.pc, addr & 0xfffe, val); - if (((addr & 0xfffe) >= 0x8590) || ((addr & 0xfffe) < 0x8000)) - if ((addr & 0xfffe) == 0xff20) - s3_virge_mmio_write(addr, val, virge); - else - s3_virge_mmio_fifo_write_w(addr, val, virge); + if ((addr & 0xfffe) < 0x8000) + s3_virge_queue(virge, addr, val, FIFO_WRITE_WORD); else { if ((addr & 0xfffe) == 0x83d4) { s3_virge_mmio_write(addr, val, virge); s3_virge_mmio_write(addr + 1, val >> 8, virge); - } + } else if ((addr & 0xfffe) == 0xff20) + s3_virge_mmio_write(addr, val, virge); } } @@ -1982,12 +2101,8 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) svga_t *svga = &virge->svga; s3_virge_log("[%04X:%08X]: MMIO WriteL addr = %04x, val = %04x\n", CS, cpu_state.pc, addr & 0xfffc, val); - if (((addr & 0xfffc) >= 0x8590) || ((addr & 0xfffc) < 0x8000)) - if ((addr & 0xfffc) == 0xff20) - s3_virge_mmio_write(addr, val, virge); - else { - s3_virge_mmio_fifo_write_l(addr, val, virge); - } + if (((addr & 0xfffc) < 0x8000) || ((addr & 0xe000) == 0xa000)) + s3_virge_queue(virge, addr, val, FIFO_WRITE_DWORD); else { switch (addr & 0xfffc) { case 0x8180: @@ -2116,7 +2231,12 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) s3_virge_updatemapping(virge); break; + case 0xff20: + s3_virge_mmio_write(addr, val, virge); + break; + default: + s3_virge_log("Actual WriteL=%04x.\n", addr & 0xfffc); break; } } @@ -2185,7 +2305,7 @@ static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) { svga_t *svga = &virge->svga; - uint8_t *vram = virge->svga.vram; + uint8_t *vram = svga->vram; uint32_t mono_pattern[64]; int count_mask; int x_inc = (virge->s3d.cmd_set & CMD_SET_XP) ? 1 : -1; @@ -2260,6 +2380,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) } } } + switch (virge->s3d.cmd_set & CMD_SET_COMMAND_MASK) { case CMD_SET_COMMAND_BITBLT: if (count == -1) { @@ -2286,8 +2407,10 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) if (virge->s3d.cmd_set & CMD_SET_IDS) return; } + if (!virge->s3d.h) return; + while (count) { src_addr = virge->s3d.src_base + (virge->s3d.src_x * x_mul) + (virge->s3d.src_y * virge->s3d.src_str); dest_addr = virge->s3d.dest_base + (virge->s3d.dest_x * x_mul) + (virge->s3d.dest_y * virge->s3d.dest_str); @@ -2377,9 +2500,8 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) default: break; } - if (!virge->s3d.h) { + if (!virge->s3d.h) return; - } } else virge->s3d.w--; } @@ -2432,11 +2554,11 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) virge->s3d.src_y += y_inc; virge->s3d.dest_y += y_inc; virge->s3d.h--; - if (!virge->s3d.h) { + if (!virge->s3d.h) return; - } } else virge->s3d.w--; + count--; } break; @@ -4271,7 +4393,8 @@ s3_virge_disable_handlers(virge_t *dev) reset_state->svga.timer = dev->svga.timer; reset_state->svga.timer8514 = dev->svga.timer8514; - reset_state->tri_timer = dev->tri_timer; + reset_state->fifo_timer = dev->fifo_timer; + reset_state->render_timer = dev->render_timer; } static void @@ -4281,6 +4404,13 @@ s3_virge_reset(void *priv) if (reset_state != NULL) { s3_virge_disable_handlers(dev); + dev->virge_busy = 0; + dev->fifo_write_idx = 0; + dev->fifo_read_idx = 0; + dev->fifo_state = FIFO_STATE_IDLE; + dev->s3d_busy = 0; + dev->s3d_write_idx = 0; + dev->s3d_read_idx = 0; reset_state->pci_slot = dev->pci_slot; *dev = *reset_state; @@ -4522,13 +4652,8 @@ s3_virge_init(const device_t *info) virge->svga.force_old_addr = 1; - virge->wake_render_thread = thread_create_event(); - virge->wake_main_thread = thread_create_event(); - virge->not_full_event = thread_create_event(); - virge->render_thread_run = 1; - virge->render_thread = thread_create(render_thread, virge); - - timer_add(&virge->tri_timer, s3_virge_tri_timer, virge, 0); + timer_add(&virge->fifo_timer, s3_virge_fifo_timer, virge, 1); + timer_add(&virge->render_timer, s3_virge_render_timer, virge, 0); virge->local = info->local; @@ -4542,13 +4667,6 @@ s3_virge_close(void *priv) { virge_t *virge = (virge_t *) priv; - virge->render_thread_run = 0; - thread_set_event(virge->wake_render_thread); - thread_wait(virge->render_thread); - thread_destroy_event(virge->not_full_event); - thread_destroy_event(virge->wake_main_thread); - thread_destroy_event(virge->wake_render_thread); - svga_close(&virge->svga); ddc_close(virge->ddc); From 4762d2bec0245530d8245d6cda0c91225eb0db34 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Thu, 25 Jul 2024 22:25:54 +0200 Subject: [PATCH 204/624] Update comments --- src/device/mouse_microtouch_touchscreen.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 5d4d6bafb..9df42308c 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -160,19 +160,19 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { // Calibrate New/Extended + if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); mtouch->cal_cntr = 2; } - if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { // Get Parameter Block 1 + if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "A\r", 2); fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", sizeof("0000000000000000000000000\r") - 1); fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } - if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { // Set Parameter Block 1 + if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "A\r", 2); } @@ -236,7 +236,7 @@ mtouch_poll(void *priv) int b = mouse_get_buttons_ex(); mouse_get_abs_coords(&abs_x, &abs_y); - dev->b |= !!(b & 3); /* any button pressed */ + dev->b |= !!(b & 3); /* Old state OR mouse click */ if (abs_x >= 1.0) abs_x = 1.0; @@ -280,7 +280,7 @@ mtouch_poll(void *priv) if (dev->cal_cntr) { return 0; } - if (!!(b & 3)) { /* Hover */ + if (!!(b & 3)) { /* Touchdown/Continuation */ dev->abs_x = abs_x; dev->abs_y = abs_y; dev->b |= 1; @@ -293,7 +293,7 @@ mtouch_poll(void *priv) fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); fifo8_push(&dev->resp, abs_y_int & 0b1111111); fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); - } else if ((dev->b & 1) && !(b & 3)) { /* Touch */ + } else if ((dev->b & 1) && !(b & 3)) { /* Liftoff */ dev->b &= ~1; abs_x_int = dev->abs_x * 16383; abs_y_int = 16383 - dev->abs_y * 16383; From e377e58881c9ca93ac1e534b27207db23d848d48 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 26 Jul 2024 00:39:11 +0200 Subject: [PATCH 205/624] Assorted fixes and Dev branched the Matrox G100 and the PCL printer. --- src/CMakeLists.txt | 4 + src/cpu/cpu_table.c | 18 +-- src/include/86box/net_dp8390.h | 2 + src/include/86box/prt_devs.h | 2 + src/include/86box/vid_svga_render.h | 2 + src/include/86box/video.h | 2 + src/lpt.c | 4 +- src/network/net_dp8390.c | 7 +- src/printer/CMakeLists.txt | 4 + src/printer/prt_ps.c | 4 + src/video/CMakeLists.txt | 4 + src/video/vid_mga.c | 2 + src/video/vid_s3.c | 10 ++ src/video/vid_s3_virge.c | 5 + src/video/vid_svga.c | 5 +- src/video/vid_svga_render.c | 196 ++++++++++++++++++++++++++++ src/video/vid_table.c | 2 + 17 files changed, 260 insertions(+), 13 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 93a6f4d4c..a36dd796c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,6 +27,10 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux") add_compile_definitions(_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 _LARGEFILE64_SOURCE=1) endif() +if(PCL) + target_compile_definitions(86Box PRIVATE USE_PCL) +endif() + if(CPPTHREADS) target_sources(86Box PRIVATE thread.cpp) endif() diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 574cf3fd5..ace51eed8 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -2508,7 +2508,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 75000000, .multi = 3.0, - .voltage = 5000, + .voltage = 3300, .edx_reset = 0x480, .cpuid_model = 0x480, .cyrix_id = 0x0000, @@ -2525,7 +2525,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 100000000, .multi = 3.0, - .voltage = 5000, + .voltage = 3300, .edx_reset = 0x483, .cpuid_model = 0x483, .cyrix_id = 0x0000, @@ -3066,7 +3066,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 133333333, .multi = 4.0, - .voltage = 5000, + .voltage = 3450, .edx_reset = 0x4e0, .cpuid_model = 0x4e0, .cyrix_id = 0, @@ -3083,7 +3083,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 150000000, .multi = 3.0, - .voltage = 5000, + .voltage = 3450, .edx_reset = 0x482, .cpuid_model = 0x482, .cyrix_id = 0, @@ -3100,7 +3100,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 160000000, .multi = 4.0, - .voltage = 5000, + .voltage = 3450, .edx_reset = 0x4e0, .cpuid_model = 0x4e0, .cyrix_id = 0, @@ -3332,7 +3332,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 80000000, .multi = 2.0, - .voltage = 5000, + .voltage = 3450, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x002f, @@ -3349,7 +3349,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 100000000, .multi = 3.0, - .voltage = 5000, + .voltage = 3450, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x002f, @@ -3366,7 +3366,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 120000000, .multi = 3.0, - .voltage = 5000, + .voltage = 3450, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x002f, @@ -3383,7 +3383,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 133333333, .multi = 4.0, - .voltage = 5000, + .voltage = 3450, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x002f, diff --git a/src/include/86box/net_dp8390.h b/src/include/86box/net_dp8390.h index e9e1e6c71..553366808 100644 --- a/src/include/86box/net_dp8390.h +++ b/src/include/86box/net_dp8390.h @@ -171,6 +171,8 @@ typedef struct dp8390_t { /* DP8390 memory */ uint8_t *mem; /* on-chip packet memory */ + uint8_t sink_buffer[4096]; + uint8_t macaddr[32]; /* ASIC ROM'd MAC address, even bytes */ uint8_t macaddr_size, /* Defaults to 16 but can be 32 */ flags, /* Flags affecting some behaviors. */ diff --git a/src/include/86box/prt_devs.h b/src/include/86box/prt_devs.h index 02920e9b0..1379c8fa8 100644 --- a/src/include/86box/prt_devs.h +++ b/src/include/86box/prt_devs.h @@ -4,6 +4,8 @@ extern const lpt_device_t lpt_prt_text_device; extern const lpt_device_t lpt_prt_escp_device; extern const lpt_device_t lpt_prt_ps_device; +#ifdef USE_PCL extern const lpt_device_t lpt_prt_pcl_device; +#endif #endif /*EMU_PRT_DEVS_H*/ diff --git a/src/include/86box/vid_svga_render.h b/src/include/86box/vid_svga_render.h index 224d96c8e..babac7592 100644 --- a/src/include/86box/vid_svga_render.h +++ b/src/include/86box/vid_svga_render.h @@ -48,6 +48,8 @@ extern void svga_render_text_80_ksc5601(svga_t *svga); extern void svga_render_2bpp_lowres(svga_t *svga); extern void svga_render_2bpp_highres(svga_t *svga); +extern void svga_render_2bpp_s3_lowres(svga_t *svga); +extern void svga_render_2bpp_s3_highres(svga_t *svga); extern void svga_render_2bpp_headland_highres(svga_t *svga); extern void svga_render_4bpp_lowres(svga_t *svga); extern void svga_render_4bpp_highres(svga_t *svga); diff --git a/src/include/86box/video.h b/src/include/86box/video.h index ed7064f9c..9cbd0399f 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -446,7 +446,9 @@ extern const device_t millennium_device; extern const device_t mystique_device; extern const device_t mystique_220_device; extern const device_t millennium_ii_device; +#ifdef USE_G100 extern const device_t productiva_g100_device; +#endif /* Oak OTI-0x7 */ extern const device_t oti037c_device; diff --git a/src/lpt.c b/src/lpt.c index d0647c0e6..3f1c5eb7b 100644 --- a/src/lpt.c +++ b/src/lpt.c @@ -42,7 +42,9 @@ static const struct { {"text_prt", &lpt_prt_text_device }, {"dot_matrix", &lpt_prt_escp_device }, {"postscript", &lpt_prt_ps_device }, - {"pcl", &lpt_prt_pcl_device }, +#ifdef USE_PCL + {"pcl", &lpt_prt_pcl_device }, +#endif {"plip", &lpt_plip_device }, {"dongle_savquest", &lpt_hasp_savquest_device }, {"", NULL } diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index 1c308e913..f4c89d99a 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -384,7 +384,12 @@ dp8390_rx_common(void *priv, uint8_t *buf, int io_len) pkthdr[0], pkthdr[1], pkthdr[2], pkthdr[3]); /* Copy into buffer, update curpage, and signal interrupt if config'd */ - startptr = &dev->mem[(dev->curr_page * 256) - dev->mem_start]; + if (((dev->curr_page * 256) - dev->mem_start) >= dev->mem_size) + /* Do this to fix Windows 2000 crashing the emulator when its + MPU-401 probe hits the NIC. */ + startptr = &dev->sink_buffer; + else + startptr = &dev->mem[(dev->curr_page * 256) - dev->mem_start]; memcpy(startptr, pkthdr, sizeof(pkthdr)); if ((nextpage > dev->curr_page) || ((dev->curr_page + pages) == dev->page_stop)) { memcpy(startptr + sizeof(pkthdr), buf, io_len); diff --git a/src/printer/CMakeLists.txt b/src/printer/CMakeLists.txt index 274226a5a..6ee52baba 100644 --- a/src/printer/CMakeLists.txt +++ b/src/printer/CMakeLists.txt @@ -15,6 +15,10 @@ add_library(print OBJECT png.c prt_cpmap.c prt_escp.c prt_text.c prt_ps.c) +if(PCL) + target_compile_definitions(print PRIVATE USE_PCL) +endif() + if(APPLE) find_library(GHOSTSCRIPT_LIB gs) if (NOT GHOSTSCRIPT_LIB) diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c index 998343c4d..dcd018881 100644 --- a/src/printer/prt_ps.c +++ b/src/printer/prt_ps.c @@ -411,6 +411,7 @@ ps_init(void *lpt) return dev; } +#ifdef USE_PCL static void * pcl_init(void *lpt) { @@ -459,6 +460,7 @@ pcl_init(void *lpt) return dev; } +#endif static void ps_close(void *priv) @@ -491,6 +493,7 @@ const lpt_device_t lpt_prt_ps_device = { .read_ctrl = NULL }; +#ifdef USE_PCL const lpt_device_t lpt_prt_pcl_device = { .name = "Generic PCL5e Printer", .internal_name = "pcl", @@ -502,3 +505,4 @@ const lpt_device_t lpt_prt_pcl_device = { .read_status = ps_read_status, .read_ctrl = NULL }; +#endif diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index c8fb7021d..2f7607ad6 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -29,6 +29,10 @@ add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c vid_tvp3026_ramdac.c vid_att2xc498_ramdac.c vid_xga.c vid_bochs_vbe.c) +if(G100) + target_compile_definitions(vid PRIVATE USE_G100) +endif() + if(XL24) target_compile_definitions(vid PRIVATE USE_XL24) endif() diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index f6f38b4de..54d9afc42 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -6963,6 +6963,7 @@ const device_t millennium_ii_device = { .config = millennium_ii_config }; +#ifdef USE_G100 const device_t productiva_g100_device = { .name = "Matrox Productiva G100", .internal_name = "productiva_g100", @@ -6976,3 +6977,4 @@ const device_t productiva_g100_device = { .force_redraw = mystique_force_redraw, .config = millennium_ii_config }; +#endif diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 16dd83f45..2ad525892 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -4153,6 +4153,11 @@ s3_recalctimings(svga_t *svga) svga->hoverride = 1; else svga->hoverride = 0; + + if (svga->render == svga_render_2bpp_lowres) + svga->render = svga_render_2bpp_s3_lowres; + else if (svga->render == svga_render_2bpp_highres) + svga->render = svga_render_2bpp_s3_highres; } static void @@ -4333,6 +4338,11 @@ s3_trio64v_recalctimings(svga_t *svga) } svga->hoverride = 1; + + if (svga->render == svga_render_2bpp_lowres) + svga->render = svga_render_2bpp_s3_lowres; + else if (svga->render == svga_render_2bpp_highres) + svga->render = svga_render_2bpp_s3_highres; } static void diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index b2087aa4e..d2f99ba14 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -973,6 +973,11 @@ s3_virge_recalctimings(svga_t *svga) } svga->hoverride = 1; + + if (svga->render == svga_render_2bpp_lowres) + svga->render = svga_render_2bpp_s3_lowres; + else if (svga->render == svga_render_2bpp_highres) + svga->render = svga_render_2bpp_s3_highres; } static void diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 7403401be..cfb984a5a 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -685,9 +685,10 @@ svga_recalctimings(svga_t *svga) else svga->render = svga_render_4bpp_highres; } else if ((svga->gdcreg[5] & 0x60) == 0x20) { - if (svga->seqregs[1] & 8) /*Low res (320)*/ + if (svga->seqregs[1] & 8) { /*Low res (320)*/ svga->render = svga_render_2bpp_lowres; - else + pclog("2 bpp low res\n"); + } else svga->render = svga_render_2bpp_highres; } else { svga->map8 = svga->pallook; diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index 9b395ea6c..74d9a4d0c 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -418,6 +418,202 @@ svga_render_text_80_ksc5601(svga_t *svga) } } +void +svga_render_2bpp_s3_lowres(svga_t *svga) +{ + int changed_offset; + int x; + uint8_t dat[2]; + uint32_t addr; + uint32_t *p; + uint32_t changed_addr; + + if ((svga->displine + svga->y_add) < 0) + return; + + if (svga->force_old_addr) { + changed_offset = ((svga->ma << 1) + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12; + + if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange) { + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; + + if (svga->firstline_draw == 2000) + svga->firstline_draw = svga->displine; + svga->lastline_draw = svga->displine; + + for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += 16) { + addr = svga->ma; + + if (!(svga->crtc[0x17] & 0x40)) { + addr = (addr << 1) & svga->vram_mask; + addr &= ~7; + + if ((svga->crtc[0x17] & 0x20) && (svga->ma & 0x20000)) + addr |= 4; + + if (!(svga->crtc[0x17] & 0x20) && (svga->ma & 0x8000)) + addr |= 4; + } + + if (!(svga->crtc[0x17] & 0x01)) + addr = (addr & ~0x8000) | ((svga->sc & 1) ? 0x8000 : 0); + + if (!(svga->crtc[0x17] & 0x02)) + addr = (addr & ~0x10000) | ((svga->sc & 2) ? 0x10000 : 0); + + dat[0] = svga->vram[addr]; + dat[1] = svga->vram[addr | 0x1]; + if (svga->seqregs[1] & 4) + svga->ma += 2; + else + svga->ma += 4; + svga->ma &= svga->vram_mask; + p[0] = p[1] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]]; + p[2] = p[3] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]]; + p[4] = p[5] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]]; + p[6] = p[7] = svga->pallook[svga->egapal[dat[0] & 3]]; + p[8] = p[9] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]]; + p[10] = p[11] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]]; + p[12] = p[13] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]]; + p[14] = p[15] = svga->pallook[svga->egapal[dat[1] & 3]]; + p += 16; + } + } + } else { + changed_addr = svga->remap_func(svga, svga->ma); + + if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; + + if (svga->firstline_draw == 2000) + svga->firstline_draw = svga->displine; + svga->lastline_draw = svga->displine; + + for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += 16) { + addr = svga->remap_func(svga, svga->ma); + + dat[0] = svga->vram[addr]; + dat[1] = svga->vram[addr | 0x1]; + if (svga->seqregs[1] & 4) + svga->ma += 2; + else + svga->ma += 4; + + svga->ma &= svga->vram_mask; + + p[0] = p[1] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]]; + p[2] = p[3] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]]; + p[4] = p[5] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]]; + p[6] = p[7] = svga->pallook[svga->egapal[dat[0] & 3]]; + p[8] = p[9] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]]; + p[10] = p[11] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]]; + p[12] = p[13] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]]; + p[14] = p[15] = svga->pallook[svga->egapal[dat[1] & 3]]; + + p += 16; + } + } + } +} + +void +svga_render_2bpp_s3_highres(svga_t *svga) +{ + int changed_offset; + int x; + uint8_t dat[2]; + uint32_t addr; + uint32_t *p; + uint32_t changed_addr; + + if ((svga->displine + svga->y_add) < 0) + return; + + if (svga->force_old_addr) { + changed_offset = ((svga->ma << 1) + (svga->sc & ~svga->crtc[0x17] & 3) * 0x8000) >> 12; + + if (svga->changedvram[changed_offset] || svga->changedvram[changed_offset + 1] || svga->fullchange) { + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; + + if (svga->firstline_draw == 2000) + svga->firstline_draw = svga->displine; + svga->lastline_draw = svga->displine; + + for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += 8) { + addr = svga->ma; + + if (!(svga->crtc[0x17] & 0x40)) { + addr = (addr << 1) & svga->vram_mask; + addr &= ~7; + + if ((svga->crtc[0x17] & 0x20) && (svga->ma & 0x20000)) + addr |= 4; + + if (!(svga->crtc[0x17] & 0x20) && (svga->ma & 0x8000)) + addr |= 4; + } + + if (!(svga->crtc[0x17] & 0x01)) + addr = (addr & ~0x8000) | ((svga->sc & 1) ? 0x8000 : 0); + + if (!(svga->crtc[0x17] & 0x02)) + addr = (addr & ~0x10000) | ((svga->sc & 2) ? 0x10000 : 0); + + dat[0] = svga->vram[addr]; + dat[1] = svga->vram[addr | 0x1]; + if (svga->seqregs[1] & 4) + svga->ma += 2; + else + svga->ma += 4; + svga->ma &= svga->vram_mask; + p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]]; + p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]]; + p[2] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]]; + p[3] = svga->pallook[svga->egapal[dat[0] & 3]]; + p[4] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]]; + p[5] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]]; + p[6] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]]; + p[7] = svga->pallook[svga->egapal[dat[1] & 3]]; + p += 8; + } + } + } else { + changed_addr = svga->remap_func(svga, svga->ma); + + if (svga->changedvram[changed_addr >> 12] || svga->changedvram[(changed_addr >> 12) + 1] || svga->fullchange) { + p = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add]; + + if (svga->firstline_draw == 2000) + svga->firstline_draw = svga->displine; + svga->lastline_draw = svga->displine; + + for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += 8) { + addr = svga->remap_func(svga, svga->ma); + + dat[0] = svga->vram[addr]; + dat[1] = svga->vram[addr | 0x1]; + if (svga->seqregs[1] & 4) + svga->ma += 2; + else + svga->ma += 4; + + svga->ma &= svga->vram_mask; + + p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]]; + p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]]; + p[2] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]]; + p[3] = svga->pallook[svga->egapal[dat[0] & 3]]; + p[4] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]]; + p[5] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]]; + p[6] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]]; + p[7] = svga->pallook[svga->egapal[dat[1] & 3]]; + + p += 8; + } + } + } +} + void svga_render_2bpp_headland_highres(svga_t *svga) { diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 284b79a67..b6e1bd2f9 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -234,7 +234,9 @@ video_cards[] = { { &s3_virge_357_agp_device }, { &s3_diamond_stealth_4000_agp_device }, { &s3_trio3d2x_agp_device }, +#ifdef USE_G100 { &productiva_g100_device, VIDEO_FLAG_TYPE_SPECIAL }, +#endif { &velocity_100_agp_device }, { &velocity_200_agp_device }, { &voodoo_3_1000_agp_device }, From 3897cdd311990cadfbc096952fcf4b83fe83ddef Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 26 Jul 2024 00:43:57 +0200 Subject: [PATCH 206/624] Fix compile-breaking mistake in net_dp8390.c. --- src/network/net_dp8390.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index f4c89d99a..b563b703a 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -387,7 +387,7 @@ dp8390_rx_common(void *priv, uint8_t *buf, int io_len) if (((dev->curr_page * 256) - dev->mem_start) >= dev->mem_size) /* Do this to fix Windows 2000 crashing the emulator when its MPU-401 probe hits the NIC. */ - startptr = &dev->sink_buffer; + startptr = dev->sink_buffer; else startptr = &dev->mem[(dev->curr_page * 256) - dev->mem_start]; memcpy(startptr, pkthdr, sizeof(pkthdr)); From 70c6e39c02c2858389e0eaf5632246f134c78b80 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 26 Jul 2024 00:46:38 +0200 Subject: [PATCH 207/624] Ran bumpversion.sh to update the dates. --- CMakeLists.txt | 2 ++ debian/changelog | 2 +- src/unix/assets/86Box.spec | 2 +- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- 4 files changed, 5 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fa1d02a15..b21dafe30 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -152,6 +152,7 @@ endif() cmake_dependent_option(AMD_K5 "AMD K5" ON "DEV_BRANCH" OFF) cmake_dependent_option(AN430TX "Intel AN430TX" ON "DEV_BRANCH" OFF) cmake_dependent_option(CYRIX_6X86 "Cyrix 6x86" ON "DEV_BRANCH" OFF) +cmake_dependent_option(G100 "Matrox Productiva G100" ON "DEV_BRANCH" OFF) cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" ON "DEV_BRANCH" OFF) cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage" ON "DEV_BRANCH" OFF) cmake_dependent_option(ISAMEM_IAB "Intel Above Board" ON "DEV_BRANCH" OFF) @@ -160,6 +161,7 @@ cmake_dependent_option(LASERXT "VTech Laser XT" cmake_dependent_option(OLIVETTI "Olivetti M290" ON "DEV_BRANCH" OFF) cmake_dependent_option(OPEN_AT "OpenAT" ON "DEV_BRANCH" OFF) cmake_dependent_option(OPL4ML "OPL4-ML daughterboard" ON "DEV_BRANCH" OFF) +cmake_dependent_option(PCL "Generic PCL5e Printer" ON "DEV_BRANCH" OFF) cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF) cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF) diff --git a/debian/changelog b/debian/changelog index fe8aa6821..5164eae30 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,4 +2,4 @@ * Bump release. - -- Jasmine Iwanek Sat, 23 Mar 2024 17:19:08 +0100 + -- Jasmine Iwanek Fri, 26 Jul 2024 00:46:15 +0200 diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index fdd7bbf55..ea335cf5b 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Sat Mar 23 2024 Robert de Rooy 4.2-1 +* Fri Jul 26 2024 Robert de Rooy 4.2-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index 18df49703..5500ba0a8 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + From bd58ad48da484e5488e309b3d534b98415a3f816 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Fri, 26 Jul 2024 01:19:12 +0200 Subject: [PATCH 208/624] Refactor code, make format tablet calibration not happen automatically --- src/device/mouse_microtouch_touchscreen.c | 68 ++++++++++------------- 1 file changed, 28 insertions(+), 40 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 9df42308c..ffc848c4e 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -18,8 +18,9 @@ /* Reference: https://www.touchwindow.com/mm5/drivers/mtsctlrm.pdf */ /* TODO: - Properly implement GP/SP commands (formats are not documented at all, like anywhere; no dumps yet). + - Properly implement GP/SP commands (formats are not documented at all, like anywhere; no dumps yet). - Dynamic baud rate selection from software following this. + - Add additional SMT2/3 commands plus config option for controller type. */ #include #include @@ -38,20 +39,18 @@ #include <86box/video.h> /* Needed to account for overscan. */ enum mtouch_modes { - MODE_TABLET = 1, - MODE_RAW = 2, + MODE_RAW = 1, + MODE_TABLET = 2, MODE_HEX = 3 }; typedef struct mouse_microtouch_t { - double abs_x; - double abs_y; double baud_rate; int b; char cmd[512]; int cmd_pos; int mode; - uint8_t cal_cntr, pen_mode, prev_b; + uint8_t cal_cntr, pen_mode; bool soh; bool in_reset; serial_t *serial; @@ -117,7 +116,8 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ - mtouch->mode = MODE_HEX; + /* Do not reset Mode Status for now as Photo Play 2000 relies on it */ + mtouch->mode = MODE_HEX; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *)"0\r", 2); } @@ -236,7 +236,6 @@ mtouch_poll(void *priv) int b = mouse_get_buttons_ex(); mouse_get_abs_coords(&abs_x, &abs_y); - dev->b |= !!(b & 3); /* Old state OR mouse click */ if (abs_x >= 1.0) abs_x = 1.0; @@ -269,34 +268,26 @@ mtouch_poll(void *priv) if (abs_y >= 1.0) abs_y = 1.0; } + + if (dev->cal_cntr || (!b && !dev->b)) { /* Calibration or no buttonpress */ + if (!b && dev->b) { + microtouch_calibrate_timer(dev); + } + dev->b = b; /* Save lack of buttonpress */ + return 0; + } if (dev->mode == MODE_TABLET) { - if (dev->cal_cntr && (!(dev->b & 1) && !!(b & 3))) { - dev->b |= 1; - } else if (dev->cal_cntr && ((dev->b & 1) && !(b & 3))) { - dev->b &= ~1; - microtouch_calibrate_timer(dev); - } - if (dev->cal_cntr) { - return 0; - } - if (!!(b & 3)) { /* Touchdown/Continuation */ - dev->abs_x = abs_x; - dev->abs_y = abs_y; - dev->b |= 1; - - abs_x_int = abs_x * 16383; - abs_y_int = 16383 - abs_y * 16383; - + abs_x_int = abs_x * 16383; + abs_y_int = 16383 - abs_y * 16383; + + if (b) { /* Touchdown/Continuation */ fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5) | ((b & 3))) : 0)); fifo8_push(&dev->resp, abs_x_int & 0b1111111); fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); fifo8_push(&dev->resp, abs_y_int & 0b1111111); fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); - } else if ((dev->b & 1) && !(b & 3)) { /* Liftoff */ - dev->b &= ~1; - abs_x_int = dev->abs_x * 16383; - abs_y_int = 16383 - dev->abs_y * 16383; + } else if (dev->b) { /* Liftoff */ fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5)) : 0)); fifo8_push(&dev->resp, abs_x_int & 0b1111111); fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); @@ -310,27 +301,24 @@ mtouch_poll(void *priv) } } - else if (dev->mode == MODE_HEX) { + if (dev->mode == MODE_HEX) { abs_x_int = abs_x * 1023; abs_y_int = 1023 - (abs_y * 1023); - char buffer[20]; + char buffer[10]; - if (dev->cal_cntr && !b && dev->prev_b) { - microtouch_calibrate_timer(dev); - } - else if (b & 1) { - if (dev->prev_b == 0) { /* Touchdown */ + if (b) { + if (!dev->b) { /* Touchdown */ snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); } else { /* Touch Continuation */ snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } else if (dev->prev_b == 1) { /* Liftoff */ + } else if (dev->b) { /* Liftoff */ snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - dev->prev_b = b & 1; + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } + + dev->b = b; /* Save buttonpress */ return 0; } From 66d2cc61015fa879b5405c03f210fcfdc39196ae Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Fri, 26 Jul 2024 02:11:21 +0200 Subject: [PATCH 209/624] Cleanup --- src/device/mouse_microtouch_touchscreen.c | 40 +++++++++++------------ 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index ffc848c4e..01cccfc1f 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -20,7 +20,7 @@ /* TODO: - Properly implement GP/SP commands (formats are not documented at all, like anywhere; no dumps yet). - Dynamic baud rate selection from software following this. - - Add additional SMT2/3 commands plus config option for controller type. + - Add additional SMT2/3 commands plus config option for controller type. */ #include #include @@ -40,7 +40,7 @@ enum mtouch_modes { MODE_RAW = 1, - MODE_TABLET = 2, + MODE_TABLET = 2, MODE_HEX = 3 }; @@ -117,7 +117,7 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ /* Do not reset Mode Status for now as Photo Play 2000 relies on it */ - mtouch->mode = MODE_HEX; + mtouch->mode = MODE_HEX; fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *)"0\r", 2); } @@ -176,8 +176,9 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "A\r", 2); } - if (fifo8_num_used(&mtouch->resp) != fifo_used) + if (fifo8_num_used(&mtouch->resp) != fifo_used) { pclog("Command received: %s\n", mtouch->cmd); + } } void @@ -193,10 +194,9 @@ mtouch_write_to_host(void *priv) goto no_write_to_machine; } } - - if (dev->in_reset) + if (dev->in_reset) { goto no_write_to_machine; - + } if (fifo8_num_used(&dev->resp)) { serial_write_fifo(dev->serial, fifo8_pop(&dev->resp)); } @@ -268,19 +268,19 @@ mtouch_poll(void *priv) if (abs_y >= 1.0) abs_y = 1.0; } - - if (dev->cal_cntr || (!b && !dev->b)) { /* Calibration or no buttonpress */ - if (!b && dev->b) { - microtouch_calibrate_timer(dev); - } - dev->b = b; /* Save lack of buttonpress */ - return 0; - } + + if (dev->cal_cntr || (!b && !dev->b)) { /* Calibration or no buttonpress */ + if (!b && dev->b) { + microtouch_calibrate_timer(dev); + } + dev->b = b; /* Save lack of buttonpress */ + return 0; + } if (dev->mode == MODE_TABLET) { - abs_x_int = abs_x * 16383; + abs_x_int = abs_x * 16383; abs_y_int = 16383 - abs_y * 16383; - + if (b) { /* Touchdown/Continuation */ fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5) | ((b & 3))) : 0)); fifo8_push(&dev->resp, abs_x_int & 0b1111111); @@ -315,10 +315,10 @@ mtouch_poll(void *priv) } else if (dev->b) { /* Liftoff */ snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - - dev->b = b; /* Save buttonpress */ + + dev->b = b; /* Save buttonpress */ return 0; } From 04a7a35f27b73d444f73ab61637e0b3fd04f1d82 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Fri, 26 Jul 2024 20:12:10 +0200 Subject: [PATCH 210/624] Microtouch: add option to turn off visible mouse crosshair for people using touchscreens --- src/device/mouse_microtouch_touchscreen.c | 9 ++++++++- src/include/86box/mouse.h | 2 +- src/qt/qt_rendererstack.cpp | 2 ++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 01cccfc1f..385dcef74 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -341,7 +341,7 @@ mtouch_init(const device_t *info) timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); dev->mode = MODE_TABLET; dev->pen_mode = 3; - mouse_input_mode = 1; + mouse_input_mode = device_get_config_int("crosshair") + 1; mouse_set_buttons(2); mouse_set_poll_ex(mtouch_poll_global); @@ -398,6 +398,13 @@ static const device_config_t mtouch_config[] = { { .description = "1200", .value = 1200 } } }, + { + .name = "crosshair", + .description = "Show Crosshair", + .type = CONFIG_BINARY, + .default_string = "", + .default_int = 1 + }, { .name = "", .description = "", .type = CONFIG_END } // clang-format on }; diff --git a/src/include/86box/mouse.h b/src/include/86box/mouse.h index e9c1d9b4d..810d62293 100644 --- a/src/include/86box/mouse.h +++ b/src/include/86box/mouse.h @@ -50,7 +50,7 @@ extern "C" { #endif extern int mouse_type; -extern int mouse_input_mode; /* 1 = Absolute, 0 = Relative */ +extern int mouse_input_mode; /* 2 = Absolute (Visible Crosshair), 1 = Absolute, 0 = Relative */ extern int mouse_timed; /* 1 = Timed, 0 = Constant */ extern int mouse_tablet_in_proximity; extern double mouse_x_abs; diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index d043f823c..d594b94f0 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -251,6 +251,8 @@ RendererStack::enterEvent(QEvent *event) mousedata.mouse_tablet_in_proximity = m_monitor_index + 1; if (mouse_input_mode == 1) + QApplication::setOverrideCursor(Qt::BlankCursor); + else if (mouse_input_mode == 2) QApplication::setOverrideCursor(Qt::CrossCursor); } From b7582ca250afb724ca451c1ee105c34155c3b795 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 26 Jul 2024 21:02:59 +0200 Subject: [PATCH 211/624] RadiSys EPC-2102: Initialize NVR to 00h instead of FFh, fixes the password. --- src/machine/m_at_socket7.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index b921b9a4e..ba20fbca9 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -443,7 +443,8 @@ machine_at_epc2102_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_params(&at_nvr_device, (void *) 0x20); pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); From 4b24142debbb5fa3a19cfde78abb9cf292bff7fa Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 26 Jul 2024 21:06:57 +0200 Subject: [PATCH 212/624] RadiSys EPC-2102: Use the correct Flash chip (turned out to be SST 39SF010). --- src/machine/m_at_socket7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index ba20fbca9..12cec1357 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -457,7 +457,7 @@ machine_at_epc2102_init(const machine_t *model) device_add(&piix3_device); device_add(&keyboard_ps2_intel_ami_pci_device); device_add(&i82091aa_device); - device_add(&intel_flash_bxt_device); + device_add(&sst_flash_39sf010_device); return ret; } From 3853979b3f0b8a12b99b506def10e3d58410515d Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 26 Jul 2024 21:08:56 +0200 Subject: [PATCH 213/624] DataExpert SX495: Apply the bus speed and voltage limits to the MR BIOS version as well. --- src/machine/machine_table.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 9b13c9234..f75947605 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5524,10 +5524,10 @@ const machine_t machines[] = { .cpu = { .package = CPU_PKG_386DX | CPU_PKG_SOCKET1, .block = CPU_BLOCK_NONE, - .min_bus = 0, - .max_bus = 0, - .min_voltage = 0, - .max_voltage = 0, + .min_bus = 25000000, + .max_bus = 66666667, + .min_voltage = 5000, + .max_voltage = 5000, .min_multi = 0, .max_multi = 0 }, From ad04a7735e6f652eb514e4e9b6f9a35e9d323a2f Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 26 Jul 2024 21:09:47 +0200 Subject: [PATCH 214/624] Bump version to 4.2.1. --- CMakeLists.txt | 2 +- debian/changelog | 4 ++-- src/unix/assets/86Box.spec | 4 ++-- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- vcpkg.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index b21dafe30..ca75ebc25 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 4.2 + VERSION 4.2.1 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/debian/changelog b/debian/changelog index 5164eae30..78c838a01 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -86box (4.2) UNRELEASED; urgency=medium +86box (4.2.1) UNRELEASED; urgency=medium * Bump release. - -- Jasmine Iwanek Fri, 26 Jul 2024 00:46:15 +0200 + -- Jasmine Iwanek Fri, 26 Jul 2024 21:09:16 +0200 diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index ea335cf5b..15eca9400 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -15,7 +15,7 @@ %global romver 4.1 Name: 86Box -Version: 4.2 +Version: 4.2.1 Release: 1%{?dist} Summary: Classic PC emulator License: GPLv2+ @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Fri Jul 26 2024 Robert de Rooy 4.2-1 +* Fri Jul 26 2024 Robert de Rooy 4.2.1-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index 5500ba0a8..7fbac6d7f 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + diff --git a/vcpkg.json b/vcpkg.json index d9ea83dba..0d71210c2 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "86box", - "version-string": "4.2", + "version-string": "4.2.1", "homepage": "https://86box.net/", "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", From d0b2efface3b92ffb88cd542010627d0fd379011 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 26 Jul 2024 16:11:54 -0300 Subject: [PATCH 215/624] Modem: Convert phonebook parse failure to pclog --- src/network/net_modem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_modem.c b/src/network/net_modem.c index 078320fb4..b3163c06c 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -263,7 +263,7 @@ modem_read_phonebook_file(modem_t *modem, const char *path) if (strspn(entry.phone, "01234567890*=,;#+>") != strlen(entry.phone)) { /* Invalid characters. */ - modem_log("Modem: Invalid character in phone number %s\n", entry.phone); + pclog("Modem: Invalid character in phone number %s\n", entry.phone); continue; } From e91ffcffa25512ed957ee213c8be304017474d5e Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 26 Jul 2024 16:15:00 -0300 Subject: [PATCH 216/624] Modem: Add SLIP alias for Win9x/IE5 with numbering rules enabled --- src/network/net_modem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_modem.c b/src/network/net_modem.c index b3163c06c..45fb00ef2 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -686,7 +686,7 @@ modem_dial(modem_t *modem, const char *str) { modem->tcpIpConnCounter = 0; modem->tcpIpMode = false; - if (!strncmp(str, "0.0.0.0", sizeof("0.0.0.0") - 1)) { + if (!strcmp(str, "0.0.0.0") || !strcmp(str, "0000")) { modem_log("Turning on SLIP\n"); modem_enter_connected_state(modem); modem->numberinprogress[0] = 0; From b19bf7782b020faa72585019ea4968f3b60444b5 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 26 Jul 2024 16:44:31 -0300 Subject: [PATCH 217/624] MGA: Fix warning with devbranched G100 --- src/video/vid_mga.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/video/vid_mga.c b/src/video/vid_mga.c index 54d9afc42..1bdbecdf6 100644 --- a/src/video/vid_mga.c +++ b/src/video/vid_mga.c @@ -6821,11 +6821,13 @@ millennium_ii_available(void) return rom_present(ROM_MILLENNIUM_II); } +#ifdef USE_G100 static int matrox_g100_available(void) { return rom_present(ROM_G100); } +#endif static void mystique_speed_changed(void *priv) From b418b0d186ae16c6a714ef724813c1622e941fd4 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 26 Jul 2024 16:45:17 -0300 Subject: [PATCH 218/624] Modem: Clean up some dead code --- src/network/net_modem.c | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/network/net_modem.c b/src/network/net_modem.c index 45fb00ef2..992270212 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -575,14 +575,6 @@ modem_send_res(modem_t *modem, const ResTypes response) } else if (response_str != NULL) { modem_send_line(modem, response_str); } - - // if(CSerial::CanReceiveByte()) // very fast response - // if(rqueue->inuse() && CSerial::getRTS()) - // { uint8_t rbyte =rqueue->getb(); - // CSerial::receiveByte(rbyte); - // LOG_MSG("SERIAL: Port %" PRIu8 " modem sending byte %2x back to UART2", - // GetPortNumber(), rbyte); - // } } } From 09ba9a1fb27186a20bdb59ddab40614c5f7f0702 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 26 Jul 2024 17:07:49 -0300 Subject: [PATCH 219/624] Modem: Respond to % escaped commands, fixes Windows autodetection taking a long time --- src/network/net_modem.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/network/net_modem.c b/src/network/net_modem.c index 992270212..241e46502 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -1091,6 +1091,10 @@ modem_do_command(modem_t *modem, int repeat) } break; } + case '%': // % escaped commands + // Windows 98 modem prober sends unknown command AT%V + modem_send_res(modem, ResERROR); + return; case '\0': modem_send_res(modem, ResOK); return; From aca6355eb291171d652f09a530040d18f29dbd2e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 27 Jul 2024 16:58:36 +0200 Subject: [PATCH 220/624] Rewrote a line in unix.c, fixes #4658. --- src/unix/unix.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/unix/unix.c b/src/unix/unix.c index 1fe477a23..d4d73817f 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -640,8 +640,12 @@ ui_msgbox_header(int flags, void *header, void *message) SDL_MessageBoxData msgdata; SDL_MessageBoxButtonData msgbtn; - if (!header) - header = (void *) ((flags & MBX_ANSI) ? "86Box" : L"86Box"); + if (!header) { + if (flags & MBX_ANSI) + header = (void *) "86Box"; + else + header = (void *) L"86Box"; + } msgbtn.buttonid = 1; msgbtn.text = "OK"; From 6d4bd6d6f8d63129b5660ee8523974452caf3154 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sat, 27 Jul 2024 20:14:22 +0200 Subject: [PATCH 221/624] Megatouch MAXX WIP - Fix soh bug to only proces full commands, - Print unhandled commands too, - Temporarily change identity to SMT3. --- src/device/mouse_microtouch_touchscreen.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 385dcef74..87ddf6728 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -108,7 +108,7 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) } if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "P50200\r", sizeof("P50200\r") - 1); + fifo8_push_all(&mtouch->resp, (uint8_t *) "A30600\r", sizeof("A30600\r") - 1); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ mtouch->mode = MODE_TABLET; @@ -176,8 +176,10 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) fifo8_push(&mtouch->resp, 1); fifo8_push_all(&mtouch->resp, (uint8_t *) "A\r", 2); } - if (fifo8_num_used(&mtouch->resp) != fifo_used) { - pclog("Command received: %s\n", mtouch->cmd); + if (fifo8_num_used(&mtouch->resp) != fifo_used || mtouch->in_reset) { + pclog("Command handled: %s\n", mtouch->cmd); + } else { + pclog("Command ignored: %s\n", mtouch->cmd); } } @@ -216,6 +218,7 @@ mtouch_write(serial_t *serial, void *priv, uint8_t data) dev->cmd[dev->cmd_pos++] = data; } else { dev->cmd[dev->cmd_pos++] = data; + dev->soh = 0; microtouch_process_commands(dev); } } From 0ae49490d2ab6e872736fd0b0d0619efbb4e91c7 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 27 Jul 2024 19:43:50 -0300 Subject: [PATCH 222/624] Network: Make packet dumping work again --- src/network/network.c | 76 ++++++++++++++++++++++++++----------------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/src/network/network.c b/src/network/network.c index c972e80da..fda1d4b2d 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -54,9 +54,7 @@ #include #include #include -#ifndef _WIN32 -# include -#endif /* _WIN32 */ +#include #include #define HAVE_STDARG_H #include <86box/86box.h> @@ -122,8 +120,7 @@ int network_ndev; netdev_t network_devs[NET_HOST_INTF_MAX]; /* Local variables. */ - -#if defined ENABLE_NETWORK_LOG && !defined(_WIN32) +#ifdef ENABLE_NETWORK_LOG int network_do_log = ENABLE_NETWORK_LOG; static FILE *network_dump = NULL; static mutex_t *network_dump_mutex; @@ -149,9 +146,15 @@ network_dump_packet(netpkt_t *pkt) struct timeval tv; gettimeofday(&tv, NULL); struct { - uint32_t ts_sec, ts_usec, incl_len, orig_len; + uint32_t ts_sec; + uint32_t ts_usec; + uint32_t incl_len; + uint32_t orig_len; } pcap_packet_hdr = { - tv.tv_sec, tv.tv_usec, pkt->len, pkt->len + .ts_sec = tv.tv_sec, + .ts_usec = tv.tv_usec, + .incl_len = pkt->len, + .orig_len = pkt->len }; if (network_dump_mutex) @@ -165,8 +168,9 @@ network_dump_packet(netpkt_t *pkt) if ((written = fwrite(pkt->data, 1, pkt->len, network_dump)) < pkt->len) { network_log("NETWORK: failed to write dump packet data\n"); fseek(network_dump, -written - sizeof(pcap_packet_hdr), SEEK_CUR); + } else { + fflush(network_dump); } - fflush(network_dump); } if (network_dump_mutex) @@ -219,28 +223,41 @@ network_init(void) #ifdef HAS_VDE // Try to load the VDE plug library - if(net_vde_prepare()==0) { + if (!net_vde_prepare()) network_devmap.has_vde = 1; - } #endif -#if defined ENABLE_NETWORK_LOG && !defined(_WIN32) +#ifdef ENABLE_NETWORK_LOG /* Start packet dump. */ network_dump = fopen("network.pcap", "wb"); - - struct { - uint32_t magic_number; - uint16_t version_major, version_minor; - int32_t thiszone; - uint32_t sigfigs, snaplen, network; - } pcap_hdr = { - 0xa1b2c3d4, - 2, 4, - 0, - 0, 65535, 1 - }; - fwrite(&pcap_hdr, sizeof(pcap_hdr), 1, network_dump); - fflush(network_dump); + if (network_dump) { + struct { + uint32_t magic_number; + uint16_t version_major; + uint16_t version_minor; + int32_t thiszone; + uint32_t sigfigs; + uint32_t snaplen; + uint32_t network; + } pcap_hdr = { + .magic_number = 0xa1b2c3d4, + .version_major = 2, + .version_minor = 4, + .thiszone = 0, + .sigfigs = 0, + .snaplen = 65535, + .network = 1 + }; + if (fwrite(&pcap_hdr, 1, sizeof(pcap_hdr), network_dump) < sizeof(pcap_hdr)) { + network_log("NETWORK: failed to write dump header\n"); + fclose(network_dump); + network_dump = NULL; + } else { + fflush(network_dump); + } + } else { + network_log("NETWORK: failed to open dump file\n"); + } #endif } @@ -297,10 +314,8 @@ network_queue_put_swap(netqueue_t *queue, netpkt_t *src_pkt) network_log("Discarded zero length packet.\n"); } else if (src_pkt->len > NET_MAX_FRAME) { network_log("Discarded oversized packet of len=%d.\n", src_pkt->len); - network_dump_packet(src_pkt); } else { network_log("Discarded %d bytes packet because the queue is full.\n", src_pkt->len); - network_dump_packet(src_pkt); } #endif return 0; @@ -501,7 +516,7 @@ network_attach(void *card_drv, uint8_t *mac, NETRXCB rx, NETSETLINKSTATE set_lin free(card->queued_pkt.data); free(card); // Placeholder - insert the error message - fatal("Error initializing the network device: Null driver initialization failed"); + fatal("Error initializing the network device: Null driver initialization failed\n"); return NULL; } @@ -533,7 +548,7 @@ netcard_close(netcard_t *card) void network_close(void) { -#if defined ENABLE_NETWORK_LOG && !defined(_WIN32) +#ifdef ENABLE_NETWORK_LOG thread_close_mutex(network_dump_mutex); network_dump_mutex = NULL; #endif @@ -554,7 +569,7 @@ network_reset(void) { ui_sb_update_icon(SB_NETWORK, 0); -#if defined ENABLE_NETWORK_LOG && !defined(_WIN32) +#ifdef ENABLE_NETWORK_LOG network_dump_mutex = thread_create_mutex(); #endif @@ -598,6 +613,7 @@ network_tx_popv(netcard_t *card, netpkt_t *pkt_vec, int vec_size) for (int i = 0; i < vec_size; i++) { if (!network_queue_get_swap(queue, pkt_vec)) break; + network_dump_packet(pkt_vec); pkt_count++; pkt_vec++; } From 2b399e210f7ace7c36cba9160ed622d65f5e6256 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sat, 27 Jul 2024 19:45:53 -0300 Subject: [PATCH 223/624] Network: Force SLiRP for PLIP as well --- src/network/network.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/network/network.c b/src/network/network.c index fda1d4b2d..7c02609ae 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -459,8 +459,9 @@ network_attach(void *card_drv, uint8_t *mac, NETRXCB rx, NETSETLINKSTATE set_lin network_queue_init(&card->queues[i]); } - if (!strcmp(network_card_get_internal_name(net_cards_conf[net_card_current].device_num), "modem") && net_type >= NET_TYPE_PCAP) { - /* Force SLiRP here. Modem only operates on non-Ethernet frames. */ + if ((!strcmp(network_card_get_internal_name(net_cards_conf[net_card_current].device_num), "modem") || + !strcmp(network_card_get_internal_name(net_cards_conf[net_card_current].device_num), "plip")) && (net_type >= NET_TYPE_PCAP)) { + /* Force SLiRP here. Modem and PLIP only operate on non-Ethernet frames. */ net_type = NET_TYPE_SLIRP; } From 760c720352b6899f4668a8667fe29bed57160b40 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 28 Jul 2024 01:00:58 +0200 Subject: [PATCH 224/624] Assorted FDC and PCjr video fixes, fixes #4659. --- src/floppy/fdc.c | 85 ++++++++--------------------------------- src/floppy/fdd_86f.c | 22 ++++++++++- src/include/86box/fdc.h | 2 +- src/machine/m_pcjr.c | 12 +++--- 4 files changed, 43 insertions(+), 78 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index bce34e327..3fd492bd2 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -561,9 +561,6 @@ static void fdc_rate(fdc_t *fdc, int drive) { fdc_update_rate(fdc, drive); -#if 0 - fdc_log("FDD %c: Setting rate: %i, %i, %i (%i, %i)\n", 0x41 + drive, fdc->drvrate[drive], fdc->rate, fdc_get_densel(fdc, drive), fdc->rwc[drive], fdc->densel_force); -#endif fdc_log("FDD %c: [%i] Setting rate: %i, %i, %i (%i, %i, %i)\n", 0x41 + drive, fdc->enh_mode, fdc->drvrate[drive], fdc->rate, fdc_get_densel(fdc, drive), fdc->rwc[drive], fdc->densel_force, fdc->densel_polarity); fdd_set_densel(fdc_get_densel(fdc, drive)); fdc_log("FDD %c: [%i] Densel: %i\n", 0x41 + drive, fdc->enh_mode, fdc_get_densel(fdc, drive)); @@ -596,17 +593,6 @@ fdc_bad_command(fdc_t *fdc) static void fdc_io_command_phase1(fdc_t *fdc, int out) { -#if 0 - int i; - - pclog_toggle_suppr(); - pclog("%02X ", fdc->processed_cmd); - for (i = 0; i < fdc->pnum; i++) - pclog("%02X ", fdc->params[i]); - pclog("\n"); - pclog_toggle_suppr(); -#endif - fifo_reset(fdc->fifo_p); fdc_rate(fdc, fdc->drive); fdc->head = fdc->params[2]; @@ -1125,9 +1111,6 @@ fdc_write(uint16_t addr, uint8_t val, void *priv) fdc->stat = (1 << fdc->drive); if (!(fdc->flags & FDC_FLAG_PCJR)) fdc->stat |= 0x80; -#if 0 - fdc->head = (fdc->params[0] & 4) ? 1 : 0; -#endif fdc->head = 0; /* TODO: See if this is correct. */ fdc->st0 = fdc->params[0] & 0x03; fdc->st0 |= (fdc->params[0] & 4); @@ -1418,7 +1401,6 @@ fdc_read(uint16_t addr, void *priv) default: ret = 0xFF; } - // fdc_log("Read FDC %04X %02X\n", addr, ret); fdc_log("[%04X:%08X] Read FDC %04X %02X [%i:%02X]\n", CS, cpu_state.pc, addr, ret, drive, fdc->dor & (0x10 << drive)); return ret; } @@ -1628,8 +1610,10 @@ fdc_callback(void *priv) if (fdc->sector == fdc->params[5]) { /* Reached end of track, MT bit is clear */ if (!(fdc->command & 0x80)) { - fdc->rw_track++; - fdc->sector = 1; + if (fdc->dma) { + fdc->rw_track++; + fdc->sector = 1; + } if (!(fdc->flags & FDC_FLAG_PCJR) && fdc->dma && (old_sector == 255)) fdc_no_dma_end(fdc, compare); else @@ -1638,10 +1622,12 @@ fdc_callback(void *priv) } /* Reached end of track, MT bit is set, head is 1 */ if (fdd_get_head(real_drive(fdc, fdc->drive)) == 1) { - fdc->rw_track++; - fdc->sector = 1; - fdc->head &= 0xFE; - fdd_set_head(real_drive(fdc, fdc->drive), 0); + if (fdc->dma) { + fdc->rw_track++; + fdc->sector = 1; + fdc->head &= 0xFE; + fdd_set_head(real_drive(fdc, fdc->drive), 0); + } if (!(fdc->flags & FDC_FLAG_PCJR) && fdc->dma && (old_sector == 255)) fdc_no_dma_end(fdc, compare); else @@ -1649,8 +1635,6 @@ fdc_callback(void *priv) return; } if (fdd_get_head(real_drive(fdc, fdc->drive)) == 0) { - fdc->sector = 1; - fdc->head |= 1; fdd_set_head(real_drive(fdc, fdc->drive), 1); if (!fdd_is_double_sided(real_drive(fdc, fdc->drive))) { fdc_noidam(fdc); @@ -1659,6 +1643,8 @@ fdc_callback(void *priv) } } else if (fdc->sector < fdc->params[5]) fdc->sector++; + else if (fdc->params[5] == 0) + fdc->sector++; ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); switch (fdc->interrupt) { case 5: @@ -1811,7 +1797,6 @@ void fdc_error(fdc_t *fdc, int st5, int st6) { dma_set_drq(fdc->dma_ch, 0); -#if 1 timer_disable(&fdc->timer); fdc_int(fdc, 1); @@ -1823,6 +1808,10 @@ fdc_error(fdc_t *fdc, int st5, int st6) fdc->st0 |= 0x08; fdc->res[5] = st5; fdc->res[6] = st6; + if (fdc->wrong_am) { + fdc->res[6] |= 0x40; + fdc->wrong_am = 0; + } fdc_log("FDC Error: %02X %02X %02X\n", fdc->res[4], fdc->res[5], fdc->res[6]); switch (fdc->interrupt) { case 0x02: @@ -1848,48 +1837,6 @@ fdc_error(fdc_t *fdc, int st5, int st6) } ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 0); fdc->paramstogo = 7; -#else - switch (fdc->interrupt) { - case 0x02: - case 0x05: - case 0x06: - case 0x09: - case 0x0C: - case 0x11: - case 0x16: - case 0x19: - case 0x1D: - fdc->error = 1; - fdc->st5 = st5; - fdc->st6 = st6; - fdc->tc = 1; - fdc->stat = 0x10; - fdc_callback(fdc); - break; - default: - timer_disable(&fdc->timer); - - fdc_int(fdc, 1); - if (!(fdc->flags & FDC_FLAG_PS1)) - fdc->fintr = 0; - fdc->stat = 0xD0; - fdc->st0 = fdc->res[4] = 0x40 | (fdd_get_head(real_drive(fdc, fdc->drive)) ? 4 : 0) | fdc->rw_drive; - if (fdc->head && !fdd_is_double_sided(real_drive(fdc, fdc->drive))) - fdc->st0 |= 0x08; - fdc->res[5] = st5; - fdc->res[6] = st6; - fdc_log("FDC Error: %02X %02X %02X\n", fdc->res[4], fdc->res[5], fdc->res[6]); - - fdc->res[7] = 0; - fdc->res[8] = 0; - fdc->res[9] = 0; - fdc->res[10] = 0; - - ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 0); - fdc->paramstogo = 7; - break; - } -#endif } void diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index fa1c070f1..35ddbb1dd 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -1298,7 +1298,16 @@ d86f_find_address_mark_fm(int drive, int side, find_t *find, uint16_t req_am, ui find->sync_pos = 0xFFFFFFFF; if (ignore_other_am & 1) { /* Skip mode, let's go back to finding ID. */ - dev->state -= 2; + fdc_set_wrong_am(d86f_fdc); + dev->data_find.sync_marks = dev->data_find.bits_obtained = dev->data_find.bytes_obtained = 0; + dev->error_condition = 0; + dev->state = STATE_IDLE; + if (dev->state == STATE_02_READ_DATA) + fdc_track_finishread(d86f_fdc, dev->error_condition); + else if (dev->state == STATE_11_SCAN_DATA) + fdc_sector_finishcompare(d86f_fdc, (dev->satisfying_bytes == ((128 << ((uint32_t) dev->last_sector.id.n)) - 1)) ? 1 : 0); + else + fdc_sector_finishread(d86f_fdc); } else { /* Not skip mode, process the sector anyway. */ fdc_set_wrong_am(d86f_fdc); @@ -1377,7 +1386,16 @@ d86f_find_address_mark_mfm(int drive, int side, find_t *find, uint16_t req_am, u find->sync_pos = 0xFFFFFFFF; if (ignore_other_am & 1) { /* Skip mode, let's go back to finding ID. */ - dev->state -= 2; + fdc_set_wrong_am(d86f_fdc); + dev->data_find.sync_marks = dev->data_find.bits_obtained = dev->data_find.bytes_obtained = 0; + dev->error_condition = 0; + dev->state = STATE_IDLE; + if (dev->state == STATE_02_READ_DATA) + fdc_track_finishread(d86f_fdc, dev->error_condition); + else if (dev->state == STATE_11_SCAN_DATA) + fdc_sector_finishcompare(d86f_fdc, (dev->satisfying_bytes == ((128 << ((uint32_t) dev->last_sector.id.n)) - 1)) ? 1 : 0); + else + fdc_sector_finishread(d86f_fdc); } else { /* Not skip mode, process the sector anyway. */ fdc_set_wrong_am(d86f_fdc); diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index e03785df6..ef78239cd 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -120,7 +120,7 @@ typedef struct fdc_t { uint8_t params[15]; uint8_t specify[2]; uint8_t res[11]; - uint8_t eot[4]; + uint16_t eot[4]; uint8_t rwc[4]; uint16_t pcn[4]; diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 6638402f7..9ac4ff631 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -465,22 +465,22 @@ vid_poll(void *priv) buffer32->line[l][ef_x + 2] = buffer32->line[l][ef_x + 3] = buffer32->line[l + 1][ef_x] = buffer32->line[l + 1][ef_x + 1] = buffer32->line[l + 1][ef_x + 2] = buffer32->line[l + 1][ef_x + 3] = - pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16; + pcjr->array[((dat >> 12) & pcjr->array[1] & 0x0f) + 16] + 16; buffer32->line[l][ef_x + 4] = buffer32->line[l][ef_x + 5] = buffer32->line[l][ef_x + 6] = buffer32->line[l][ef_x + 7] = - buffer32->line[l + 1][(x << 4) + 12] = buffer32->line[l + 1][(x << 4) + 13] = - buffer32->line[l + 1][(x << 4) + 14] = buffer32->line[l + 1][(x << 4) + 15] = - pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16; + buffer32->line[l + 1][ef_x + 4] = buffer32->line[l + 1][ef_x + 5] = + buffer32->line[l + 1][ef_x + 6] = buffer32->line[l + 1][ef_x + 7] = + pcjr->array[((dat >> 8) & pcjr->array[1] & 0x0f) + 16] + 16; buffer32->line[l][ef_x + 8] = buffer32->line[l][ef_x + 9] = buffer32->line[l][ef_x + 10] = buffer32->line[l][ef_x + 11] = buffer32->line[l + 1][ef_x + 8] = buffer32->line[l + 1][ef_x + 9] = buffer32->line[l + 1][ef_x + 10] = buffer32->line[l + 1][ef_x + 11] = - pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16; + pcjr->array[((dat >> 4) & pcjr->array[1] & 0x0f) + 16] + 16; buffer32->line[l][ef_x + 12] = buffer32->line[l][ef_x + 13] = buffer32->line[l][ef_x + 14] = buffer32->line[l][ef_x + 15] = buffer32->line[l + 1][ef_x + 12] = buffer32->line[l + 1][ef_x + 13] = buffer32->line[l + 1][ef_x + 14] = buffer32->line[l + 1][ef_x + 15] = - pcjr->array[(dat & pcjr->array[1]) + 16] + 16; + pcjr->array[(dat & pcjr->array[1] & 0x0f) + 16] + 16; } break; case 0x03: /*640x200x4*/ From 4ae901c901785befa0fc3226fdfbe8ad4cc30ee3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 28 Jul 2024 02:26:43 +0200 Subject: [PATCH 225/624] Genoa Unknown 486: Port 92h controls the exact same gate as the KBC, fixes #4660. --- src/include/86box/port_92.h | 1 + src/machine/m_at_386dx_486.c | 2 +- src/port_92.c | 27 ++++++++++++++++++++++++--- 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/src/include/86box/port_92.h b/src/include/86box/port_92.h index 2dd4319be..838b7ca28 100644 --- a/src/include/86box/port_92.h +++ b/src/include/86box/port_92.h @@ -37,6 +37,7 @@ extern void port_92_add(void *priv); extern void port_92_remove(void *priv); extern const device_t port_92_device; +extern const device_t port_92_key_device; extern const device_t port_92_inv_device; extern const device_t port_92_word_device; extern const device_t port_92_pci_device; diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 82f946314..6b0ffae50 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -2333,7 +2333,7 @@ machine_at_genoa486_init(const machine_t *model) machine_at_common_init(model); device_add(&compaq_genoa_device); - device_add(&port_92_device); + device_add(&port_92_key_device); device_add(&keyboard_at_ami_device); diff --git a/src/port_92.c b/src/port_92.c index 1307ecba9..18e60326c 100644 --- a/src/port_92.c +++ b/src/port_92.c @@ -36,6 +36,7 @@ #define PORT_92_PCI 4 #define PORT_92_RESET 8 #define PORT_92_A20 16 +#define PORT_92_KEY 32 static uint8_t port_92_readb(uint16_t port, void *priv) @@ -46,7 +47,10 @@ port_92_readb(uint16_t port, void *priv) if (port == 0x92) { /* Return bit 1 directly from mem_a20_alt, so the pin can be reset independently of the device. */ - ret = (dev->reg & ~0x03) | (mem_a20_alt & 2) | (cpu_alt_reset & 1); + if (dev->flags & PORT_92_KEY) + ret = (dev->reg & ~0x03) | (mem_a20_key & 2) | (cpu_alt_reset & 1); + else + ret = (dev->reg & ~0x03) | (mem_a20_alt & 2) | (cpu_alt_reset & 1); if (dev->flags & PORT_92_INV) ret |= 0xfc; @@ -94,8 +98,11 @@ port_92_writeb(uint16_t port, uint8_t val, void *priv) dev->reg = val & 0x03; - if ((mem_a20_alt ^ val) & 2) { - mem_a20_alt = (val & 2); + if (dev->flags & PORT_92_KEY) { + mem_a20_key = val & 2; + mem_a20_recalc(); + } else if ((mem_a20_alt ^ val) & 2) { + mem_a20_alt = (mem_a20_alt & 0xfd) | (val & 2); mem_a20_recalc(); } @@ -234,6 +241,20 @@ const device_t port_92_device = { .config = NULL }; +const device_t port_92_key_device = { + .name = "Port 92 Register (using A20 key)", + .internal_name = "port_92_key", + .flags = 0, + .local = PORT_92_KEY, + .init = port_92_init, + .close = port_92_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; + const device_t port_92_inv_device = { .name = "Port 92 Register (inverted bits 2-7)", .internal_name = "port_92_inv", From 91021c55e3a0cfe6ee5d5ea09c877813b43587c8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 28 Jul 2024 03:36:43 +0200 Subject: [PATCH 226/624] The exclamation mark icon. --- src/qt/icons/warning.ico | Bin 0 -> 9622 bytes src/qt/qt_settingsmachine.cpp | 2 +- src/qt_resources.qrc | 3 +++ 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 src/qt/icons/warning.ico diff --git a/src/qt/icons/warning.ico b/src/qt/icons/warning.ico new file mode 100644 index 0000000000000000000000000000000000000000..2f283e2c42f9aec44f83f537c9783dc37bd36c6e GIT binary patch literal 9622 zcmZQzU}Run5D);-3Je)63=D1z3=AS75dID}28MMk3=9$y5Pk zcLPlS-@ktu{{BT#2Uh?0?|+6re?S;42MQZ_Sitmx+z8V9?;k`Bh>wmz=KTNvA8aPn z9}JlK5n;!`@Sh1}FH|4cUm!a`=Hk*1RSUBNOoPP!{ezeba~}cyV0VGS5ad3Peh>!P zOW1yh|3P|T7~%(rIFkRdhX0>G5OpxUAR1&RNE}3i+yHYs%m9!ZLE<3%=g(hoIDz!R zFi7w3-(YcYctFHqx*;^O8Axsfs|T5jBnHs{N(G=~4d*d{!wk(FuvYAa^0D2d6ivJK+8XrGFSkO2;VXJ$b?eHXCH#zkk2M=D^HFHxE=6fH15~0jb00 zZ;)9(fBt6p_Ya)+U}l2-2sIPThM5I255&ghMv!@b|NdbBm0_T=0E9t$K=vbJkQfMq z#9%at4Rs^fpCAHc-oJkk^AKi2%1MwM2!r&2+ypZRMuWt$oA(#&K7@IwOf*3jLkfdILIsz2I>3z7hZpW;uj_SAZq`^>M)QzN*u%d12PMQq2__hEogjz*&zRd zFvL8F`$25n?gRN5Qg?#%!OViuATbaIg&oLVr1%9z0}6(@5o8|-gY?17fzco_klX+N z|A*7BM~@=XGsqkm2IT{oIWQVz7DyaK<8oVTE5ey*ZUn~x)GRO?WEQ9%`uFb-m=BRd z=m)W|l`l|pnLv8KfB(zy?b~0b-@pGbfZ8QLe*6Z<4M+`0KLZ0pa7qfe{H(67W&oFe z=w^b{fz;!|AbC3B-#`BU|Hu6Q{{x2q|35I)|9`+>|K9DFfcF}AhnMZIO*gW60HH{L0p(bqfnHC%mn3eTo@z|!zdbw;egT% zDBZ&H4H}J33n7dIzag8;>1Gda=eY zl03{5RJy4Nm5(nj(A-YYY*dpGJdhnAjAkB6yny6E7@>=F7DzuXOp0lszA&gRYj0;@ z=zEpnN$D&KjZ)ZzyCwV4?ts-4oK~=2GGDI4)+WtVNe}}57Wvo`0T_cM=f{2%m%ds z@L`xbbea-(fXss1i6_q@l?U*4CrB?0ljR0b{sontcep*2AK)=8y>%d?MBiEvmZpGxPeIfVdjxV zqoqZ-{q(RKOBhgOKN0B;YZxJg!BDjyoaTt_Q=q3!YWN?NUO?dwqS4JK#HWV+AiH6h zkbUU#6xt69dr;m7VK5)v4t#v5{qVF0VvrJ!Ahj^RgJ=*RpM6MjV7FqkpA_o>% zc3{nOFnL^d)4_hceh1kP!o-9ny5B*3nE&w6`1}sC8-!_OKg{nSD+ppjZUFfg9pmvg zNp`~=hsO;_=7A=evG%)RX%I;*%w*zeJZ^xQkB_FvZkQ`UZUA9C;fvJ`AUz-qGlx_O1_t|o3=Hyr7#R3}Ffg!x zU|?W>z`(!^!Uq@_7(uv!fq@YRW^Q0$U_QXWzz)I>7#R2;Ffhn}U|_KS!N5@ehk@b$ OKL(IJAp7LORs#S@b2SwJ literal 0 HcmV?d00001 diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index aff55203e..30b163687 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -61,7 +61,7 @@ SettingsMachine::SettingsMachine(QWidget *parent) break; } - auto warning_icon = ui->softFloatWarningIcon->style()->standardIcon(QStyle::SP_MessageBoxWarning); + auto warning_icon = QIcon(":/misc/qt/icons/warning.ico"); ui->softFloatWarningIcon->setPixmap(warning_icon.pixmap(warning_icon.actualSize(QSize(16, 16)))); ui->softFloatWarningIcon->setVisible(false); ui->softFloatWarningText->setVisible(false); diff --git a/src/qt_resources.qrc b/src/qt_resources.qrc index 2c4e9775a..1f6341786 100644 --- a/src/qt_resources.qrc +++ b/src/qt_resources.qrc @@ -63,6 +63,9 @@ qt/icons/send_cae.ico qt/icons/settings.ico + + qt/icons/warning.ico + qt/texture_vert.spv qt/texture_frag.spv From c32c685070056ad9e33e34d2dd6f27d1b095f52f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 28 Jul 2024 03:44:45 +0200 Subject: [PATCH 227/624] vid_svga.c: Allocate 8 bytes more of video memory to avoid segmentation faults. --- src/video/vid_svga.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index cfb984a5a..93c1eb669 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -1341,7 +1341,7 @@ svga_init(const device_t *info, svga_t *svga, void *priv, int memsize, svga->dispontime = 1000ULL << 32; svga->dispofftime = 1000ULL << 32; svga->bpp = 8; - svga->vram = calloc(memsize, 1); + svga->vram = calloc(memsize + 8, 1); svga->vram_max = memsize; svga->vram_display_mask = svga->vram_mask = memsize - 1; svga->decode_mask = 0x7fffff; From 4d3b0627931eb33e0da489518fb917a6ecf8d329 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 28 Jul 2024 06:22:06 +0200 Subject: [PATCH 228/624] net_modem.c: Fix credits. --- src/network/net_modem.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/net_modem.c b/src/network/net_modem.c index 241e46502..2ed219edf 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -14,7 +14,8 @@ * The DOSBox Team * * Copyright 2024 Cacodemon345 - * Copyright 2002-2021 The DOSBox Team + * Copyright (C) 2022 The DOSBox Staging Team + * Copyright (C) 2002-2021 The DOSBox Team */ #include From cb275dd6a3fa34f0026d796d9789503d0344e577 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 29 Jul 2024 04:34:47 +0200 Subject: [PATCH 229/624] Fixes the behavior of F(N)INIT and F(N)SAVE on 8087, fixes the only MCPDIAG failure that was actually an 86Box bug, closes #4518. --- src/cpu/x87_ops_misc.h | 8 ++++++++ src/cpu/x87_ops_sf.h | 10 ++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/cpu/x87_ops_misc.h b/src/cpu/x87_ops_misc.h index d40d70140..96750468a 100644 --- a/src/cpu/x87_ops_misc.h +++ b/src/cpu/x87_ops_misc.h @@ -78,7 +78,11 @@ opFINIT(uint32_t fetchdat) cpu_state.npxc = 0x37F; #endif codegen_set_rounding_mode(X87_ROUNDING_NEAREST); +#ifdef FPU_8087 + cpu_state.npxs &= 0x4700; +#else cpu_state.npxs = 0; +#endif p = (uint64_t *) cpu_state.tag; #ifdef USE_NEW_DYNAREC *p = 0; @@ -406,7 +410,11 @@ FSAVE(void) cpu_state.npxc = 0x37F; codegen_set_rounding_mode(X87_ROUNDING_NEAREST); +#ifdef FPU_8087 + cpu_state.npxs &= 0x4700; +#else cpu_state.npxs = 0; +#endif p = (uint64_t *) cpu_state.tag; #ifdef USE_NEW_DYNAREC *p = 0; diff --git a/src/cpu/x87_ops_sf.h b/src/cpu/x87_ops_sf.h index af94897c9..31416447e 100644 --- a/src/cpu/x87_ops_sf.h +++ b/src/cpu/x87_ops_sf.h @@ -431,11 +431,12 @@ sf_FNSAVE_a16(uint32_t fetchdat) } #ifdef FPU_8087 - fpu_state.swd = 0x3FF; + fpu_state.cwd = 0x3FF; + fpu_state.swd &= 0x4700; #else fpu_state.cwd = 0x37F; -#endif fpu_state.swd = 0; +#endif fpu_state.tos = 0; fpu_state.tag = 0xffff; cpu_state.ismmx = 0; @@ -467,7 +468,7 @@ sf_FNSAVE_a32(uint32_t fetchdat) } # ifdef FPU_8087 - fpu_state.swd = 0x3FF; + fpu_state.cwd = 0x3FF; # else fpu_state.cwd = 0x37F; # endif @@ -504,10 +505,11 @@ sf_FNINIT(uint32_t fetchdat) cpu_state.pc++; #ifdef FPU_8087 fpu_state.cwd = 0x3FF; + fpu_state.swd &= 0x4700; #else fpu_state.cwd = 0x37F; -#endif fpu_state.swd = 0; +#endif fpu_state.tos = 0; fpu_state.tag = 0xffff; fpu_state.foo = 0; From 9135083877dbb22a37016e6381b97b9992f3994f Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 29 Jul 2024 06:37:40 +0200 Subject: [PATCH 230/624] SN76489: Correctly ignore bit 6 of the second data byte on the non-PSSJ types, fixes #4664. --- src/sound/snd_sn76489.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/sound/snd_sn76489.c b/src/sound/snd_sn76489.c index 519219934..d7bfa87b9 100644 --- a/src/sound/snd_sn76489.c +++ b/src/sound/snd_sn76489.c @@ -88,7 +88,7 @@ sn76489_write(UNUSED(uint16_t addr), uint8_t data, void *priv) case 0: sn76489->freqlo[3] = data & 0xf; sn76489->latch[3] = (sn76489->freqlo[3] | (sn76489->freqhi[3] << 4)) << 6; - if (sn76489->extra_divide) + if (!sn76489->extra_divide) sn76489->latch[3] &= 0x3ff; if (!sn76489->latch[3]) sn76489->latch[3] = (sn76489->extra_divide ? 2048 : 1024) << 6; @@ -101,7 +101,7 @@ sn76489_write(UNUSED(uint16_t addr), uint8_t data, void *priv) case 0x20: sn76489->freqlo[2] = data & 0xf; sn76489->latch[2] = (sn76489->freqlo[2] | (sn76489->freqhi[2] << 4)) << 6; - if (sn76489->extra_divide) + if (!sn76489->extra_divide) sn76489->latch[2] &= 0x3ff; if (!sn76489->latch[2]) sn76489->latch[2] = (sn76489->extra_divide ? 2048 : 1024) << 6; @@ -114,7 +114,7 @@ sn76489_write(UNUSED(uint16_t addr), uint8_t data, void *priv) case 0x40: sn76489->freqlo[1] = data & 0xf; sn76489->latch[1] = (sn76489->freqlo[1] | (sn76489->freqhi[1] << 4)) << 6; - if (sn76489->extra_divide) + if (!sn76489->extra_divide) sn76489->latch[1] &= 0x3ff; if (!sn76489->latch[1]) sn76489->latch[1] = (sn76489->extra_divide ? 2048 : 1024) << 6; @@ -132,7 +132,7 @@ sn76489_write(UNUSED(uint16_t addr), uint8_t data, void *priv) sn76489->latch[0] = sn76489->latch[1]; else sn76489->latch[0] = 0x400 << (data & 3); - if (sn76489->extra_divide) + if (!sn76489->extra_divide) sn76489->latch[0] &= 0x3ff; if (!sn76489->latch[0]) sn76489->latch[0] = (sn76489->extra_divide ? 2048 : 1024) << 6; @@ -157,9 +157,12 @@ sn76489_write(UNUSED(uint16_t addr), uint8_t data, void *priv) if (!sn76489->latch[0]) sn76489->latch[0] = 1024 << 6; } else if ((sn76489->firstdat & 0x70) != 0x60) { - sn76489->freqhi[sn76489->lasttone] = data & 0x7F; - freq = sn76489->freqlo[sn76489->lasttone] | (sn76489->freqhi[sn76489->lasttone] << 4); if (sn76489->extra_divide) + sn76489->freqhi[sn76489->lasttone] = data & 0x7F; + else + sn76489->freqhi[sn76489->lasttone] = data & 0x3F; + freq = sn76489->freqlo[sn76489->lasttone] | (sn76489->freqhi[sn76489->lasttone] << 4); + if (!sn76489->extra_divide) freq &= 0x3ff; if (!freq) freq = sn76489->extra_divide ? 2048 : 1024; @@ -174,6 +177,12 @@ void sn74689_set_extra_divide(sn76489_t *sn76489, int enable) { sn76489->extra_divide = enable; + + if (!enable) { + for (uint8_t c = 1; c < 4; c++) + sn76489->latch[c] &= ~(0x400 << 6); + sn76489->latch[0] &= ~(0x400 << 6); + } } void From 2c0acb290e5591770ed5a8be8b3a487976370511 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 29 Jul 2024 18:46:24 +0500 Subject: [PATCH 231/624] Fix "None" option not being translated in several places Also fix "POV # (X/Y) axis" too --- src/qt/qt_deviceconfig.cpp | 4 ++-- src/qt/qt_joystickconfiguration.cpp | 14 +++++++------- src/qt/qt_settingsmachine.cpp | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index d24db2ed4..21f9a7e80 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -298,7 +298,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) int currentIndex = 0; auto serialDevices = EnumerateSerialDevices(); - Models::AddEntry(model, "None", -1); + Models::AddEntry(model, tr("None"), -1); for (int i = 0; i < serialDevices.size(); i++) { const int row = Models::AddEntry(model, serialDevices[i], i); if (selected == serialDevices[i]) @@ -401,7 +401,7 @@ DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *se { auto *cbox = dc.findChild(config->name); auto path = cbox->currentText().toUtf8(); - if (path == "None") + if (cbox->currentData().toInt() == -1) path = ""; config_set_string(device_context.name, const_cast(config->name), path); break; diff --git a/src/qt/qt_joystickconfiguration.cpp b/src/qt/qt_joystickconfiguration.cpp index e03d57e09..8489dfd22 100644 --- a/src/qt/qt_joystickconfiguration.cpp +++ b/src/qt/qt_joystickconfiguration.cpp @@ -36,7 +36,7 @@ JoystickConfiguration::JoystickConfiguration(int type, int joystick_nr, QWidget ui->setupUi(this); auto model = ui->comboBoxDevice->model(); - Models::AddEntry(model, "None", 0); + Models::AddEntry(model, tr("None"), 0); for (int c = 0; c < joysticks_present; c++) { Models::AddEntry(model, plat_joystick_state[c].name, c + 1); } @@ -114,8 +114,8 @@ JoystickConfiguration::on_comboBoxDevice_currentIndexChanged(int index) } for (int d = 0; d < plat_joystick_state[joystick].nr_povs; d++) { - Models::AddEntry(model, QString("%1 (X axis)").arg(plat_joystick_state[joystick].pov[d].name), 0); - Models::AddEntry(model, QString("%1 (Y axis)").arg(plat_joystick_state[joystick].pov[d].name), 0); + Models::AddEntry(model, tr("%1 (X axis)").arg(plat_joystick_state[joystick].pov[d].name), 0); + Models::AddEntry(model, tr("%1 (Y axis)").arg(plat_joystick_state[joystick].pov[d].name), 0); } int nr_axes = plat_joystick_state[joystick].nr_axes; @@ -161,9 +161,9 @@ JoystickConfiguration::on_comboBoxDevice_currentIndexChanged(int index) for (int c = 0; c < joystick_get_pov_count(type) * 2; c++) { QLabel *label; if (c & 1) { - label = new QLabel(QString("%1 (Y axis)").arg(joystick_get_pov_name(type, c / 2)), this); + label = new QLabel(tr("%1 (Y axis)").arg(joystick_get_pov_name(type, c / 2)), this); } else { - label = new QLabel(QString("%1 (X axis)").arg(joystick_get_pov_name(type, c / 2)), this); + label = new QLabel(tr("%1 (X axis)").arg(joystick_get_pov_name(type, c / 2)), this); } auto cbox = new QComboBox(this); cbox->setObjectName(QString("cboxPov%1").arg(QString::number(c))); @@ -171,8 +171,8 @@ JoystickConfiguration::on_comboBoxDevice_currentIndexChanged(int index) auto model = cbox->model(); for (int d = 0; d < plat_joystick_state[joystick].nr_povs; d++) { - Models::AddEntry(model, QString("%1 (X axis)").arg(plat_joystick_state[joystick].pov[d].name), 0); - Models::AddEntry(model, QString("%1 (Y axis)").arg(plat_joystick_state[joystick].pov[d].name), 0); + Models::AddEntry(model, tr("%1 (X axis)").arg(plat_joystick_state[joystick].pov[d].name), 0); + Models::AddEntry(model, tr("%1 (Y axis)").arg(plat_joystick_state[joystick].pov[d].name), 0); } for (int d = 0; d < plat_joystick_state[joystick].nr_axes; d++) { diff --git a/src/qt/qt_settingsmachine.cpp b/src/qt/qt_settingsmachine.cpp index 30b163687..771f1cbec 100644 --- a/src/qt/qt_settingsmachine.cpp +++ b/src/qt/qt_settingsmachine.cpp @@ -301,7 +301,7 @@ SettingsMachine::on_comboBoxSpeed_currentIndexChanged(int index) for (const char *fpuName = fpu_get_name_from_index(cpuFamily, cpuId, i); fpuName != nullptr; fpuName = fpu_get_name_from_index(cpuFamily, cpuId, ++i)) { auto fpuType = fpu_get_type_from_index(cpuFamily, cpuId, i); - Models::AddEntry(modelFpu, QString("%1").arg(fpuName), fpuType); + Models::AddEntry(modelFpu, tr(QString("%1").arg(fpuName).toUtf8().data()), fpuType); if (fpu_type == fpuType) selectedFpuRow = i; } From 115583c4a08aae01d639895681f519f1c0b82c12 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 29 Jul 2024 19:44:41 +0500 Subject: [PATCH 232/624] Add translations for "MiB" in the HDD table header --- src/qt/languages/fr-FR.po | 3 +++ src/qt/languages/ru-RU.po | 3 +++ src/qt/languages/uk-UA.po | 3 +++ 3 files changed, 9 insertions(+) diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index f7687132f..db16abe07 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -741,6 +741,9 @@ msgstr "T" msgid "S" msgstr "S" +msgid "MiB" +msgstr "Mio" + msgid "KB" msgstr "Ko" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index a4103c3e8..eb3c89174 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -831,6 +831,9 @@ msgstr "H" msgid "S" msgstr "S" +msgid "MiB" +msgstr "МиБ" + msgid "KB" msgstr "КБ" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 8dca70a85..9c76d803e 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -741,6 +741,9 @@ msgstr "H" msgid "S" msgstr "S" +msgid "MiB" +msgstr "МіБ" + msgid "KB" msgstr "КБ" From 2b6ca97ab496700b76572876b7098df38a22089c Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 29 Jul 2024 20:07:00 +0500 Subject: [PATCH 233/624] qt_progsettings.cpp: use a switch case to determine the Windows font --- src/qt/qt_progsettings.cpp | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 2d047a787..4e53b2818 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -159,16 +159,18 @@ ProgSettings::on_pushButton_released() QString ProgSettings::getFontName(uint32_t lcid) { - if (lcid == 0x0804) /* zh-CN */ - return "Microsoft YaHei"; - else if (lcid == 0x0404) /* zh-TW */ + switch (lcid) { + case 0x0404: /* zh-TW */ return "Microsoft JhengHei"; - else if (lcid == 0x0411) /* ja-JP */ + case 0x0411: /* ja-JP */ return "Meiryo UI"; - else if (lcid == 0x0412) /* ko-KR */ + case 0x0412: /* ko-KR */ return "Malgun Gothic"; - else + case 0x0804: /* zh-CN */ + return "Microsoft YaHei"; + default: return "Segoe UI"; + } } #endif From 51cd31b8855f029acebd5eb9d2a2907f93c3ffc0 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Mon, 29 Jul 2024 18:54:06 +0200 Subject: [PATCH 234/624] Use wrapper function for Microtouch replies --- src/device/mouse_microtouch_touchscreen.c | 67 ++++++++++------------- 1 file changed, 28 insertions(+), 39 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 87ddf6728..74ace2653 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -61,14 +61,21 @@ typedef struct mouse_microtouch_t { static mouse_microtouch_t *mtouch_inst = NULL; +void +mt_fifo8_puts(Fifo8 *fifo, const uint8_t *data) +{ + fifo8_push(fifo, 1); + fifo8_push_all(fifo, data, strlen(data)); + fifo8_push(fifo, '\r'); +} + void microtouch_reset_complete(void *priv) { mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; mtouch->in_reset = false; - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); } void @@ -78,8 +85,7 @@ microtouch_calibrate_timer(void *priv) if (!fifo8_num_used(&mtouch->resp)) { mtouch->cal_cntr--; - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); + mt_fifo8_puts(&mtouch->resp, "1"); } } @@ -94,42 +100,34 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mtouch->cmd[i] = toupper(mtouch->cmd[i]); } if (mtouch->cmd[0] == 'Z') { /* Null */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ mtouch->pen_mode = 1; - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "TP****00\r", sizeof("TP****00\r") - 1); + mt_fifo8_puts(&mtouch->resp, "TP****00"); } if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "A30600\r", sizeof("A30600\r") - 1); + mt_fifo8_puts(&mtouch->resp, "A30600"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ mtouch->mode = MODE_TABLET; - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ /* Do not reset Mode Status for now as Photo Play 2000 relies on it */ mtouch->mode = MODE_HEX; - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *)"0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ mtouch->mode = MODE_RAW; mtouch->cal_cntr = 0; - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; @@ -139,42 +137,33 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) timer_on_auto(&mtouch->reset_timer, 500. * 1000.); } if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { /* Autobaud Enable/Disable */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'N' && mtouch->cmd[1] == 'M') { /* ?? */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); + mt_fifo8_puts(&mtouch->resp, "1"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'Q') { /* ?? */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); + mt_fifo8_puts(&mtouch->resp, "1"); } if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'F') { /* ?? */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "1\r", 2); + mt_fifo8_puts(&mtouch->resp, "1"); } if (mtouch->cmd[0] == 'P') { if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0");; } if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "0"); mtouch->cal_cntr = 2; } if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "A\r", 2); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", sizeof("0000000000000000000000000\r") - 1); - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0\r", 2); + mt_fifo8_puts(&mtouch->resp, "A"); + mt_fifo8_puts(&mtouch->resp, "0000000000000000000000000"); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ - fifo8_push(&mtouch->resp, 1); - fifo8_push_all(&mtouch->resp, (uint8_t *) "A\r", 2); + mt_fifo8_puts(&mtouch->resp, "A"); } if (fifo8_num_used(&mtouch->resp) != fifo_used || mtouch->in_reset) { pclog("Command handled: %s\n", mtouch->cmd); From 36386ac7f4e5a8101bae87a75270312cf3ce8db5 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 29 Jul 2024 19:10:43 +0200 Subject: [PATCH 235/624] Pro Audio Spectrum 16: Do not enable the timeout watchdog timer if (val & 0x3f) is zero, fixes some hangs. --- src/sound/snd_pas16.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c index d88a498d5..80a2c9a7b 100644 --- a/src/sound/snd_pas16.c +++ b/src/sound/snd_pas16.c @@ -1504,7 +1504,8 @@ pas16_out(uint16_t port, uint8_t val, void *priv) pas16->timeout_count = val; if (timer_is_enabled(&pas16->scsi_timer)) timer_disable(&pas16->scsi_timer); - timer_set_delay_u64(&pas16->scsi_timer, (val & 0x3f) * PASSCSICONST); + if ((val & 0x3f) > 0x00) + timer_set_delay_u64(&pas16->scsi_timer, (val & 0x3f) * PASSCSICONST); } break; From 2616c66854bfe9054083f32d43466416ee0da7c3 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Mon, 29 Jul 2024 20:28:20 +0200 Subject: [PATCH 236/624] Add controller identity menu option --- src/device/mouse_microtouch_touchscreen.c | 43 +++++++++++++++++------ 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 74ace2653..c727f11a2 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -44,13 +44,20 @@ enum mtouch_modes { MODE_HEX = 3 }; +const char* mtouch_identity[] = { + "A30100", /* SMT2 Serial / SMT3(R)V */ + "A40100", /* PC Bus SMT2 */ + "P50100", /* TouchPen 4 (+) */ + "Q10100", /* SMT3(R) Serial */ +}; + typedef struct mouse_microtouch_t { double baud_rate; int b; char cmd[512]; int cmd_pos; int mode; - uint8_t cal_cntr, pen_mode; + uint8_t id, cal_cntr, pen_mode; bool soh; bool in_reset; serial_t *serial; @@ -64,9 +71,9 @@ static mouse_microtouch_t *mtouch_inst = NULL; void mt_fifo8_puts(Fifo8 *fifo, const uint8_t *data) { - fifo8_push(fifo, 1); - fifo8_push_all(fifo, data, strlen(data)); - fifo8_push(fifo, '\r'); + fifo8_push(fifo, 1); + fifo8_push_all(fifo, data, strlen(data)); + fifo8_push(fifo, '\r'); } void @@ -100,17 +107,17 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mtouch->cmd[i] = toupper(mtouch->cmd[i]); } if (mtouch->cmd[0] == 'Z') { /* Null */ - mt_fifo8_puts(&mtouch->resp, "0"); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ mtouch->pen_mode = 1; - mt_fifo8_puts(&mtouch->resp, "0"); + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ - mt_fifo8_puts(&mtouch->resp, "TP****00"); + mt_fifo8_puts(&mtouch->resp, "TP****00"); } if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ - mt_fifo8_puts(&mtouch->resp, "A30600"); + mt_fifo8_puts(&mtouch->resp, mtouch_identity[mtouch->id]); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ mtouch->mode = MODE_TABLET; @@ -158,8 +165,8 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mtouch->cal_cntr = 2; } if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ - mt_fifo8_puts(&mtouch->resp, "A"); - mt_fifo8_puts(&mtouch->resp, "0000000000000000000000000"); + mt_fifo8_puts(&mtouch->resp, "A"); + mt_fifo8_puts(&mtouch->resp, "0000000000000000000000000"); mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ @@ -331,6 +338,7 @@ mtouch_init(const device_t *info) timer_add(&dev->host_to_serial_timer, mtouch_write_to_host, dev, 0); timer_add(&dev->reset_timer, microtouch_reset_complete, dev, 0); timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); + dev->id = device_get_config_int("identity"); dev->mode = MODE_TABLET; dev->pen_mode = 3; mouse_input_mode = device_get_config_int("crosshair") + 1; @@ -390,6 +398,21 @@ static const device_config_t mtouch_config[] = { { .description = "1200", .value = 1200 } } }, + { + .name = "identity", + .description = "Controller", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { + { .description = "A3 - SMT2 Serial / SMT3(R)V", .value = 0 }, + { .description = "A4 - SMT2 PCBus", .value = 1 }, + { .description = "P5 - TouchPen 4(+)", .value = 2 }, + { .description = "Q1 - SMT3(R) Serial", .value = 3 } + } + }, { .name = "crosshair", .description = "Show Crosshair", From 37538fd932fe1a34b0d4c4635e09c239c2b49701 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Mon, 29 Jul 2024 20:36:21 +0200 Subject: [PATCH 237/624] Correct MT format variables, to not confuse them with MT modes --- src/device/mouse_microtouch_touchscreen.c | 27 +++++++++++------------ 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index c727f11a2..7a7683b3e 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -38,10 +38,10 @@ #include <86box/fifo.h> #include <86box/video.h> /* Needed to account for overscan. */ -enum mtouch_modes { - MODE_RAW = 1, - MODE_TABLET = 2, - MODE_HEX = 3 +enum mtouch_formats { + FORMAT_RAW = 1, + FORMAT_TABLET = 2, + FORMAT_HEX = 3 }; const char* mtouch_identity[] = { @@ -56,7 +56,7 @@ typedef struct mouse_microtouch_t { int b; char cmd[512]; int cmd_pos; - int mode; + int format; uint8_t id, cal_cntr, pen_mode; bool soh; bool in_reset; @@ -120,16 +120,15 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mt_fifo8_puts(&mtouch->resp, mtouch_identity[mtouch->id]); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ - mtouch->mode = MODE_TABLET; + mtouch->format = FORMAT_TABLET; mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ - /* Do not reset Mode Status for now as Photo Play 2000 relies on it */ - mtouch->mode = MODE_HEX; + mtouch->format = FORMAT_HEX; mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ - mtouch->mode = MODE_RAW; + mtouch->format = FORMAT_RAW; mtouch->cal_cntr = 0; mt_fifo8_puts(&mtouch->resp, "0"); } @@ -138,7 +137,7 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) } if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; - mtouch->mode = MODE_TABLET; + mtouch->format = FORMAT_TABLET; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; timer_on_auto(&mtouch->reset_timer, 500. * 1000.); @@ -225,7 +224,7 @@ mtouch_poll(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - if (fifo8_num_free(&dev->resp) <= 10 || dev->mode == MODE_RAW) { + if (fifo8_num_free(&dev->resp) <= 10 || dev->format == FORMAT_RAW) { return 0; } @@ -276,7 +275,7 @@ mtouch_poll(void *priv) return 0; } - if (dev->mode == MODE_TABLET) { + if (dev->format == FORMAT_TABLET) { abs_x_int = abs_x * 16383; abs_y_int = 16383 - abs_y * 16383; @@ -300,7 +299,7 @@ mtouch_poll(void *priv) } } - if (dev->mode == MODE_HEX) { + if (dev->format == FORMAT_HEX) { abs_x_int = abs_x * 1023; abs_y_int = 1023 - (abs_y * 1023); char buffer[10]; @@ -339,7 +338,7 @@ mtouch_init(const device_t *info) timer_add(&dev->reset_timer, microtouch_reset_complete, dev, 0); timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); dev->id = device_get_config_int("identity"); - dev->mode = MODE_TABLET; + dev->format = FORMAT_TABLET; dev->pen_mode = 3; mouse_input_mode = device_get_config_int("crosshair") + 1; mouse_set_buttons(2); From 1eb24bf69b75c4c18cd97c98879eec30574b7528 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Mon, 29 Jul 2024 21:01:54 +0200 Subject: [PATCH 238/624] Add Format Decimal and make it default for legacy controller modes --- src/device/mouse_microtouch_touchscreen.c | 88 +++++++++++++++-------- 1 file changed, 60 insertions(+), 28 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 7a7683b3e..e4f3c7e7b 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -39,9 +39,10 @@ #include <86box/video.h> /* Needed to account for overscan. */ enum mtouch_formats { - FORMAT_RAW = 1, - FORMAT_TABLET = 2, - FORMAT_HEX = 3 + FORMAT_DEC = 1, + FORMAT_HEX = 2, + FORMAT_RAW = 3, + FORMAT_TABLET = 4 }; const char* mtouch_identity[] = { @@ -119,8 +120,8 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ mt_fifo8_puts(&mtouch->resp, mtouch_identity[mtouch->id]); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ - mtouch->format = FORMAT_TABLET; + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ + mtouch->format = FORMAT_DEC; mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ @@ -128,18 +129,27 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ - mtouch->format = FORMAT_RAW; + mtouch->format = FORMAT_RAW; mtouch->cal_cntr = 0; mt_fifo8_puts(&mtouch->resp, "0"); } + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ + mtouch->format = FORMAT_TABLET; + mt_fifo8_puts(&mtouch->resp, "0"); + } if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; - mtouch->format = FORMAT_TABLET; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; + + if (mtouch->id < 2) + mtouch->format = FORMAT_DEC; + else + mtouch->format = FORMAT_TABLET; + timer_on_auto(&mtouch->reset_timer, 500. * 1000.); } if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { /* Autobaud Enable/Disable */ @@ -274,8 +284,42 @@ mtouch_poll(void *priv) dev->b = b; /* Save lack of buttonpress */ return 0; } - - if (dev->format == FORMAT_TABLET) { + + if (dev->format == FORMAT_DEC) { + abs_x_int = abs_x * 999; + abs_y_int = 999 - (abs_y * 999); + char buffer[10]; + + if (b) { + if (!dev->b) { /* Touchdown */ + snprintf(buffer, sizeof(buffer), "\x19%03d,%03d\r", abs_x_int, abs_y_int); + } else { /* Touch Continuation */ + snprintf(buffer, sizeof(buffer), "\x1c%03d,%03d\r", abs_x_int, abs_y_int); + } + } else if (dev->b) { /* Liftoff */ + snprintf(buffer, sizeof(buffer), "\x18%03d,%03d\r", abs_x_int, abs_y_int); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } + + else if (dev->format == FORMAT_HEX) { + abs_x_int = abs_x * 1023; + abs_y_int = 1023 - (abs_y * 1023); + char buffer[10]; + + if (b) { + if (!dev->b) { /* Touchdown */ + snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); + } else { /* Touch Continuation */ + snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); + } + } else if (dev->b) { /* Liftoff */ + snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } + + else if (dev->format == FORMAT_TABLET) { abs_x_int = abs_x * 16383; abs_y_int = 16383 - abs_y * 16383; @@ -299,23 +343,6 @@ mtouch_poll(void *priv) } } - if (dev->format == FORMAT_HEX) { - abs_x_int = abs_x * 1023; - abs_y_int = 1023 - (abs_y * 1023); - char buffer[10]; - - if (b) { - if (!dev->b) { /* Touchdown */ - snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); - } else { /* Touch Continuation */ - snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); - } - } else if (dev->b) { /* Liftoff */ - snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); - } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } - dev->b = b; /* Save buttonpress */ return 0; } @@ -338,8 +365,13 @@ mtouch_init(const device_t *info) timer_add(&dev->reset_timer, microtouch_reset_complete, dev, 0); timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); dev->id = device_get_config_int("identity"); - dev->format = FORMAT_TABLET; - dev->pen_mode = 3; + dev->pen_mode = 3; + + if (dev->id < 2) /* legacy controllers */ + dev->format = FORMAT_DEC; + else + dev->format = FORMAT_TABLET; + mouse_input_mode = device_get_config_int("crosshair") + 1; mouse_set_buttons(2); mouse_set_poll_ex(mtouch_poll_global); From 066bd35f1aa4fc77285631b5f19841433445fdca Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Mon, 29 Jul 2024 21:31:36 +0200 Subject: [PATCH 239/624] Optimize Format Tablet Remove touchdown packet from Format tablet liftoff. Does not cause issues for windows 95 or DOS. --- src/device/mouse_microtouch_touchscreen.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index e4f3c7e7b..598764415 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -330,11 +330,6 @@ mtouch_poll(void *priv) fifo8_push(&dev->resp, abs_y_int & 0b1111111); fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); } else if (dev->b) { /* Liftoff */ - fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5)) : 0)); - fifo8_push(&dev->resp, abs_x_int & 0b1111111); - fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); - fifo8_push(&dev->resp, abs_y_int & 0b1111111); - fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); fifo8_push(&dev->resp, 0b10000000 | ((dev->pen_mode == 2) ? ((1 << 5)) : 0)); fifo8_push(&dev->resp, abs_x_int & 0b1111111); fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); From 796e7bbe1925485da538a92473664fcc38866989 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Mon, 29 Jul 2024 21:51:44 +0200 Subject: [PATCH 240/624] Update TODO --- src/device/mouse_microtouch_touchscreen.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 598764415..23f582237 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -20,7 +20,8 @@ /* TODO: - Properly implement GP/SP commands (formats are not documented at all, like anywhere; no dumps yet). - Dynamic baud rate selection from software following this. - - Add additional SMT2/3 commands plus config option for controller type. + - Add additional SMT2/3 formats as we currently only support Tablet, Hex and Dec. + - Add additional SMT2/3 modes as we currently hardcode Mode Stream + Mode Status. */ #include #include From fcec4a40f91aefeca2a4a1b9c550532120910589 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Tue, 30 Jul 2024 20:09:13 +0200 Subject: [PATCH 241/624] Cleanup/bugfix --- src/device/mouse_microtouch_touchscreen.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 23f582237..b05e82054 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -48,8 +48,8 @@ enum mtouch_formats { const char* mtouch_identity[] = { "A30100", /* SMT2 Serial / SMT3(R)V */ - "A40100", /* PC Bus SMT2 */ - "P50100", /* TouchPen 4 (+) */ + "A40100", /* SMT2 PCBus */ + "P50100", /* TouchPen 4(+) */ "Q10100", /* SMT3(R) Serial */ }; @@ -176,7 +176,7 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) } if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ mt_fifo8_puts(&mtouch->resp, "A"); - mt_fifo8_puts(&mtouch->resp, "0000000000000000000000000"); + fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", sizeof("0000000000000000000000000\r") - 1); mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ @@ -282,7 +282,7 @@ mtouch_poll(void *priv) if (!b && dev->b) { microtouch_calibrate_timer(dev); } - dev->b = b; /* Save lack of buttonpress */ + dev->b = b; /* Save buttonpress */ return 0; } From 0e1f457f65eac6174076cfe0515a1576ab39824c Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 31 Jul 2024 23:04:00 +0200 Subject: [PATCH 242/624] Rename the Tandy 1000 to Tandy 1000 SX, closes #4676. --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index f75947605..2608f1ead 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1499,7 +1499,7 @@ const machine_t machines[] = { .net_device = NULL }, { - .name = "[8088] Tandy 1000", + .name = "[8088] Tandy 1000 SX", .internal_name = "tandy", .type = MACHINE_TYPE_8088, .chipset = MACHINE_CHIPSET_PROPRIETARY, From 94bffa104a3e9d82ca0acd1060c3a851622d1846 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Thu, 1 Aug 2024 20:47:15 +0200 Subject: [PATCH 243/624] Set CTS/DSR/DCD high like a real Microtouch --- src/device/mouse_microtouch_touchscreen.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index b05e82054..20ec5351c 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -356,6 +356,10 @@ mtouch_init(const device_t *info) dev->serial = serial_attach(device_get_config_int("port"), NULL, mtouch_write, dev); dev->baud_rate = device_get_config_int("baudrate"); + serial_set_cts(dev->serial, 1); + serial_set_dsr(dev->serial, 1); + serial_set_dcd(dev->serial, 1); + fifo8_create(&dev->resp, 512); timer_add(&dev->host_to_serial_timer, mtouch_write_to_host, dev, 0); timer_add(&dev->reset_timer, microtouch_reset_complete, dev, 0); From 3b2072ac8cdc0436cecf0285cb6ddf6925525dae Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Thu, 1 Aug 2024 22:40:20 +0200 Subject: [PATCH 244/624] Change mouse poll rate per mode to reflect serial write speed, optimize serial fifo lengths --- src/device/mouse_microtouch_touchscreen.c | 32 +++++++++++++++++------ 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 20ec5351c..c91ed8065 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -19,6 +19,7 @@ /* TODO: - Properly implement GP/SP commands (formats are not documented at all, like anywhere; no dumps yet). + - Decouple serial packet generation from mouse poll rate. - Dynamic baud rate selection from software following this. - Add additional SMT2/3 formats as we currently only support Tablet, Hex and Dec. - Add additional SMT2/3 modes as we currently hardcode Mode Stream + Mode Status. @@ -56,7 +57,7 @@ const char* mtouch_identity[] = { typedef struct mouse_microtouch_t { double baud_rate; int b; - char cmd[512]; + char cmd[256]; int cmd_pos; int format; uint8_t id, cal_cntr, pen_mode; @@ -122,34 +123,45 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mt_fifo8_puts(&mtouch->resp, mtouch_identity[mtouch->id]); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ + mouse_set_sample_rate(106); mtouch->format = FORMAT_DEC; mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ + mouse_set_sample_rate(106); mtouch->format = FORMAT_HEX; mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ + mouse_set_sample_rate(106); mtouch->format = FORMAT_RAW; mtouch->cal_cntr = 0; mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ + mouse_set_sample_rate(192); mtouch->format = FORMAT_TABLET; mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ mt_fifo8_puts(&mtouch->resp, "0"); } + if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'T') { /* Mode Status */ + mt_fifo8_puts(&mtouch->resp, "0"); + } if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; - if (mtouch->id < 2) + if (mtouch->id < 2) { + mouse_set_sample_rate(106); mtouch->format = FORMAT_DEC; - else + } + else { + mouse_set_sample_rate(192); mtouch->format = FORMAT_TABLET; + } timer_on_auto(&mtouch->reset_timer, 500. * 1000.); } @@ -235,7 +247,7 @@ mtouch_poll(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - if (fifo8_num_free(&dev->resp) <= 10 || dev->format == FORMAT_RAW) { + if (fifo8_num_free(&dev->resp) <= 256 - 10 || dev->format == FORMAT_RAW) { return 0; } @@ -360,18 +372,22 @@ mtouch_init(const device_t *info) serial_set_dsr(dev->serial, 1); serial_set_dcd(dev->serial, 1); - fifo8_create(&dev->resp, 512); + fifo8_create(&dev->resp, 256); timer_add(&dev->host_to_serial_timer, mtouch_write_to_host, dev, 0); timer_add(&dev->reset_timer, microtouch_reset_complete, dev, 0); timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); dev->id = device_get_config_int("identity"); dev->pen_mode = 3; - if (dev->id < 2) /* legacy controllers */ + if (dev->id < 2) { /* legacy controllers */ dev->format = FORMAT_DEC; - else + mouse_set_sample_rate(106); + } + else { dev->format = FORMAT_TABLET; - + mouse_set_sample_rate(192); + } + mouse_input_mode = device_get_config_int("crosshair") + 1; mouse_set_buttons(2); mouse_set_poll_ex(mtouch_poll_global); From 40dcbaa10efc58e6e346a1574a5db1cf98fbbda4 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Fri, 2 Aug 2024 00:16:49 +0200 Subject: [PATCH 245/624] Implement Mode Status --- src/device/mouse_microtouch_touchscreen.c | 71 ++++++++++++++--------- 1 file changed, 45 insertions(+), 26 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index c91ed8065..8faafbc49 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -22,7 +22,7 @@ - Decouple serial packet generation from mouse poll rate. - Dynamic baud rate selection from software following this. - Add additional SMT2/3 formats as we currently only support Tablet, Hex and Dec. - - Add additional SMT2/3 modes as we currently hardcode Mode Stream + Mode Status. + - Add additional SMT2/3 modes as we currently hardcode Mode Stream. */ #include #include @@ -59,7 +59,8 @@ typedef struct mouse_microtouch_t { int b; char cmd[256]; int cmd_pos; - int format; + uint8_t format; + bool mode_status; uint8_t id, cal_cntr, pen_mode; bool soh; bool in_reset; @@ -83,7 +84,7 @@ void microtouch_reset_complete(void *priv) { mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; - + mtouch->in_reset = false; mt_fifo8_puts(&mtouch->resp, "0"); } @@ -92,7 +93,7 @@ void microtouch_calibrate_timer(void *priv) { mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; - + if (!fifo8_num_used(&mtouch->resp)) { mtouch->cal_cntr--; mt_fifo8_puts(&mtouch->resp, "1"); @@ -147,12 +148,14 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'T') { /* Mode Status */ + mtouch->mode_status = true; mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; + mtouch->mode_status = false; if (mtouch->id < 2) { mouse_set_sample_rate(106); @@ -255,7 +258,7 @@ mtouch_poll(void *priv) double abs_x; double abs_y; int b = mouse_get_buttons_ex(); - + mouse_get_abs_coords(&abs_x, &abs_y); if (abs_x >= 1.0) @@ -268,12 +271,13 @@ mtouch_poll(void *priv) abs_y = 0.0; if (enable_overscan) { int index = mouse_tablet_in_proximity - 1; - if (mouse_tablet_in_proximity == -1) + if (mouse_tablet_in_proximity == -1) { mouse_tablet_in_proximity = 0; - + } + abs_x *= monitors[index].mon_unscaled_size_x - 1; abs_y *= monitors[index].mon_efscrnsz_y - 1; - + if (abs_x <= (monitors[index].mon_overscan_x / 2.)) { abs_x = (monitors[index].mon_overscan_x / 2.); } @@ -303,16 +307,23 @@ mtouch_poll(void *priv) abs_y_int = 999 - (abs_y * 999); char buffer[10]; - if (b) { - if (!dev->b) { /* Touchdown */ - snprintf(buffer, sizeof(buffer), "\x19%03d,%03d\r", abs_x_int, abs_y_int); - } else { /* Touch Continuation */ - snprintf(buffer, sizeof(buffer), "\x1c%03d,%03d\r", abs_x_int, abs_y_int); + if (!dev->mode_status) { + if (b) { // Touch + snprintf(buffer, sizeof(buffer), "\x1%03d,%03d\r", abs_x_int, abs_y_int); + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - } else if (dev->b) { /* Liftoff */ - snprintf(buffer, sizeof(buffer), "\x18%03d,%03d\r", abs_x_int, abs_y_int); + } else { + if (b) { + if (!dev->b) { /* Touchdown Status */ + snprintf(buffer, sizeof(buffer), "\x19%03d,%03d\r", abs_x_int, abs_y_int); + } else { /* Touch Continuation Status */ + snprintf(buffer, sizeof(buffer), "\x1c%03d,%03d\r", abs_x_int, abs_y_int); + } + } else if (dev->b) { /* Liftoff Status */ + snprintf(buffer, sizeof(buffer), "\x18%03d,%03d\r", abs_x_int, abs_y_int); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } else if (dev->format == FORMAT_HEX) { @@ -320,16 +331,23 @@ mtouch_poll(void *priv) abs_y_int = 1023 - (abs_y * 1023); char buffer[10]; - if (b) { - if (!dev->b) { /* Touchdown */ - snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); - } else { /* Touch Continuation */ - snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); + if (!dev->mode_status) { + if (b) { // Touch + snprintf(buffer, sizeof(buffer), "\x1%03X,%03X\r", abs_x_int, abs_y_int); + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - } else if (dev->b) { /* Liftoff */ - snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); + } else { + if (b) { + if (!dev->b) { /* Touchdown Status */ + snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); + } else { /* Touch Continuation Status */ + snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); + } + } else if (dev->b) { /* Liftoff Status */ + snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } else if (dev->format == FORMAT_TABLET) { @@ -365,7 +383,7 @@ void * mtouch_init(const device_t *info) { mouse_microtouch_t *dev = calloc(1, sizeof(mouse_microtouch_t)); - + dev->serial = serial_attach(device_get_config_int("port"), NULL, mtouch_write, dev); dev->baud_rate = device_get_config_int("baudrate"); serial_set_cts(dev->serial, 1); @@ -377,7 +395,8 @@ mtouch_init(const device_t *info) timer_add(&dev->reset_timer, microtouch_reset_complete, dev, 0); timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); dev->id = device_get_config_int("identity"); - dev->pen_mode = 3; + dev->pen_mode = 3; + dev->mode_status = false; if (dev->id < 2) { /* legacy controllers */ dev->format = FORMAT_DEC; From 49d71c19babb35997429b2637024140f8be4065c Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Fri, 2 Aug 2024 01:24:00 +0200 Subject: [PATCH 246/624] Commands cleanup - Return 0 for unknown commands instead of 1, to not lock up software. - Add a few extra unknown commands. - Sort commands alphabetically to keep this mess organized. - Don't capitalize commands as no software i know needs it. --- src/device/mouse_microtouch_touchscreen.c | 83 ++++++++++++----------- 1 file changed, 44 insertions(+), 39 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 8faafbc49..7e992dc22 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -103,36 +103,36 @@ microtouch_calibrate_timer(void *priv) void microtouch_process_commands(mouse_microtouch_t *mtouch) { - int i = 0; int fifo_used = fifo8_num_used(&mtouch->resp); mtouch->cmd[strcspn(mtouch->cmd, "\r")] = '\0'; mtouch->cmd_pos = 0; - for (i = 0; i < strlen(mtouch->cmd); i++) { - mtouch->cmd[i] = toupper(mtouch->cmd[i]); - } - if (mtouch->cmd[0] == 'Z') { /* Null */ + if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { /* Autobaud Enable/Disable */ mt_fifo8_puts(&mtouch->resp, "0"); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ - mtouch->pen_mode = 1; + if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ mt_fifo8_puts(&mtouch->resp, "0"); - } - if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ - mt_fifo8_puts(&mtouch->resp, "TP****00"); - } - if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ - mt_fifo8_puts(&mtouch->resp, mtouch_identity[mtouch->id]); + mtouch->cal_cntr = 2; } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ mouse_set_sample_rate(106); mtouch->format = FORMAT_DEC; mt_fifo8_puts(&mtouch->resp, "0"); + } + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'N') { /* Filter Number */ + mt_fifo8_puts(&mtouch->resp, "0"); + } + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ + mtouch->pen_mode = 1; + mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ mouse_set_sample_rate(106); mtouch->format = FORMAT_HEX; mt_fifo8_puts(&mtouch->resp, "0"); } + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'Q') { /* ?? */ + mt_fifo8_puts(&mtouch->resp, "0"); + } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ mouse_set_sample_rate(106); mtouch->format = FORMAT_RAW; @@ -144,6 +144,17 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mtouch->format = FORMAT_TABLET; mt_fifo8_puts(&mtouch->resp, "0"); } + if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'F') { /* ?? */ + mt_fifo8_puts(&mtouch->resp, "0"); + } + if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ + mt_fifo8_puts(&mtouch->resp, "A"); + fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", sizeof("0000000000000000000000000\r") - 1); + mt_fifo8_puts(&mtouch->resp, "0"); + } + if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'P') { /* ?? */ + mt_fifo8_puts(&mtouch->resp, "0"); + } if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ mt_fifo8_puts(&mtouch->resp, "0"); } @@ -151,6 +162,20 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mtouch->mode_status = true; mt_fifo8_puts(&mtouch->resp, "0"); } + if (mtouch->cmd[0] == 'N' && mtouch->cmd[1] == 'M') { /* ?? */ + mt_fifo8_puts(&mtouch->resp, "0"); + } + if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ + mt_fifo8_puts(&mtouch->resp, mtouch_identity[mtouch->id]); + } + if (mtouch->cmd[0] == 'P') { + if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ + else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ + mt_fifo8_puts(&mtouch->resp, "0"); /* Also 'PL' Parameter Lock */ + } + if (mtouch->cmd[0] == 'Q' && mtouch->cmd[1] == 'P') { /* ?? */ + mt_fifo8_puts(&mtouch->resp, "0"); + } if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; mtouch->cal_cntr = 0; @@ -168,34 +193,14 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) timer_on_auto(&mtouch->reset_timer, 500. * 1000.); } - if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { /* Autobaud Enable/Disable */ - mt_fifo8_puts(&mtouch->resp, "0"); - } - if (mtouch->cmd[0] == 'N' && mtouch->cmd[1] == 'M') { /* ?? */ - mt_fifo8_puts(&mtouch->resp, "1"); - } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'Q') { /* ?? */ - mt_fifo8_puts(&mtouch->resp, "1"); - } - if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'F') { /* ?? */ - mt_fifo8_puts(&mtouch->resp, "1"); - } - if (mtouch->cmd[0] == 'P') { - if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ - else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ - mt_fifo8_puts(&mtouch->resp, "0");; - } - if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ - mt_fifo8_puts(&mtouch->resp, "0"); - mtouch->cal_cntr = 2; - } - if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ - mt_fifo8_puts(&mtouch->resp, "A"); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", sizeof("0000000000000000000000000\r") - 1); - mt_fifo8_puts(&mtouch->resp, "0"); - } if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ mt_fifo8_puts(&mtouch->resp, "A"); + } + if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ + mt_fifo8_puts(&mtouch->resp, "TP****00"); + } + if (mtouch->cmd[0] == 'Z') { /* Null */ + mt_fifo8_puts(&mtouch->resp, "0"); } if (fifo8_num_used(&mtouch->resp) != fifo_used || mtouch->in_reset) { pclog("Command handled: %s\n", mtouch->cmd); From 282d4e0c70c3c6ee905d702c8ae654e8e901008c Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Fri, 2 Aug 2024 15:09:52 +0200 Subject: [PATCH 247/624] Formatting, use selected bauddrate for serial retry timing too --- src/device/mouse_microtouch_touchscreen.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 7e992dc22..2f5333121 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -109,7 +109,7 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { /* Autobaud Enable/Disable */ mt_fifo8_puts(&mtouch->resp, "0"); } - if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ + if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ mt_fifo8_puts(&mtouch->resp, "0"); mtouch->cal_cntr = 2; } @@ -118,7 +118,7 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mtouch->format = FORMAT_DEC; mt_fifo8_puts(&mtouch->resp, "0"); } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'N') { /* Filter Number */ + if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'N') { /* Filter Number */ mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ @@ -196,10 +196,10 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ mt_fifo8_puts(&mtouch->resp, "A"); } - if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ + if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ mt_fifo8_puts(&mtouch->resp, "TP****00"); } - if (mtouch->cmd[0] == 'Z') { /* Null */ + if (mtouch->cmd[0] == 'Z') { /* Null */ mt_fifo8_puts(&mtouch->resp, "0"); } if (fifo8_num_used(&mtouch->resp) != fifo_used || mtouch->in_reset) { @@ -230,7 +230,7 @@ mtouch_write_to_host(void *priv) } no_write_to_machine: - timer_on_auto(&dev->host_to_serial_timer, (1000000.0 / (double) 9600.0) * (double) (1 + 8 + 1)); + timer_on_auto(&dev->host_to_serial_timer, (1000000.0 / (double) dev->baud_rate) * (double) (1 + 8 + 1)); } void @@ -415,9 +415,9 @@ mtouch_init(const device_t *info) mouse_input_mode = device_get_config_int("crosshair") + 1; mouse_set_buttons(2); mouse_set_poll_ex(mtouch_poll_global); - + mtouch_inst = dev; - + return dev; } @@ -430,7 +430,7 @@ mtouch_close(void *priv) /* Detach serial port from the mouse. */ if (dev && dev->serial && dev->serial->sd) memset(dev->serial->sd, 0, sizeof(serial_device_t)); - + free(dev); mtouch_inst = NULL; } From 5782f812e0130d88e4a7f776f89db07706aee6d0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 3 Aug 2024 19:54:39 +0200 Subject: [PATCH 248/624] UYVY format implementation, fixes #4682. --- src/video/vid_voodoo_banshee_blitter.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/video/vid_voodoo_banshee_blitter.c b/src/video/vid_voodoo_banshee_blitter.c index b8809d3fd..4dc39f332 100644 --- a/src/video/vid_voodoo_banshee_blitter.c +++ b/src/video/vid_voodoo_banshee_blitter.c @@ -346,6 +346,7 @@ update_src_stride(voodoo_t *voodoo) break; case SRC_FORMAT_COL_32_BPP: case SRC_FORMAT_COL_YUYV: + case SRC_FORMAT_COL_UYVY: bpp = 32; break; @@ -731,6 +732,13 @@ do_screen_to_screen_line(voodoo_t *voodoo, uint8_t *src_p, int use_x_dir, int sr src_data_yuv = *(uint32_t *) &src_p[src_x_real]; break; } + case SRC_FORMAT_COL_UYVY: + { + src_data_yuv = *(uint32_t *) &src_p[src_x_real]; + src_data_yuv = ((src_data_yuv & 0xFF00) >> 8) | ((src_data_yuv & 0xFF) << 8) | + ((src_data_yuv & 0xFF000000) >> 8) | ((src_data_yuv & 0xFF0000) << 8); + break; + } default: fatal("banshee_do_screen_to_screen_blt: unknown srcFormat %08x\n", voodoo->banshee_blt.srcFormat); @@ -744,7 +752,8 @@ do_screen_to_screen_line(voodoo_t *voodoo, uint8_t *src_p, int use_x_dir, int sr src_data = (b >> 3) | ((g >> 2) << 5) | ((r >> 3) << 11); } - if ((voodoo->banshee_blt.srcFormat & SRC_FORMAT_COL_MASK) == SRC_FORMAT_COL_YUYV) { + if ((voodoo->banshee_blt.srcFormat & SRC_FORMAT_COL_MASK) == SRC_FORMAT_COL_YUYV + || (voodoo->banshee_blt.srcFormat & SRC_FORMAT_COL_MASK) == SRC_FORMAT_COL_UYVY) { if (((voodoo->banshee_blt.dstFormat & DST_FORMAT_COL_MASK) == DST_FORMAT_COL_24_BPP) || ((voodoo->banshee_blt.dstFormat & DST_FORMAT_COL_MASK) == DST_FORMAT_COL_32_BPP)) { uint32_t rgbcol[2] = { 0, 0 }; @@ -1488,6 +1497,7 @@ voodoo_2d_reg_writel(voodoo_t *voodoo, uint32_t addr, uint32_t val) break; case SRC_FORMAT_COL_32_BPP: case SRC_FORMAT_COL_YUYV: + case SRC_FORMAT_COL_UYVY: voodoo->banshee_blt.src_bpp = 32; break; case SRC_FORMAT_COL_16_BPP: From 09dad6f6b718df053d796348aacb244e03e688c3 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 4 Aug 2024 00:19:40 +0200 Subject: [PATCH 249/624] Command handling updates - Always return 0 (success) for commands to greatly increase compatibility with unknown command. - Remove empty commands because of this. - Remove command wrapper function. - Fix compiler warnings. - Fix unit type string for SMT2/3. - Guard for empty commands. --- src/device/mouse_microtouch_touchscreen.c | 93 ++++++++--------------- 1 file changed, 32 insertions(+), 61 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 2f5333121..5b207dfc6 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -72,21 +72,13 @@ typedef struct mouse_microtouch_t { static mouse_microtouch_t *mtouch_inst = NULL; -void -mt_fifo8_puts(Fifo8 *fifo, const uint8_t *data) -{ - fifo8_push(fifo, 1); - fifo8_push_all(fifo, data, strlen(data)); - fifo8_push(fifo, '\r'); -} - void microtouch_reset_complete(void *priv) { mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; mtouch->in_reset = false; - mt_fifo8_puts(&mtouch->resp, "0"); + fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } void @@ -96,85 +88,55 @@ microtouch_calibrate_timer(void *priv) if (!fifo8_num_used(&mtouch->resp)) { mtouch->cal_cntr--; - mt_fifo8_puts(&mtouch->resp, "1"); + fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x31\x0D", 3); /* 1 */ } } void microtouch_process_commands(mouse_microtouch_t *mtouch) { - int fifo_used = fifo8_num_used(&mtouch->resp); mtouch->cmd[strcspn(mtouch->cmd, "\r")] = '\0'; - mtouch->cmd_pos = 0; - if (mtouch->cmd[0] == 'A' && (mtouch->cmd[1] == 'D' || mtouch->cmd[1] == 'E')) { /* Autobaud Enable/Disable */ - mt_fifo8_puts(&mtouch->resp, "0"); - } + pclog("MT Command: %s\n", mtouch->cmd); + if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ - mt_fifo8_puts(&mtouch->resp, "0"); mtouch->cal_cntr = 2; } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ mouse_set_sample_rate(106); mtouch->format = FORMAT_DEC; - mt_fifo8_puts(&mtouch->resp, "0"); - } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'N') { /* Filter Number */ - mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ mtouch->pen_mode = 1; - mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ mouse_set_sample_rate(106); mtouch->format = FORMAT_HEX; - mt_fifo8_puts(&mtouch->resp, "0"); - } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'Q') { /* ?? */ - mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ mouse_set_sample_rate(106); mtouch->format = FORMAT_RAW; mtouch->cal_cntr = 0; - mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ mouse_set_sample_rate(192); mtouch->format = FORMAT_TABLET; - mt_fifo8_puts(&mtouch->resp, "0"); - } - if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'F') { /* ?? */ - mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ - mt_fifo8_puts(&mtouch->resp, "A"); - fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", sizeof("0000000000000000000000000\r") - 1); - mt_fifo8_puts(&mtouch->resp, "0"); - } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'P') { /* ?? */ - mt_fifo8_puts(&mtouch->resp, "0"); - } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ - mt_fifo8_puts(&mtouch->resp, "0"); + fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ + fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", 26); } if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'T') { /* Mode Status */ mtouch->mode_status = true; - mt_fifo8_puts(&mtouch->resp, "0"); - } - if (mtouch->cmd[0] == 'N' && mtouch->cmd[1] == 'M') { /* ?? */ - mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ - mt_fifo8_puts(&mtouch->resp, mtouch_identity[mtouch->id]); + fifo8_push(&mtouch->resp, 0x01); + fifo8_push_all(&mtouch->resp, (uint8_t *) mtouch_identity[mtouch->id], 6); + fifo8_push(&mtouch->resp, 0x0D); + return; } if (mtouch->cmd[0] == 'P') { if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ - mt_fifo8_puts(&mtouch->resp, "0"); /* Also 'PL' Parameter Lock */ - } - if (mtouch->cmd[0] == 'Q' && mtouch->cmd[1] == 'P') { /* ?? */ - mt_fifo8_puts(&mtouch->resp, "0"); } if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; @@ -185,28 +147,31 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) if (mtouch->id < 2) { mouse_set_sample_rate(106); mtouch->format = FORMAT_DEC; - } - else { + } else { mouse_set_sample_rate(192); mtouch->format = FORMAT_TABLET; } timer_on_auto(&mtouch->reset_timer, 500. * 1000.); + return; } if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ - mt_fifo8_puts(&mtouch->resp, "A"); + fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ + return; } if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ - mt_fifo8_puts(&mtouch->resp, "TP****00"); - } - if (mtouch->cmd[0] == 'Z') { /* Null */ - mt_fifo8_puts(&mtouch->resp, "0"); - } - if (fifo8_num_used(&mtouch->resp) != fifo_used || mtouch->in_reset) { - pclog("Command handled: %s\n", mtouch->cmd); - } else { - pclog("Command ignored: %s\n", mtouch->cmd); + fifo8_push(&mtouch->resp, 0x01); + + if (mtouch->id == 2) { + fifo8_push_all(&mtouch->resp, (uint8_t *) "TP****00", 8); + } else { + fifo8_push_all(&mtouch->resp, (uint8_t *) "QM****00", 8); + } + fifo8_push(&mtouch->resp, 0x0D); + return; } + + fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } void @@ -243,8 +208,14 @@ mtouch_write(serial_t *serial, void *priv, uint8_t data) if (data != '\r') { dev->cmd[dev->cmd_pos++] = data; } else { - dev->cmd[dev->cmd_pos++] = data; dev->soh = 0; + + if (!dev->cmd_pos) { + return; + } + + dev->cmd[dev->cmd_pos++] = data; + dev->cmd_pos = 0; microtouch_process_commands(dev); } } From 7692abb60c2b755591d133028a79a3f26f305908 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 4 Aug 2024 01:04:09 +0200 Subject: [PATCH 250/624] A liftoff should keep the old touch location --- src/device/mouse_microtouch_touchscreen.c | 44 ++++++++++++----------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 5b207dfc6..9767d5c04 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -55,19 +55,20 @@ const char* mtouch_identity[] = { }; typedef struct mouse_microtouch_t { - double baud_rate; - int b; - char cmd[256]; - int cmd_pos; - uint8_t format; - bool mode_status; - uint8_t id, cal_cntr, pen_mode; - bool soh; - bool in_reset; - serial_t *serial; - Fifo8 resp; - pc_timer_t host_to_serial_timer; - pc_timer_t reset_timer; + double baud_rate; + unsigned int abs_x_int, abs_y_int; + int b; + char cmd[256]; + int cmd_pos; + uint8_t format; + bool mode_status; + uint8_t id, cal_cntr, pen_mode; + bool soh; + bool in_reset; + serial_t *serial; + Fifo8 resp; + pc_timer_t host_to_serial_timer; + pc_timer_t reset_timer; } mouse_microtouch_t; static mouse_microtouch_t *mtouch_inst = NULL; @@ -296,7 +297,7 @@ mtouch_poll(void *priv) snprintf(buffer, sizeof(buffer), "\x1c%03d,%03d\r", abs_x_int, abs_y_int); } } else if (dev->b) { /* Liftoff Status */ - snprintf(buffer, sizeof(buffer), "\x18%03d,%03d\r", abs_x_int, abs_y_int); + snprintf(buffer, sizeof(buffer), "\x18%03d,%03d\r", dev->abs_x_int, dev->abs_y_int); } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } @@ -320,7 +321,7 @@ mtouch_poll(void *priv) snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); } } else if (dev->b) { /* Liftoff Status */ - snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", abs_x_int, abs_y_int); + snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", dev->abs_x_int, dev->abs_y_int); } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } @@ -338,14 +339,17 @@ mtouch_poll(void *priv) fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); } else if (dev->b) { /* Liftoff */ fifo8_push(&dev->resp, 0b10000000 | ((dev->pen_mode == 2) ? ((1 << 5)) : 0)); - fifo8_push(&dev->resp, abs_x_int & 0b1111111); - fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); - fifo8_push(&dev->resp, abs_y_int & 0b1111111); - fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); + fifo8_push(&dev->resp, dev->abs_x_int & 0b1111111); + fifo8_push(&dev->resp, (dev->abs_x_int >> 7) & 0b1111111); + fifo8_push(&dev->resp, dev->abs_y_int & 0b1111111); + fifo8_push(&dev->resp, (dev->abs_y_int >> 7) & 0b1111111); } } - dev->b = b; /* Save buttonpress */ + /* Save old states*/ + dev->abs_x_int = abs_x_int; + dev->abs_y_int = abs_y_int; + dev->b = b; return 0; } From 6979b6a6c09add333ed1f0550eb56446103c88c8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 Aug 2024 05:13:24 +0200 Subject: [PATCH 251/624] Assorted MIDI and MPU-401 intelligent mode fixes, fixes #4419. --- src/include/86box/midi.h | 2 + src/include/86box/snd_mpu401.h | 9 +- src/sound/midi.c | 9 +- src/sound/snd_mpu401.c | 988 ++++++++++++++++----------------- src/sound/snd_sb_dsp.c | 2 +- 5 files changed, 486 insertions(+), 524 deletions(-) diff --git a/src/include/86box/midi.h b/src/include/86box/midi.h index 7f7ad89ae..57a20ae5c 100644 --- a/src/include/86box/midi.h +++ b/src/include/86box/midi.h @@ -32,6 +32,7 @@ typedef struct midi_device_t { void (*play_sysex)(uint8_t *sysex, unsigned int len); void (*play_msg)(uint8_t *msg); void (*poll)(void); + void (*reset)(void); int (*write)(uint8_t val); } midi_device_t; @@ -77,6 +78,7 @@ extern void midi_raw_out_thru_rt_byte(uint8_t val); extern void midi_raw_out_byte(uint8_t val); extern void midi_clear_buffer(void); extern void midi_poll(void); +extern void midi_reset(void); extern void midi_in_handler(int set, void (*msg)(void *priv, uint8_t *msg, uint32_t len), int (*sysex)(void *priv, uint8_t *buffer, uint32_t len, int abort), void *priv); extern void midi_in_handlers_clear(void); diff --git a/src/include/86box/snd_mpu401.h b/src/include/86box/snd_mpu401.h index 8cd275af8..6dd99379e 100644 --- a/src/include/86box/snd_mpu401.h +++ b/src/include/86box/snd_mpu401.h @@ -26,9 +26,9 @@ #define MPU401_VERSION 0x15 #define MPU401_REVISION 0x01 -#define MPU401_QUEUE 1024 +#define MPU401_QUEUE 32 #define MPU401_INPUT_QUEUE 1024 -#define MPU401_TIMECONSTANT (60000000 / 1000.0f) +#define MPU401_TIMECONSTANT (60000000.0 / 1000.0) #define MPU401_RESETBUSY 27.0f /*helpers*/ @@ -89,7 +89,7 @@ typedef struct mpu_t { uint32_t ch_toref[16]; struct track { int counter; - uint8_t value[3]; + uint8_t value[8]; uint8_t sys_val; uint8_t vlength; uint8_t length; @@ -106,7 +106,6 @@ typedef struct mpu_t { int wsm; int wsd_start; int run_irq; - int irq_pending; int track_req; int send_now; int eoi_scheduled; @@ -116,9 +115,11 @@ typedef struct mpu_t { int sysex_in_finished; int rec_copy; RecState rec; + uint8_t irq_pending; uint8_t tmask; uint8_t cmask; uint8_t amask; + uint8_t queued_eois; uint8_t last_rtcmd; uint16_t midi_mask; uint16_t req_mask; diff --git a/src/sound/midi.c b/src/sound/midi.c index 18fad1886..bf92249c4 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -341,7 +341,7 @@ midi_raw_out_byte(uint8_t val) else if ((midi_out->midi_sysex_data[5] == 0x10) && (midi_out->midi_sysex_data[6] == 0x00) && (midi_out->midi_sysex_data[7] == 0x01)) midi_out->midi_sysex_delay = 30; /* Dark Sun 1 */ else - midi_out->midi_sysex_delay = (unsigned int) (((float) (midi_out->midi_pos) * 1.25f) * 1000.0f / 3125.0f) + 2; + midi_out->midi_sysex_delay = (unsigned int) (((double) (midi_out->midi_pos) * 1.25) / 3.125) + 2; midi_out->midi_sysex_start = plat_get_ticks(); } @@ -584,3 +584,10 @@ midi_in_sysex(uint8_t *buffer, uint32_t len) break; } } + +void +midi_reset(void) +{ + if (midi_out && midi_out->m_out_device && midi_out->m_out_device->reset) + midi_out->m_out_device->reset(); +} diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index a8c9d3e3c..40853d98b 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -8,15 +8,13 @@ * * Roland MPU-401 emulation. * - * - * * Authors: DOSBox Team, * Miran Grca, * TheCollector1995, * - * Copyright 2008-2020 DOSBox Team. - * Copyright 2016-2020 Miran Grca. - * Copyright 2016-2020 TheCollector1995. + * Copyright 2008-2024 DOSBox Team. + * Copyright 2016-2024 Miran Grca. + * Copyright 2016-2024 TheCollector1995. */ #include #include @@ -51,10 +49,11 @@ enum { int mpu401_standalone_enable = 0; static void MPU401_WriteCommand(mpu_t *mpu, uint8_t val); +static void MPU401_WriteData(mpu_t *mpu, uint8_t val); static void MPU401_IntelligentOut(mpu_t *mpu, uint8_t track); static void MPU401_EOIHandler(void *priv); static void MPU401_EOIHandlerDispatch(void *priv); -static void MPU401_NotesOff(mpu_t *mpu, int i); +static __inline void MPU401_NotesOff(mpu_t *mpu, unsigned int i); #ifdef ENABLE_MPU401_LOG int mpu401_do_log = ENABLE_MPU401_LOG; @@ -74,11 +73,26 @@ mpu401_log(const char *fmt, ...) # define mpu401_log(fmt, ...) #endif +static void +MPU401_UpdateIRQ(mpu_t *mpu, int set) +{ + /* Clear IRQ. */ + if ((mpu->irq > 0) && (mpu->irq <= 15)) { + mpu401_log("MPU401_UpdateIRQ(): Int IRQ %i %s.\n", mpu->irq, set ? "set" : "cleared"); + picint_common(1 << mpu->irq, PIC_IRQ_EDGE, set, NULL); + } + + if (mpu->ext_irq_update) { + mpu401_log("MPU401_UpdateIRQ(): Ext IRQ %s.\n", set ? "set" : "cleared"); + mpu->ext_irq_update(mpu->priv, set); + } +} + static void MPU401_ReCalcClock(mpu_t *mpu) { int32_t mintempo = 16; - int32_t maxtempo = 240; + int32_t maxtempo = 240; int32_t freq; if (mpu->clock.timebase < 72) { @@ -96,10 +110,11 @@ MPU401_ReCalcClock(mpu_t *mpu) } mpu->clock.freq = ((uint32_t) (mpu->clock.tempo * 2 * mpu->clock.tempo_rel)) >> 6; - mpu->clock.freq = mpu->clock.timebase * (mpu->clock.freq < (mintempo * 2) ? mintempo : ((mpu->clock.freq / 2) < maxtempo ? (mpu->clock.freq / 2) : maxtempo)); + mpu->clock.freq = mpu->clock.timebase * (mpu->clock.freq < (mintempo * 2) ? + mintempo : ((mpu->clock.freq / 2) < maxtempo ? (mpu->clock.freq / 2) : maxtempo)); if (mpu->state.sync_in) { - freq = (int32_t) ((float) (mpu->clock.freq) * mpu->clock.freq_mod); + freq = (int32_t) ((double) (mpu->clock.freq) * mpu->clock.freq_mod); if ((freq > (mpu->clock.timebase * mintempo)) && (freq < (mpu->clock.timebase * maxtempo))) mpu->clock.freq = freq; } @@ -110,135 +125,109 @@ MPU401_ReStartClock(mpu_t *mpu) { if (mpu->clock.active) { timer_disable(&mpu->mpu401_event_callback); - timer_set_delay_u64(&mpu->mpu401_event_callback, (MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC); + timer_set_delay_u64(&mpu->mpu401_event_callback, + (MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC); + mpu401_log("MPU-401: Clock restarted\n"); } } -static void +static __inline void MPU401_StartClock(mpu_t *mpu) { - mpu401_log("MPU401_StartClock(): %i, %i, %i, %i\n", mpu->clock.active, mpu->state.clock_to_host, - mpu->state.playing, (mpu->state.rec == M_RECON)); - if (mpu->clock.active) - return; - if (mpu->state.clock_to_host || mpu->state.playing || (mpu->state.rec == M_RECON)) - return; - - mpu->clock.active = 1; - timer_set_delay_u64(&mpu->mpu401_event_callback, (MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC); + if (!mpu->clock.active && (mpu->state.playing || + mpu->state.clock_to_host || (mpu->state.rec == M_RECON))) { + mpu->clock.active = 1; + timer_set_delay_u64(&mpu->mpu401_event_callback, + (MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC); + mpu401_log("MPU-401: Clock started\n"); + } } -static void +static __inline void MPU401_StopClock(mpu_t *mpu) { - if (!mpu->state.clock_to_host && !mpu->state.playing && (mpu->state.rec == M_RECOFF)) - return; - mpu->clock.active = 0; - timer_disable(&mpu->mpu401_event_callback); + if (mpu->clock.active && !mpu->state.playing && + !mpu->state.clock_to_host && (mpu->state.rec != M_RECON)) { + mpu->clock.active = 0; + timer_disable(&mpu->mpu401_event_callback); + mpu401_log("MPU-401: Clock stopped\n"); + } } -static void +static __inline void MPU401_RunClock(mpu_t *mpu) { - if (!mpu->clock.active) { + if (mpu->clock.active) + timer_advance_u64(&mpu->mpu401_event_callback, + (MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC); + else timer_disable(&mpu->mpu401_event_callback); - return; - } - timer_advance_u64(&mpu->mpu401_event_callback, (MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC); -#if 0 - mpu401_log("Next event after %" PRIu64 " us (time constant: %i)\n", (uint64_t) ((MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC), (int) MPU401_TIMECONSTANT); -#endif } static void -MPU401_QueueByteEx(mpu_t *mpu, uint8_t data, UNUSED(int irq)) +MPU401_QueueByte(mpu_t *mpu, uint8_t data) { if (mpu->state.block_ack) { mpu->state.block_ack = 0; return; } - if (mpu->queue_used == 0) { - if (mpu->ext_irq_update) - mpu->ext_irq_update(mpu->priv, 1); - else { - mpu->state.irq_pending = 1; - picint(1 << mpu->irq); - } + mpu401_log("QueueByte Used=%d.\n", mpu->queue_used); + if (!mpu->queue_used) { + mpu->state.irq_pending = 1; + MPU401_UpdateIRQ(mpu, 1); } if (mpu->queue_used < MPU401_QUEUE) { - int pos = mpu->queue_used + mpu->queue_pos; - + if (mpu->queue_pos > MPU401_QUEUE) fatal("MPU queue overflow\n"); + uint8_t pos = mpu->queue_used + mpu->queue_pos; if (mpu->queue_pos >= MPU401_QUEUE) mpu->queue_pos -= MPU401_QUEUE; if (pos >= MPU401_QUEUE) pos -= MPU401_QUEUE; mpu->queue_used++; + if (pos >= MPU401_QUEUE) fatal("MPU position overflow\n"); mpu->queue[pos] = data; } } static void -MPU401_QueueByte(mpu_t *mpu, uint8_t data) +MPU401_RecQueueBuffer(mpu_t *mpu, uint8_t *buf, unsigned int len) { - MPU401_QueueByteEx(mpu, data, 1); -} - -static int -MPU401_IRQPending(mpu_t *mpu) -{ - int irq_pending; - - if (mpu->ext_irq_pending) - irq_pending = mpu->ext_irq_pending(mpu->priv); - else - irq_pending = mpu->state.irq_pending; - - return irq_pending; -} - -static void -MPU401_RecQueueBuffer(mpu_t *mpu, uint8_t *buf, uint32_t len, UNUSED(int block)) -{ - uint32_t cnt = 0; - int pos; + unsigned int cnt = 0; while (cnt < len) { if (mpu->rec_queue_used < MPU401_INPUT_QUEUE) { - pos = mpu->rec_queue_used + mpu->rec_queue_pos; + unsigned int pos = mpu->rec_queue_used + mpu->rec_queue_pos; if (pos >= MPU401_INPUT_QUEUE) pos -= MPU401_INPUT_QUEUE; mpu->rec_queue[pos] = buf[cnt]; mpu->rec_queue_used++; - if ((!mpu->state.sysex_in_finished) && (buf[cnt] == MSG_EOX)) { - /* finish sysex */ + if (!mpu->state.sysex_in_finished && (buf[cnt] == MSG_EOX)) { + /* Finish SysEx */ mpu->state.sysex_in_finished = 1; break; } cnt++; } } - - if (mpu->queue_used == 0) { - if (mpu->state.rec_copy || MPU401_IRQPending(mpu)) { - if (MPU401_IRQPending(mpu)) { - if (mpu->ext_irq_update) - mpu->ext_irq_update(mpu->priv, 0); - else { - mpu->state.irq_pending = 0; - picintc(1 << mpu->irq); - } + if (!mpu->queue_used) { + if (mpu->state.rec_copy || mpu->state.irq_pending) { + if (mpu->state.irq_pending) { + mpu->state.irq_pending = 0; + MPU401_UpdateIRQ(mpu, 0); } return; } + mpu->state.rec_copy = 1; if (mpu->rec_queue_pos >= MPU401_INPUT_QUEUE) mpu->rec_queue_pos -= MPU401_INPUT_QUEUE; + MPU401_QueueByte(mpu, mpu->rec_queue[mpu->rec_queue_pos]); - mpu->rec_queue_used--; - mpu->rec_queue_pos++; + mpu->rec_queue_used--; + mpu->rec_queue_pos++; } } @@ -250,12 +239,8 @@ MPU401_ClrQueue(mpu_t *mpu) mpu->rec_queue_used = 0; mpu->rec_queue_pos = 0; mpu->state.sysex_in_finished = 1; - if (mpu->ext_irq_update) - mpu->ext_irq_update(mpu->priv, 0); - else { - mpu->state.irq_pending = 0; - picintc(1 << mpu->irq); - } + mpu->state.irq_pending = 0; + MPU401_UpdateIRQ(mpu, 0); } static void @@ -263,86 +248,85 @@ MPU401_Reset(mpu_t *mpu) { uint8_t i; -#ifdef DOSBOX_CODE - if (mpu->mode == M_INTELLIGENT) { - if (mpu->ext_irq_update) - mpu->ext_irq_update(mpu->priv, 0); - else { - mpu->state.irq_pending = 0; - picintc(1 << mpu->irq); - } + midi_reset(); + /* Clear MIDI buffers, terminate notes. */ + midi_clear_buffer(); + for (i = 0xb0; i <= 0xbf; i++) { + midi_raw_out_byte(i); + midi_raw_out_byte(0x7b); + midi_raw_out_byte(0); } -#else - if (mpu->ext_irq_update) - mpu->ext_irq_update(mpu->priv, 0); - else { - mpu->state.irq_pending = 0; - picintc(1 << mpu->irq); - } -#endif - mpu->mode = M_INTELLIGENT; - mpu->midi_thru = 0; - mpu->state.rec = M_RECOFF; - mpu->state.eoi_scheduled = 0; - mpu->state.wsd = 0; - mpu->state.wsm = 0; - mpu->state.conductor = 0; - mpu->state.cond_req = 0; - mpu->state.cond_set = 0; - mpu->state.playing = 0; - mpu->state.run_irq = 0; - mpu->state.cmask = 0xff; - mpu->state.amask = mpu->state.tmask = 0; - mpu->state.midi_mask = 0xffff; - mpu->state.command_byte = 0; - mpu->state.block_ack = 0; - mpu->clock.tempo = mpu->clock.old_tempo = 100; - mpu->clock.timebase = mpu->clock.old_timebase = 120; + mpu->state.irq_pending = 0; + MPU401_UpdateIRQ(mpu, 0); + + timer_disable(&mpu->mpu401_event_callback); + + mpu->mode = M_INTELLIGENT; + mpu->midi_thru = 0; + mpu->state.rec = M_RECOFF; + mpu->state.eoi_scheduled = 0; + mpu->state.wsd = 0; + mpu->state.wsm = 0; + mpu->state.conductor = 0; + mpu->state.cond_req = 0; + mpu->state.cond_set = 0; + mpu->state.playing = 0; + mpu->state.run_irq = 0; + mpu->state.cmask = 0xff; + mpu->state.amask = mpu->state.tmask = 0; + mpu->state.midi_mask = 0xffff; + mpu->state.command_byte = 0; + mpu->state.block_ack = 0; + mpu->clock.tempo = mpu->clock.old_tempo = 100; + mpu->clock.timebase = mpu->clock.old_timebase = 120; mpu->clock.tempo_rel = mpu->clock.old_tempo_rel = 0x40; mpu->clock.freq_mod = 1.0; mpu->clock.tempo_grad = 0; + mpu->state.clock_to_host = 0; MPU401_StopClock(mpu); MPU401_ReCalcClock(mpu); for (i = 0; i < 4; i++) - mpu->clock.cth_rate[i] = 60; + mpu->clock.cth_rate[i] = 60; - mpu->clock.cth_counter = 0; - mpu->clock.midimetro = 12; - mpu->clock.metromeas = 8; - mpu->filter.rec_measure_end = 1; - mpu->filter.rt_out = 1; - mpu->filter.rt_affection = 1; - mpu->filter.allnotesoff_out = 1; - mpu->filter.all_thru = 1; - mpu->filter.midi_thru = 1; - mpu->filter.commonmsgs_thru = 1; + mpu->clock.cth_counter = 0; + mpu->clock.midimetro = 12; + mpu->clock.metromeas = 8; + mpu->filter.rec_measure_end = 1; + mpu->filter.rt_out = 1; + mpu->filter.rt_affection = 1; + mpu->filter.allnotesoff_out = 1; + mpu->filter.all_thru = 1; + mpu->filter.midi_thru = 1; + mpu->filter.commonmsgs_thru = 1; /* Reset channel reference and input tables. */ for (i = 0; i < 4; i++) { - mpu->chanref[i].on = 1; - mpu->chanref[i].chan = i; - mpu->ch_toref[i] = i; + mpu->chanref[i].on = 1; + mpu->chanref[i].chan = i; + + mpu->ch_toref[i] = i; } for (i = 0; i < 16; i++) { - mpu->inputref[i].on = 1; - mpu->inputref[i].chan = i; + mpu->inputref[i].on = 1; + mpu->inputref[i].chan = i; if (i > 3) - mpu->ch_toref[i] = 4; /* Dummy reftable. */ + mpu->ch_toref[i] = 4; /* Dummy reftable. */ } MPU401_ClrQueue(mpu); - mpu->state.data_onoff = -1; + mpu->state.data_onoff = -1; - mpu->state.req_mask = 0; - mpu->condbuf.counter = 0; - mpu->condbuf.type = T_OVERFLOW; + mpu->state.req_mask = 0; + mpu->condbuf.counter = 0; + + mpu->condbuf.type = T_OVERFLOW; for (i = 0; i < 8; i++) { - mpu->playbuf[i].type = T_OVERFLOW; - mpu->playbuf[i].counter = 0; + mpu->playbuf[i].type = T_OVERFLOW; + mpu->playbuf[i].counter = 0; } /* Clear MIDI buffers, terminate notes. */ @@ -355,15 +339,22 @@ MPU401_Reset(mpu_t *mpu) } } +static uint8_t +MPU401_ReadStatus(mpu_t *mpu) +{ + uint8_t ret = 0x3f; + if (mpu->state.cmd_pending) + ret |= STATUS_OUTPUT_NOT_READY; + if (!mpu->queue_used) + ret |= STATUS_INPUT_NOT_READY; + return ret; +} + static void MPU401_ResetDone(void *priv) { mpu_t *mpu = (mpu_t *) priv; - mpu401_log("MPU-401 reset callback\n"); - - timer_disable(&mpu->mpu401_reset_callback); - mpu->state.reset = 0; if (mpu->state.cmd_pending) { @@ -387,6 +378,15 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) if ((val != 0xff) && (mpu->mode == M_UART)) return; + if (mpu->state.reset) { + if (mpu->state.cmd_pending || (val != 0xff)) { + mpu->state.cmd_pending = val + 1; + return; + } + timer_disable(&mpu->mpu401_reset_callback); + mpu->state.reset = 0; + } + /* In Intelligent mode, UART-only variants of the MPU-401 only support commands 0x3F and 0xFF. */ if (!mpu->intelligent && (val != 0x3f) && (val != 0xff)) return; @@ -425,15 +425,15 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) } switch (val & 0xc) { /* Playing */ case 0x4: /* Stop */ - MPU401_StopClock(mpu); mpu->state.playing = 0; + MPU401_StopClock(mpu); for (i = 0; i < 16; i++) MPU401_NotesOff(mpu, i); mpu->filter.prchg_mask = 0; break; case 0x8: /* Start */ - MPU401_StartClock(mpu); mpu->state.playing = 1; + MPU401_StartClock(mpu); MPU401_ClrQueue(mpu); break; @@ -444,14 +444,14 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) case 0: /* check if it waited for MIDI RT command */ if (((val & 3) < 2) || !mpu->filter.rt_affection || (mpu->state.rec != M_RECSTB)) break; - MPU401_StartClock(mpu); mpu->state.rec = M_RECON; + MPU401_StartClock(mpu); if (mpu->filter.prchg_mask) send_prchg = 1; break; case 0x10: /* Stop */ - MPU401_StopClock(mpu); mpu->state.rec = M_RECOFF; + MPU401_StopClock(mpu); MPU401_QueueByte(mpu, MSG_MPU_ACK); MPU401_QueueByte(mpu, mpu->clock.rec_counter); MPU401_QueueByte(mpu, MSG_MPU_END); @@ -480,7 +480,7 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) /* record counter hack: needed by Prism, but sent only on cmd 0x20/0x26 (or breaks Ballade) */ uint8_t rec_cnt = mpu->clock.rec_counter; if (((val == 0x20) || (val == 0x26)) && (mpu->state.rec == M_RECON)) - MPU401_RecQueueBuffer(mpu, &rec_cnt, 1, 0); + MPU401_RecQueueBuffer(mpu, &rec_cnt, 1); if (send_prchg) { for (i = 0; i < 16; i++) { @@ -488,11 +488,12 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) recmsg[0] = mpu->clock.rec_counter; recmsg[1] = 0xc0 | i; recmsg[2] = mpu->filter.prchg_buf[i]; - MPU401_RecQueueBuffer(mpu, recmsg, 3, 0); + MPU401_RecQueueBuffer(mpu, recmsg, 3); mpu->filter.prchg_mask &= ~(1 << i); } } } + return; } else if ((val >= 0xa0) && (val <= 0xa7)) /* Request play counter */ MPU401_QueueByte(mpu, mpu->playbuf[val & 7].counter); else if ((val >= 0xd0) && (val <= 0xd7)) { /* Send data */ @@ -552,7 +553,8 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) return; case 0x80: /* Internal clock */ if (mpu->clock.active && mpu->state.sync_in) { - timer_set_delay_u64(&mpu->mpu401_event_callback, (MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC); + timer_set_delay_u64(&mpu->mpu401_event_callback, + (MPU401_TIMECONSTANT / mpu->clock.freq) * 1000 * TIMER_USEC); mpu->clock.freq_mod = 1.0; } mpu->state.sync_in = 0; @@ -594,12 +596,12 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) mpu->filter.rt_affection = !!(val & 1); break; case 0x94: /* Clock to host */ - MPU401_StopClock(mpu); mpu->state.clock_to_host = 0; + MPU401_StopClock(mpu); break; case 0x95: - MPU401_StartClock(mpu); mpu->state.clock_to_host = 1; + MPU401_StartClock(mpu); break; case 0x96: case 0x97: /* Sysex input allow */ @@ -650,6 +652,8 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) mpu->state.conductor = mpu->state.cond_set; mpu->clock.cth_counter = mpu->clock.cth_old = 0; mpu->clock.measure_counter = mpu->clock.meas_old = 0; + mpu->state.req_mask = 0; + mpu->state.irq_pending = 1; break; case 0xb9: /* Clear play map */ for (i = 0; i < 16; i++) @@ -661,6 +665,8 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) mpu->state.last_rtcmd = 0; mpu->clock.cth_counter = mpu->clock.cth_old = 0; mpu->clock.measure_counter = mpu->clock.meas_old = 0; + mpu->state.req_mask = 0; + mpu->state.irq_pending = 1; break; case 0xba: /* Clear record counter */ mpu->clock.rec_counter = 0; @@ -704,38 +710,106 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) return; break; - default: + default: #if 0 - mpu401_log("MPU-401:Unhandled command %X",val); + mpu401_log("MPU-401:Unhandled command %X",val); #endif - break; + break; } MPU401_QueueByte(mpu, MSG_MPU_ACK); } +void +MPU401_ReadRaiseIRQ(mpu_t *mpu) +{ + /* Clear IRQ. */ + MPU401_UpdateIRQ(mpu, 0); + + if (mpu->queue_used) + MPU401_UpdateIRQ(mpu, 1); +} + +uint8_t +MPU401_ReadData(mpu_t *mpu) +{ + uint8_t ret = MSG_MPU_ACK; + + if (mpu->queue_used) { + mpu->queue_pos -= (mpu->queue_pos >= MPU401_QUEUE) ? MPU401_QUEUE : 0; + ret = mpu->queue[mpu->queue_pos]; + mpu->queue_pos++; + mpu->queue_used--; + } + + /* Shouldn't this check mpu->mode? */ + if (!mpu->intelligent || (mpu->mode == M_UART)) { + MPU401_ReadRaiseIRQ(mpu); + return ret; + } + + mpu401_log("QueueUsed=%d.\n", mpu->queue_used); + if (!mpu->queue_used) + MPU401_UpdateIRQ(mpu, 0); + + if (mpu->state.rec_copy && !mpu->rec_queue_used) { + MPU401_ReadRaiseIRQ(mpu); + mpu->state.rec_copy = 0; + MPU401_EOIHandler(mpu); + return ret; + } + + /* Copy from recording buffer. */ + if (!mpu->queue_used && mpu->rec_queue_used) { + mpu->state.rec_copy = 1; + if (mpu->rec_queue_pos >= MPU401_INPUT_QUEUE) + mpu->rec_queue_pos -= MPU401_INPUT_QUEUE; + + MPU401_QueueByte(mpu, mpu->rec_queue[mpu->rec_queue_pos]); + mpu->rec_queue_pos++; + mpu->rec_queue_used--; + } + + MPU401_ReadRaiseIRQ(mpu); + + if ((ret >= 0xf0) && (ret <= 0xf7)) { /* MIDI data request */ + mpu->state.track = ret & 7; + mpu->state.data_onoff = 0; + mpu->state.cond_req = 0; + mpu->state.track_req = 1; + } + + if (ret == MSG_MPU_COMMAND_REQ) { + mpu->state.data_onoff = 0; + mpu->state.cond_req = 1; + if (mpu->condbuf.type != T_OVERFLOW) { + mpu->state.block_ack = 1; + MPU401_WriteCommand(mpu, mpu->condbuf.value[0]); + if (mpu->state.command_byte) + MPU401_WriteData(mpu, mpu->condbuf.value[1]); + mpu->condbuf.type = T_OVERFLOW; + } + } + + if ((ret == MSG_MPU_END) || (ret == MSG_MPU_CLOCK) || (ret == MSG_MPU_ACK) || (ret == MSG_MPU_OVERFLOW)) + MPU401_EOIHandlerDispatch(mpu); + + return ret; +} + static void MPU401_WriteData(mpu_t *mpu, uint8_t val) { - static int length; - static int cnt; + static unsigned int length; + static unsigned int cnt; + static unsigned int posd; -#ifdef DOSBOX_CODE - if (mpu->mode == M_UART) { - midi_raw_out_byte(val); - return; - } - - if (!mpu->intelligent) { - mpu->state.command_byte = 0; - return; - } -#else if (!mpu->intelligent || (mpu->mode == M_UART)) { midi_raw_out_byte(val); + if (val == 0xff) + midi_reset(); return; } -#endif switch (mpu->state.command_byte) { /* 0xe# command data */ case 0x00: @@ -759,6 +833,7 @@ MPU401_WriteData(mpu_t *mpu, uint8_t val) MPU401_ReStartClock(mpu); return; case 0xe2: /* Set gradation for relative tempo */ + mpu->state.command_byte = 0; mpu->clock.tempo_grad = val; MPU401_ReCalcClock(mpu); MPU401_ReStartClock(mpu); @@ -844,6 +919,7 @@ MPU401_WriteData(mpu_t *mpu, uint8_t val) } if (cnt == length) { + mpu->playbuf[mpu->state.track].vlength = cnt; MPU401_IntelligentOut(mpu, mpu->state.track); mpu->state.wsd = 0; mpu->state.track = mpu->state.old_track; @@ -874,8 +950,9 @@ MPU401_WriteData(mpu_t *mpu, uint8_t val) break; default: + length = 0; mpu->state.wsm = 0; - return; + break; } } else if (val & 0x80) { midi_raw_out_byte(MSG_EOX); @@ -900,38 +977,36 @@ MPU401_WriteData(mpu_t *mpu, uint8_t val) case -1: return; case 0: /* Timing byte */ - mpu->condbuf.length = 0; + mpu->condbuf.vlength = 0; if (val < 0xf0) mpu->state.data_onoff++; else { - mpu->state.cond_req = 0; mpu->state.data_onoff = -1; MPU401_EOIHandlerDispatch(mpu); - break; + return; } - mpu->state.send_now = !val ? 1 : 0; + /* A timing value of 0 means send it now! */ + mpu->state.send_now = (val == 0); mpu->condbuf.counter = val; break; case 1: /* Command byte #1 */ mpu->condbuf.type = T_COMMAND; if ((val == 0xf8) || (val == 0xf9) || (val == 0xfc)) mpu->condbuf.type = T_OVERFLOW; - mpu->condbuf.value[mpu->condbuf.length] = val; - mpu->condbuf.length++; - if ((val & 0xf0) != 0xe0) { /*no cmd data byte*/ - MPU401_EOIHandler(mpu); - mpu->state.data_onoff = -1; - mpu->state.cond_req = 0; - } else + + mpu->condbuf.value[mpu->condbuf.vlength] = val; + mpu->condbuf.vlength++; + + if ((val & 0xf0) != 0xe0) + MPU401_EOIHandlerDispatch(mpu); + else mpu->state.data_onoff++; break; case 2: /* Command byte #2 */ - mpu->condbuf.value[mpu->condbuf.length] = val; - mpu->condbuf.length++; - MPU401_EOIHandler(mpu); - mpu->state.data_onoff = -1; - mpu->state.cond_req = 0; + mpu->condbuf.value[mpu->condbuf.vlength] = val; + mpu->condbuf.vlength++; + MPU401_EOIHandlerDispatch(mpu); break; default: @@ -939,103 +1014,95 @@ MPU401_WriteData(mpu_t *mpu, uint8_t val) } return; } - switch (mpu->state.data_onoff) { /* Data */ case -1: - break; + return; case 0: /* Timing byte */ if (val < 0xf0) - mpu->state.data_onoff++; + mpu->state.data_onoff = 1; else { mpu->state.data_onoff = -1; MPU401_EOIHandlerDispatch(mpu); mpu->state.track_req = 0; return; } - mpu->state.send_now = !val ? 1 : 0; + mpu->state.send_now = (val == 0); mpu->playbuf[mpu->state.track].counter = val; break; case 1: /* MIDI */ - cnt = 0; - mpu->state.data_onoff++; - switch (val & 0xf0) { - case 0xc0: - case 0xd0: /* MIDI Message */ - length = mpu->playbuf[mpu->state.track].length = 2; - mpu->playbuf[mpu->state.track].type = T_MIDI_NORM; - break; - case 0x80: - case 0x90: - case 0xa0: - case 0xb0: - case 0xe0: - length = mpu->playbuf[mpu->state.track].length = 3; - mpu->playbuf[mpu->state.track].type = T_MIDI_NORM; - break; - case 0xf0: /* System message or mark */ - mpu->playbuf[mpu->state.track].sys_val = val; - if (val > 0xf7) { - mpu->playbuf[mpu->state.track].type = T_MARK; - if (val == 0xf9) - mpu->clock.measure_counter = 0; - } else { -#if 0 - mpu401_log("MPU-401:Illegal message"); -#endif - mpu->playbuf[mpu->state.track].type = T_OVERFLOW; - } - mpu->state.data_onoff = -1; - MPU401_EOIHandler(mpu); - mpu->state.track_req = 0; - return; - default: /* MIDI with running status */ - cnt++; - length = mpu->playbuf[mpu->state.track].length; - mpu->playbuf[mpu->state.track].type = T_MIDI_NORM; - break; - } - break; - case 2: - if (cnt < length) { - mpu->playbuf[mpu->state.track].value[cnt] = val; - cnt++; - } - if (cnt == length) { - mpu->state.data_onoff = -1; - mpu->state.track_req = 0; - MPU401_EOIHandler(mpu); - } - break; + mpu->playbuf[mpu->state.track].vlength++; + posd = mpu->playbuf[mpu->state.track].vlength; + + if (posd == 1) { + switch (val & 0xf0) { + case 0xc0: + case 0xd0: /* MIDI Message */ + mpu->playbuf[mpu->state.track].type = T_MIDI_NORM; + length = mpu->playbuf[mpu->state.track].length = 2; + break; + case 0x80: + case 0x90: + case 0xa0: + case 0xb0: + case 0xe0: + mpu->playbuf[mpu->state.track].type = T_MIDI_NORM; + length = mpu->playbuf[mpu->state.track].length = 3; + break; + case 0xf0: /* System message or mark */ + mpu->playbuf[mpu->state.track].sys_val = val; + if (val > 0xf7) { + mpu->playbuf[mpu->state.track].type = T_MARK; + if (val == 0xf9) + mpu->clock.measure_counter = 0; + } else + mpu->playbuf[mpu->state.track].type = T_OVERFLOW; - default: + length = 1; + break; + + default: /* MIDI with running status */ + posd++; + length = mpu->playbuf[mpu->state.track].length; + mpu->playbuf[mpu->state.track].vlength++; + mpu->playbuf[mpu->state.track].type = T_MIDI_NORM; + break; + } + } + + if (!((posd == 1) && (val >= 0xf0))) + mpu->playbuf[mpu->state.track].value[posd - 1] = val; + + if (posd == length) { + MPU401_EOIHandlerDispatch(mpu); + mpu->state.track_req = 0; + } break; } - - return; } static void MPU401_IntelligentOut(mpu_t *mpu, uint8_t track) { - uint8_t chan; - uint8_t chrefnum; - uint8_t key; - uint8_t msg; - int send; - int retrigger; + unsigned int chan; + unsigned int chrefnum; + uint8_t key; + uint8_t msg; + uint8_t val; + int send; + int retrigger; switch (mpu->playbuf[track].type) { case T_OVERFLOW: break; - case T_MARK: - if (mpu->playbuf[track].sys_val == 0xfc) { - midi_raw_out_rt_byte(mpu->playbuf[track].sys_val); + val = mpu->playbuf[track].sys_val; + if (val == 0xfc) { + midi_raw_out_rt_byte(val); mpu->state.amask &= ~(1 << track); + mpu->state.req_mask &= ~(1 << track); } break; - case T_MIDI_NORM: chan = mpu->playbuf[track].value[0] & 0xf; key = mpu->playbuf[track].value[1] & 0x7f; @@ -1043,18 +1110,20 @@ MPU401_IntelligentOut(mpu_t *mpu, uint8_t track) send = 1; retrigger = 0; switch (msg = mpu->playbuf[track].value[0] & 0xf0) { - case 0x80: /* note off */ + case 0x80: /* Note off */ if (mpu->inputref[chan].on && (mpu->inputref[chan].M_GETKEY)) send = 0; if (mpu->chanref[chrefnum].on && (!(mpu->chanref[chrefnum].M_GETKEY))) send = 0; + mpu->chanref[chrefnum].M_DELKEY; break; - case 0x90: /* note on */ + case 0x90: /* Note on */ if (mpu->inputref[chan].on && (mpu->inputref[chan].M_GETKEY)) retrigger = 1; if (mpu->chanref[chrefnum].on && (!(mpu->chanref[chrefnum].M_GETKEY))) retrigger = 1; + mpu->chanref[chrefnum].M_SETKEY; break; case 0xb0: @@ -1063,7 +1132,6 @@ MPU401_IntelligentOut(mpu_t *mpu, uint8_t track) return; } break; - default: break; } @@ -1073,7 +1141,7 @@ MPU401_IntelligentOut(mpu_t *mpu, uint8_t track) midi_raw_out_byte(0); } if (send) { - for (uint8_t i = 0; i < mpu->playbuf[track].length; i++) + for (uint8_t i = 0; i < mpu->playbuf[track].vlength; ++i) midi_raw_out_byte(mpu->playbuf[track].value[i]); } break; @@ -1087,8 +1155,8 @@ static void UpdateTrack(mpu_t *mpu, uint8_t track) { MPU401_IntelligentOut(mpu, track); - if (mpu->state.amask & (1 << track)) { + mpu->playbuf[track].vlength = 0; mpu->playbuf[track].type = T_OVERFLOW; mpu->playbuf[track].counter = 0xf0; mpu->state.req_mask |= (1 << track); @@ -1098,46 +1166,78 @@ UpdateTrack(mpu_t *mpu, uint8_t track) } } -/* Updates counters and requests new data on "End of Input" */ static void -MPU401_EOIHandler(void *priv) +MPU401_Event(void *priv) { mpu_t *mpu = (mpu_t *) priv; - uint8_t i; - mpu401_log("MPU-401 end of input callback\n"); - - timer_disable(&mpu->mpu401_eoi_callback); - mpu->state.eoi_scheduled = 0; - if (mpu->state.send_now) { - mpu->state.send_now = 0; - if (mpu->state.cond_req) { - mpu->condbuf.counter = 0xf0; - mpu->state.req_mask |= (1 << 9); - } else - UpdateTrack(mpu, mpu->state.track); - } - - if (mpu->state.rec_copy || !mpu->state.sysex_in_finished) + if (!mpu->intelligent || (mpu->mode == M_UART)) return; - if (!mpu->state.req_mask || !mpu->clock.active) - return; + if (mpu->state.irq_pending) + goto next_event; - if (mpu->ext_irq_update) - mpu->ext_irq_update(mpu->priv, 0); - else { - mpu->state.irq_pending = 0; - } - - i = 0; - do { - if (mpu->state.req_mask & (1 << i)) { - MPU401_QueueByte(mpu, 0xf0 + i); - mpu->state.req_mask &= ~(1 << i); - break; + if (mpu->state.playing) { + /* Decrease counters. */ + for (uint8_t i = 0; i < 8; i++) { + if (mpu->state.amask & (1 << i)) { + if (mpu->playbuf[i].counter) + mpu->playbuf[i].counter--; + if (!mpu->playbuf[i].counter) + UpdateTrack(mpu, i); + } } - } while ((i++) < 16); + if (mpu->state.conductor) { + if (mpu->condbuf.counter) + mpu->condbuf.counter--; + if (!mpu->condbuf.counter) { + mpu->condbuf.vlength = 0; + mpu->condbuf.counter = 0xf0; + mpu->state.req_mask |= (1 << 9); + } + } + } + + if (mpu->state.clock_to_host) { + mpu->clock.cth_counter++; + if (mpu->clock.cth_counter >= mpu->clock.cth_rate[mpu->clock.cth_mode]) { + mpu->clock.cth_counter = 0; + ++mpu->clock.cth_mode; + mpu->clock.cth_mode %= 4; + mpu->state.req_mask |= (1 << 13); + } + } + + /* Recording */ + if (mpu->state.rec == M_RECON) { + mpu->clock.rec_counter++; + if (mpu->clock.rec_counter >= 240) { + mpu->clock.rec_counter = 0; + mpu->state.req_mask |= (1 << 8); + } + } + + if (mpu->state.playing || (mpu->state.rec == M_RECON)) { + int max_meascnt = (mpu->clock.timebase * mpu->clock.midimetro * mpu->clock.metromeas) / 24; + if (max_meascnt != 0) { /* Measure end */ + if (++mpu->clock.measure_counter >= max_meascnt) { + if (mpu->filter.rt_out) + midi_raw_out_rt_byte(0xf8); + + mpu->clock.measure_counter=0; + if (mpu->filter.rec_measure_end && (mpu->state.rec == M_RECON)) + mpu->state.req_mask |= (1 << 12); + } + } + } + + if (!mpu->state.irq_pending && mpu->state.req_mask) + MPU401_EOIHandler(mpu); + +next_event: + MPU401_RunClock(mpu); + if (mpu->state.sync_in) + mpu->clock.ticks_in++; } static void @@ -1148,111 +1248,78 @@ MPU401_EOIHandlerDispatch(void *priv) mpu401_log("EOI handler dispatch\n"); if (mpu->state.send_now) { mpu->state.eoi_scheduled = 1; - timer_advance_u64(&mpu->mpu401_eoi_callback, 60LL * TIMER_USEC); /* Possibly a bit longer */ + timer_set_delay_u64(&mpu->mpu401_eoi_callback, 60LL * TIMER_USEC); /* Possibly a bit longer */ } else if (!mpu->state.eoi_scheduled) MPU401_EOIHandler(mpu); } +/* Updates counters and requests new data on "End of Input" */ +static void +MPU401_EOIHandler(void *priv) +{ + mpu_t *mpu = (mpu_t *) priv; + + mpu401_log("MPU-401 end of input callback\n"); + + mpu->state.eoi_scheduled = 0; + if (mpu->state.send_now) { + mpu->state.send_now = 0; + if (mpu->state.cond_req) { + mpu->condbuf.vlength = 0; + mpu->condbuf.counter = 0xf0; + mpu->state.req_mask |= (1 << 9); + } else + UpdateTrack(mpu, mpu->state.track); + } + if (mpu->state.rec_copy || !mpu->state.sysex_in_finished) + return; + + mpu->state.irq_pending = 0; + + if (!mpu->state.req_mask || !mpu->clock.active) + return; + + uint8_t i = 0; + do { + if (mpu->state.req_mask & (1 << i)) { + MPU401_QueueByte(mpu, 0xf0 + i); + mpu->state.req_mask &= ~(1 << i); + break; + } + } while ((i++) < 16); +} + +static __inline void +MPU401_NotesOff(mpu_t *mpu, unsigned int i) +{ + if (mpu->filter.allnotesoff_out && !(mpu->inputref[i].on && + (mpu->inputref[i].key[0] | mpu->inputref[i].key[1] | + mpu->inputref[i].key[2] | mpu->inputref[i].key[3]))) { + for (uint8_t j = 0;j < 4; j++) + mpu->chanref[mpu->ch_toref[i]].key[j] = 0; + + midi_raw_out_byte(0xb0 | i); + midi_raw_out_byte(123); + midi_raw_out_byte(0); + } else if (mpu->chanref[mpu->ch_toref[i]].on) { + for (uint8_t key = 0; key < 128; key++) { + if ((mpu->chanref[mpu->ch_toref[i]].M_GETKEY) && + !(mpu->inputref[i].on && (mpu->inputref[i].M_GETKEY))) { + midi_raw_out_byte(0x80 | i); + midi_raw_out_byte(key); + midi_raw_out_byte(0); + } + mpu->chanref[mpu->ch_toref[i]].M_DELKEY; + } + } +} + static void imf_write(UNUSED(uint16_t addr), UNUSED(uint8_t val), UNUSED(void *priv)) { mpu401_log("IMF:Wr %4X,%X\n", addr, val); } -void -MPU401_ReadRaiseIRQ(mpu_t *mpu) -{ - /* Clear IRQ. */ - if (mpu->ext_irq_update) - mpu->ext_irq_update(mpu->priv, 0); - else { - mpu->state.irq_pending = 0; - picintc(1 << mpu->irq); - } - - if (mpu->queue_used) { - /* Bytes remaining in queue, raise IRQ again. */ - if (mpu->ext_irq_update) - mpu->ext_irq_update(mpu->priv, 1); - else { - mpu->state.irq_pending = 1; - picint(1 << mpu->irq); - } - } -} - -uint8_t -MPU401_ReadData(mpu_t *mpu) -{ - uint8_t ret; - - ret = MSG_MPU_ACK; - - if (mpu->queue_used) { - if (mpu->queue_pos >= MPU401_QUEUE) - mpu->queue_pos -= MPU401_QUEUE; - ret = mpu->queue[mpu->queue_pos]; - mpu->queue_pos++; - mpu->queue_used--; - } - - /* Shouldn't this check mpu->mode? */ -#ifdef DOSBOX_CODE - if (mpu->mode == M_UART) { - MPU401_ReadRaiseIRQ(mpu); - return ret; - } -#else - if (!mpu->intelligent || (mpu->mode == M_UART)) { - MPU401_ReadRaiseIRQ(mpu); - return ret; - } -#endif - - if (mpu->state.rec_copy && !mpu->rec_queue_used) { - mpu->state.rec_copy = 0; - MPU401_EOIHandler(mpu); - return ret; - } - - /* Copy from recording buffer. */ - if (!mpu->queue_used && mpu->rec_queue_used) { - mpu->state.rec_copy = 1; - if (mpu->rec_queue_pos >= MPU401_INPUT_QUEUE) - mpu->rec_queue_pos -= MPU401_INPUT_QUEUE; - MPU401_QueueByte(mpu, mpu->rec_queue[mpu->rec_queue_pos]); - mpu->rec_queue_pos++; - mpu->rec_queue_used--; - } - - MPU401_ReadRaiseIRQ(mpu); - - if ((ret >= 0xf0) && (ret <= 0xf7)) { - /* MIDI data request */ - mpu->state.track = ret & 7; - mpu->state.data_onoff = 0; - mpu->state.cond_req = 0; - mpu->state.track_req = 1; - } - - if (ret == MSG_MPU_COMMAND_REQ) { - mpu->state.data_onoff = 0; - mpu->state.cond_req = 1; - if (mpu->condbuf.type != T_OVERFLOW) { - mpu->state.block_ack = 1; - MPU401_WriteCommand(mpu, mpu->condbuf.value[0]); - if (mpu->state.command_byte) - MPU401_WriteData(mpu, mpu->condbuf.value[1]); - mpu->condbuf.type = T_OVERFLOW; - } - } - - if ((ret == MSG_MPU_END) || (ret == MSG_MPU_CLOCK) || (ret == MSG_MPU_ACK) || (ret == MSG_MPU_OVERFLOW)) - MPU401_EOIHandlerDispatch(mpu); - - return ret; -} - void mpu401_write(uint16_t addr, uint8_t val, void *priv) { @@ -1288,12 +1355,7 @@ mpu401_read(uint16_t addr, void *priv) break; case 1: /* Read Status */ - if (mpu->state.cmd_pending) - ret = STATUS_OUTPUT_NOT_READY; - if (!mpu->queue_used) - ret = STATUS_INPUT_NOT_READY; - ret |= 0x3f; - + ret = MPU401_ReadStatus(mpu); mpu401_log("Read Status (0x331) %x\n", ret); break; @@ -1305,111 +1367,6 @@ mpu401_read(uint16_t addr, void *priv) return ret; } -static void -MPU401_Event(void *priv) -{ - mpu_t *mpu = (mpu_t *) priv; - int max_meascnt; - - mpu401_log("MPU-401 event callback\n"); - -#ifdef DOSBOX_CODE - if (mpu->mode == M_UART) { - timer_disable(&mpu->mpu401_event_callback); - return; - } -#else - if (!mpu->intelligent || (mpu->mode == M_UART)) { - timer_disable(&mpu->mpu401_event_callback); - return; - } -#endif - - if (MPU401_IRQPending(mpu)) - goto next_event; - - if (mpu->state.playing) { - for (uint8_t i = 0; i < 8; i++) { - /* Decrease counters. */ - if (mpu->state.amask & (1 << i)) { - mpu->playbuf[i].counter--; - if (mpu->playbuf[i].counter <= 0) - UpdateTrack(mpu, i); - } - } - - if (mpu->state.conductor) { - mpu->condbuf.counter--; - if (mpu->condbuf.counter <= 0) { - mpu->condbuf.counter = 0xf0; - mpu->state.req_mask |= (1 << 9); - } - } - } - - if (mpu->state.clock_to_host) { - mpu->clock.cth_counter++; - if (mpu->clock.cth_counter >= mpu->clock.cth_rate[mpu->clock.cth_mode]) { - mpu->clock.cth_counter = 0; - mpu->clock.cth_mode++; - mpu->clock.cth_mode %= 4; - mpu->state.req_mask |= (1 << 13); - } - } - - if (mpu->state.rec == M_RECON) { - /* Recording. */ - mpu->clock.rec_counter++; - if (mpu->clock.rec_counter >= 240) { - mpu->clock.rec_counter = 0; - mpu->state.req_mask |= (1 << 8); - } - } - - if (mpu->state.playing || (mpu->state.rec == M_RECON)) { - max_meascnt = (mpu->clock.timebase * mpu->clock.midimetro * mpu->clock.metromeas) / 24; - if (max_meascnt != 0) { - /* Measure end. */ - if (++mpu->clock.measure_counter >= max_meascnt) { - if (mpu->filter.rt_out) - midi_raw_out_rt_byte(0xf8); - mpu->clock.measure_counter = 0; - if (mpu->filter.rec_measure_end && (mpu->state.rec == M_RECON)) - mpu->state.req_mask |= (1 << 12); - } - } - } - - if (!MPU401_IRQPending(mpu) && mpu->state.req_mask) - MPU401_EOIHandler(mpu); - -next_event: - MPU401_RunClock(mpu); - if (mpu->state.sync_in) - mpu->clock.ticks_in++; -} - -static void -MPU401_NotesOff(mpu_t *mpu, int i) -{ - if (mpu->filter.allnotesoff_out && !(mpu->inputref[i].on && (mpu->inputref[i].key[0] | mpu->inputref[i].key[1] | mpu->inputref[i].key[2] | mpu->inputref[i].key[3]))) { - for (uint8_t j = 0; j < 4; j++) - mpu->chanref[mpu->ch_toref[i]].key[j] = 0; - midi_raw_out_byte(0xb0 | i); - midi_raw_out_byte(123); - midi_raw_out_byte(0); - } else if (mpu->chanref[mpu->ch_toref[i]].on) { - for (uint8_t key = 0; key < 128; key++) { - if ((mpu->chanref[mpu->ch_toref[i]].M_GETKEY) && !(mpu->inputref[i].on && (mpu->inputref[i].M_GETKEY))) { - midi_raw_out_byte(0x80 | i); - midi_raw_out_byte(key); - midi_raw_out_byte(0); - } - mpu->chanref[mpu->ch_toref[i]].M_DELKEY; - } - } -} - /*Input handler for SysEx */ int MPU401_InputSysex(void *priv, uint8_t *buffer, uint32_t len, int abort) @@ -1420,14 +1377,12 @@ MPU401_InputSysex(void *priv, uint8_t *buffer, uint32_t len, int abort) mpu401_log("MPU401 Input Sysex\n"); -#ifdef DOSBOX_CODE - if (mpu->mode == M_UART) { -#else if (!mpu->intelligent || mpu->mode == M_UART) { -#endif /* UART mode input. */ for (i = 0; i < len; i++) MPU401_QueueByte(mpu, buffer[i]); + + MPU401_ReadRaiseIRQ(mpu); return 0; } @@ -1440,7 +1395,7 @@ MPU401_InputSysex(void *priv, uint8_t *buffer, uint32_t len, int abort) if (mpu->state.sysex_in_finished) { if (mpu->rec_queue_used >= MPU401_INPUT_QUEUE) return len; - MPU401_RecQueueBuffer(mpu, &val_ff, 1, 1); + MPU401_RecQueueBuffer(mpu, &val_ff, 1); mpu->state.sysex_in_finished = 0; mpu->clock.rec_counter = 0; } @@ -1449,10 +1404,10 @@ MPU401_InputSysex(void *priv, uint8_t *buffer, uint32_t len, int abort) int available = MPU401_INPUT_QUEUE - mpu->rec_queue_used; if (available >= len) { - MPU401_RecQueueBuffer(mpu, buffer, len, 1); + MPU401_RecQueueBuffer(mpu, buffer, len); return 0; } else { - MPU401_RecQueueBuffer(mpu, buffer, available, 1); + MPU401_RecQueueBuffer(mpu, buffer, available); if (mpu->state.sysex_in_finished) return 0; return (len - available); @@ -1490,11 +1445,7 @@ MPU401_InputMsg(void *priv, uint8_t *msg, uint32_t len) mpu401_log("MPU401 Input Msg\n"); -#ifdef DOSBOX_CODE - if (mpu->mode == M_INTELLIGENT) { -#else if (mpu->intelligent && (mpu->mode == M_INTELLIGENT)) { -#endif if (msg[0] < 0x80) { /* Expand running status */ msg[2] = msg[1]; @@ -1606,7 +1557,7 @@ MPU401_InputMsg(void *priv, uint8_t *msg, uint32_t len) if (!(mpu->filter.rt_in && (msg[0] <= 0xfc) && (msg[0] >= 0xfa))) { recdata[0] = 0xff; recdata[1] = msg[0]; - MPU401_RecQueueBuffer(mpu, recdata, 2, 1); + MPU401_RecQueueBuffer(mpu, recdata, 2); send = 0; } } else { /* Common or system. */ @@ -1624,7 +1575,7 @@ MPU401_InputMsg(void *priv, uint8_t *msg, uint32_t len) recmsg[1] = msg[0]; recmsg[2] = msg[1]; recmsg[3] = msg[2]; - MPU401_RecQueueBuffer(mpu, recmsg, len + 1, 1); + MPU401_RecQueueBuffer(mpu, recmsg, len + 1); } if (mpu->filter.rt_affection) { switch (msg[0]) { @@ -1678,7 +1629,7 @@ MPU401_InputMsg(void *priv, uint8_t *msg, uint32_t len) recmsg[1] = msg[0]; recmsg[2] = msg[1]; recmsg[3] = msg[2]; - MPU401_RecQueueBuffer(mpu, recmsg, len + 1, 1); + MPU401_RecQueueBuffer(mpu, recmsg, len + 1); mpu->clock.rec_counter = 0; } else if (mpu->filter.data_in_stop) { if (mpu->filter.timing_in_stop) { @@ -1686,13 +1637,13 @@ MPU401_InputMsg(void *priv, uint8_t *msg, uint32_t len) recmsg[1] = msg[0]; recmsg[2] = msg[1]; recmsg[3] = msg[2]; - MPU401_RecQueueBuffer(mpu, recmsg, len + 1, 1); + MPU401_RecQueueBuffer(mpu, recmsg, len + 1); } else { recmsg[0] = msg[0]; recmsg[1] = msg[1]; recmsg[2] = msg[2]; recmsg[3] = 0; - MPU401_RecQueueBuffer(mpu, recmsg, len, 1); + MPU401_RecQueueBuffer(mpu, recmsg, len); } } } @@ -1702,6 +1653,8 @@ MPU401_InputMsg(void *priv, uint8_t *msg, uint32_t len) /* UART mode input. */ for (i = 0; i < len; i++) MPU401_QueueByte(mpu, msg[i]); + + MPU401_ReadRaiseIRQ(mpu); } void @@ -1823,8 +1776,7 @@ mpu401_standalone_init(const device_t *info) int irq; uint16_t base; - mpu = malloc(sizeof(mpu_t)); - memset(mpu, 0, sizeof(mpu_t)); + mpu = calloc(1, sizeof(mpu_t)); mpu401_log("mpu_init\n"); diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index f51ff4d25..2513d36f6 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -442,7 +442,7 @@ sb_dsp_set_mpu(sb_dsp_t *dsp, mpu_t *mpu) { dsp->mpu = mpu; - if (mpu != NULL) + if (IS_NOT_ESS(dsp) && (mpu != NULL)) mpu401_irq_attach(mpu, sb_dsp_irq_update, sb_dsp_irq_pending, dsp); } From eee7c39b84dd334edc6515316aebb22ecc5571c8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 4 Aug 2024 05:20:04 +0200 Subject: [PATCH 252/624] Modem: Double the size of the FIFO's, should mitigate buffer overflows, fixes #4669. --- src/network/net_modem.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/net_modem.c b/src/network/net_modem.c index 2ed219edf..e48467a86 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -1488,8 +1488,8 @@ modem_init(const device_t *info) modem->clientsocket = modem->serversocket = modem->waitingclientsocket = -1; - fifo8_create(&modem->data_pending, 0x10000); - fifo8_create(&modem->rx_data, 0x10000); + fifo8_create(&modem->data_pending, 0x20000); + fifo8_create(&modem->rx_data, 0x20000); timer_add(&modem->dtr_timer, modem_dtr_callback_timer, modem, 0); timer_add(&modem->host_to_serial_timer, host_to_modem_cb, modem, 0); From db159ecb11be563ed41789202ab6afc22c8af818 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 4 Aug 2024 14:27:47 +0200 Subject: [PATCH 253/624] Add output status command --- src/device/mouse_microtouch_touchscreen.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 9767d5c04..b824d47b5 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -64,7 +64,7 @@ typedef struct mouse_microtouch_t { bool mode_status; uint8_t id, cal_cntr, pen_mode; bool soh; - bool in_reset; + bool in_reset, reset; serial_t *serial; Fifo8 resp; pc_timer_t host_to_serial_timer; @@ -78,6 +78,7 @@ microtouch_reset_complete(void *priv) { mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; + mtouch->reset = true; mtouch->in_reset = false; fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } @@ -135,11 +136,19 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) fifo8_push(&mtouch->resp, 0x0D); return; } + if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'S') { /* Output Status */ + if (mtouch->reset) { + fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x40\x60\x0D", 4); + } else { + fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x40\x40\x0D", 4); + } + return; + } if (mtouch->cmd[0] == 'P') { if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ } - if (mtouch->cmd[0] == 'R') { /* Reset */ + if (mtouch->cmd[0] == 'R') { /* Reset/Defaults */ mtouch->in_reset = true; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; From 01c463df74cb97e221314e8c216f00b3a60aba88 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 4 Aug 2024 16:12:10 +0200 Subject: [PATCH 254/624] Add command handling for more output modes. Fix Reset behavior. --- src/device/mouse_microtouch_touchscreen.c | 50 +++++++++++++++++------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index b824d47b5..d91b10440 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -6,7 +6,7 @@ * * This file is part of the 86Box distribution. * - * 3M MicroTouch SMT3 emulation. + * 3M MicroTouch Serial emulation. * * * @@ -47,6 +47,13 @@ enum mtouch_formats { FORMAT_TABLET = 4 }; +enum mtouch_modes { + MODE_DOWNUP = 1, + MODE_INACTIVE = 2, + MODE_POINT = 3, + MODE_STREAM = 4, +}; + const char* mtouch_identity[] = { "A30100", /* SMT2 Serial / SMT3(R)V */ "A40100", /* SMT2 PCBus */ @@ -60,7 +67,7 @@ typedef struct mouse_microtouch_t { int b; char cmd[256]; int cmd_pos; - uint8_t format; + uint8_t format, mode; bool mode_status; uint8_t id, cal_cntr, pen_mode; bool soh; @@ -106,6 +113,7 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ mouse_set_sample_rate(106); mtouch->format = FORMAT_DEC; + mtouch->mode_status = false; } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ mtouch->pen_mode = 1; @@ -113,10 +121,12 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ mouse_set_sample_rate(106); mtouch->format = FORMAT_HEX; + mtouch->mode_status = false; } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ mouse_set_sample_rate(106); mtouch->format = FORMAT_RAW; + mtouch->mode = MODE_INACTIVE; mtouch->cal_cntr = 0; } if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ @@ -127,9 +137,21 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", 26); } + if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'D' && mtouch->cmd[2] == 'U') { /* Mode Down/Up */ + mtouch->mode = MODE_DOWNUP; + } + if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'I') { /* Mode Inactive */ + mtouch->mode = MODE_INACTIVE; + } + if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'P') { /* Mode Point */ + mtouch->mode = MODE_POINT; + } if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'T') { /* Mode Status */ mtouch->mode_status = true; } + if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ + mtouch->mode = MODE_STREAM; + } if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ fifo8_push(&mtouch->resp, 0x01); fifo8_push_all(&mtouch->resp, (uint8_t *) mtouch_identity[mtouch->id], 6); @@ -148,18 +170,22 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ } - if (mtouch->cmd[0] == 'R') { /* Reset/Defaults */ + if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; - mtouch->mode_status = false; - if (mtouch->id < 2) { - mouse_set_sample_rate(106); - mtouch->format = FORMAT_DEC; - } else { - mouse_set_sample_rate(192); - mtouch->format = FORMAT_TABLET; + if (mtouch->cmd[0] == 'D') { /* Restore Defaults */ + mtouch->mode = MODE_STREAM; + mtouch->mode_status = false; + + if (mtouch->id < 2) { + mouse_set_sample_rate(106); + mtouch->format = FORMAT_DEC; + } else { + mouse_set_sample_rate(192); + mtouch->format = FORMAT_TABLET; + } } timer_on_auto(&mtouch->reset_timer, 500. * 1000.); @@ -236,7 +262,7 @@ mtouch_poll(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - if (fifo8_num_free(&dev->resp) <= 256 - 10 || dev->format == FORMAT_RAW) { + if (fifo8_num_free(&dev->resp) <= 256 - 10 || dev->mode == MODE_INACTIVE) { return 0; } @@ -385,7 +411,7 @@ mtouch_init(const device_t *info) timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); dev->id = device_get_config_int("identity"); dev->pen_mode = 3; - dev->mode_status = false; + dev->mode = MODE_STREAM; if (dev->id < 2) { /* legacy controllers */ dev->format = FORMAT_DEC; From 885a92ae62a1f3117e30d01c0e5ad4b62e2542c7 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 4 Aug 2024 22:28:39 +0200 Subject: [PATCH 255/624] AMD/DC390 SCSI fixes of the day (August 4th, 2024) Ported the latest changes/fixes to the above controller from QEMU and added a bios-less AMD Am53c974 device (non-DC390). The latest changes fix the AMD-branded DOS ASPI drivers on both cards (even without bios). --- src/fifo8.c | 88 +- src/include/86box/fifo8.h | 70 +- src/include/86box/scsi_pcscsi.h | 1 + src/scsi/scsi.c | 1 + src/scsi/scsi_pcscsi.c | 1331 ++++++++++++++++++++----------- 5 files changed, 983 insertions(+), 508 deletions(-) diff --git a/src/fifo8.c b/src/fifo8.c index feef0deb2..9c73b4e82 100644 --- a/src/fifo8.c +++ b/src/fifo8.c @@ -21,14 +21,19 @@ #include <86box/86box.h> #include <86box/fifo8.h> +void +fifo8_reset(Fifo8 *fifo) +{ + fifo->num = 0; + fifo->head = 0; +} + void fifo8_create(Fifo8 *fifo, uint32_t capacity) { - fifo->data = (uint8_t *) malloc(capacity); - memset(fifo->data, 0, capacity); + fifo->data = (uint8_t *) calloc(1, capacity); fifo->capacity = capacity; - fifo->head = 0; - fifo->num = 0; + fifo8_reset(fifo); } void @@ -54,7 +59,7 @@ fifo8_push_all(Fifo8 *fifo, const uint8_t *data, uint32_t num) uint32_t start; uint32_t avail; - assert(fifo->num + num <= fifo->capacity); + assert((fifo->num + num) <= fifo->capacity); start = (fifo->head + fifo->num) % fifo->capacity; @@ -81,25 +86,72 @@ fifo8_pop(Fifo8 *fifo) return ret; } -const uint8_t * -fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *num) +static const uint8_t +*fifo8_peekpop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr, int do_pop) { - const uint8_t *ret; + uint8_t *ret; + uint32_t num; + + assert((max > 0) && (max <= fifo->num)); + num = MIN(fifo->capacity - fifo->head, max); + ret = &fifo->data[fifo->head]; + + if (do_pop) { + fifo->head += num; + fifo->head %= fifo->capacity; + fifo->num -= num; + } + if (numptr) + *numptr = num; - assert(max > 0 && max <= fifo->num); - *num = MIN(fifo->capacity - fifo->head, max); - ret = &fifo->data[fifo->head]; - fifo->head += *num; - fifo->head %= fifo->capacity; - fifo->num -= *num; return ret; } -void -fifo8_reset(Fifo8 *fifo) +const uint8_t +*fifo8_peek_bufptr(Fifo8 *fifo, uint32_t max, uint32_t *numptr) { - fifo->num = 0; - fifo->head = 0; + return fifo8_peekpop_buf(fifo, max, numptr, 0); +} + +const uint8_t +*fifo8_pop_bufptr(Fifo8 *fifo, uint32_t max, uint32_t *numptr) +{ + return fifo8_peekpop_buf(fifo, max, numptr, 1); +} + +uint32_t +fifo8_pop_buf(Fifo8 *fifo, uint8_t *dest, uint32_t destlen) +{ + const uint8_t *buf; + uint32_t n1, n2 = 0; + uint32_t len; + + if (destlen == 0) + return 0; + + len = destlen; + buf = fifo8_pop_bufptr(fifo, len, &n1); + if (dest) + memcpy(dest, buf, n1); + + /* Add FIFO wraparound if needed */ + len -= n1; + len = MIN(len, fifo8_num_used(fifo)); + if (len) { + buf = fifo8_pop_bufptr(fifo, len, &n2); + if (dest) { + memcpy(&dest[n1], buf, n2); + } + } + + return n1 + n2; +} + +void +fifo8_drop(Fifo8 *fifo, uint32_t len) +{ + len -= fifo8_pop_buf(fifo, NULL, len); + assert(len == 0); } int diff --git a/src/include/86box/fifo8.h b/src/include/86box/fifo8.h index 9f88ec408..7dec1d57d 100644 --- a/src/include/86box/fifo8.h +++ b/src/include/86box/fifo8.h @@ -69,28 +69,80 @@ extern uint8_t fifo8_pop(Fifo8 *fifo); /** * fifo8_pop_buf: * @fifo: FIFO to pop from - * @max: maximum number of bytes to pop - * @num: actual number of returned bytes + * @dest: the buffer to write the data into (can be NULL) + * @destlen: size of @dest and maximum number of bytes to pop * - * Pop a number of elements from the FIFO up to a maximum of max. The buffer + * Pop a number of elements from the FIFO up to a maximum of @destlen. + * The popped data is copied into the @dest buffer. + * Care is taken when the data wraps around in the ring buffer. + * + * Returns: number of bytes popped. + */ +extern uint32_t fifo8_pop_buf(Fifo8 *fifo, uint8_t *dest, uint32_t destlen); + +/** + * fifo8_pop_bufptr: + * @fifo: FIFO to pop from + * @max: maximum number of bytes to pop + * @numptr: pointer filled with number of bytes returned (can be NULL) + * + * New code should prefer to use fifo8_pop_buf() instead of fifo8_pop_bufptr(). + * + * Pop a number of elements from the FIFO up to a maximum of @max. The buffer * containing the popped data is returned. This buffer points directly into - * the FIFO backing store and data is invalidated once any of the fifo8_* APIs - * are called on the FIFO. + * the internal FIFO backing store and data (without checking for overflow!) + * and is invalidated once any of the fifo8_* APIs are called on the FIFO. * * The function may return fewer bytes than requested when the data wraps * around in the ring buffer; in this case only a contiguous part of the data * is returned. * - * The number of valid bytes returned is populated in *num; will always return - * at least 1 byte. max must not be 0 or greater than the number of bytes in - * the FIFO. + * The number of valid bytes returned is populated in *@numptr; will always + * return at least 1 byte. max must not be 0 or greater than the number of + * bytes in the FIFO. * * Clients are responsible for checking the availability of requested data * using fifo8_num_used(). * * Returns: A pointer to popped data. */ -extern const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *num); +extern const uint8_t *fifo8_pop_bufptr(Fifo8 *fifo, uint32_t max, uint32_t *numptr); + +/** + * fifo8_peek_bufptr: read upto max bytes from the fifo + * @fifo: FIFO to read from + * @max: maximum number of bytes to peek + * @numptr: pointer filled with number of bytes returned (can be NULL) + * + * Peek into a number of elements from the FIFO up to a maximum of @max. + * The buffer containing the data peeked into is returned. This buffer points + * directly into the FIFO backing store. Since data is invalidated once any + * of the fifo8_* APIs are called on the FIFO, it is the caller responsibility + * to access it before doing further API calls. + * + * The function may return fewer bytes than requested when the data wraps + * around in the ring buffer; in this case only a contiguous part of the data + * is returned. + * + * The number of valid bytes returned is populated in *@numptr; will always + * return at least 1 byte. max must not be 0 or greater than the number of + * bytes in the FIFO. + * + * Clients are responsible for checking the availability of requested data + * using fifo8_num_used(). + * + * Returns: A pointer to peekable data. + */ +extern const uint8_t *fifo8_peek_bufptr(Fifo8 *fifo, uint32_t max, uint32_t *numptr); + +/** + * fifo8_drop: + * @fifo: FIFO to drop bytes + * @len: number of bytes to drop + * + * Drop (consume) bytes from a FIFO. + */ +extern void fifo8_drop(Fifo8 *fifo, uint32_t len); /** * fifo8_reset: diff --git a/src/include/86box/scsi_pcscsi.h b/src/include/86box/scsi_pcscsi.h index 3acee78f9..8547aba25 100644 --- a/src/include/86box/scsi_pcscsi.h +++ b/src/include/86box/scsi_pcscsi.h @@ -25,6 +25,7 @@ #ifndef SCSI_PCSCSI_H #define SCSI_PCSCSI_H +extern const device_t am53c974_pci_device; extern const device_t dc390_pci_device; extern const device_t ncr53c90a_mca_device; diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index 591ef2aa3..bbce63651 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -82,6 +82,7 @@ static SCSI_CARD scsi_cards[] = { { &ncr53c825a_pci_device, }, { &ncr53c860_pci_device, }, { &ncr53c875_pci_device, }, + { &am53c974_pci_device, }, { &dc390_pci_device, }, { &buslogic_445s_device, }, { &buslogic_445c_device, }, diff --git a/src/scsi/scsi_pcscsi.c b/src/scsi/scsi_pcscsi.c index a714ada96..720fcef82 100644 --- a/src/scsi/scsi_pcscsi.c +++ b/src/scsi/scsi_pcscsi.c @@ -26,6 +26,7 @@ #include #include #include +#include #define HAVE_STDARG_H #include #include <86box/86box.h> @@ -47,6 +48,7 @@ #include <86box/fifo8.h> #define DC390_ROM "roms/scsi/esp_pci/INT13.BIN" +#define AM53C974_ROM "roms/scsi/esp_pci/harom.bin" #define ESP_REGS 16 #define ESP_FIFO_SZ 16 @@ -174,6 +176,7 @@ typedef struct esp_t { Fifo8 cmdfifo; uint32_t do_cmd; uint8_t cmdfifo_cdb_offset; + int data_ready; int32_t xfer_counter; int dma_enabled; @@ -186,6 +189,7 @@ typedef struct esp_t { pc_timer_t timer; + int local; int mca; uint16_t Base; uint8_t HostID; @@ -204,6 +208,9 @@ typedef struct esp_t { #define READ_FROM_DEVICE 1 #define WRITE_TO_DEVICE 0 +uint8_t esp_pci_regs[256]; +bar_t esp_pci_bar[2]; + #ifdef ENABLE_ESP_LOG int esp_do_log = ENABLE_ESP_LOG; @@ -223,16 +230,62 @@ esp_log(const char *fmt, ...) #endif static void esp_dma_enable(esp_t *dev, int level); -static void esp_do_dma(esp_t *dev, scsi_device_t *sd); -static void esp_do_nodma(esp_t *dev, scsi_device_t *sd); +static void esp_do_dma(esp_t *dev); +static void esp_do_nodma(esp_t *dev); static void esp_pci_dma_memory_rw(esp_t *dev, uint8_t *buf, uint32_t len, int dir); static void esp_timer_on(esp_t *dev, scsi_device_t *sd, double p); static void esp_command_complete(void *priv, uint32_t status); -static void esp_pci_command_complete(void *priv, uint32_t status); +static void esp_dma_ti_check(esp_t *dev); +static void esp_nodma_ti_dataout(esp_t *dev); static void esp_pci_soft_reset(esp_t *dev); static void esp_pci_hard_reset(esp_t *dev); static void handle_ti(void *priv); +static int +esp_cdb_length(uint8_t *buf) +{ + int cdb_len; + + switch (buf[0] >> 5) { + case 0: + case 3: + cdb_len = 6; + break; + case 1: + case 2: + case 6: + cdb_len = 10; + break; + case 4: + cdb_len = 16; + break; + case 5: + cdb_len = 12; + break; + default: + cdb_len = -1; + break; + } + return cdb_len; +} + +static void +esp_pci_update_irq(esp_t *dev) +{ + int scsi_level = !!(dev->dma_regs[DMA_STAT] & DMA_STAT_SCSIINT); + int dma_level = (dev->dma_regs[DMA_CMD] & DMA_CMD_INTE_D) ? + !!(dev->dma_regs[DMA_STAT] & DMA_STAT_DONE) : 0; + int level = scsi_level || dma_level; + + if (level) { + pci_set_irq(dev->pci_slot, PCI_INTA, &dev->irq_state); + esp_log("Raising PCI IRQ...\n"); + } else { + pci_clear_irq(dev->pci_slot, PCI_INTA, &dev->irq_state); + esp_log("Lowering PCI IRQ...\n"); + } +} + static void esp_irq(esp_t *dev, int level) { @@ -246,12 +299,21 @@ esp_irq(esp_t *dev, int level) } } else { if (level) { - pci_set_irq(dev->pci_slot, PCI_INTA, &dev->irq_state); - esp_log("Raising IRQ...\n"); - } else { - pci_clear_irq(dev->pci_slot, PCI_INTA, &dev->irq_state); - esp_log("Lowering IRQ...\n"); - } + dev->dma_regs[DMA_STAT] |= DMA_STAT_SCSIINT; + /* + * If raising the ESP IRQ to indicate end of DMA transfer, set + * DMA_STAT_DONE at the same time. In theory this should be done in + * esp_pci_dma_memory_rw(), however there is a delay between setting + * DMA_STAT_DONE and the ESP IRQ arriving which is visible to the + * guest that can cause confusion e.g. Linux + */ + if ((dev->dma_regs[DMA_CMD] & DMA_CMD_MASK) == 0x3 && + dev->dma_regs[DMA_WBC] == 0) + dev->dma_regs[DMA_STAT] |= DMA_STAT_DONE; + } else + dev->dma_regs[DMA_STAT] &= ~DMA_STAT_SCSIINT; + + esp_pci_update_irq(dev); } } @@ -274,41 +336,46 @@ esp_lower_irq(esp_t *dev) } static void -esp_fifo_push(Fifo8 *fifo, uint8_t val) +esp_set_phase(esp_t *dev, uint8_t phase) { - if (fifo8_num_used(fifo) == fifo->capacity) { - return; - } - - fifo8_push(fifo, val); + dev->rregs[ESP_RSTAT] &= ~7; + dev->rregs[ESP_RSTAT] |= phase; } static uint8_t -esp_fifo_pop(Fifo8 *fifo) +esp_get_phase(esp_t *dev) { - if (fifo8_is_empty(fifo)) { - return 0; - } + return dev->rregs[ESP_RSTAT] & 7; +} - return fifo8_pop(fifo); +static void +esp_fifo_push(esp_t *dev, uint8_t val) +{ + if (fifo8_num_used(&dev->fifo) == dev->fifo.capacity) + return; + + fifo8_push(&dev->fifo, val); +} + +static uint8_t +esp_fifo_pop(esp_t *dev) +{ + uint8_t val; + + if (fifo8_is_empty(&dev->fifo)) + val = 0; + else + val = fifo8_pop(&dev->fifo); + + return val; } static uint32_t -esp_fifo_pop_buf(Fifo8 *fifo, uint8_t *dest, int maxlen) +esp_fifo_pop_buf(esp_t *dev, uint8_t *dest, int maxlen) { - const uint8_t *buf; - uint32_t n; + uint32_t len = fifo8_pop_buf(&dev->fifo, dest, maxlen); - if (maxlen == 0) { - return 0; - } - - buf = fifo8_pop_buf(fifo, maxlen, &n); - if (dest) { - memcpy(dest, buf, n); - } - - return n; + return len; } static uint32_t @@ -326,9 +393,14 @@ esp_get_tc(esp_t *dev) static void esp_set_tc(esp_t *dev, uint32_t dmalen) { + uint32_t old_tc = esp_get_tc(dev); + dev->rregs[ESP_TCLO] = dmalen; dev->rregs[ESP_TCMID] = dmalen >> 8; dev->rregs[ESP_TCHI] = dmalen >> 16; + + if (old_tc && !dmalen) + dev->rregs[ESP_RSTAT] |= STAT_TC; } static uint32_t @@ -343,64 +415,91 @@ esp_get_stc(esp_t *dev) return dmalen; } -static void -esp_dma_done(esp_t *dev) +static int +esp_select(esp_t *dev) { - dev->rregs[ESP_RSTAT] |= STAT_TC; - dev->rregs[ESP_RINTR] = INTR_BS; - dev->rregs[ESP_RSEQ] = 0; - dev->rregs[ESP_RFLAGS] = 0; - esp_set_tc(dev, 0); - esp_log("ESP DMA Finished\n"); - esp_raise_irq(dev); -} - -static uint32_t -esp_get_cmd(esp_t *dev, uint32_t maxlen) -{ - uint8_t buf[ESP_CMDFIFO_SZ]; - uint32_t dmalen; - uint32_t n; + scsi_device_t *sd; dev->id = dev->wregs[ESP_WBUSID] & BUSID_DID; - if (dev->dma) { - dmalen = MIN(esp_get_tc(dev), maxlen); - esp_log("ESP Get data, dmalen = %d\n", dmalen); - if (dmalen == 0) - return 0; - if (dev->mca) { - dma_set_drq(dev->DmaChannel, 1); - while (dev->dma_86c01.pos < dmalen) { - int val = dma_channel_read(dev->DmaChannel); - buf[dev->dma_86c01.pos++] = val & 0xff; - } - dev->dma_86c01.pos = 0; - dma_set_drq(dev->DmaChannel, 0); - } else { - esp_pci_dma_memory_rw(dev, buf, dmalen, WRITE_TO_DEVICE); - } - dmalen = MIN(fifo8_num_free(&dev->cmdfifo), dmalen); - fifo8_push_all(&dev->cmdfifo, buf, dmalen); - } else { - dmalen = MIN(fifo8_num_used(&dev->fifo), maxlen); - esp_log("ESP Get command, dmalen = %i\n", dmalen); - if (dmalen == 0) { - return 0; - } - n = esp_fifo_pop_buf(&dev->fifo, buf, dmalen); - n = MIN(fifo8_num_free(&dev->cmdfifo), n); - fifo8_push_all(&dev->cmdfifo, buf, n); - } + sd = &scsi_devices[dev->bus][dev->id]; dev->ti_size = 0; - fifo8_reset(&dev->fifo); + dev->rregs[ESP_RSEQ] = SEQ_0; - dev->rregs[ESP_RINTR] |= INTR_FC; - dev->rregs[ESP_RSEQ] = SEQ_CD; + if (!scsi_device_present(sd)) { + esp_log("ESP SCSI no devices on ID %d, LUN %d\n", dev->id, dev->lun); + /* No such drive */ + dev->rregs[ESP_RSTAT] = 0; + dev->rregs[ESP_RINTR] = INTR_DC; + esp_raise_irq(dev); + return -1; + } else + esp_log("ESP SCSI device present on ID %d, LUN %d\n", dev->id, dev->lun); - return dmalen; + return 0; } + /* Callback to indicate that the SCSI layer has completed a transfer. */ +static void +esp_transfer_data(esp_t *dev) +{ + if (!dev->data_ready) { + dev->data_ready = 1; + + switch (dev->rregs[ESP_CMD]) { + case CMD_SEL: + case (CMD_SEL | CMD_DMA): + case CMD_SELATN: + case (CMD_SELATN | CMD_DMA): + /* + * Initial incoming data xfer is complete for sequencer command + * so raise deferred bus service and function complete interrupt + */ + dev->rregs[ESP_RINTR] |= (INTR_BS | INTR_FC); + dev->rregs[ESP_RSEQ] = SEQ_CD; + break; + + case CMD_SELATNS: + case (CMD_SELATNS | CMD_DMA): + /* + * Initial incoming data xfer is complete so raise command + * completion interrupt + */ + dev->rregs[ESP_RINTR] |= INTR_BS; + dev->rregs[ESP_RSEQ] = SEQ_MO; + break; + + case CMD_TI: + case (CMD_TI | CMD_DMA): + /* + * Bus service interrupt raised because of initial change to + * DATA phase + */ + dev->rregs[ESP_CMD] = 0; + dev->rregs[ESP_RINTR] |= INTR_BS; + break; + } + + esp_raise_irq(dev); + } + + /* + * Always perform the initial transfer upon reception of the next TI + * command to ensure the DMA/non-DMA status of the command is correct. + * It is not possible to use s->dma directly in the section below as + * some OSs send non-DMA NOP commands after a DMA transfer. Hence if the + * async data transfer is delayed then s->dma is set incorrectly. + */ + + if (dev->rregs[ESP_CMD] == (CMD_TI | CMD_DMA)) { + /* When the SCSI layer returns more data, raise deferred INTR_BS */ + esp_dma_ti_check(dev); + esp_do_dma(dev); + } else if (dev->rregs[ESP_CMD] == CMD_TI) + esp_do_nodma(dev); +} + + static void esp_do_command_phase(esp_t *dev) { @@ -416,7 +515,7 @@ esp_do_command_phase(esp_t *dev) if (!cmdlen) return; - esp_fifo_pop_buf(&dev->cmdfifo, buf, cmdlen); + fifo8_pop_buf(&dev->cmdfifo, buf, cmdlen); for (int i = 0; i < cmdlen; i++) esp_log("CDB[%i] = %02x\n", i, buf[i]); @@ -427,46 +526,36 @@ esp_do_command_phase(esp_t *dev) dev->ti_size = sd->buffer_length; dev->xfer_counter = sd->buffer_length; - esp_log("ESP SCSI Command = 0x%02x, ID = %d, LUN = %d, len = %d\n", buf[0], dev->id, dev->lun, sd->buffer_length); + pclog("ESP SCSI Command = 0x%02x, ID = %d, LUN = %d, len = %d, phase = %02x.\n", buf[0], dev->id, dev->lun, sd->buffer_length, sd->phase); fifo8_reset(&dev->cmdfifo); + dev->data_ready = 0; if (sd->buffer_length > 0) { - /* This should be set to the underlying device's buffer by command phase 0. */ - dev->rregs[ESP_RSTAT] = STAT_TC; - dev->rregs[ESP_RSEQ] = SEQ_CD; - if (sd->phase == SCSI_PHASE_DATA_IN) { - dev->rregs[ESP_RSTAT] |= STAT_DI; + esp_set_phase(dev, STAT_DI); esp_log("ESP Data In\n"); esp_timer_on(dev, sd, scsi_device_get_callback(sd)); } else if (sd->phase == SCSI_PHASE_DATA_OUT) { - dev->rregs[ESP_RSTAT] |= STAT_DO; - esp_log("ESP Data Out\n"); + esp_set_phase(dev, STAT_DO); dev->ti_size = -sd->buffer_length; + esp_log("ESP Data Out\n"); esp_timer_on(dev, sd, scsi_device_get_callback(sd)); } esp_log("ESP SCSI Start reading/writing\n"); - esp_do_dma(dev, sd); + esp_do_dma(dev); } else { - esp_log("ESP SCSI Command with no length\n"); - if (dev->mca) { - if (buf[0] == 0x43) { - dev->rregs[ESP_RSTAT] = STAT_DI | STAT_TC; - dev->rregs[ESP_RSEQ] = SEQ_CD; - esp_do_dma(dev, sd); - } else - esp_command_complete(dev, sd->status); - } else - esp_pci_command_complete(dev, sd->status); + if (dev->mca && (buf[0] == 0x43) && (sd->phase == SCSI_PHASE_STATUS)) { + esp_set_phase(dev, STAT_DI); + scsi_device_command_phase1(sd); + } + pclog("ESP SCSI Command with no length\n"); + esp_command_complete(dev, sd->status); } - - scsi_device_identify(sd, SCSI_LUN_USE_CDB); - - dev->rregs[ESP_RINTR] |= (INTR_BS | INTR_FC); - esp_raise_irq(dev); + esp_transfer_data(dev); } + static void esp_do_message_phase(esp_t *dev) { @@ -474,19 +563,18 @@ esp_do_message_phase(esp_t *dev) uint8_t message; if (dev->cmdfifo_cdb_offset) { - message = esp_fifo_pop(&dev->cmdfifo); + message = fifo8_is_empty(&dev->cmdfifo) ? 0 : + fifo8_pop(&dev->cmdfifo); dev->lun = message & 7; dev->cmdfifo_cdb_offset--; if (scsi_device_present(&scsi_devices[dev->bus][dev->id]) && (dev->lun > 0)) { /* We only support LUN 0 */ - esp_log("LUN = %i\n", dev->lun); + pclog("LUN = %i\n", dev->lun); dev->rregs[ESP_RSTAT] = 0; dev->rregs[ESP_RINTR] = INTR_DC; - dev->rregs[ESP_RSEQ] = SEQ_0; esp_raise_irq(dev); - fifo8_reset(&dev->cmdfifo); return; } @@ -497,7 +585,7 @@ esp_do_message_phase(esp_t *dev) if (dev->cmdfifo_cdb_offset) { len = MIN(dev->cmdfifo_cdb_offset, fifo8_num_used(&dev->cmdfifo)); - esp_fifo_pop_buf(&dev->cmdfifo, NULL, len); + fifo8_drop(&dev->cmdfifo, len); dev->cmdfifo_cdb_offset = 0; } } @@ -505,9 +593,10 @@ esp_do_message_phase(esp_t *dev) static void esp_do_cmd(esp_t *dev) { + esp_log("DO CMD.\n"); esp_do_message_phase(dev); - if (dev->cmdfifo_cdb_offset == 0) - esp_do_command_phase(dev); + assert(dev->cmdfifo_cdb_offset == 0); + esp_do_command_phase(dev); } static void @@ -544,265 +633,550 @@ esp_hard_reset(esp_t *dev) esp_log("ESP Reset\n"); for (uint8_t i = 0; i < 16; i++) scsi_device_reset(&scsi_devices[dev->bus][i]); + timer_stop(&dev->timer); } -static void -esp_do_nodma(esp_t *dev, scsi_device_t *sd) +static int +esp_cdb_ready(esp_t *dev) { - int count; + int len = fifo8_num_used(&dev->cmdfifo) - dev->cmdfifo_cdb_offset; + const uint8_t *pbuf; + uint32_t n; + int cdblen; - esp_log("ESP SCSI Actual FIFO len = %d\n", dev->xfer_counter); + if (len <= 0) + return 0; - if (dev->do_cmd) { - esp_log("ESP Command on FIFO\n"); - dev->ti_size = 0; - - if ((dev->rregs[ESP_RSTAT] & 7) == STAT_CD) { - if (dev->cmdfifo_cdb_offset == fifo8_num_used(&dev->cmdfifo)) { - esp_log("CDB offset = %i used return\n", dev->cmdfifo_cdb_offset); - return; - } - - dev->do_cmd = 0; - esp_do_cmd(dev); - } else { - dev->cmdfifo_cdb_offset = fifo8_num_used(&dev->cmdfifo); - esp_log("CDB offset = %i used\n", dev->cmdfifo_cdb_offset); - - dev->rregs[ESP_RSTAT] = STAT_TC | STAT_CD; - dev->rregs[ESP_RSEQ] = SEQ_CD; - dev->rregs[ESP_RINTR] |= INTR_BS; - esp_raise_irq(dev); - } - return; + pbuf = fifo8_peek_bufptr(&dev->cmdfifo, len, &n); + if (n < len) { + /* + * In normal use the cmdfifo should never wrap, but include this check + * to prevent a malicious guest from reading past the end of the + * cmdfifo data buffer below + */ + return 0; } - if (dev->xfer_counter == 0) { - /* Wait until data is available. */ - esp_log("(ID=%02i LUN=%02i): FIFO no data available\n", dev->id, dev->lun); - return; - } + cdblen = esp_cdb_length((uint8_t *)&pbuf[dev->cmdfifo_cdb_offset]); - esp_log("ESP FIFO = %d, buffer length = %d\n", dev->xfer_counter, sd->buffer_length); + return (cdblen < 0) ? 0 : (len >= cdblen); +} - if (sd->phase == SCSI_PHASE_DATA_IN) { - if (fifo8_is_empty(&dev->fifo)) { - fifo8_push(&dev->fifo, sd->sc->temp_buffer[dev->buffer_pos]); - dev->buffer_pos++; - dev->ti_size--; - dev->xfer_counter--; - } - } else if (sd->phase == SCSI_PHASE_DATA_OUT) { - count = MIN(fifo8_num_used(&dev->fifo), ESP_FIFO_SZ); - esp_fifo_pop_buf(&dev->fifo, sd->sc->temp_buffer + dev->buffer_pos, count); - dev->buffer_pos += count; - dev->ti_size += count; - dev->xfer_counter -= count; - } - - esp_log("ESP FIFO Transfer bytes = %d\n", dev->xfer_counter); - if (dev->xfer_counter <= 0) { - if (sd->phase == SCSI_PHASE_DATA_OUT) { - if (dev->ti_size < 0) { - esp_log("ESP FIFO Keep writing\n"); - esp_do_nodma(dev, sd); - } else { - esp_log("ESP FIFO Write finished\n"); - scsi_device_command_phase1(sd); - if (dev->mca) { - esp_command_complete(dev, sd->status); - } else - esp_pci_command_complete(dev, sd->status); - } - } else if (sd->phase == SCSI_PHASE_DATA_IN) { - /* If there is still data to be read from the device then - complete the DMA operation immediately. Otherwise defer - until the scsi layer has completed. */ - if (dev->ti_size <= 0) { - esp_log("ESP FIFO Read finished\n"); - scsi_device_command_phase1(sd); - if (dev->mca) { - esp_command_complete(dev, sd->status); - } else - esp_pci_command_complete(dev, sd->status); - } else { - esp_log("ESP FIFO Keep reading\n"); - esp_do_nodma(dev, sd); - } - } - } else { - /* Partially filled a scsi buffer. Complete immediately. */ - esp_log("ESP SCSI Partially filled the FIFO buffer\n"); +static void +esp_dma_ti_check(esp_t *dev) +{ + if ((esp_get_tc(dev) == 0) && (fifo8_num_used(&dev->fifo) < 2)) { dev->rregs[ESP_RINTR] |= INTR_BS; esp_raise_irq(dev); } } static void -esp_do_dma(esp_t *dev, scsi_device_t *sd) +esp_do_dma(esp_t *dev) { + scsi_device_t *sd = &scsi_devices[dev->bus][dev->id]; uint8_t buf[ESP_CMDFIFO_SZ]; - uint32_t tdbc; - int count; + uint32_t len; - esp_log("ESP SCSI Actual DMA len = %d\n", esp_get_tc(dev)); + pclog("ESP SCSI Actual DMA len = %d\n", esp_get_tc(dev)); - if (!scsi_device_present(sd)) { - esp_log("ESP SCSI no devices on ID %d, LUN %d\n", dev->id, dev->lun); - /* No such drive */ - dev->rregs[ESP_RSTAT] = 0; - dev->rregs[ESP_RINTR] = INTR_DC; - dev->rregs[ESP_RSEQ] = SEQ_0; - esp_raise_irq(dev); - fifo8_reset(&dev->cmdfifo); - return; - } else { - esp_log("ESP SCSI device found on ID %d, LUN %d\n", dev->id, dev->lun); - } + len = esp_get_tc(dev); - count = tdbc = esp_get_tc(dev); + switch (esp_get_phase(dev)) { + case STAT_MO: + len = MIN(len, fifo8_num_free(&dev->cmdfifo)); + if (dev->mca) { + dma_set_drq(dev->DmaChannel, 1); + while (dev->dma_86c01.pos < len) { + int val = dma_channel_read(dev->DmaChannel); + buf[dev->dma_86c01.pos++] = val & 0xff; + } + dev->dma_86c01.pos = 0; + dma_set_drq(dev->DmaChannel, 0); + } else + esp_pci_dma_memory_rw(dev, buf, len, WRITE_TO_DEVICE); - if (dev->mca) { - if (sd->buffer_length < 0) { - if (dev->dma_enabled) - goto done; - else - goto partial; - } - } + esp_set_tc(dev, esp_get_tc(dev) - len); + fifo8_push_all(&dev->cmdfifo, buf, len); + dev->cmdfifo_cdb_offset += len; - if (dev->do_cmd) { - esp_log("ESP Command on DMA\n"); - count = MIN(count, fifo8_num_free(&dev->cmdfifo)); - if (dev->mca) { - dma_set_drq(dev->DmaChannel, 1); - while (dev->dma_86c01.pos < count) { - dma_channel_write(dev->DmaChannel, buf[dev->dma_86c01.pos]); - dev->dma_86c01.pos++; + switch (dev->rregs[ESP_CMD]) { + case (CMD_SELATN | CMD_DMA): + if (fifo8_num_used(&dev->cmdfifo) >= 1) { + /* First byte received, switch to command phase */ + esp_set_phase(dev, STAT_CD); + dev->rregs[ESP_RSEQ] = SEQ_CD; + dev->cmdfifo_cdb_offset = 1; + + if (fifo8_num_used(&dev->cmdfifo) > 1) { + /* Process any additional command phase data */ + esp_do_dma(dev); + } + } + break; + + case (CMD_SELATNS | CMD_DMA): + if (fifo8_num_used(&dev->cmdfifo) == 1) { + /* First byte received, stop in message out phase */ + dev->rregs[ESP_RSEQ] = SEQ_MO; + dev->cmdfifo_cdb_offset = 1; + + /* Raise command completion interrupt */ + dev->rregs[ESP_RINTR] |= (INTR_BS | INTR_FC); + esp_raise_irq(dev); + } + break; + + case (CMD_TI | CMD_DMA): + /* ATN remains asserted until TC == 0 */ + if (esp_get_tc(dev) == 0) { + esp_set_phase(dev, STAT_CD); + dev->rregs[ESP_CMD] = 0; + dev->rregs[ESP_RINTR] |= INTR_BS; + esp_raise_irq(dev); + } + break; + + default: + break; } - dev->dma_86c01.pos = 0; - dma_set_drq(dev->DmaChannel, 0); - } else - esp_pci_dma_memory_rw(dev, buf, count, READ_FROM_DEVICE); - fifo8_push_all(&dev->cmdfifo, buf, count); - dev->ti_size = 0; + break; - if ((dev->rregs[ESP_RSTAT] & 7) == STAT_CD) { - if (dev->cmdfifo_cdb_offset == fifo8_num_used(&dev->cmdfifo)) + case STAT_CD: + len = MIN(len, fifo8_num_free(&dev->cmdfifo)); + if (dev->mca) { + dma_set_drq(dev->DmaChannel, 1); + while (dev->dma_86c01.pos < len) { + int val = dma_channel_read(dev->DmaChannel); + buf[dev->dma_86c01.pos++] = val & 0xff; + } + dev->dma_86c01.pos = 0; + dma_set_drq(dev->DmaChannel, 0); + } else + esp_pci_dma_memory_rw(dev, buf, len, WRITE_TO_DEVICE); + + fifo8_push_all(&dev->cmdfifo, buf, len); + esp_set_tc(dev, esp_get_tc(dev) - len); + dev->ti_size = 0; + if (esp_get_tc(dev) == 0) { + /* Command has been received */ + esp_do_cmd(dev); + } + break; + + case STAT_DO: + if (!dev->xfer_counter && esp_get_tc(dev)) { + /* Defer until data is available. */ return; - - dev->do_cmd = 0; - esp_do_cmd(dev); - } else { - dev->cmdfifo_cdb_offset = fifo8_num_used(&dev->cmdfifo); - - dev->rregs[ESP_RSTAT] = STAT_TC | STAT_CD; - dev->rregs[ESP_RSEQ] = SEQ_CD; - dev->rregs[ESP_RINTR] |= INTR_BS; - esp_raise_irq(dev); - } - return; - } - - if (dev->xfer_counter == 0) { - /* Wait until data is available. */ - esp_log("(ID=%02i LUN=%02i): DMA no data available\n", dev->id, dev->lun); - return; - } - - esp_log("ESP SCSI dmaleft = %d, buffer length = %d\n", esp_get_tc(dev), sd->buffer_length); - - /* Make sure count is never bigger than buffer_length. */ - if (count > dev->xfer_counter) - count = dev->xfer_counter; - - if (sd->phase == SCSI_PHASE_DATA_IN) { - esp_log("ESP SCSI Read, dma cnt = %i, ti size = %i, positive len = %i\n", esp_get_tc(dev), dev->ti_size, count); - if (dev->mca) { - dma_set_drq(dev->DmaChannel, 1); - while (dev->dma_86c01.pos < count) { - dma_channel_write(dev->DmaChannel, sd->sc->temp_buffer[dev->buffer_pos + dev->dma_86c01.pos]); - esp_log("ESP SCSI DMA read for 53C9x: pos = %i, val = %02x\n", dev->dma_86c01.pos, sd->sc->temp_buffer[dev->buffer_pos + dev->dma_86c01.pos]); - dev->dma_86c01.pos++; } - dev->dma_86c01.pos = 0; - dma_set_drq(dev->DmaChannel, 0); - } else { - esp_pci_dma_memory_rw(dev, sd->sc->temp_buffer + dev->buffer_pos, count, READ_FROM_DEVICE); - } - } else if (sd->phase == SCSI_PHASE_DATA_OUT) { - esp_log("ESP SCSI Write, negative len = %i, ti size = %i, dma cnt = %i\n", count, -dev->ti_size, esp_get_tc(dev)); - if (dev->mca) { - dma_set_drq(dev->DmaChannel, 1); - while (dev->dma_86c01.pos < count) { - int val = dma_channel_read(dev->DmaChannel); - esp_log("ESP SCSI DMA write for 53C9x: pos = %i, val = %02x\n", dev->dma_86c01.pos, val & 0xff); - sd->sc->temp_buffer[dev->buffer_pos + dev->dma_86c01.pos] = val & 0xff; - dev->dma_86c01.pos++; - } - dma_set_drq(dev->DmaChannel, 0); - dev->dma_86c01.pos = 0; - } else - esp_pci_dma_memory_rw(dev, sd->sc->temp_buffer + dev->buffer_pos, count, WRITE_TO_DEVICE); - } - esp_set_tc(dev, esp_get_tc(dev) - count); - dev->buffer_pos += count; - dev->xfer_counter -= count; - if (sd->phase == SCSI_PHASE_DATA_IN) { - dev->ti_size -= count; - } else if (sd->phase == SCSI_PHASE_DATA_OUT) { - dev->ti_size += count; - } + if (len > dev->xfer_counter) + len = dev->xfer_counter; - esp_log("ESP SCSI Transfer bytes = %d\n", dev->xfer_counter); - if (dev->xfer_counter <= 0) { - if (sd->phase == SCSI_PHASE_DATA_OUT) { - if (dev->ti_size < 0) { - esp_log("ESP SCSI Keep writing\n"); - esp_do_dma(dev, sd); - } else { - esp_log("ESP SCSI Write finished\n"); - scsi_device_command_phase1(sd); - if (dev->mca) { + switch (dev->rregs[ESP_CMD]) { + case (CMD_TI | CMD_DMA): + if (dev->mca) { + dma_set_drq(dev->DmaChannel, 1); + while (dev->dma_86c01.pos < len) { + int val = dma_channel_read(dev->DmaChannel); + esp_log("ESP SCSI DMA write for 53C9x: pos = %i, val = %02x\n", dev->dma_86c01.pos, val & 0xff); + sd->sc->temp_buffer[dev->buffer_pos + dev->dma_86c01.pos] = val & 0xff; + dev->dma_86c01.pos++; + } + dma_set_drq(dev->DmaChannel, 0); + dev->dma_86c01.pos = 0; + } else + esp_pci_dma_memory_rw(dev, sd->sc->temp_buffer + dev->buffer_pos, len, WRITE_TO_DEVICE); + + esp_set_tc(dev, esp_get_tc(dev) - len); + + dev->buffer_pos += len; + dev->xfer_counter -= len; + dev->ti_size += len; + break; + + case (CMD_PAD | CMD_DMA): + /* Copy TC zero bytes into the incoming stream */ + memset(sd->sc->temp_buffer + dev->buffer_pos, 0, len); + + dev->buffer_pos += len; + dev->xfer_counter -= len; + dev->ti_size += len; + break; + + default: + break; + } + + if ((dev->xfer_counter <= 0) && (fifo8_num_used(&dev->fifo) < 2)) { + /* Defer until the scsi layer has completed */ + if (dev->ti_size < 0) { + esp_log("ESP SCSI Keep writing\n"); + esp_do_dma(dev); + } else { + esp_log("ESP SCSI Write finished\n"); + scsi_device_command_phase1(sd); esp_command_complete(dev, sd->status); - } else - esp_pci_command_complete(dev, sd->status); + } + return; } - } else if (sd->phase == SCSI_PHASE_DATA_IN) { - /* If there is still data to be read from the device then - complete the DMA operation immediately. Otherwise defer - until the scsi layer has completed. */ - if (dev->ti_size <= 0) { -done: - esp_log("ESP SCSI Read finished\n"); + + esp_dma_ti_check(dev); + break; + + case STAT_DI: + if (!dev->xfer_counter && esp_get_tc(dev)) { + /* Defer until data is available. */ + return; + } + if (len > dev->xfer_counter) + len = dev->xfer_counter; + + switch (dev->rregs[ESP_CMD]) { + case (CMD_TI | CMD_DMA): + if (dev->mca) { + dma_set_drq(dev->DmaChannel, 1); + while (dev->dma_86c01.pos < len) { + dma_channel_write(dev->DmaChannel, sd->sc->temp_buffer[dev->buffer_pos + dev->dma_86c01.pos]); + esp_log("ESP SCSI DMA read for 53C9x: pos = %i, val = %02x\n", dev->dma_86c01.pos, sd->sc->temp_buffer[dev->buffer_pos + dev->dma_86c01.pos]); + dev->dma_86c01.pos++; + } + dev->dma_86c01.pos = 0; + dma_set_drq(dev->DmaChannel, 0); + } else + esp_pci_dma_memory_rw(dev, sd->sc->temp_buffer + dev->buffer_pos, len, READ_FROM_DEVICE); + + dev->buffer_pos += len; + dev->xfer_counter -= len; + dev->ti_size -= len; + esp_set_tc(dev, esp_get_tc(dev) - len); + break; + + case (CMD_PAD | CMD_DMA): + dev->buffer_pos += len; + dev->xfer_counter -= len; + dev->ti_size -= len; + esp_set_tc(dev, esp_get_tc(dev) - len); + break; + + default: + break; + } + + if ((dev->xfer_counter <= 0) && !dev->ti_size && esp_get_tc(dev)) { + /* If the guest underflows TC then terminate SCSI request */ + pclog("ESP SCSI Read finished (underflow).\n"); scsi_device_command_phase1(sd); - if (dev->mca) { - esp_command_complete(dev, sd->status); - } else - esp_pci_command_complete(dev, sd->status); - } else { - esp_log("ESP SCSI Keep reading\n"); - esp_do_dma(dev, sd); + esp_command_complete(dev, sd->status); + return; } - } - } else { - /* Partially filled a scsi buffer. Complete immediately. */ -partial: - esp_log("ESP SCSI Partially filled the SCSI buffer\n"); - esp_dma_done(dev); + + if ((dev->xfer_counter <= 0) && (fifo8_num_used(&dev->fifo) < 2)) { + /* Defer until the scsi layer has completed */ + if (dev->ti_size <= 0) { + pclog("ESP SCSI Read finished\n"); + scsi_device_command_phase1(sd); + esp_command_complete(dev, sd->status); + } else { + pclog("ESP SCSI Keep reading\n"); + esp_do_dma(dev); + } + return; + } + esp_dma_ti_check(dev); + break; + + case STAT_ST: + switch (dev->rregs[ESP_CMD]) { + case (CMD_ICCS | CMD_DMA): + len = MIN(len, 1); + + if (len) { + buf[0] = dev->status; + + if (dev->mca) { + dma_set_drq(dev->DmaChannel, 1); + while (dev->dma_86c01.pos < len) { + dma_channel_write(dev->DmaChannel, buf[dev->dma_86c01.pos]); + dev->dma_86c01.pos++; + } + dev->dma_86c01.pos = 0; + dma_set_drq(dev->DmaChannel, 0); + } else + esp_pci_dma_memory_rw(dev, buf, len, READ_FROM_DEVICE); + + esp_set_tc(dev, esp_get_tc(dev) - len); + esp_set_phase(dev, STAT_MI); + + if (esp_get_tc(dev) > 0) { + /* Process any message in phase data */ + esp_do_dma(dev); + } + } + break; + + default: + /* Consume remaining data if the guest underflows TC */ + if (fifo8_num_used(&dev->fifo) < 2) { + dev->rregs[ESP_RINTR] |= INTR_BS; + esp_raise_irq(dev); + } + break; + } + break; + + case STAT_MI: + switch (dev->rregs[ESP_CMD]) { + case (CMD_ICCS | CMD_DMA): + len = MIN(len, 1); + + if (len) { + buf[0] = 0; + + if (dev->mca) { + dma_set_drq(dev->DmaChannel, 1); + while (dev->dma_86c01.pos < len) { + dma_channel_write(dev->DmaChannel, buf[dev->dma_86c01.pos]); + dev->dma_86c01.pos++; + } + dev->dma_86c01.pos = 0; + dma_set_drq(dev->DmaChannel, 0); + } else + esp_pci_dma_memory_rw(dev, buf, len, READ_FROM_DEVICE); + + esp_set_tc(dev, esp_get_tc(dev) - len); + + /* Raise end of command interrupt */ + dev->rregs[ESP_RINTR] |= INTR_FC; + esp_raise_irq(dev); + } + break; + } + break; + + default: + break; } } static void -esp_report_command_complete(esp_t *dev, uint32_t status) +esp_nodma_ti_dataout(esp_t *dev) { - esp_log("ESP Command complete\n"); + scsi_device_t *sd = &scsi_devices[dev->bus][dev->id]; + int len; - dev->ti_size = 0; - dev->status = status; - dev->rregs[ESP_RSTAT] = STAT_TC | STAT_ST; - esp_dma_done(dev); + if (!dev->xfer_counter) { + /* Defer until data is available. */ + return; + } + len = MIN(dev->xfer_counter, ESP_FIFO_SZ); + len = MIN(len, fifo8_num_used(&dev->fifo)); + esp_fifo_pop_buf(dev, sd->sc->temp_buffer + dev->buffer_pos, len); + dev->buffer_pos += len; + dev->xfer_counter -= len; + dev->ti_size += len; + + if (dev->xfer_counter <= 0) { + if (dev->ti_size < 0) { + esp_log("ESP SCSI Keep writing\n"); + esp_nodma_ti_dataout(dev); + } else { + esp_log("ESP SCSI Write finished\n"); + scsi_device_command_phase1(sd); + esp_command_complete(dev, sd->status); + } + return; + } + + dev->rregs[ESP_RINTR] |= INTR_BS; + esp_raise_irq(dev); +} + +static void +esp_do_nodma(esp_t *dev) +{ + scsi_device_t *sd = &scsi_devices[dev->bus][dev->id]; + uint8_t buf[ESP_FIFO_SZ]; + int len; + + switch (esp_get_phase(dev)) { + case STAT_MO: + switch (dev->rregs[ESP_CMD]) { + case CMD_SELATN: + /* Copy FIFO into cmdfifo */ + len = esp_fifo_pop_buf(dev, buf, fifo8_num_used(&dev->fifo)); + len = MIN(fifo8_num_free(&dev->cmdfifo), len); + fifo8_push_all(&dev->cmdfifo, buf, len); + + if (fifo8_num_used(&dev->cmdfifo) >= 1) { + /* First byte received, switch to command phase */ + esp_set_phase(dev, STAT_CD); + dev->rregs[ESP_RSEQ] = SEQ_CD; + dev->cmdfifo_cdb_offset = 1; + + if (fifo8_num_used(&dev->cmdfifo) > 1) { + /* Process any additional command phase data */ + esp_do_nodma(dev); + } + } + break; + + case CMD_SELATNS: + /* Copy one byte from FIFO into cmdfifo */ + len = esp_fifo_pop_buf(dev, buf, + MIN(fifo8_num_used(&dev->fifo), 1)); + len = MIN(fifo8_num_free(&dev->cmdfifo), len); + fifo8_push_all(&dev->cmdfifo, buf, len); + + if (fifo8_num_used(&dev->cmdfifo) >= 1) { + /* First byte received, stop in message out phase */ + dev->rregs[ESP_RSEQ] = SEQ_MO; + dev->cmdfifo_cdb_offset = 1; + + /* Raise command completion interrupt */ + dev->rregs[ESP_RINTR] |= (INTR_BS | INTR_FC); + esp_raise_irq(dev); + } + break; + + case CMD_TI: + /* Copy FIFO into cmdfifo */ + len = esp_fifo_pop_buf(dev, buf, fifo8_num_used(&dev->fifo)); + len = MIN(fifo8_num_free(&dev->cmdfifo), len); + fifo8_push_all(&dev->cmdfifo, buf, len); + + /* ATN remains asserted until FIFO empty */ + dev->cmdfifo_cdb_offset = fifo8_num_used(&dev->cmdfifo); + esp_set_phase(dev, STAT_CD); + dev->rregs[ESP_CMD] = 0; + dev->rregs[ESP_RINTR] |= INTR_BS; + esp_raise_irq(dev); + break; + + default: + break; + } + break; + + case STAT_CD: + switch (dev->rregs[ESP_CMD]) { + case CMD_TI: + /* Copy FIFO into cmdfifo */ + len = esp_fifo_pop_buf(dev, buf, fifo8_num_used(&dev->fifo)); + len = MIN(fifo8_num_free(&dev->cmdfifo), len); + fifo8_push_all(&dev->cmdfifo, buf, len); + + /* CDB may be transferred in one or more TI commands */ + if (esp_cdb_ready(dev)) { + /* Command has been received */ + esp_do_cmd(dev); + } else { + /* + * If data was transferred from the FIFO then raise bus + * service interrupt to indicate transfer complete. Otherwise + * defer until the next FIFO write. + */ + if (len) { + /* Raise interrupt to indicate transfer complete */ + dev->rregs[ESP_RINTR] |= INTR_BS; + esp_raise_irq(dev); + } + } + break; + + case (CMD_SEL | CMD_DMA): + case (CMD_SELATN | CMD_DMA): + /* Copy FIFO into cmdfifo */ + len = esp_fifo_pop_buf(dev, buf, fifo8_num_used(&dev->fifo)); + len = MIN(fifo8_num_free(&dev->cmdfifo), len); + fifo8_push_all(&dev->cmdfifo, buf, len); + + /* Handle when DMA transfer is terminated by non-DMA FIFO write */ + if (esp_cdb_ready(dev)) { + /* Command has been received */ + esp_do_cmd(dev); + } + break; + + case CMD_SEL: + case CMD_SELATN: + /* FIFO already contain entire CDB: copy to cmdfifo and execute */ + len = esp_fifo_pop_buf(dev, buf, fifo8_num_used(&dev->fifo)); + len = MIN(fifo8_num_free(&dev->cmdfifo), len); + fifo8_push_all(&dev->cmdfifo, buf, len); + + esp_do_cmd(dev); + break; + + default: + break; + } + break; + + case STAT_DO: + /* Accumulate data in FIFO until non-DMA TI is executed */ + break; + + case STAT_DI: + if (!dev->xfer_counter) { + /* Defer until data is available. */ + return; + } + if (fifo8_is_empty(&dev->fifo)) { + esp_fifo_push(dev, sd->sc->temp_buffer[dev->buffer_pos]); + dev->buffer_pos++; + dev->ti_size--; + dev->xfer_counter--; + } + + if (dev->xfer_counter <= 0) { + if (dev->ti_size <= 0) { + esp_log("ESP FIFO Read finished\n"); + scsi_device_command_phase1(sd); + esp_command_complete(dev, sd->status); + } else { + esp_log("ESP FIFO Keep reading\n"); + esp_do_nodma(dev); + } + return; + } + + /* If preloading the FIFO, defer until TI command issued */ + if (dev->rregs[ESP_CMD] != CMD_TI) + return; + + dev->rregs[ESP_RINTR] |= INTR_BS; + esp_raise_irq(dev); + break; + + case STAT_ST: + switch (dev->rregs[ESP_CMD]) { + case CMD_ICCS: + esp_fifo_push(dev, dev->status); + esp_set_phase(dev, STAT_MI); + + /* Process any message in phase data */ + esp_do_nodma(dev); + break; + default: + break; + } + break; + + case STAT_MI: + switch (dev->rregs[ESP_CMD]) { + case CMD_ICCS: + esp_fifo_push(dev, 0); + + /* Raise end of command interrupt */ + dev->rregs[ESP_RINTR] |= INTR_FC; + esp_raise_irq(dev); + break; + default: + break; + } + break; + } } /* Callback to indicate that the SCSI layer has completed a command. */ @@ -810,18 +1184,36 @@ static void esp_command_complete(void *priv, uint32_t status) { esp_t *dev = (esp_t *) priv; + scsi_device_t *sd = &scsi_devices[dev->bus][dev->id]; - esp_report_command_complete(dev, status); -} + dev->ti_size = 0; + dev->status = status; -static void -esp_pci_command_complete(void *priv, uint32_t status) -{ - esp_t *dev = (esp_t *) priv; + switch (dev->rregs[ESP_CMD]) { + case CMD_SEL: + case (CMD_SEL | CMD_DMA): + case CMD_SELATN: + case (CMD_SELATN | CMD_DMA): + /* + * Switch to status phase. For non-DMA transfers from the target the last + * byte is still in the FIFO + */ + dev->rregs[ESP_RINTR] |= (INTR_BS | INTR_FC); + dev->rregs[ESP_RSEQ] = SEQ_CD; + break; + case CMD_TI: + case (CMD_TI | CMD_DMA): + dev->rregs[ESP_CMD] = 0; + break; + default: + break; + } + /* Raise bus service interrupt to indicate change to STATUS phase */ + scsi_device_identify(sd, SCSI_LUN_USE_CDB); - esp_command_complete(dev, status); - dev->dma_regs[DMA_WBC] = 0; - dev->dma_regs[DMA_STAT] |= DMA_STAT_DONE; + esp_set_phase(dev, STAT_ST); + dev->rregs[ESP_RINTR] |= INTR_BS; + esp_raise_irq(dev); } static void @@ -838,18 +1230,31 @@ esp_timer_on(esp_t *dev, scsi_device_t *sd, double p) timer_on_auto(&dev->timer, dev->period + 40.0); } +static void +handle_pad(esp_t *dev) +{ + if (dev->dma) { + esp_log("ESP Handle PAD, do data, minlen = %i\n", esp_get_tc(dev)); + esp_do_dma(dev); + } else { + esp_log("ESP Handle PAD, do nodma, minlen = %i\n", dev->xfer_counter); + esp_do_nodma(dev); + } +} + static void handle_ti(void *priv) { esp_t *dev = (esp_t *) priv; - scsi_device_t *sd = &scsi_devices[dev->bus][dev->id]; if (dev->dma) { esp_log("ESP Handle TI, do data, minlen = %i\n", esp_get_tc(dev)); - esp_do_dma(dev, sd); + esp_do_dma(dev); } else { esp_log("ESP Handle TI, do nodma, minlen = %i\n", dev->xfer_counter); - esp_do_nodma(dev, sd); + esp_do_nodma(dev); + if (esp_get_phase(dev) == STAT_DO) + esp_nodma_ti_dataout(dev); } } @@ -857,95 +1262,59 @@ static void handle_s_without_atn(void *priv) { esp_t *dev = (esp_t *) priv; - int len; - len = esp_get_cmd(dev, ESP_CMDFIFO_SZ); - esp_log("ESP SEL w/o ATN len = %d, id = %d\n", len, dev->id); - if (len > 0) { - dev->cmdfifo_cdb_offset = 0; - dev->do_cmd = 0; - esp_do_cmd(dev); - } else if (len == 0) { - dev->do_cmd = 1; - /* Target present, but no cmd yet - switch to command phase */ - dev->rregs[ESP_RSEQ] = SEQ_CD; - dev->rregs[ESP_RSTAT] = STAT_CD; - } + if (esp_select(dev) < 0) + return; + + esp_set_phase(dev, STAT_CD); + dev->cmdfifo_cdb_offset = 0; + + if (dev->dma) + esp_do_dma(dev); + else + esp_do_nodma(dev); } static void handle_satn(void *priv) { esp_t *dev = (esp_t *) priv; - int len; - len = esp_get_cmd(dev, ESP_CMDFIFO_SZ); - esp_log("ESP SEL with ATN len = %d, id = %d\n", len, dev->id); - if (len > 0) { - dev->cmdfifo_cdb_offset = 1; - dev->do_cmd = 0; - esp_do_cmd(dev); - } else if (len == 0) { - dev->do_cmd = 1; - /* Target present, but no cmd yet - switch to command phase */ - dev->rregs[ESP_RSEQ] = SEQ_CD; - dev->rregs[ESP_RSTAT] = STAT_CD; - } + if (esp_select(dev) < 0) + return; + + esp_set_phase(dev, STAT_MO); + + if (dev->dma) + esp_do_dma(dev); + else + esp_do_nodma(dev); } static void handle_satn_stop(void *priv) { esp_t *dev = (esp_t *) priv; - int cmdlen; - cmdlen = esp_get_cmd(dev, 1); - if (cmdlen > 0) { - dev->do_cmd = 1; - dev->cmdfifo_cdb_offset = 1; - dev->rregs[ESP_RSTAT] = STAT_MO; - dev->rregs[ESP_RINTR] = INTR_BS | INTR_FC; - dev->rregs[ESP_RSEQ] = SEQ_MO; - esp_log("ESP SCSI Command len = %d, raising IRQ\n", cmdlen); - esp_raise_irq(dev); - } else if (cmdlen == 0) { - dev->do_cmd = 1; - /* Target present, switch to message out phase */ - dev->rregs[ESP_RSEQ] = SEQ_MO; - dev->rregs[ESP_RSTAT] = STAT_MO; - } + if (esp_select(dev) < 0) + return; + + esp_set_phase(dev, STAT_MO); + dev->cmdfifo_cdb_offset = 0; + + if (dev->dma) + esp_do_dma(dev); + else + esp_do_nodma(dev); } static void esp_write_response(esp_t *dev) { - uint8_t buf[2]; - - buf[0] = dev->status; - buf[1] = 0; - esp_log("esp_write_response(): %02X %02X\n", buf[0], buf[1]); - - if (dev->dma) { - if (dev->mca) { - dma_set_drq(dev->DmaChannel, 1); - while (dev->dma_86c01.pos < 2) { - int val = dma_channel_read(dev->DmaChannel); - buf[dev->dma_86c01.pos++] = val & 0xff; - } - dev->dma_86c01.pos = 0; - dma_set_drq(dev->DmaChannel, 0); - } else - esp_pci_dma_memory_rw(dev, buf, 2, WRITE_TO_DEVICE); - dev->rregs[ESP_RSTAT] = STAT_TC | STAT_ST; - dev->rregs[ESP_RINTR] = INTR_BS | INTR_FC; - dev->rregs[ESP_RSEQ] = SEQ_CD; - } else { - fifo8_reset(&dev->fifo); - fifo8_push_all(&dev->fifo, buf, 2); - dev->rregs[ESP_RFLAGS] = 2; - } - esp_log("ESP SCSI ICCS IRQ\n"); - esp_raise_irq(dev); + if (dev->dma) + esp_do_dma(dev); + else + esp_do_nodma(dev); } static void @@ -953,13 +1322,13 @@ esp_callback(void *priv) { esp_t *dev = (esp_t *) priv; - if (dev->dma_enabled || dev->do_cmd || ((dev->rregs[ESP_CMD] & CMD_CMD) == CMD_PAD)) { + if (dev->dma_enabled || !dev->dma || ((dev->rregs[ESP_CMD] & CMD_CMD) == CMD_PAD)) { if ((dev->rregs[ESP_CMD] & CMD_CMD) == CMD_TI) { esp_log("ESP SCSI Handle TI Callback\n"); handle_ti(dev); } else if ((dev->rregs[ESP_CMD] & CMD_CMD) == CMD_PAD) { esp_log("ESP SCSI Handle PAD Callback\n"); - handle_ti(dev); + handle_pad(dev); } } @@ -973,20 +1342,7 @@ esp_reg_read(esp_t *dev, uint32_t saddr) switch (saddr) { case ESP_FIFO: - if ((dev->rregs[ESP_RSTAT] & 7) == STAT_DI) { - if (dev->ti_size) { - esp_log("TI size FIFO = %i\n", dev->ti_size); - esp_do_nodma(dev, &scsi_devices[dev->bus][dev->id]); - } else { - /* - * The last byte of a non-DMA transfer has been read out - * of the FIFO so switch to status phase - */ - dev->rregs[ESP_RSTAT] = STAT_TC | STAT_ST; - } - } - - dev->rregs[ESP_FIFO] = esp_fifo_pop(&dev->fifo); + dev->rregs[ESP_FIFO] = esp_fifo_pop(dev); ret = dev->rregs[ESP_FIFO]; break; case ESP_RINTR: @@ -1033,21 +1389,10 @@ esp_reg_write(esp_t *dev, uint32_t saddr, uint32_t val) dev->rregs[ESP_RSTAT] &= ~STAT_TC; break; case ESP_FIFO: - if (dev->do_cmd) { - esp_fifo_push(&dev->cmdfifo, val); - esp_log("ESP CmdVal = %02x\n", val); - /* - * If any unexpected message out/command phase data is - * transferred using non-DMA, raise the interrupt - */ - if (dev->rregs[ESP_CMD] == CMD_TI) { - dev->rregs[ESP_RINTR] |= INTR_BS; - esp_raise_irq(dev); - } - } else { - esp_fifo_push(&dev->fifo, val); - esp_log("ESP fifoval = %02x\n", val); - } + if (!fifo8_is_full(&dev->fifo)) + esp_fifo_push(dev, val); + + esp_do_nodma(dev); break; case ESP_CMD: dev->rregs[saddr] = val; @@ -1056,6 +1401,8 @@ esp_reg_write(esp_t *dev, uint32_t saddr, uint32_t val) dev->dma = 1; /* Reload DMA counter. */ esp_set_tc(dev, esp_get_stc(dev)); + if (!esp_get_stc(dev)) + esp_set_tc(dev, 0x10000); } else { dev->dma = 0; esp_log("ESP Command not for DMA\n"); @@ -1091,6 +1438,11 @@ esp_reg_write(esp_t *dev, uint32_t saddr, uint32_t val) case CMD_TI: esp_log("Transfer Information val = %02X\n", val); break; + case CMD_ICCS: + esp_write_response(dev); + dev->rregs[ESP_RINTR] |= INTR_FC; + dev->rregs[ESP_RSTAT] |= STAT_MI; + break; case CMD_SEL: handle_s_without_atn(dev); break; @@ -1100,11 +1452,6 @@ esp_reg_write(esp_t *dev, uint32_t saddr, uint32_t val) case CMD_SELATNS: handle_satn_stop(dev); break; - case CMD_ICCS: - esp_write_response(dev); - dev->rregs[ESP_RINTR] |= INTR_FC; - dev->rregs[ESP_RSTAT] |= STAT_MI; - break; case CMD_MSGACC: dev->rregs[ESP_RINTR] |= INTR_DC; dev->rregs[ESP_RSEQ] = 0; @@ -1160,6 +1507,7 @@ esp_reg_write(esp_t *dev, uint32_t saddr, uint32_t val) static void esp_pci_dma_memory_rw(esp_t *dev, uint8_t *buf, uint32_t len, int dir) { + uint32_t addr; int expected_dir; if (dev->dma_regs[DMA_CMD] & DMA_CMD_DIR) @@ -1174,14 +1522,15 @@ esp_pci_dma_memory_rw(esp_t *dev, uint8_t *buf, uint32_t len, int dir) return; } + addr = dev->dma_regs[DMA_WAC]; if (dev->dma_regs[DMA_WBC] < len) len = dev->dma_regs[DMA_WBC]; - if (expected_dir) { - dma_bm_write(dev->dma_regs[DMA_SPA], buf, len, 4); - } else { - dma_bm_read(dev->dma_regs[DMA_SPA], buf, len, 4); - } + if (expected_dir) + dma_bm_write(addr, buf, len, 4); + else + dma_bm_read(addr, buf, len, 4); + esp_log("DMA: Address = %08X, Length = %08X (%02X %02X %02X %02X -> %02X %02X %02X %02X)\n", dev->dma_regs[DMA_SPA], len, ram[dev->dma_regs[DMA_SPA]], ram[dev->dma_regs[DMA_SPA] + 1], ram[dev->dma_regs[DMA_SPA] + 2], ram[dev->dma_regs[DMA_SPA] + 3], buf[0], buf[1], buf[2], buf[3]); @@ -1201,13 +1550,10 @@ esp_pci_dma_read(esp_t *dev, uint16_t saddr) ret = dev->dma_regs[saddr]; if (saddr == DMA_STAT) { - if (dev->rregs[ESP_RSTAT] & STAT_INT) { - ret |= DMA_STAT_SCSIINT; - esp_log("ESP PCI DMA Read SCSI interrupt issued\n"); - } if (!(dev->sbac & SBAC_STATUS)) { dev->dma_regs[DMA_STAT] &= ~(DMA_STAT_ERROR | DMA_STAT_ABORT | DMA_STAT_DONE); esp_log("ESP PCI DMA Read done cleared\n"); + esp_pci_update_irq(dev); } } @@ -1230,6 +1576,7 @@ esp_pci_dma_write(esp_t *dev, uint16_t saddr, uint32_t val) esp_log("PCI DMA disable\n"); break; case 1: /*BLAST*/ + dev->dma_regs[DMA_STAT] |= DMA_STAT_BCMBLT; break; case 2: /*ABORT*/ scsi_device_command_stop(&scsi_devices[dev->bus][dev->id]); @@ -1256,6 +1603,7 @@ esp_pci_dma_write(esp_t *dev, uint16_t saddr, uint32_t val) /* clear some bits on write */ mask = DMA_STAT_ERROR | DMA_STAT_ABORT | DMA_STAT_DONE; dev->dma_regs[DMA_STAT] &= ~(val & mask); + esp_pci_update_irq(dev); } break; @@ -1628,9 +1976,6 @@ dc390_load_eeprom(esp_t *dev) } } -uint8_t esp_pci_regs[256]; -bar_t esp_pci_bar[2]; - static uint8_t esp_pci_read(UNUSED(int func), int addr, void *priv) { @@ -1641,7 +1986,7 @@ esp_pci_read(UNUSED(int func), int addr, void *priv) switch (addr) { case 0x00: // esp_log("ESP PCI: Read DO line = %02x\n", dev->eeprom.out); - if (!dev->has_bios) + if (!dev->has_bios || dev->local) return 0x22; else { if (dev->eeprom.out) @@ -1651,6 +1996,7 @@ esp_pci_read(UNUSED(int func), int addr, void *priv) return 2; } } + break; case 0x01: return 0x10; case 0x02: @@ -1703,6 +2049,7 @@ esp_pci_read(UNUSED(int func), int addr, void *priv) return PCI_INTA; case 0x40 ... 0x4f: + pclog("ESP PCI: Read value %02X to register %02X, ID=%d\n", esp_pci_regs[addr], addr, dev->id); return esp_pci_regs[addr]; default: @@ -1722,15 +2069,17 @@ esp_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) // esp_log("ESP PCI: Write value %02X to register %02X\n", val, addr); - if ((addr >= 0x80) && (addr <= 0xFF)) { - if (addr == 0x80) { - eesk = val & 0x80 ? 1 : 0; - eedi = val & 0x40 ? 1 : 0; - dc390_write_eeprom(dev, 1, eesk, eedi); - } else if (addr == 0xc0) - dc390_write_eeprom(dev, 0, 0, 0); - // esp_log("ESP PCI: Write value %02X to register %02X\n", val, addr); - return; + if (!dev->local) { + if ((addr >= 0x80) && (addr <= 0xFF)) { + if (addr == 0x80) { + eesk = val & 0x80 ? 1 : 0; + eedi = val & 0x40 ? 1 : 0; + dc390_write_eeprom(dev, 1, eesk, eedi); + } else if (addr == 0xc0) + dc390_write_eeprom(dev, 0, 0, 0); + // esp_log("ESP PCI: Write value %02X to register %02X\n", val, addr); + return; + } } switch (addr) { @@ -1809,6 +2158,7 @@ esp_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) return; case 0x40 ... 0x4f: + esp_log("ESP PCI: Write value %02X to register %02X, ID=%i.\n", val, addr, dev->id); esp_pci_regs[addr] = val; return; @@ -1827,6 +2177,7 @@ dc390_init(UNUSED(const device_t *info)) dev->bus = scsi_get_bus(); + dev->local = info->local; dev->mca = 0; fifo8_create(&dev->fifo, ESP_FIFO_SZ); @@ -1843,23 +2194,27 @@ dc390_init(UNUSED(const device_t *info)) dev->has_bios = device_get_config_int("bios"); if (dev->has_bios) { dev->BIOSBase = 0xd0000; - rom_init(&dev->bios, DC390_ROM, 0xd0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + if (dev->local) { + ;//rom_init(&dev->bios, AM53C974_ROM, 0xd0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + } else + rom_init(&dev->bios, DC390_ROM, 0xd0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); } /* Enable our BIOS space in PCI, if needed. */ - if (dev->has_bios) { + if (dev->has_bios) esp_pci_bar[1].addr = 0xffff0000; - } else { + else esp_pci_bar[1].addr = 0; - } if (dev->has_bios) esp_bios_disable(dev); - sprintf(dev->nvr_path, "dc390_%i.nvr", device_get_instance()); + if (!dev->local) { + sprintf(dev->nvr_path, "dc390_%i.nvr", device_get_instance()); - /* Load the serial EEPROM. */ - dc390_load_eeprom(dev); + /* Load the serial EEPROM. */ + dc390_load_eeprom(dev); + } esp_pci_hard_reset(dev); @@ -2092,6 +2447,20 @@ const device_t dc390_pci_device = { .config = bios_enable_config }; +const device_t am53c974_pci_device = { + .name = "AMD 53c974 PCI", + .internal_name = "am53c974", + .flags = DEVICE_PCI, + .local = 1, + .init = dc390_init, + .close = esp_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = bios_enable_config +}; + const device_t ncr53c90a_mca_device = { .name = "NCR 53c90a MCA", .internal_name = "ncr53c90a", From e79b722ebe9ddc12accfedc60549c704be3c3ae6 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 4 Aug 2024 22:30:50 +0200 Subject: [PATCH 256/624] Actually report the 86Box CD/DVD-ROM SCSI drive as SCSI-2 compliant --- src/scsi/scsi_cdrom.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index a049c69d0..cd5f661ed 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -3231,9 +3231,6 @@ begin: if (dev->drv->bus_type == CDROM_BUS_SCSI) { dev->buffer[3] = 0x02; switch (dev->drv->type) { - case CDROM_TYPE_86BOX_100: - dev->buffer[2] = 0x05; /*SCSI-2 compliant*/ - break; case CDROM_TYPE_CHINON_CDS431_H42: case CDROM_TYPE_DEC_RRD45_0436: case CDROM_TYPE_MATSHITA_501_10b: From 862494222040b138866eab2b3f55b01e2c93c996 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 5 Aug 2024 01:00:48 +0200 Subject: [PATCH 257/624] More ESP SCSI fixes (LUN mainly) This commit should fix the NT 3.1 AMD PCscsi drivers when they look for devices on LUN > 0 and causing havoc with them (BSOD). Basically clear the FIFO and set the SEQ_0 bit in the RSEQ read reg. AM53c974 side: a biosless card is biosless. General: fixed all the log excesses. --- src/scsi/scsi_pcscsi.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/scsi/scsi_pcscsi.c b/src/scsi/scsi_pcscsi.c index 720fcef82..a19d543ed 100644 --- a/src/scsi/scsi_pcscsi.c +++ b/src/scsi/scsi_pcscsi.c @@ -526,7 +526,7 @@ esp_do_command_phase(esp_t *dev) dev->ti_size = sd->buffer_length; dev->xfer_counter = sd->buffer_length; - pclog("ESP SCSI Command = 0x%02x, ID = %d, LUN = %d, len = %d, phase = %02x.\n", buf[0], dev->id, dev->lun, sd->buffer_length, sd->phase); + esp_log("ESP SCSI Command = 0x%02x, ID = %d, LUN = %d, len = %d, phase = %02x.\n", buf[0], dev->id, dev->lun, sd->buffer_length, sd->phase); fifo8_reset(&dev->cmdfifo); @@ -549,7 +549,7 @@ esp_do_command_phase(esp_t *dev) esp_set_phase(dev, STAT_DI); scsi_device_command_phase1(sd); } - pclog("ESP SCSI Command with no length\n"); + esp_log("ESP SCSI Command with no length\n"); esp_command_complete(dev, sd->status); } esp_transfer_data(dev); @@ -571,10 +571,12 @@ esp_do_message_phase(esp_t *dev) if (scsi_device_present(&scsi_devices[dev->bus][dev->id]) && (dev->lun > 0)) { /* We only support LUN 0 */ - pclog("LUN = %i\n", dev->lun); + esp_log("LUN = %i\n", dev->lun); dev->rregs[ESP_RSTAT] = 0; dev->rregs[ESP_RINTR] = INTR_DC; + dev->rregs[ESP_RSEQ] = SEQ_0; esp_raise_irq(dev); + fifo8_reset(&dev->cmdfifo); return; } @@ -679,7 +681,7 @@ esp_do_dma(esp_t *dev) uint8_t buf[ESP_CMDFIFO_SZ]; uint32_t len; - pclog("ESP SCSI Actual DMA len = %d\n", esp_get_tc(dev)); + esp_log("ESP SCSI Actual DMA len = %d\n", esp_get_tc(dev)); len = esp_get_tc(dev); @@ -865,7 +867,7 @@ esp_do_dma(esp_t *dev) if ((dev->xfer_counter <= 0) && !dev->ti_size && esp_get_tc(dev)) { /* If the guest underflows TC then terminate SCSI request */ - pclog("ESP SCSI Read finished (underflow).\n"); + esp_log("ESP SCSI Read finished (underflow).\n"); scsi_device_command_phase1(sd); esp_command_complete(dev, sd->status); return; @@ -874,11 +876,11 @@ esp_do_dma(esp_t *dev) if ((dev->xfer_counter <= 0) && (fifo8_num_used(&dev->fifo) < 2)) { /* Defer until the scsi layer has completed */ if (dev->ti_size <= 0) { - pclog("ESP SCSI Read finished\n"); + esp_log("ESP SCSI Read finished\n"); scsi_device_command_phase1(sd); esp_command_complete(dev, sd->status); } else { - pclog("ESP SCSI Keep reading\n"); + esp_log("ESP SCSI Keep reading\n"); esp_do_dma(dev); } return; @@ -2049,7 +2051,7 @@ esp_pci_read(UNUSED(int func), int addr, void *priv) return PCI_INTA; case 0x40 ... 0x4f: - pclog("ESP PCI: Read value %02X to register %02X, ID=%d\n", esp_pci_regs[addr], addr, dev->id); + esp_log("ESP PCI: Read value %02X to register %02X, ID=%d\n", esp_pci_regs[addr], addr, dev->id); return esp_pci_regs[addr]; default: @@ -2458,7 +2460,7 @@ const device_t am53c974_pci_device = { { .available = NULL }, .speed_changed = NULL, .force_redraw = NULL, - .config = bios_enable_config + .config = NULL }; const device_t ncr53c90a_mca_device = { From c2ec03954fd3be8d94686192169a8eef66c228ff Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 Aug 2024 01:22:39 +0200 Subject: [PATCH 258/624] Implemented B8000/C0000 video RAM access toggle on Tandy 1000 SX and HX, fixes #4670. --- src/machine/m_tandy.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index e677ff8b4..6a9308627 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -1589,6 +1589,10 @@ tandy_write(uint16_t addr, uint8_t val, void *priv) mem_mapping_set_addr(&dev->ram_mapping, ((val >> 1) & 7) * 128 * 1024, 0x20000); } + if (val & 0x01) + mem_mapping_set_addr(&dev->vid->mapping, 0xc0000, 0x10000); + else + mem_mapping_set_addr(&dev->vid->mapping, 0xb8000, 0x8000); dev->ram_bank = val; break; From 9133ee25d9bb45aca1f8ef5a756ee4120c95c1cc Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 Aug 2024 01:33:33 +0200 Subject: [PATCH 259/624] Sound Blaster 16 on-card MPU-401 now correctly initializes without its own IRQ. --- src/sound/snd_sb.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index b9e2dea5a..6f9a2b650 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -3190,7 +3190,8 @@ sb_16_init(UNUSED(const device_t *info)) if (mpu_addr) { sb->mpu = (mpu_t *) malloc(sizeof(mpu_t)); memset(sb->mpu, 0, sizeof(mpu_t)); - mpu401_init(sb->mpu, device_get_config_hex16("base401"), device_get_config_int("irq"), M_UART, device_get_config_int("receive_input401")); + mpu401_init(sb->mpu, device_get_config_hex16("base401"), 0, M_UART, + device_get_config_int("receive_input401")); } else sb->mpu = NULL; sb_dsp_set_mpu(&sb->dsp, sb->mpu); @@ -3534,7 +3535,8 @@ sb_awe32_init(UNUSED(const device_t *info)) if (mpu_addr) { sb->mpu = (mpu_t *) malloc(sizeof(mpu_t)); memset(sb->mpu, 0, sizeof(mpu_t)); - mpu401_init(sb->mpu, device_get_config_hex16("base401"), device_get_config_int("irq"), M_UART, device_get_config_int("receive_input401")); + mpu401_init(sb->mpu, device_get_config_hex16("base401"), 0, M_UART, + device_get_config_int("receive_input401")); } else sb->mpu = NULL; sb_dsp_set_mpu(&sb->dsp, sb->mpu); From 7d53c02c39deb4757fd4348c56a56bc10e91d8e7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 Aug 2024 01:35:05 +0200 Subject: [PATCH 260/624] Call it DSP MIDI, not SB MIDI. --- src/sound/snd_sb.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 6f9a2b650..88a7d875a 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -4053,7 +4053,7 @@ static const device_config_t sb_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4163,7 +4163,7 @@ static const device_config_t sb15_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4292,7 +4292,7 @@ static const device_config_t sb2_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4358,7 +4358,7 @@ static const device_config_t sb_mcv_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4448,7 +4448,7 @@ static const device_config_t sb_pro_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4459,7 +4459,7 @@ static const device_config_t sb_pro_config[] = { static const device_config_t sb_pro_mcv_config[] = { { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4612,7 +4612,7 @@ static const device_config_t sb_16_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4637,7 +4637,7 @@ static const device_config_t sb_16_pnp_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4694,7 +4694,7 @@ static const device_config_t sb_32_pnp_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4914,7 +4914,7 @@ static const device_config_t sb_awe32_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4971,7 +4971,7 @@ static const device_config_t sb_awe32_pnp_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5048,7 +5048,7 @@ static const device_config_t sb_awe64_value_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5121,7 +5121,7 @@ static const device_config_t sb_awe64_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5186,7 +5186,7 @@ static const device_config_t sb_awe64_gold_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5316,7 +5316,7 @@ static const device_config_t ess_688_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5447,7 +5447,7 @@ static const device_config_t ess_1688_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5466,7 +5466,7 @@ static const device_config_t ess_1688_config[] = { static const device_config_t ess_688_pnp_config[] = { { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5485,7 +5485,7 @@ static const device_config_t ess_1688_pnp_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 From 28c1e7b8fb98d39d84757ebb46838e45762621c1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 Aug 2024 02:21:06 +0200 Subject: [PATCH 261/624] MPU-401: Revert some unnecessary changes, fixes the NT 3.1 Sound Blaster 16 driver regression. --- src/sound/snd_mpu401.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index 40853d98b..21595e373 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -342,11 +342,15 @@ MPU401_Reset(mpu_t *mpu) static uint8_t MPU401_ReadStatus(mpu_t *mpu) { - uint8_t ret = 0x3f; + uint8_t ret = 0x00; + if (mpu->state.cmd_pending) - ret |= STATUS_OUTPUT_NOT_READY; + ret = STATUS_OUTPUT_NOT_READY; if (!mpu->queue_used) - ret |= STATUS_INPUT_NOT_READY; + ret = STATUS_INPUT_NOT_READY; + + ret |= 0x3f; + return ret; } @@ -378,15 +382,6 @@ MPU401_WriteCommand(mpu_t *mpu, uint8_t val) if ((val != 0xff) && (mpu->mode == M_UART)) return; - if (mpu->state.reset) { - if (mpu->state.cmd_pending || (val != 0xff)) { - mpu->state.cmd_pending = val + 1; - return; - } - timer_disable(&mpu->mpu401_reset_callback); - mpu->state.reset = 0; - } - /* In Intelligent mode, UART-only variants of the MPU-401 only support commands 0x3F and 0xFF. */ if (!mpu->intelligent && (val != 0x3f) && (val != 0xff)) return; From 2f4b260499fdd9847e0b29429577e2ac11cc4e71 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 5 Aug 2024 04:34:24 +0200 Subject: [PATCH 262/624] Tandy: No longer incorrectly double the line scan timings in some modes, fixes #4687. --- src/machine/m_tandy.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 6a9308627..6e7fdfd40 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -715,13 +715,8 @@ recalc_timings(tandy_t *dev) double _dispofftime; double disptime; - if (vid->mode & 1) { - disptime = vid->crtc[0] + 1; - _dispontime = vid->crtc[1]; - } else { - disptime = (vid->crtc[0] + 1) << 1; - _dispontime = vid->crtc[1] << 1; - } + disptime = vid->crtc[0] + 1; + _dispontime = vid->crtc[1]; _dispofftime = disptime - _dispontime; _dispontime *= CGACONST; From 58310e02c15c3a7e327cb11e68112a992ac960a6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 Aug 2024 04:02:11 +0200 Subject: [PATCH 263/624] Tandy: Mask palette indexes read from video memories to the lower 4 bits in 16-color modes, fixes #4691. --- src/machine/m_tandy.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 6e7fdfd40..9d9d54577 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -979,10 +979,10 @@ vid_poll(void *priv) for (x = 0; x < vid->crtc[1]; x++) { dat = (vid->vram[((vid->ma << 1) & 0x1fff) + ((vid->sc & 3) * 0x2000)] << 8) | vid->vram[((vid->ma << 1) & 0x1fff) + ((vid->sc & 3) * 0x2000) + 1]; vid->ma++; - buffer32->line[vid->displine << 1][(x << 3) + 8] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 8] = buffer32->line[vid->displine << 1][(x << 3) + 9] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 9] = vid->array[((dat >> 12) & vid->array[1]) + 16] + 16; - buffer32->line[vid->displine << 1][(x << 3) + 10] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 10] = buffer32->line[vid->displine << 1][(x << 3) + 11] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 11] = vid->array[((dat >> 8) & vid->array[1]) + 16] + 16; - buffer32->line[vid->displine << 1][(x << 3) + 12] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 12] = buffer32->line[vid->displine << 1][(x << 3) + 13] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 13] = vid->array[((dat >> 4) & vid->array[1]) + 16] + 16; - buffer32->line[vid->displine << 1][(x << 3) + 14] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 14] = buffer32->line[vid->displine << 1][(x << 3) + 15] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 15] = vid->array[(dat & vid->array[1]) + 16] + 16; + buffer32->line[vid->displine << 1][(x << 3) + 8] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 8] = buffer32->line[vid->displine << 1][(x << 3) + 9] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 9] = vid->array[((dat >> 12) & vid->array[1] & 0x0f) + 16] + 16; + buffer32->line[vid->displine << 1][(x << 3) + 10] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 10] = buffer32->line[vid->displine << 1][(x << 3) + 11] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 11] = vid->array[((dat >> 8) & vid->array[1] & 0x0f) + 16] + 16; + buffer32->line[vid->displine << 1][(x << 3) + 12] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 12] = buffer32->line[vid->displine << 1][(x << 3) + 13] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 13] = vid->array[((dat >> 4) & vid->array[1] & 0x0f) + 16] + 16; + buffer32->line[vid->displine << 1][(x << 3) + 14] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 14] = buffer32->line[vid->displine << 1][(x << 3) + 15] = buffer32->line[(vid->displine << 1) + 1][(x << 3) + 15] = vid->array[(dat & vid->array[1] & 0x0f) + 16] + 16; } } else if (vid->array[3] & 0x10) { /*160x200x16*/ for (x = 0; x < vid->crtc[1]; x++) { @@ -992,10 +992,10 @@ vid_poll(void *priv) dat = (vid->vram[((vid->ma << 1) & 0x1fff) + ((vid->sc & 3) * 0x2000)] << 8) | vid->vram[((vid->ma << 1) & 0x1fff) + ((vid->sc & 3) * 0x2000) + 1]; } vid->ma++; - buffer32->line[vid->displine << 1][(x << 4) + 8] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 8] = buffer32->line[vid->displine << 1][(x << 4) + 9] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 9] = buffer32->line[vid->displine << 1][(x << 4) + 10] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 10] = buffer32->line[vid->displine << 1][(x << 4) + 11] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 11] = vid->array[((dat >> 12) & vid->array[1]) + 16] + 16; - buffer32->line[vid->displine << 1][(x << 4) + 12] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 12] = buffer32->line[vid->displine << 1][(x << 4) + 13] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 13] = buffer32->line[vid->displine << 1][(x << 4) + 14] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 14] = buffer32->line[vid->displine << 1][(x << 4) + 15] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 15] = vid->array[((dat >> 8) & vid->array[1]) + 16] + 16; - buffer32->line[vid->displine << 1][(x << 4) + 16] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 16] = buffer32->line[vid->displine << 1][(x << 4) + 17] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 17] = buffer32->line[vid->displine << 1][(x << 4) + 18] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 18] = buffer32->line[vid->displine << 1][(x << 4) + 19] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 19] = vid->array[((dat >> 4) & vid->array[1]) + 16] + 16; - buffer32->line[vid->displine << 1][(x << 4) + 20] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 20] = buffer32->line[vid->displine << 1][(x << 4) + 21] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 21] = buffer32->line[vid->displine << 1][(x << 4) + 22] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 22] = buffer32->line[vid->displine << 1][(x << 4) + 23] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 23] = vid->array[(dat & vid->array[1]) + 16] + 16; + buffer32->line[vid->displine << 1][(x << 4) + 8] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 8] = buffer32->line[vid->displine << 1][(x << 4) + 9] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 9] = buffer32->line[vid->displine << 1][(x << 4) + 10] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 10] = buffer32->line[vid->displine << 1][(x << 4) + 11] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 11] = vid->array[((dat >> 12) & vid->array[1] & 0x0f) + 16] + 16; + buffer32->line[vid->displine << 1][(x << 4) + 12] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 12] = buffer32->line[vid->displine << 1][(x << 4) + 13] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 13] = buffer32->line[vid->displine << 1][(x << 4) + 14] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 14] = buffer32->line[vid->displine << 1][(x << 4) + 15] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 15] = vid->array[((dat >> 8) & vid->array[1] & 0x0f) + 16] + 16; + buffer32->line[vid->displine << 1][(x << 4) + 16] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 16] = buffer32->line[vid->displine << 1][(x << 4) + 17] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 17] = buffer32->line[vid->displine << 1][(x << 4) + 18] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 18] = buffer32->line[vid->displine << 1][(x << 4) + 19] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 19] = vid->array[((dat >> 4) & vid->array[1] & 0x0f) + 16] + 16; + buffer32->line[vid->displine << 1][(x << 4) + 20] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 20] = buffer32->line[vid->displine << 1][(x << 4) + 21] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 21] = buffer32->line[vid->displine << 1][(x << 4) + 22] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 22] = buffer32->line[vid->displine << 1][(x << 4) + 23] = buffer32->line[(vid->displine << 1) + 1][(x << 4) + 23] = vid->array[(dat & vid->array[1] & 0x0f) + 16] + 16; } } else if (vid->array[3] & 0x08) { /*640x200x4 - this implementation is a complete guess!*/ for (x = 0; x < vid->crtc[1]; x++) { From 608165295bd49eb52188b8e7cc1a410ccd880c93 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 6 Aug 2024 06:06:02 +0200 Subject: [PATCH 264/624] Tandy 1000 HX control register fixes, fixes Space Quest 3. --- src/machine/m_tandy.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 9d9d54577..660710526 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -129,6 +129,7 @@ typedef struct tandy_t { uint32_t base; uint32_t mask; + int is_hx; int is_sl2; t1kvid_t *vid; @@ -1571,12 +1572,12 @@ tandy_write(uint16_t addr, uint8_t val, void *priv) switch (addr) { case 0x00a0: - if (val & 0x10) { + if (dev->is_hx && (val & 0x10)) { dev->base = (mem_size - 256) * 1024; dev->mask = 0x3ffff; mem_mapping_set_addr(&ram_low_mapping, 0, dev->base); mem_mapping_set_addr(&dev->ram_mapping, - ((val >> 1) & 7) * 128 * 1024, 0x40000); + (((val >> 1) & 7) - 1) * 128 * 1024, 0x40000); } else { dev->base = (mem_size - 128) * 1024; dev->mask = 0x1ffff; @@ -1584,10 +1585,22 @@ tandy_write(uint16_t addr, uint8_t val, void *priv) mem_mapping_set_addr(&dev->ram_mapping, ((val >> 1) & 7) * 128 * 1024, 0x20000); } - if (val & 0x01) - mem_mapping_set_addr(&dev->vid->mapping, 0xc0000, 0x10000); - else - mem_mapping_set_addr(&dev->vid->mapping, 0xb8000, 0x8000); + if (dev->is_hx) { + io_removehandler(0x03d0, 16, + vid_in, NULL, NULL, vid_out, NULL, NULL, dev); + if (val & 0x01) + mem_mapping_disable(&dev->vid->mapping); + else { + io_sethandler(0x03d0, 16, + vid_in, NULL, NULL, vid_out, NULL, NULL, dev); + mem_mapping_set_addr(&dev->vid->mapping, 0xb8000, 0x8000); + } + } else { + if (val & 0x01) + mem_mapping_set_addr(&dev->vid->mapping, 0xc0000, 0x10000); + else + mem_mapping_set_addr(&dev->vid->mapping, 0xb8000, 0x8000); + } dev->ram_bank = val; break; @@ -1717,8 +1730,7 @@ machine_tandy1k_init(const machine_t *model, int type) { tandy_t *dev; - dev = malloc(sizeof(tandy_t)); - memset(dev, 0x00, sizeof(tandy_t)); + dev = calloc(1, sizeof(tandy_t)); machine_common_init(model); @@ -1753,6 +1765,7 @@ machine_tandy1k_init(const machine_t *model, int type) break; case TYPE_TANDY1000HX: + dev->is_hx = 1; keyboard_set_table(scancode_tandy); io_sethandler(0x00a0, 1, tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev); From 00035f7c69c50210abb46ce801668cefdb5f8383 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 6 Aug 2024 13:47:47 -0400 Subject: [PATCH 265/624] Fix Tandy 1000 SX minimum RAM --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 2608f1ead..a57261371 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1521,7 +1521,7 @@ const machine_t machines[] = { .bus_flags = MACHINE_PC, .flags = MACHINE_VIDEO_FIXED, .ram = { - .min = 128, + .min = 384, .max = 640, .step = 128 }, From 7cb0c648117a2550530dce80efa8ba51f60f9242 Mon Sep 17 00:00:00 2001 From: gasiba Date: Tue, 6 Aug 2024 22:33:27 +0200 Subject: [PATCH 266/624] add helper script to download ROMS to user's home directory --- scripts/86Box-install-roms.sh | 73 +++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100755 scripts/86Box-install-roms.sh diff --git a/scripts/86Box-install-roms.sh b/scripts/86Box-install-roms.sh new file mode 100755 index 000000000..b13d93acc --- /dev/null +++ b/scripts/86Box-install-roms.sh @@ -0,0 +1,73 @@ +#!/bin/sh + +URL="https://github.com/86Box/roms/archive/refs/tags/v4.2.zip" +TMP_FILE="/tmp/86Box-ROMS.zip" +EXTRACT_DIR="/tmp/86Box-ROMS-extracted" +DEFAULT_TARGET_DIR="$HOME/.local/share/86Box/roms/" +TARGET_DIR=${TARGET_DIR:-$DEFAULT_TARGET_DIR} + +install_roms() { + if [ -d "$TARGET_DIR" ] && [ "$(ls -A $TARGET_DIR)" ]; then + echo "ROMS already installed in $TARGET_DIR" + echo "To (re)install, please first remove ROMS with -r parameter" + exit 1 + fi + fetch -o "$TMP_FILE" "$URL" + + if [ $? -ne 0 ]; then + echo "Failed to download the file from $URL" + exit 1 + fi + + mkdir -p "$EXTRACT_DIR" + unzip "$TMP_FILE" -d "$EXTRACT_DIR" + + if [ $? -ne 0 ]; then + echo "Failed to decompress the file" + rm "$TMP_FILE" + exit 1 + fi + + mkdir -p "$TARGET_DIR" + cd "$EXTRACT_DIR" + TOP_LEVEL_DIR=$(find . -mindepth 1 -maxdepth 1 -type d) + + if [ -d "$TOP_LEVEL_DIR" ]; then + mv "$TOP_LEVEL_DIR"/* "$TARGET_DIR" + fi + + rm -rf "$TMP_FILE" "$EXTRACT_DIR" + echo "ROMS installed successfully in $TARGET_DIR" +} + +remove_roms() { + if [ -d "$TARGET_DIR" ]; then + rm -rf "$TARGET_DIR" + echo "ROMS removed successfully from $TARGET_DIR" + else + echo "No ROMS directory found in $TARGET_DIR" + fi +} + +help() { + echo "" + echo "$0 [-h|-i|-r]" + echo " -h : this help" + echo " -i : install (this parameter can be omitted)" + echo " -r : remove the ROMS" + echo "" +} + +case "$1" in + -h) + help + ;; + -r) + remove_roms + ;; + -i|*) + install_roms + ;; +esac + +exit 0 From 50c79e1594b2bd839bb48b5849a94007dcb4ba4c Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 6 Aug 2024 14:10:52 -0400 Subject: [PATCH 267/624] Fix Tandy 1000 HX minimum RAM --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index a57261371..460765d70 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1560,7 +1560,7 @@ const machine_t machines[] = { .bus_flags = MACHINE_PC, .flags = MACHINE_VIDEO_FIXED, .ram = { - .min = 384, + .min = 256, .max = 640, .step = 128 }, From 834bcd09c15293693b6e418aed3de2f85d84ebe6 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 6 Aug 2024 16:18:56 -0400 Subject: [PATCH 268/624] Tidy up tandy 1000 SX --- src/include/86box/machine.h | 2 +- src/machine/m_tandy.c | 6 ++++-- src/machine/machine_table.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 42fb9a6d7..8afd5e28f 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -890,7 +890,7 @@ extern int machine_ps2_model_70_type4_init(const machine_t *); /* m_tandy.c */ extern int tandy1k_eeprom_read(void); -extern int machine_tandy_init(const machine_t *); +extern int machine_tandy1000sx_init(const machine_t *); extern int machine_tandy1000hx_init(const machine_t *); extern int machine_tandy1000sl2_init(const machine_t *); diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 660710526..c5de74824 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -52,6 +52,7 @@ enum { enum { TYPE_TANDY = 0, + TYPE_TANDY1000SX, TYPE_TANDY1000HX, TYPE_TANDY1000SL2 }; @@ -1756,6 +1757,7 @@ machine_tandy1k_init(const machine_t *model, int type) switch (type) { case TYPE_TANDY: + case TYPE_TANDY1000SX: keyboard_set_table(scancode_tandy); io_sethandler(0x00a0, 1, tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev); @@ -1802,7 +1804,7 @@ tandy1k_eeprom_read(void) } int -machine_tandy_init(const machine_t *model) +machine_tandy1000sx_init(const machine_t *model) { int ret; @@ -1812,7 +1814,7 @@ machine_tandy_init(const machine_t *model) if (bios_only || !ret) return ret; - machine_tandy1k_init(model, TYPE_TANDY); + machine_tandy1k_init(model, TYPE_TANDY1000SX); return ret; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 460765d70..a9d83f241 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1503,7 +1503,7 @@ const machine_t machines[] = { .internal_name = "tandy", .type = MACHINE_TYPE_8088, .chipset = MACHINE_CHIPSET_PROPRIETARY, - .init = machine_tandy_init, + .init = machine_tandy1000sx_init, .p1_handler = NULL, .gpio_handler = NULL, .available_flag = MACHINE_AVAILABLE, From 837c16f5468fa04dad7bc6b648d66c44cc34d6ad Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 6 Aug 2024 18:01:13 -0400 Subject: [PATCH 269/624] Less magic numbers in PIT code --- src/include/86box/pit.h | 4 +++- src/include/86box/pit_fast.h | 2 +- src/pit.c | 6 +++--- src/pit_fast.c | 6 +++--- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/include/86box/pit.h b/src/include/86box/pit.h index eb03fd2c9..3c5a9cb52 100644 --- a/src/include/86box/pit.h +++ b/src/include/86box/pit.h @@ -19,6 +19,8 @@ #ifndef EMU_PIT_H #define EMU_PIT_H +#define NUM_COUNTERS 3 + typedef struct ctr_t { uint8_t m; uint8_t ctrl; @@ -68,7 +70,7 @@ typedef struct PIT { int clock; pc_timer_t callback_timer; - ctr_t counters[3]; + ctr_t counters[NUM_COUNTERS]; uint8_t ctrl; diff --git a/src/include/86box/pit_fast.h b/src/include/86box/pit_fast.h index 5650ffb4d..f824bad68 100644 --- a/src/include/86box/pit_fast.h +++ b/src/include/86box/pit_fast.h @@ -68,7 +68,7 @@ typedef struct ctrf_t { typedef struct pitf_t { int flags; - ctrf_t counters[3]; + ctrf_t counters[NUM_COUNTERS]; uint8_t ctrl; diff --git a/src/pit.c b/src/pit.c index 0816094cb..8b9f23a79 100644 --- a/src/pit.c +++ b/src/pit.c @@ -526,7 +526,7 @@ pit_timer_over(void *priv) dev->clock ^= 1; - for (uint8_t i = 0; i < 3; i++) + for (uint8_t i = 0; i < NUM_COUNTERS; i++) pit_ctr_set_clock_common(&dev->counters[i], dev->clock, dev); timer_advance_u64(&dev->callback_timer, dev->pit_const >> 1ULL); @@ -874,7 +874,7 @@ pit_device_reset(pit_t *dev) { dev->clock = 0; - for (uint8_t i = 0; i < 3; i++) + for (uint8_t i = 0; i < NUM_COUNTERS; i++) ctr_reset(&dev->counters[i]); } @@ -885,7 +885,7 @@ pit_reset(pit_t *dev) dev->clock = 0; - for (uint8_t i = 0; i < 3; i++) + for (uint8_t i = 0; i < NUM_COUNTERS; i++) ctr_reset(&dev->counters[i]); /* Disable speaker gate. */ diff --git a/src/pit_fast.c b/src/pit_fast.c index e986600ee..0f82d894d 100644 --- a/src/pit_fast.c +++ b/src/pit_fast.c @@ -670,7 +670,7 @@ pitf_reset(pitf_t *dev) { memset(dev, 0, sizeof(pitf_t)); - for (uint8_t i = 0; i < 3; i++) + for (uint8_t i = 0; i < NUM_COUNTERS; i++) ctr_reset(&dev->counters[i]); /* Disable speaker gate. */ @@ -683,7 +683,7 @@ pitf_set_pit_const(void *data, uint64_t pit_const) pitf_t *pit = (pitf_t *) data; ctrf_t *ctr; - for (uint8_t i = 0; i < 3; i++) { + for (uint8_t i = 0; i < NUM_COUNTERS; i++) { ctr = &pit->counters[i]; ctr->pit_const = pit_const; } @@ -728,7 +728,7 @@ pitf_init(const device_t *info) dev->flags = info->local; if (!(dev->flags & PIT_PS2) && !(dev->flags & PIT_CUSTOM_CLOCK)) { - for (int i = 0; i < 3; i++) { + for (int i = 0; i < NUM_COUNTERS; i++) { ctrf_t *ctr = &dev->counters[i]; ctr->priv = dev; timer_add(&ctr->timer, pitf_timer_over, (void *) ctr, 0); From b78ad87d67312a07037e475bd811c1501ef50d2b Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 6 Aug 2024 19:23:05 -0400 Subject: [PATCH 270/624] Fix compile error in pit_fast with logging enabled --- src/pit_fast.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pit_fast.c b/src/pit_fast.c index 0f82d894d..e9befb202 100644 --- a/src/pit_fast.c +++ b/src/pit_fast.c @@ -476,7 +476,7 @@ pitf_write(uint16_t addr, uint8_t val, void *priv) pitf_ctr_set_out(ctr, 1, dev); ctr->disabled = 1; - pit_log("PIT %i: M = %i, RM/WM = %i, State = %i, Out = %i\n", t, ctr->m, ctr->rm, ctr->state, ctr->out); + pit_log("PIT %i: M = %i, RM/WM = %i, Out = %i\n", t, ctr->m, ctr->rm, ctr->out); } ctr->thit = 0; } From f04229280b25dbb7ec970653eb1fce8e0dc363dd Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 6 Aug 2024 19:45:10 -0400 Subject: [PATCH 271/624] Give pit_fast unique logging name --- src/pit_fast.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/pit_fast.c b/src/pit_fast.c index e9befb202..0d56a6616 100644 --- a/src/pit_fast.c +++ b/src/pit_fast.c @@ -47,22 +47,22 @@ #define PIT_CUSTOM_CLOCK 64 /* The PIT uses custom clock inputs provided by another provider. */ #define PIT_SECONDARY 128 /* The PIT is secondary (ports 0048-004B). */ -#ifdef ENABLE_PIT_LOG -int pit_do_log = ENABLE_PIT_LOG; +#ifdef ENABLE_PIT_FAST_LOG +int pit_fast_do_log = ENABLE_PIT_FAST_LOG; static void -pit_log(const char *fmt, ...) +pit_fast_log(const char *fmt, ...) { va_list ap; - if (pit_do_log) { + if (pit_fast_do_log) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); } } #else -# define pit_log(fmt, ...) +# define pit_fast_log(fmt, ...) #endif static void @@ -420,7 +420,7 @@ pitf_write(uint16_t addr, uint8_t val, void *priv) int t = (addr & 3); ctrf_t *ctr; - pit_log("[%04X:%08X] pit_write(%04X, %02X, %08X)\n", CS, cpu_state.pc, addr, val, priv); + pit_fast_log("[%04X:%08X] pit_write(%04X, %02X, %08X)\n", CS, cpu_state.pc, addr, val, priv); cycles -= ISA_CYCLES(8); @@ -438,7 +438,7 @@ pitf_write(uint16_t addr, uint8_t val, void *priv) pitf_ctr_latch_count(&dev->counters[1]); if (val & 8) pitf_ctr_latch_count(&dev->counters[2]); - pit_log("PIT %i: Initiated readback command\n", t); + pit_fast_log("PIT %i: Initiated readback command\n", t); } if (!(val & 0x10)) { if (val & 2) @@ -456,7 +456,7 @@ pitf_write(uint16_t addr, uint8_t val, void *priv) if (!(dev->ctrl & 0x30)) { pitf_ctr_latch_count(ctr); dev->ctrl |= 0x30; - pit_log("PIT %i: Initiated latched read, %i bytes latched\n", + pit_fast_log("PIT %i: Initiated latched read, %i bytes latched\n", t, ctr->latched); } else { ctr->ctrl = val; @@ -476,7 +476,7 @@ pitf_write(uint16_t addr, uint8_t val, void *priv) pitf_ctr_set_out(ctr, 1, dev); ctr->disabled = 1; - pit_log("PIT %i: M = %i, RM/WM = %i, Out = %i\n", t, ctr->m, ctr->rm, ctr->out); + pit_fast_log("PIT %i: M = %i, RM/WM = %i, Out = %i\n", t, ctr->m, ctr->rm, ctr->out); } ctr->thit = 0; } @@ -619,7 +619,7 @@ pitf_read(uint16_t addr, void *priv) break; } - pit_log("[%04X:%08X] pit_read(%04X, %08X) = %02X\n", CS, cpu_state.pc, addr, priv, ret); + pit_fast_log("[%04X:%08X] pit_read(%04X, %08X) = %02X\n", CS, cpu_state.pc, addr, priv, ret); return ret; } From fbfb6849c4acbf855400bd2369ed8463e98e9318 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 Aug 2024 05:08:41 +0200 Subject: [PATCH 272/624] Compaq EGA: Implement C&T behavior where reads in mode 0 return 0xFF if bit 2 of GDC register 4 is set, fixes video memory size detection, fixes #4571. --- src/video/vid_ega.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 8f995117c..9a0ebfc50 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -1278,6 +1278,10 @@ ega_read(uint32_t addr, void *priv) temp4 &= (ega->colournocare & 8) ? 0xff : 0; return ~(temp | temp2 | temp3 | temp4); } + + if ((ega_type == 2) && (ega->gdcreg[4] & 0x04)) + return 0xff; + return ega->vram[addr | readplane]; } From 3c8c66d64960f6957395a9cd80c702f464efac1b Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 Aug 2024 05:32:52 +0200 Subject: [PATCH 273/624] Re-add the English translations of the Fullscreen menu item, they're apparently needed for the keyboard shortcut to show up in the menu. --- src/qt/languages/en-GB.po | 3 +++ src/qt/languages/en-US.po | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index fa6d1e2c3..b8b421f10 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -6,6 +6,9 @@ msgstr "" "X-Language: en_GB\n" "X-Source-Language: en_US\n" +msgid "&Fullscreen\tCtrl+Alt+PgUp" +msgstr "&Fullscreen\tCtrl+Alt+PgUp" + msgid "RGB &Color" msgstr "RGB &Colour" diff --git a/src/qt/languages/en-US.po b/src/qt/languages/en-US.po index e78536c66..9efb2ad0d 100644 --- a/src/qt/languages/en-US.po +++ b/src/qt/languages/en-US.po @@ -5,3 +5,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Language: en_US\n" "X-Source-Language: en_US\n" + +msgid "&Fullscreen\tCtrl+Alt+PgUp" +msgstr "&Fullscreen\tCtrl+Alt+PgUp" From f537ae792ea4817368e821154081c78b636b71b5 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 Aug 2024 05:38:05 +0200 Subject: [PATCH 274/624] Actually fix that correctly now by actually adding the shortcut to the menu item. --- src/qt/languages/en-GB.po | 3 --- src/qt/languages/en-US.po | 3 --- src/qt/qt_mainwindow.ui | 3 +++ 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index b8b421f10..fa6d1e2c3 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -6,9 +6,6 @@ msgstr "" "X-Language: en_GB\n" "X-Source-Language: en_US\n" -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Fullscreen\tCtrl+Alt+PgUp" - msgid "RGB &Color" msgstr "RGB &Colour" diff --git a/src/qt/languages/en-US.po b/src/qt/languages/en-US.po index 9efb2ad0d..e78536c66 100644 --- a/src/qt/languages/en-US.po +++ b/src/qt/languages/en-US.po @@ -5,6 +5,3 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Language: en_US\n" "X-Source-Language: en_US\n" - -msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Fullscreen\tCtrl+Alt+PgUp" diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index 90dbfdab7..b1dc0ecf1 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -373,6 +373,9 @@ &Fullscreen + + Ctrl+Alt+PgUp + From 37ceea4ed04f4398817928804ca45a54647d34cc Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 Aug 2024 06:11:50 +0200 Subject: [PATCH 275/624] Fix emulator-handled UI keyboard combinations when keyboard requires capture and is not captured, also fix keyboard input in full screen in such situations, fixes #4697. --- src/device/keyboard.c | 41 ++++++++++++++++++--------------- src/include/86box/keyboard.h | 1 + src/qt/qt_mainwindow.cpp | 12 +++++----- src/qt/qt_winrawinputfilter.cpp | 3 --- 4 files changed, 30 insertions(+), 27 deletions(-) diff --git a/src/device/keyboard.c b/src/device/keyboard.c index 5f9986d7b..ea81e7525 100644 --- a/src/device/keyboard.c +++ b/src/device/keyboard.c @@ -25,6 +25,7 @@ #include <86box/86box.h> #include <86box/machine.h> #include <86box/keyboard.h> +#include <86box/plat.h> #include "cpu.h" @@ -50,7 +51,8 @@ uint16_t key_uncapture_2 = 0x14f; /* End */ void (*keyboard_send)(uint16_t val); -static int recv_key[512]; /* keyboard input buffer */ +static int recv_key[512] = { 0 }; /* keyboard input buffer */ +static int recv_key_ui[512] = { 0 }; /* keyboard input buffer */ static int oldkey[512]; #if 0 static int keydelay[512]; @@ -238,16 +240,13 @@ keyboard_input(int down, uint16_t scan) } } - /* NOTE: Shouldn't this be some sort of bit shift? An array of 8 unsigned 64-bit integers - should be enough. */ -#if 0 - recv_key[scan >> 6] |= ((uint64_t) down << ((uint64_t) scan & 0x3fLL)); -#endif - /* pclog("Received scan code: %03X (%s)\n", scan & 0x1ff, down ? "down" : "up"); */ - recv_key[scan & 0x1ff] = down; + recv_key_ui[scan & 0x1ff] = down; - key_process(scan & 0x1ff, down); + if (mouse_capture || !kbd_req_capture || video_fullscreen) { + recv_key[scan & 0x1ff] = down; + key_process(scan & 0x1ff, down); + } } static uint8_t @@ -343,30 +342,36 @@ keyboard_recv(uint16_t key) return recv_key[key]; } +int +keyboard_recv_ui(uint16_t key) +{ + return recv_key_ui[key]; +} + /* Do we have Control-Alt-PgDn in the keyboard buffer? */ int keyboard_isfsenter(void) { - return ((recv_key[0x01d] || recv_key[0x11d]) && (recv_key[0x038] || recv_key[0x138]) && (recv_key[0x049] || recv_key[0x149])); + return ((recv_key_ui[0x01d] || recv_key_ui[0x11d]) && (recv_key_ui[0x038] || recv_key_ui[0x138]) && (recv_key_ui[0x049] || recv_key_ui[0x149])); } int keyboard_isfsenter_up(void) { - return (!recv_key[0x01d] && !recv_key[0x11d] && !recv_key[0x038] && !recv_key[0x138] && !recv_key[0x049] && !recv_key[0x149]); + return (!recv_key_ui[0x01d] && !recv_key_ui[0x11d] && !recv_key_ui[0x038] && !recv_key_ui[0x138] && !recv_key_ui[0x049] && !recv_key_ui[0x149]); } /* Do we have Control-Alt-PgDn in the keyboard buffer? */ int keyboard_isfsexit(void) { - return ((recv_key[0x01d] || recv_key[0x11d]) && (recv_key[0x038] || recv_key[0x138]) && (recv_key[0x051] || recv_key[0x151])); + return ((recv_key_ui[0x01d] || recv_key_ui[0x11d]) && (recv_key_ui[0x038] || recv_key_ui[0x138]) && (recv_key_ui[0x051] || recv_key_ui[0x151])); } int keyboard_isfsexit_up(void) { - return (!recv_key[0x01d] && !recv_key[0x11d] && !recv_key[0x038] && !recv_key[0x138] && !recv_key[0x051] && !recv_key[0x151]); + return (!recv_key_ui[0x01d] && !recv_key_ui[0x11d] && !recv_key_ui[0x038] && !recv_key_ui[0x138] && !recv_key_ui[0x051] && !recv_key_ui[0x151]); } /* Do we have the mouse uncapture combination in the keyboard buffer? */ @@ -374,10 +379,10 @@ int keyboard_ismsexit(void) { if ((key_prefix_2_1 != 0x000) || (key_prefix_2_2 != 0x000)) - return ((recv_key[key_prefix_1_1] || recv_key[key_prefix_1_2]) && - (recv_key[key_prefix_2_1] || recv_key[key_prefix_2_2]) && - (recv_key[key_uncapture_1] || recv_key[key_uncapture_2])); + return ((recv_key_ui[key_prefix_1_1] || recv_key_ui[key_prefix_1_2]) && + (recv_key_ui[key_prefix_2_1] || recv_key_ui[key_prefix_2_2]) && + (recv_key_ui[key_uncapture_1] || recv_key_ui[key_uncapture_2])); else - return ((recv_key[key_prefix_1_1] || recv_key[key_prefix_1_2]) && - (recv_key[key_uncapture_1] || recv_key[key_uncapture_2])); + return ((recv_key_ui[key_prefix_1_1] || recv_key_ui[key_prefix_1_2]) && + (recv_key_ui[key_uncapture_1] || recv_key_ui[key_uncapture_2])); } diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index bf9a76d73..eec64990e 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -272,6 +272,7 @@ extern uint8_t keyboard_get_shift(void); extern void keyboard_get_states(uint8_t *cl, uint8_t *nl, uint8_t *sl); extern void keyboard_set_states(uint8_t cl, uint8_t nl, uint8_t sl); extern int keyboard_recv(uint16_t key); +extern int keyboard_recv_ui(uint16_t key); extern int keyboard_isfsenter(void); extern int keyboard_isfsenter_up(void); extern int keyboard_isfsexit(void); diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 0b7ebb33d..916f3eb5e 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1218,7 +1218,7 @@ MainWindow::getTitle(wchar_t *title) bool MainWindow::eventFilter(QObject *receiver, QEvent *event) { - if (!dopause && (mouse_capture || !kbd_req_capture)) { + if (!dopause) { if (event->type() == QEvent::Shortcut) { auto shortcutEvent = (QShortcutEvent *) event; if (shortcutEvent->key() == ui->actionExit->shortcut()) { @@ -1299,7 +1299,7 @@ MainWindow::showMessage_(int flags, const QString &header, const QString &messag void MainWindow::keyPressEvent(QKeyEvent *event) { - if (send_keyboard_input && !(kbd_req_capture && !mouse_capture)) { + if (send_keyboard_input) { #ifdef Q_OS_MACOS processMacKeyboardInput(true, event); #else @@ -1312,10 +1312,10 @@ MainWindow::keyPressEvent(QKeyEvent *event) if (keyboard_ismsexit()) plat_mouse_capture(0); - if ((video_fullscreen > 0) && (keyboard_recv(0x1D) || keyboard_recv(0x11D))) { - if (keyboard_recv(0x57)) + 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(0x58)) + else if (keyboard_recv_ui(0x58)) pc_send_cad(); } @@ -1338,7 +1338,7 @@ void MainWindow::keyReleaseEvent(QKeyEvent *event) { if (event->key() == Qt::Key_Pause) { - if (keyboard_recv(0x38) && keyboard_recv(0x138)) { + if (keyboard_recv_ui(0x38) && keyboard_recv_ui(0x138)) { plat_pause(dopause ^ 1); } } diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index 857ccef3b..66d8ad8e5 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -176,9 +176,6 @@ WindowsRawInputFilter::keyboard_handle(PRAWINPUT raw) RAWKEYBOARD rawKB = raw->data.keyboard; scancode = rawKB.MakeCode; - if (kbd_req_capture && !mouse_capture) - return; - /* If it's not a scan code that starts with 0xE1 */ if ((rawKB.Flags & RI_KEY_E1)) { if (rawKB.MakeCode == 0x1D) { From 7b73c015d72b985ab75d8b7d1a82210465930743 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 6 Aug 2024 23:47:45 -0400 Subject: [PATCH 276/624] Compile fix for sis_85c50x.c logging --- src/chipset/sis_85c50x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chipset/sis_85c50x.c b/src/chipset/sis_85c50x.c index 137ddb5cf..2286105ce 100644 --- a/src/chipset/sis_85c50x.c +++ b/src/chipset/sis_85c50x.c @@ -107,8 +107,8 @@ sis_85c50x_shadow_recalc(sis_85c50x_t *dev) if (dev->states[8 + i] != state) { mem_set_mem_state_both(base, 0x00004000, state); sis_85c50x_log("%05X-%05X: R%c, W%c\n", base, base + 0x3fff, - (dev->pci_conf[0x543 & (0x80 >> i)) ? - ((dev->pci_conf[0x54] & 0x40) ? 'I' : 'D') : 'E', + (dev->pci_conf[0x54] & (0x80 >> i)) ? + ((dev->pci_conf[0x53] & 0x40) ? 'I' : 'D') : 'E', (dev->pci_conf[0x54] & (0x80 >> i)) ? ((dev->pci_conf[0x53] & 0x20) ? 'P' : 'I') : 'E'); dev->states[8 + i] = state; From bda8fe7b9b8e7bfd02160c279956b24a3e366e18 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 00:14:53 -0400 Subject: [PATCH 277/624] Compile fix for cpu/x86.c logging --- src/cpu/x86.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 5435f366d..4bf381ee4 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -83,7 +83,9 @@ int fpu_cycles = 0; int in_lock = 0; #ifdef ENABLE_X86_LOG +#if 0 void dumpregs(int); +#endif int x86_do_log = ENABLE_X86_LOG; int indump = 0; @@ -93,13 +95,14 @@ x86_log(const char *fmt, ...) { va_list ap; - if (x808x_do_log) { + if (x86_do_log) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); } } +#if 0 void dumpregs(int force) { @@ -144,6 +147,7 @@ dumpregs(int force) x87_dumpregs(); indump = 0; } +#endif #else # define x86_log(fmt, ...) #endif From 7ffcf545cd080f4b84e67ebab804cb9d27ed6cb3 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 00:32:23 -0400 Subject: [PATCH 278/624] Compile fix for dma.c logging --- src/dma.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dma.c b/src/dma.c index 1c23c53c2..8bf60cdc8 100644 --- a/src/dma.c +++ b/src/dma.c @@ -18,6 +18,7 @@ * Copyright 2016-2020 Miran Grca. * Copyright 2017-2020 Fred N. van Kempen. */ +#include #include #include #include From 5b8b5d739bf5262021ce0e001bf6e0a3f1663e3f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 00:28:07 -0400 Subject: [PATCH 279/624] Deal with some magic numbers in vid_ega.c --- src/video/vid_ega.c | 48 +++++++++++++++++++++++++-------------------- 1 file changed, 27 insertions(+), 21 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 9a0ebfc50..712df923c 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -54,11 +54,17 @@ enum { EGA_TSENG }; +enum { + EGA_TYPE_IBM = 0; + EGA_TYPE_OTHER = 1; + EGA_TYPE_COMPAQ = 2; +}; + static video_timings_t timing_ega = { .type = VIDEO_ISA, .write_b = 8, .write_w = 16, .write_l = 32, .read_b = 8, .read_w = 16, .read_l = 32 }; static uint8_t ega_rotate[8][256]; static uint32_t pallook16[256]; static uint32_t pallook64[256]; -static int ega_type = 0; +static int ega_type = EGA_TYPE_IBM; static int old_overscan_color = 0; /* 3C2 controls default mode on EGA. On VGA, it determines monitor type (mono or colour): @@ -180,7 +186,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) } break; case 0x3c6: - if (ega_type == 2) + if (ega_type == EGA_TYPE_COMPAQ) ega->ctl_mode = val; break; case 0x3ce: @@ -295,47 +301,47 @@ ega_in(uint16_t addr, void *priv) break; case 0x3c0: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->attraddr | ega->attr_palette_enable; break; case 0x3c1: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->attrregs[ega->attraddr]; break; case 0x3c2: ret = (egaswitches & (8 >> egaswitchread)) ? 0x10 : 0x00; break; case 0x3c4: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->seqaddr; break; case 0x3c5: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->seqregs[ega->seqaddr & 0xf]; break; case 0x3c6: - if (ega_type == 2) + if (ega_type == EGA_TYPE_COMPAQ) ret = ega->ctl_mode; break; case 0x3c8: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = 2; break; case 0x3cc: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->miscout; break; case 0x3ce: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->gdcaddr; break; case 0x3cf: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->gdcreg[ega->gdcaddr & 0xf]; break; case 0x3d0: case 0x3d4: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->crtcreg; break; case 0x3d1: @@ -349,28 +355,28 @@ ega_in(uint16_t addr, void *priv) break; case 0x10: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->crtc[ega->crtcreg]; else ret = ega->light_pen >> 8; break; case 0x11: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->crtc[ega->crtcreg]; else ret = ega->light_pen & 0xff; break; default: - if (ega_type == 1) + if (ega_type == EGA_TYPE_OTHER) ret = ega->crtc[ega->crtcreg]; break; } break; case 0x3da: ega->attrff = 0; - if (ega_type == 2) { + if (ega_type == EGA_TYPE_COMPAQ) { ret = ega->stat & 0xcf; switch ((ega->attrregs[0x12] >> 4) & 0x03) { case 0x00: @@ -466,7 +472,7 @@ ega_recalctimings(ega_t *ega) ega->linedbl = ega->crtc[9] & 0x80; ega->rowcount = ega->crtc[9] & 0x1f; - if (ega_type == 2) { + if (ega_type == EGA_TYPE_COMPAQ) { color = (ega->miscout & 1); clksel = ((ega->miscout & 0xc) >> 2); @@ -1396,7 +1402,7 @@ ega_init(ega_t *ega, int monitor_type, int is_mono) ega->crtc[6] = 255; timer_add(&ega->timer, ega_poll, ega, 1); - if (ega_type == 2) + if (ega_type == EGA_TYPE_COMPAQ) timer_add(&ega->dot_timer, ega_dot_poll, ega, 1); } @@ -1416,11 +1422,11 @@ ega_standalone_init(const device_t *info) ega->y_add = 14; if ((info->local == EGA_IBM) || (info->local == EGA_ISKRA) || (info->local == EGA_TSENG)) - ega_type = 0; + ega_type = EGA_TYPE_IBM; else if (info->local == EGA_COMPAQ) - ega_type = 2; + ega_type = EGA_TYPE_COMPAQ; else - ega_type = 1; + ega_type = EGA_TYPE_OTHER; ega->actual_type = info->local; ega->chipset = 0; From de851d9173b71bd799ed124dad12efda97645f2f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 00:41:11 -0400 Subject: [PATCH 280/624] Compile fix for cpu/386.c logging --- src/cpu/386.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpu/386.c b/src/cpu/386.c index 657bd0894..3524e0d1e 100644 --- a/src/cpu/386.c +++ b/src/cpu/386.c @@ -279,7 +279,7 @@ exec386_2386(int32_t cycs) if (!cpu_state.abrt) { #ifdef ENABLE_386_LOG if (in_smm) - x386_2386_log("[%04X:%08X] %08X\n", CS, cpu_state.pc, fetchdat); + x386_log("[%04X:%08X] %08X\n", CS, cpu_state.pc, fetchdat); #endif opcode = fetchdat & 0xFF; fetchdat >>= 8; From 5b922c4747c8468ba409b0b2b3cbf027cfd4d7d5 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 00:48:11 -0400 Subject: [PATCH 281/624] Cleanups to logging in cdrom_image_backend.c --- src/cdrom/cdrom_image_backend.c | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index 25085285c..7dcde1cdb 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -170,25 +170,23 @@ cleanup_error: static int bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) { - track_file_t *tf; - - cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu)\n", - tf->fp, seek, count); + track_file_t *tf = NULL; if ((tf = (track_file_t *) priv)->fp == NULL) return 0; + cdrom_image_backend_log("CDROM: binary_read(%08lx, pos=%" PRIu64 " count=%lu)\n", + tf->fp, seek, count); + if (fseeko64(tf->fp, seek, SEEK_SET) == -1) { -#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG cdrom_image_backend_log("CDROM: binary_read failed during seek!\n"); -#endif + return 0; } if (fread(buffer, count, 1, tf->fp) != 1) { -#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG cdrom_image_backend_log("CDROM: binary_read failed during read!\n"); -#endif + return 0; } @@ -207,9 +205,7 @@ bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) static uint64_t bin_get_length(void *priv) { - track_file_t *tf; - - cdrom_image_backend_log("CDROM: binary_length(%08lx)\n", tf->fp); + track_file_t *tf = NULL; if ((tf = (track_file_t *) priv)->fp == NULL) return 0; @@ -1159,10 +1155,9 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) trk.file = audio_init(filename, &error); } if (error) { -#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG cdrom_image_backend_log("CUE: cannot open file '%s' in cue sheet!\n", filename); -#endif + if (trk.file != NULL) { trk.file->close(trk.file); trk.file = NULL; @@ -1177,9 +1172,8 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) /* Ignored commands. */ success = 1; } else { -#ifdef ENABLE_CDROM_IMAGE_BACKEND_LOG cdrom_image_backend_log("CUE: unsupported command '%s' in cue sheet!\n", command); -#endif + success = 0; } From 8be47d6781c349373cc9e36586de1a7b85fa5d93 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 00:55:57 -0400 Subject: [PATCH 282/624] Fix some compile warns and update monster copyright --- src/floppy/fdc_monster.c | 21 +++++++++++---------- src/sound/snd_cs423x.c | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index d2dedb5c0..504254ee0 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -11,10 +11,11 @@ * * * Authors: Jasmine Iwanek, + * Miran Grca, * - * Copyright 2022 Jasmine Iwanek. + * Copyright 2022-2024 Jasmine Iwanek. + * Copyright 2024 Miran Grca. */ - #include #include #include @@ -103,10 +104,10 @@ monster_fdc_close(void *priv) monster_fdc_t *dev = (monster_fdc_t *) priv; if (dev->nvr_path[0] != 0x00) { - FILE *f = nvr_fopen(dev->nvr_path, "wb"); - if (f != NULL) { - fwrite(dev->bios_rom.rom, 1, 0x2000, f); - fclose(f); + FILE *fp = nvr_fopen(dev->nvr_path, "wb"); + if (fp != NULL) { + fwrite(dev->bios_rom.rom, 1, 0x2000, fp); + fclose(fp); } } @@ -144,10 +145,10 @@ monster_fdc_init(UNUSED(const device_t *info)) if (rom_writes_enabled) { mem_mapping_set_write_handler(&dev->bios_rom.mapping, rom_write, rom_writew, rom_writel); sprintf(dev->nvr_path, "monster_fdc_%i.nvr", device_get_instance()); - FILE *f = nvr_fopen(dev->nvr_path, "rb"); - if (f != NULL) { - fread(dev->bios_rom.rom, 1, 0x2000, f); - fclose(f); + FILE *fp = nvr_fopen(dev->nvr_path, "rb"); + if (fp != NULL) { + (void) !fread(dev->bios_rom.rom, 1, 0x2000, fp); + fclose(fp); } } diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 02ca16fa6..95d183e8f 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -752,7 +752,7 @@ cs423x_init(const device_t *info) FILE *fp = rom_fopen(PNP_ROM_CS4236B, "rb"); if (fp) { - fread(&(dev->eeprom_data[23]), 1, 8201, fp); + (void) !fread(&(dev->eeprom_data[23]), 1, 8201, fp); fclose(fp); } From 7b80e6dc159a7bf530779c641a0444e26525f0ef Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 01:02:33 -0400 Subject: [PATCH 283/624] Compile fix for smbus_sis5595.c logging --- src/device/smbus_sis5595.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/smbus_sis5595.c b/src/device/smbus_sis5595.c index b76b38e17..191e7a6a5 100644 --- a/src/device/smbus_sis5595.c +++ b/src/device/smbus_sis5595.c @@ -148,7 +148,7 @@ smbus_sis5595_read_data(void *priv) break; } - smbus_sis5595_log("SMBus SIS5595: read(%02X) = %02x\n", addr, ret); + smbus_sis5595_log("SMBus SIS5595: read(%02X) = %02x\n", dev->addr, ret); return ret; } @@ -171,7 +171,7 @@ smbus_sis5595_write_data(void *priv, uint8_t val) uint16_t prev_stat; uint16_t timer_bytes = 0; - smbus_sis5595_log("SMBus SIS5595: write(%02X, %02X)\n", addr, val); + smbus_sis5595_log("SMBus SIS5595: write(%02X, %02X)\n", dev->addr, val); prev_stat = dev->next_stat; dev->next_stat = 0x0000; From fde5606799844669dcf43aee0c85975b6e1bc950 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Tue, 6 Aug 2024 22:51:05 -0400 Subject: [PATCH 284/624] Fix compilation when building the GDB stub --- src/gdbstub.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gdbstub.c b/src/gdbstub.c index 8322c5ef6..900f40dab 100644 --- a/src/gdbstub.c +++ b/src/gdbstub.c @@ -40,6 +40,7 @@ #include <86box/86box.h> #include "cpu.h" #include "x86seg.h" +#include "x87_sf.h" #include "x87.h" #include "x87_ops_conv.h" #include <86box/io.h> From 493e82f4882764482ad20803aa3d6108512f0ebe Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 01:29:13 -0400 Subject: [PATCH 285/624] Fix mistake in vid_ega.c --- src/video/vid_ega.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 712df923c..b05491bf0 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -55,9 +55,9 @@ enum { }; enum { - EGA_TYPE_IBM = 0; - EGA_TYPE_OTHER = 1; - EGA_TYPE_COMPAQ = 2; + EGA_TYPE_IBM = 0, + EGA_TYPE_OTHER = 1, + EGA_TYPE_COMPAQ = 2 }; static video_timings_t timing_ega = { .type = VIDEO_ISA, .write_b = 8, .write_w = 16, .write_l = 32, .read_b = 8, .read_w = 16, .read_l = 32 }; From 68437c22bf81a1d8d52b784d7dad284c4047a599 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 01:32:36 -0400 Subject: [PATCH 286/624] Compile fix for hdc_ide_ali5213.c logging --- src/disk/hdc_ide_ali5213.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/disk/hdc_ide_ali5213.c b/src/disk/hdc_ide_ali5213.c index eee3844c4..8ff3d392c 100644 --- a/src/disk/hdc_ide_ali5213.c +++ b/src/disk/hdc_ide_ali5213.c @@ -83,7 +83,7 @@ ali5213_write(uint16_t addr, uint8_t val, void *priv) { ali5213_t *dev = (ali5213_t *) priv; - ali5213_log("[%04X:%08X] [W] %02X = %02X (%i)\n", CS, cpu_state.pc, port, val, dev->tries); + ali5213_log("[%04X:%08X] [W] %02X = %02X\n", CS, cpu_state.pc, addr, val); switch (addr) { case 0xf4: /* Usually it writes 30h here */ @@ -179,7 +179,7 @@ ali5213_read(uint16_t addr, void *priv) break; } - ali5213_log("[%04X:%08X] [R] %02X = %02X\n", CS, cpu_state.pc, port, ret); + ali5213_log("[%04X:%08X] [R] %02X = %02X\n", CS, cpu_state.pc, addr, ret); return ret; } From a6cd293baa1d0a0dd99babc4a07a0e7f65c9511f Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 01:59:25 -0400 Subject: [PATCH 287/624] Compile fix for hdc_ide_um8673f.c logging --- src/disk/hdc_ide_um8673f.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/disk/hdc_ide_um8673f.c b/src/disk/hdc_ide_um8673f.c index 9ee149c7f..bc046dd26 100644 --- a/src/disk/hdc_ide_um8673f.c +++ b/src/disk/hdc_ide_um8673f.c @@ -79,7 +79,7 @@ um8673f_write(uint16_t addr, uint8_t val, void *priv) { um8673f_t *dev = (um8673f_t *) priv; - um8673f_log("[%04X:%08X] [W] %02X = %02X (%i)\n", CS, cpu_state.pc, port, val, dev->tries); + um8673f_log("[%04X:%08X] [W] %02X = %02X (%i)\n", CS, cpu_state.pc, addr, val, dev->tries); switch (addr) { case 0x108: @@ -140,7 +140,7 @@ um8673f_read(uint16_t addr, void *priv) break; } - um8673f_log("[%04X:%08X] [R] %02X = %02X\n", CS, cpu_state.pc, port, ret); + um8673f_log("[%04X:%08X] [R] %02X = %02X\n", CS, cpu_state.pc, addr, ret); return ret; } From 31f87b873a035e38d6f27df4ae361a7c1fe7e2fa Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 02:02:50 -0400 Subject: [PATCH 288/624] Compile fix for hdc_ide_w83769f.c logging --- src/disk/hdc_ide_w83769f.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disk/hdc_ide_w83769f.c b/src/disk/hdc_ide_w83769f.c index ed34bc9fc..c2b053814 100644 --- a/src/disk/hdc_ide_w83769f.c +++ b/src/disk/hdc_ide_w83769f.c @@ -59,7 +59,7 @@ w83769f_log(const char *fmt, ...) { va_list ap; - if (cmd640_do_log) { + if (w83769f_do_log) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); From e1fffd155ac085c09680442d559b82831c66b5eb Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 02:14:22 -0400 Subject: [PATCH 289/624] Compile fix for net_rtl8139.c logging --- src/network/net_rtl8139.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/network/net_rtl8139.c b/src/network/net_rtl8139.c index 2e85d67bf..bc44b3fb1 100644 --- a/src/network/net_rtl8139.c +++ b/src/network/net_rtl8139.c @@ -22,13 +22,14 @@ * Copyright 2011-2023 Benjamin Poirier. * Copyright 2023 Cacodemon345. */ +#include #include #include #include #include #include #include - +#define HAVE_STDARG_H #include <86box/86box.h> #include <86box/timer.h> #include <86box/pci.h> From 0ce0f477b563c081c8bd7c722d6fd8fde95adb55 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 02:22:46 -0400 Subject: [PATCH 290/624] Compile fix for dummy_cdrom_ioctl.c logging --- src/unix/dummy_cdrom_ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/unix/dummy_cdrom_ioctl.c b/src/unix/dummy_cdrom_ioctl.c index 5c533b216..ed19dfb1f 100644 --- a/src/unix/dummy_cdrom_ioctl.c +++ b/src/unix/dummy_cdrom_ioctl.c @@ -205,7 +205,7 @@ plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) /* Cooked */ } plat_cdrom_close(); - dummy_cdrom_ioctl_log("ReadSector status=%d, sector=%d, size=%" PRId64 ".\n", status, sector, (long long) size); + dummy_cdrom_ioctl_log("ReadSector sector=%d.\n", sector); return 0; } From 765e65e72a0ccd3a727ba16fda9587c3dae2e035 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 02:30:56 -0400 Subject: [PATCH 291/624] Compile fix for cpu/x87.c logging --- src/cpu/x87.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/cpu/x87.c b/src/cpu/x87.c index 2aafd44e6..390c06dc2 100644 --- a/src/cpu/x87.c +++ b/src/cpu/x87.c @@ -26,22 +26,22 @@ uint32_t x87_op_off; uint16_t x87_pc_seg; uint16_t x87_op_seg; -#ifdef ENABLE_FPU_LOG -int fpu_do_log = ENABLE_FPU_LOG; +#ifdef ENABLE_FPU_X87_LOG +int fpu_x87_do_log = ENABLE_FPU_X87_LOG; void -fpu_log(const char *fmt, ...) +fpu_x87_log(const char *fmt, ...) { va_list ap; - if (fpu_do_log) { + if (fpu_x87_do_log) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); } } #else -# define fpu_log(fmt, ...) +# define fpu_x87_log(fmt, ...) #endif #ifdef USE_NEW_DYNAREC @@ -546,17 +546,17 @@ unpack_FPU_TW(uint16_t tag_byte) return (twd >> 2); } -#ifdef ENABLE_808X_LOG +#ifdef ENABLE_FPU_X87_LOG void x87_dumpregs(void) { if (cpu_state.ismmx) { - fpu_log("MM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\n", cpu_state.MM[0].q, cpu_state.MM[1].q, cpu_state.MM[2].q, cpu_state.MM[3].q); - fpu_log("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", cpu_state.MM[4].q, cpu_state.MM[5].q, cpu_state.MM[6].q, cpu_state.MM[7].q); + fpu_x87_log("MM0=%016llX\tMM1=%016llX\tMM2=%016llX\tMM3=%016llX\n", cpu_state.MM[0].q, cpu_state.MM[1].q, cpu_state.MM[2].q, cpu_state.MM[3].q); + fpu_x87_log("MM4=%016llX\tMM5=%016llX\tMM6=%016llX\tMM7=%016llX\n", cpu_state.MM[4].q, cpu_state.MM[5].q, cpu_state.MM[6].q, cpu_state.MM[7].q); } else { - fpu_log("ST(0)=%f\tST(1)=%f\tST(2)=%f\tST(3)=%f\t\n", cpu_state.ST[cpu_state.TOP], cpu_state.ST[(cpu_state.TOP + 1) & 7], cpu_state.ST[(cpu_state.TOP + 2) & 7], cpu_state.ST[(cpu_state.TOP + 3) & 7]); - fpu_log("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\t\n", cpu_state.ST[(cpu_state.TOP + 4) & 7], cpu_state.ST[(cpu_state.TOP + 5) & 7], cpu_state.ST[(cpu_state.TOP + 6) & 7], cpu_state.ST[(cpu_state.TOP + 7) & 7]); + fpu_x87_log("ST(0)=%f\tST(1)=%f\tST(2)=%f\tST(3)=%f\t\n", cpu_state.ST[cpu_state.TOP], cpu_state.ST[(cpu_state.TOP + 1) & 7], cpu_state.ST[(cpu_state.TOP + 2) & 7], cpu_state.ST[(cpu_state.TOP + 3) & 7]); + fpu_x87_log("ST(4)=%f\tST(5)=%f\tST(6)=%f\tST(7)=%f\t\n", cpu_state.ST[(cpu_state.TOP + 4) & 7], cpu_state.ST[(cpu_state.TOP + 5) & 7], cpu_state.ST[(cpu_state.TOP + 6) & 7], cpu_state.ST[(cpu_state.TOP + 7) & 7]); } - fpu_log("Status = %04X Control = %04X Tag = %04X\n", cpu_state.npxs, cpu_state.npxc, x87_gettag()); + fpu_x87_log("Status = %04X Control = %04X Tag = %04X\n", cpu_state.npxs, cpu_state.npxc, x87_gettag()); } #endif From a4815fccfe7dab54fe7fea4d05228904fbe0f423 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 7 Aug 2024 02:43:19 -0400 Subject: [PATCH 292/624] Compile fix for cpu/808x.c logging --- src/cpu/808x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpu/808x.c b/src/cpu/808x.c index 6705563c0..990f9ae87 100644 --- a/src/cpu/808x.c +++ b/src/cpu/808x.c @@ -130,10 +130,10 @@ typedef int (*OpFn)(uint32_t fetchdat); static int tempc_fpu = 0; #ifdef ENABLE_808X_LOG +#if 0 void dumpregs(int); - +#endif int x808x_do_log = ENABLE_808X_LOG; -int indump = 0; static void x808x_log(const char *fmt, ...) From 6118f7080ddad100607a88a9ee96c18f65100822 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 Aug 2024 17:34:09 +0200 Subject: [PATCH 293/624] Compaq EGA: Put the dot poll timer into the correct time after a timings recalculation, fixes POST errors on non-Compaq machines. --- src/video/vid_ega.c | 48 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 39 insertions(+), 9 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index b05491bf0..a472f2e57 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -62,6 +62,7 @@ enum { static video_timings_t timing_ega = { .type = VIDEO_ISA, .write_b = 8, .write_w = 16, .write_l = 32, .read_b = 8, .read_w = 16, .read_l = 32 }; static uint8_t ega_rotate[8][256]; +static int active = 0; static uint32_t pallook16[256]; static uint32_t pallook64[256]; static int ega_type = EGA_TYPE_IBM; @@ -155,6 +156,25 @@ ega_out(uint16_t addr, uint8_t val, void *priv) if (!(val & 1)) io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega); ega_recalctimings(ega); + if ((ega_type == 2) && !(val & 0x02)) + mem_mapping_disable(&ega->mapping); + else switch (ega->gdcreg[6] & 0xc) { + case 0x0: /*128k at A0000*/ + mem_mapping_set_addr(&ega->mapping, 0xa0000, 0x20000); + break; + case 0x4: /*64k at A0000*/ + mem_mapping_set_addr(&ega->mapping, 0xa0000, 0x10000); + break; + case 0x8: /*32k at B0000*/ + mem_mapping_set_addr(&ega->mapping, 0xb0000, 0x08000); + break; + case 0xC: /*32k at B8000*/ + mem_mapping_set_addr(&ega->mapping, 0xb8000, 0x08000); + break; + + default: + break; + } break; case 0x3c4: ega->seqaddr = val; @@ -207,7 +227,9 @@ ega_out(uint16_t addr, uint8_t val, void *priv) ega->chain2_read = val & 0x10; break; case 6: - switch (val & 0xc) { + if ((ega_type == 2) && !(ega->miscout & 0x02)) + mem_mapping_disable(&ega->mapping); + else switch (val & 0xc) { case 0x0: /*128k at A0000*/ mem_mapping_set_addr(&ega->mapping, 0xa0000, 0x20000); break; @@ -593,9 +615,16 @@ ega_recalctimings(ega_t *ega) if (ega->dispofftime < TIMER_USEC) ega->dispofftime = TIMER_USEC; - ega->dot_time = (uint64_t) (ega->dot_clock); - if (ega->dot_time < TIMER_USEC) - ega->dot_time = TIMER_USEC; + if (ega_type == 2) { + ega->dot_time = (uint64_t) (ega->dot_clock); + if (ega->dot_time < TIMER_USEC) + ega->dot_time = TIMER_USEC; + timer_disable(&ega->dot_timer); + timer_set_delay_u64(&ega->dot_timer, ega->dot_time); + ega->cca = 0; + active = 1; + ega->dot = 0; + } ega_recalc_remap_func(ega); } @@ -622,14 +651,13 @@ ega_dot_poll(void *priv) uint32_t addr; int drawcursor; uint32_t charaddr; - static int fg; - static int bg; - static uint32_t dat; + static int fg = 0; + static int bg = 0; + static uint32_t dat = 0x00000000; + static int cclock = 0; static int disptime; static int _dispontime; static int _dispofftime; - static int cclock = 0; - static int active = 0; if (ega->seqregs[1] & 8) { disptime = ((ega->crtc[0] + 2) << 1); @@ -1476,6 +1504,8 @@ ega_standalone_init(const device_t *info) ega->vrammask = ega->vram_limit - 1; mem_mapping_add(&ega->mapping, 0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL, NULL, MEM_MAPPING_EXTERNAL, ega); + if (ega_type == 2) + mem_mapping_disable(&ega->mapping); io_sethandler(0x03c0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega); if (ega->chipset) { From 90592d57dc40b75293405fe259936586fa95f6ed Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 7 Aug 2024 23:21:58 +0200 Subject: [PATCH 294/624] QT Main Window: Clear full screen on and off signals after full screen toggle, fixes Ctrl+Alt+PgDn not working immediately after Ctrl+Alt+PgUp. --- src/qt/qt_mainwindow.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 916f3eb5e..32720c48b 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -998,7 +998,7 @@ MainWindow::processKeyboardInput(bool down, uint32_t keycode) case 0x10b: /* Microsoft scroll up normal */ case 0x180 ... 0x1ff: /* E0 break codes (including Microsoft scroll down normal) */ /* This key uses a break code as make. Send it manually, only on press. */ - if (down) { + if (down && (mouse_capture || !kbd_req_capture || video_fullscreen)) { if (keycode & 0x100) keyboard_send(0xe0); keyboard_send(keycode & 0xff); @@ -1011,7 +1011,7 @@ MainWindow::processKeyboardInput(bool down, uint32_t keycode) break; case 0x137: /* Print Screen */ - if (keyboard_recv(0x38) || keyboard_recv(0x138)) { /* Alt+ */ + if (keyboard_recv_ui(0x38) || keyboard_recv_ui(0x138)) { /* Alt+ */ keycode = 0x54; } else if (down) { keyboard_input(down, 0x12a); @@ -1022,7 +1022,7 @@ MainWindow::processKeyboardInput(bool down, uint32_t keycode) break; case 0x145: /* Pause */ - if (keyboard_recv(0x1d) || keyboard_recv(0x11d)) { /* Ctrl+ */ + if (keyboard_recv_ui(0x1d) || keyboard_recv_ui(0x11d)) { /* Ctrl+ */ keycode = 0x146; } else { keyboard_input(down, 0xe11d); @@ -1196,6 +1196,8 @@ MainWindow::on_actionFullscreen_triggered() ui->stackedWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX); showFullScreen(); } + fs_on_signal = false; + fs_off_signal = false; ui->stackedWidget->onResize(width(), height()); } From 479ab87f176162a74152e4891d3256e998b5d317 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 8 Aug 2024 00:56:19 +0200 Subject: [PATCH 295/624] EGA Render: Apply the (S)VGA Render blink fix by greasemonkey. --- src/video/vid_ega_render.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/video/vid_ega_render.c b/src/video/vid_ega_render.c index 0cb1216ad..fe2632574 100644 --- a/src/video/vid_ega_render.c +++ b/src/video/vid_ega_render.c @@ -201,7 +201,8 @@ ega_render_graphics(ega_t *ega) const bool crtcreset = ((ega->crtc[0x17] & 0x80) == 0); const bool seq9dot = ((ega->seqregs[1] & 1) == 0); const bool seqoddeven = ((ega->seqregs[1] & 4) != 0); - const uint8_t blinkmask = (attrblink && blinked ? 0x8 : 0x0); + const uint8_t blinkmask = (attrblink ? 0x8 : 0x0); + const uint8_t blinkval = (attrblink && blinked ? 0x8 : 0x0); uint32_t *p = &buffer32->line[ega->displine + ega->y_add][ega->x_add]; const int dwshift = doublewidth ? 1 : 0; const int dotwidth = 1 << dwshift; @@ -254,8 +255,14 @@ ega_render_graphics(ega_t *ega) uint8_t dat = (edatlookup[(edat[0] >> inshift) & 3][(edat[1] >> inshift) & 3]) | (edatlookup[(edat[2] >> inshift) & 3][(edat[3] >> inshift) & 3] << 2); // FIXME: Confirm blink behaviour is actually XOR on real hardware - uint32_t p0 = ega->pallook[ega->egapal[((dat >> 4) & ega->plane_mask) ^ blinkmask]]; - uint32_t p1 = ega->pallook[ega->egapal[(dat & ega->plane_mask) ^ blinkmask]]; + uint32_t c0 = (dat >> 4) & 0xF; + uint32_t c1 = dat & 0xF; + c0 = ((c0 & ega->plane_mask & ~blinkmask) | + ((c0 | ~ega->plane_mask) & blinkmask & blinkval)) ^ blinkmask; + c1 = ((c1 & ega->plane_mask & ~blinkmask) | + ((c1 | ~ega->plane_mask) & blinkmask & blinkval)) ^ blinkmask; + uint32_t p0 = ega->pallook[ega->egapal[c0]]; + uint32_t p1 = ega->pallook[ega->egapal[c1]]; for (int subx = 0; subx < dotwidth; subx++) p[outoffs + subx] = p0; for (int subx = 0; subx < dotwidth; subx++) From 1e82bd88a10ce720da7750f938544eb390da7bb6 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 8 Aug 2024 01:20:29 +0200 Subject: [PATCH 296/624] SCSI fixes of the day (August 8th, 2024) SCSI CD-ROM: request sense command should preserve its sense data unless a different command is issued, fixes DOS hanging with a blinking cursor using CDSCSI-2.sys for the 53c9x MCA card when there's no CD inside, making its no length Data In hack no longer needed. --- src/scsi/scsi_cdrom.c | 7 ++++--- src/scsi/scsi_pcscsi.c | 4 ---- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index cd5f661ed..be9809e08 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1724,9 +1724,6 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt that condition. */ dev->unit_attention = 0; } - - /* Clear the sense stuff as per the spec. */ - scsi_cdrom_sense_clear(dev, GPCMD_REQUEST_SENSE); } void @@ -1841,6 +1838,10 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) return; begin: + if (cdb[0] != GPCMD_REQUEST_SENSE) { + /* Clear the sense stuff as per the spec. */ + scsi_cdrom_sense_clear(dev, cdb[0]); + } switch (cdb[0]) { case GPCMD_TEST_UNIT_READY: scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); diff --git a/src/scsi/scsi_pcscsi.c b/src/scsi/scsi_pcscsi.c index a19d543ed..be50d9a89 100644 --- a/src/scsi/scsi_pcscsi.c +++ b/src/scsi/scsi_pcscsi.c @@ -545,10 +545,6 @@ esp_do_command_phase(esp_t *dev) esp_log("ESP SCSI Start reading/writing\n"); esp_do_dma(dev); } else { - if (dev->mca && (buf[0] == 0x43) && (sd->phase == SCSI_PHASE_STATUS)) { - esp_set_phase(dev, STAT_DI); - scsi_device_command_phase1(sd); - } esp_log("ESP SCSI Command with no length\n"); esp_command_complete(dev, sd->status); } From b172df649831425f08bb867c646cc97d266b9af8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 8 Aug 2024 18:56:05 +0200 Subject: [PATCH 297/624] Fix SN76489 behavior and make the Tandy 1000 SX use the NCR sound chip instead (as some revisions of it shipped with that), fixes #4700. --- src/include/86box/snd_sn76489.h | 3 ++ src/machine/m_tandy.c | 2 +- src/sound/snd_sn76489.c | 70 ++++++++++++++++++++++----------- 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/include/86box/snd_sn76489.h b/src/include/86box/snd_sn76489.h index 6e7399d54..81d9ad229 100644 --- a/src/include/86box/snd_sn76489.h +++ b/src/include/86box/snd_sn76489.h @@ -20,6 +20,9 @@ typedef struct sn76489_t { int freqhi[4]; int vol[4]; uint32_t shift; + uint32_t white_noise_tap_1; + uint32_t white_noise_tap_2; + uint32_t feedback_mask; uint8_t noise; int lasttone; uint8_t firstdat; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index c5de74824..d51209123 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -1763,7 +1763,7 @@ machine_tandy1k_init(const machine_t *model, int type) tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev); vid_init(dev); device_add_ex(&vid_device, dev); - device_add(&sn76489_device); + device_add((type == TYPE_TANDY1000SX) ? &ncr8496_device : &sn76489_device); break; case TYPE_TANDY1000HX: diff --git a/src/sound/snd_sn76489.c b/src/sound/snd_sn76489.c index d7bfa87b9..5ccc0cd10 100644 --- a/src/sound/snd_sn76489.c +++ b/src/sound/snd_sn76489.c @@ -21,7 +21,15 @@ static float volslog[16] = { 7.51785f, 9.46440f, 11.9194f, 15.0000f }; -void +static int +sn76489_check_tap_2(sn76489_t *sn76489) +{ + int ret = ((sn76489->shift >> sn76489->white_noise_tap_2) & 1); + + return (sn76489->type == SN76496) ? ret : !ret; +} + +static void sn76489_update(sn76489_t *sn76489) { for (; sn76489->pos < sound_pos_global; sn76489->pos++) { @@ -42,24 +50,28 @@ sn76489_update(sn76489_t *sn76489) result += (((sn76489->shift & 1) ^ 1) * 127 * volslog[sn76489->vol[0]] * 2); sn76489->count[0] -= (512 * sn76489->psgconst); - while (sn76489->count[0] < 0 && sn76489->latch[0]) { + while ((sn76489->count[0] < 0) && sn76489->latch[0]) { sn76489->count[0] += (sn76489->latch[0] * 4); if (!(sn76489->noise & 4)) { - if (sn76489->shift & 1) - sn76489->shift |= 0x8000; - sn76489->shift >>= 1; + if ((sn76489->shift >> sn76489->white_noise_tap_1) & 1) { + sn76489->shift >>= 1; + sn76489->shift |= sn76489->feedback_mask; + } else + sn76489->shift >>= 1; } else { - if ((sn76489->shift & 1) ^ ((sn76489->shift >> 1) & 1)) - sn76489->shift |= 0x8000; - sn76489->shift >>= 1; + if (((sn76489->shift >> sn76489->white_noise_tap_1) & 1) ^ sn76489_check_tap_2(sn76489)) { + sn76489->shift >>= 1; + sn76489->shift |= sn76489->feedback_mask; + } else + sn76489->shift >>= 1; } } - sn76489->buffer[sn76489->pos] = result; + sn76489->buffer[sn76489->pos] = (sn76489->type == NCR8496) ? -result : result; } } -void +static void sn76489_get_buffer(int32_t *buffer, int len, void *priv) { sn76489_t *sn76489 = (sn76489_t *) priv; @@ -74,7 +86,7 @@ sn76489_get_buffer(int32_t *buffer, int len, void *priv) sn76489->pos = 0; } -void +static void sn76489_write(UNUSED(uint16_t addr), uint8_t data, void *priv) { sn76489_t *sn76489 = (sn76489_t *) priv; @@ -125,15 +137,13 @@ sn76489_write(UNUSED(uint16_t addr), uint8_t data, void *priv) sn76489->vol[1] = 0xf - data; break; case 0x60: - if ((data & 4) != (sn76489->noise & 4) || sn76489->type == SN76496) - sn76489->shift = 0x4000; + if (((data & 4) != (sn76489->noise & 4)) || (sn76489->type == SN76496)) + sn76489->shift = sn76489->feedback_mask; sn76489->noise = data & 0xf; if ((data & 3) == 3) sn76489->latch[0] = sn76489->latch[1]; else sn76489->latch[0] = 0x400 << (data & 3); - if (!sn76489->extra_divide) - sn76489->latch[0] &= 0x3ff; if (!sn76489->latch[0]) sn76489->latch[0] = (sn76489->extra_divide ? 2048 : 1024) << 6; break; @@ -146,22 +156,24 @@ sn76489_write(UNUSED(uint16_t addr), uint8_t data, void *priv) break; } } else { + /* NCR8496 ignores writes to registers 1, 3, 5, 6 and 7 with bit 7 clear. */ + if ((sn76489->type != SN76496) && ((sn76489->firstdat & 0x10) || ((sn76489->firstdat & 0x70) == 0x60))) + return; + if ((sn76489->firstdat & 0x70) == 0x60 && (sn76489->type == SN76496)) { - if ((data & 4) != (sn76489->noise & 4) || sn76489->type == SN76496) - sn76489->shift = 0x4000; + if (sn76489->type == SN76496) + sn76489->shift = sn76489->feedback_mask; sn76489->noise = data & 0xf; if ((data & 3) == 3) sn76489->latch[0] = sn76489->latch[1]; else sn76489->latch[0] = 0x400 << (data & 3); if (!sn76489->latch[0]) - sn76489->latch[0] = 1024 << 6; + sn76489->latch[0] = (sn76489->extra_divide ? 2048 : 1024) << 6; } else if ((sn76489->firstdat & 0x70) != 0x60) { - if (sn76489->extra_divide) - sn76489->freqhi[sn76489->lasttone] = data & 0x7F; - else - sn76489->freqhi[sn76489->lasttone] = data & 0x3F; - freq = sn76489->freqlo[sn76489->lasttone] | (sn76489->freqhi[sn76489->lasttone] << 4); + sn76489->freqhi[sn76489->lasttone] = data & 0x7F; + freq = sn76489->freqlo[sn76489->lasttone] | + (sn76489->freqhi[sn76489->lasttone] << 4); if (!sn76489->extra_divide) freq &= 0x3ff; if (!freq) @@ -190,6 +202,16 @@ sn76489_init(sn76489_t *sn76489, uint16_t base, uint16_t size, int type, int fre { sound_add_handler(sn76489_get_buffer, sn76489); + if (type == SN76496) { + sn76489->white_noise_tap_1 = 0; + sn76489->white_noise_tap_2 = 1; + sn76489->feedback_mask = 0x4000; + } else { + sn76489->white_noise_tap_1 = 1; + sn76489->white_noise_tap_2 = 5; + sn76489->feedback_mask = 0x8000; + } + sn76489->latch[0] = sn76489->latch[1] = sn76489->latch[2] = sn76489->latch[3] = 0x3FF << 6; sn76489->vol[0] = 0; sn76489->vol[1] = sn76489->vol[2] = sn76489->vol[3] = 8; @@ -200,7 +222,7 @@ sn76489_init(sn76489_t *sn76489, uint16_t base, uint16_t size, int type, int fre sn76489->count[2] = (rand() & 0x3FF) << 6; sn76489->count[3] = (rand() & 0x3FF) << 6; sn76489->noise = 3; - sn76489->shift = 0x4000; + sn76489->shift = sn76489->feedback_mask; sn76489->type = type; sn76489->psgconst = (((double) freq / 64.0) / (double) FREQ_48000); From 62efc68d9afcfacfc3b9bca628a09634f9676ed8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 9 Aug 2024 00:25:17 +0200 Subject: [PATCH 298/624] DP8390: Correctly use the Rx page start instead of the Tx one in the Rx function, fixes loss of received packets. --- src/network/net_dp8390.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_dp8390.c b/src/network/net_dp8390.c index b563b703a..d6062604f 100644 --- a/src/network/net_dp8390.c +++ b/src/network/net_dp8390.c @@ -396,7 +396,7 @@ dp8390_rx_common(void *priv, uint8_t *buf, int io_len) } else { endbytes = (dev->page_stop - dev->curr_page) * 256; memcpy(startptr + sizeof(pkthdr), buf, endbytes - sizeof(pkthdr)); - startptr = &dev->mem[((dev->tx_page_start * 256) - dev->mem_start) & dev->mem_wrap]; + startptr = &dev->mem[((dev->page_start * 256) - dev->mem_start) & dev->mem_wrap]; memcpy(startptr, buf + endbytes - sizeof(pkthdr), io_len - endbytes + 8); } dev->curr_page = nextpage; From d2214bbbb000b4f2e653d334af5032b9542a8bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Fri, 9 Aug 2024 00:39:42 +0200 Subject: [PATCH 299/624] Update vid_voodoo_banshee.c Fix heap corruption. --- src/video/vid_voodoo_banshee.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 5b6dbb434..8e2b98980 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -513,7 +513,7 @@ banshee_render_16bpp_tiled(svga_t *svga) if (addr >= svga->vram_max) return; - for (int x = 0; x <= svga->hdisp; x += 64) { + for (int x = 0; x < svga->hdisp; x += 64) { if (svga->hwcursor_on || svga->overlay_on) svga->changedvram[addr >> 12] = 2; if (svga->changedvram[addr >> 12] || svga->fullchange) { From 6a04cde42aee4ad2227068a02788ede04cd7a442 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Fri, 9 Aug 2024 00:47:27 +0200 Subject: [PATCH 300/624] TGUI9440 (VLB/PCI) change of the day (August 9th, 2024) Adjust the resolution accordingly for 1280x1022x256 (weird resolution using NT 3.1 drivers) as well as the X axis mouse movement in interlaced mode. --- src/video/vid_tgui9440.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 490c724ce..25988fcc6 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -482,8 +482,11 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) svga->hwcursor.y = (svga->crtc[0x42] | (svga->crtc[0x43] << 8)) & 0x7ff; if ((tgui->accel.ger22 & 0xff) == 8) { - if (svga->bpp != 24) + if (svga->bpp != 24) { svga->hwcursor.x <<= 1; + if ((tgui->type == TGUI_9440) && (svga->crtc[0x1e] & 4)) + svga->hwcursor.x >>= 1; + } } svga->hwcursor.xoff = svga->crtc[0x46] & 0x3f; @@ -788,6 +791,9 @@ tgui_recalctimings(svga_t *svga) default: break; } + } else { + if ((svga->hdisp == 1280) && (svga->dispend == (1020 >> 1)) && svga->interlace) + svga->dispend++; } break; case 15: From c59e12ab096fb479586988e70ef6370dc74043f7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 8 Aug 2024 18:58:14 -0400 Subject: [PATCH 301/624] Deal with more magic numbers in vid_ega.c --- src/video/vid_ega.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index a472f2e57..5a4f100df 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -156,7 +156,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) if (!(val & 1)) io_sethandler(0x03a0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega); ega_recalctimings(ega); - if ((ega_type == 2) && !(val & 0x02)) + if ((ega_type == EGA_TYPE_COMPAQ) && !(val & 0x02)) mem_mapping_disable(&ega->mapping); else switch (ega->gdcreg[6] & 0xc) { case 0x0: /*128k at A0000*/ @@ -227,7 +227,7 @@ ega_out(uint16_t addr, uint8_t val, void *priv) ega->chain2_read = val & 0x10; break; case 6: - if ((ega_type == 2) && !(ega->miscout & 0x02)) + if ((ega_type == EGA_TYPE_COMPAQ) && !(ega->miscout & 0x02)) mem_mapping_disable(&ega->mapping); else switch (val & 0xc) { case 0x0: /*128k at A0000*/ @@ -615,7 +615,7 @@ ega_recalctimings(ega_t *ega) if (ega->dispofftime < TIMER_USEC) ega->dispofftime = TIMER_USEC; - if (ega_type == 2) { + if (ega_type == EGA_TYPE_COMPAQ) { ega->dot_time = (uint64_t) (ega->dot_clock); if (ega->dot_time < TIMER_USEC) ega->dot_time = TIMER_USEC; @@ -1313,7 +1313,7 @@ ega_read(uint32_t addr, void *priv) return ~(temp | temp2 | temp3 | temp4); } - if ((ega_type == 2) && (ega->gdcreg[4] & 0x04)) + if ((ega_type == EGA_TYPE_COMPAQ) && (ega->gdcreg[4] & 0x04)) return 0xff; return ega->vram[addr | readplane]; @@ -1504,7 +1504,7 @@ ega_standalone_init(const device_t *info) ega->vrammask = ega->vram_limit - 1; mem_mapping_add(&ega->mapping, 0xa0000, 0x20000, ega_read, NULL, NULL, ega_write, NULL, NULL, NULL, MEM_MAPPING_EXTERNAL, ega); - if (ega_type == 2) + if (ega_type == EGA_TYPE_COMPAQ) mem_mapping_disable(&ega->mapping); io_sethandler(0x03c0, 0x0020, ega_in, NULL, NULL, ega_out, NULL, NULL, ega); From 0219547a16bbeb988c2664f71656e67b43f934d2 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 8 Aug 2024 19:13:20 -0400 Subject: [PATCH 302/624] Put Wacom tablets on dev branch --- CMakeLists.txt | 1 + src/device/CMakeLists.txt | 5 +++++ src/device/mouse.c | 2 +- src/include/86box/mouse.h | 2 ++ src/qt/CMakeLists.txt | 4 ++++ 5 files changed, 13 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ca75ebc25..e307d6d2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,6 +163,7 @@ cmake_dependent_option(OPEN_AT "OpenAT" cmake_dependent_option(OPL4ML "OPL4-ML daughterboard" ON "DEV_BRANCH" OFF) cmake_dependent_option(PCL "Generic PCL5e Printer" ON "DEV_BRANCH" OFF) cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF) +cmake_dependent_option(WACOM "Wacom Input Devices" ON "DEV_BRANCH" OFF) cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF) # Ditto but for Qt diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index e48f30d0f..b8dcdf0c5 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -45,3 +45,8 @@ endif() if(LASERXT) target_compile_definitions(dev PRIVATE USE_LASERXT) endif() + +if(WACOM) + target_compile_definitions(dev PRIVATE USE_WACOM) + target_sources(dev PRIVATE mouse_wacom_tablet.c) +endif() diff --git a/src/device/mouse.c b/src/device/mouse.c index 8fd783ee2..fc193398b 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -98,7 +98,7 @@ static mouse_t mouse_devices[] = { { &mouse_wacom_device }, { &mouse_wacom_artpad_device }, #endif - { &mouse_mtouch_device }, + { &mouse_mtouch_device }, { NULL } // clang-format on }; diff --git a/src/include/86box/mouse.h b/src/include/86box/mouse.h index 810d62293..bbe78413b 100644 --- a/src/include/86box/mouse.h +++ b/src/include/86box/mouse.h @@ -71,8 +71,10 @@ extern const device_t mouse_mssystems_device; extern const device_t mouse_msserial_device; extern const device_t mouse_ltserial_device; extern const device_t mouse_ps2_device; +# ifdef USE_WACOM extern const device_t mouse_wacom_device; extern const device_t mouse_wacom_artpad_device; +# endif extern const device_t mouse_mtouch_device; #endif diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index db0a6353f..171e0a77c 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -190,6 +190,10 @@ if(RTMIDI) target_compile_definitions(ui PRIVATE USE_RTMIDI) endif() +if(WACOM) + target_compile_definitions(ui PRIVATE USE_WACOM) +endif() + if(WIN32) enable_language(RC) target_sources(86Box PUBLIC 86Box-qt.rc) From 3cd59235c915f99d253756a7eaf548dd88067d4e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 8 Aug 2024 19:28:36 -0400 Subject: [PATCH 303/624] Move USE_PCL to correct cmakelist --- src/CMakeLists.txt | 4 ---- src/device/CMakeLists.txt | 4 ++++ 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a36dd796c..93a6f4d4c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,10 +27,6 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux") add_compile_definitions(_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 _LARGEFILE64_SOURCE=1) endif() -if(PCL) - target_compile_definitions(86Box PRIVATE USE_PCL) -endif() - if(CPPTHREADS) target_sources(86Box PRIVATE thread.cpp) endif() diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index b8dcdf0c5..d1f4cdc68 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -46,6 +46,10 @@ if(LASERXT) target_compile_definitions(dev PRIVATE USE_LASERXT) endif() +if(PCL) + target_compile_definitions(dev PRIVATE USE_PCL) +endif() + if(WACOM) target_compile_definitions(dev PRIVATE USE_WACOM) target_sources(dev PRIVATE mouse_wacom_tablet.c) From 892f066ffa7b1831c681fed3e0824d4de338356e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 8 Aug 2024 20:25:03 -0400 Subject: [PATCH 304/624] Don't depend on DEV_BRANCH Allows things to be compiled independently --- src/cpu/cpu.c | 120 +++++++++++++++++------------------ src/cpu/cpu_table.c | 8 +-- src/cpu/x86_ops.h | 8 +-- src/cpu/x86_ops_mmx_mov.h | 4 +- src/device/isamem.c | 24 +++---- src/device/keyboard_xt.c | 8 +-- src/include/86box/chipset.h | 4 +- src/include/86box/keyboard.h | 4 +- src/include/86box/machine.h | 8 +-- src/include/86box/midi.h | 8 +-- src/include/86box/sio.h | 4 +- src/include/86box/video.h | 6 +- src/machine/m_at.c | 4 +- src/machine/m_at_286_386sx.c | 4 +- src/machine/m_at_socket7.c | 4 +- src/sound/midi.c | 12 ++-- src/sound/snd_gus.c | 62 +++++++++--------- src/video/vid_ati28800.c | 28 ++++---- src/video/vid_table.c | 6 +- 19 files changed, 163 insertions(+), 163 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 0ff54f61c..178a17e95 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -47,7 +47,7 @@ #ifdef USE_DYNAREC # include "codegen.h" -#endif +#endif /* USE_DYNAREC */ #include "x87_timings.h" #define CCR1_USE_SMI (1 << 1) @@ -119,7 +119,7 @@ const OpFn *x86_dynarec_opcodes_df_a32; const OpFn *x86_dynarec_opcodes_REPE; const OpFn *x86_dynarec_opcodes_REPNE; const OpFn *x86_dynarec_opcodes_3DNOW; -#endif +#endif /* USE_DYNAREC */ const OpFn *x86_opcodes; const OpFn *x86_opcodes_0f; @@ -504,7 +504,7 @@ cpu_set(void) #ifdef USE_ACYCS acycs = 0; -#endif +#endif /* USE_ACYCS */ soft_reset_pci = 0; cpu_init = 0; @@ -576,7 +576,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_386_0f, dynarec_ops_386, dynarec_ops_386_0f); #else x86_setopcodes(ops_386, ops_386_0f); -#endif +#endif /* USE_DYNAREC */ x86_setopcodes_2386(ops_2386_386, ops_2386_386_0f); x86_opcodes_REPE = ops_REPE; x86_opcodes_REPNE = ops_REPNE; @@ -587,7 +587,7 @@ cpu_set(void) x86_dynarec_opcodes_REPE = dynarec_ops_REPE; x86_dynarec_opcodes_REPNE = dynarec_ops_REPNE; x86_dynarec_opcodes_3DNOW = dynarec_ops_3DNOW; -#endif +#endif /* USE_DYNAREC */ if (hasfpu) { #ifdef USE_DYNAREC @@ -626,7 +626,7 @@ cpu_set(void) x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_df_a16; x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_df_a32; } -#endif +#endif /* USE_DYNAREC */ if (fpu_softfloat) { x86_opcodes_d8_a16 = ops_sf_fpu_d8_a16; x86_opcodes_d8_a32 = ops_sf_fpu_d8_a32; @@ -714,7 +714,7 @@ cpu_set(void) x86_dynarec_opcodes_de_a32 = dynarec_ops_nofpu_a32; x86_dynarec_opcodes_df_a16 = dynarec_ops_nofpu_a16; x86_dynarec_opcodes_df_a32 = dynarec_ops_nofpu_a32; -#endif +#endif /* USE_DYNAREC */ x86_opcodes_d8_a16 = ops_nofpu_a16; x86_opcodes_d8_a32 = ops_nofpu_a32; x86_opcodes_d9_a16 = ops_nofpu_a16; @@ -752,7 +752,7 @@ cpu_set(void) #ifdef USE_DYNAREC codegen_timing_set(&codegen_timing_486); -#endif +#endif /* USE_DYNAREC */ memset(&msr, 0, sizeof(msr)); @@ -774,7 +774,7 @@ cpu_set(void) x86_setopcodes(ops_186, ops_186_0f, dynarec_ops_186, dynarec_ops_186_0f); #else x86_setopcodes(ops_186, ops_186_0f); -#endif +#endif /* USE_DYNAREC */ x86_setopcodes_2386(ops_2386_186, ops_2386_186_0f); break; @@ -783,7 +783,7 @@ cpu_set(void) x86_setopcodes(ops_286, ops_286_0f, dynarec_ops_286, dynarec_ops_286_0f); #else x86_setopcodes(ops_286, ops_286_0f); -#endif +#endif /* USE_DYNAREC */ x86_setopcodes_2386(ops_2386_286, ops_2386_286_0f); if (fpu_type == FPU_287) { @@ -819,7 +819,7 @@ cpu_set(void) x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_287_df_a16; x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_287_df_a32; } -#endif +#endif /* USE_DYNAREC */ if (fpu_softfloat) { x86_opcodes_d9_a16 = ops_sf_fpu_287_d9_a16; x86_opcodes_d9_a32 = ops_sf_fpu_287_d9_a32; @@ -921,7 +921,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_ibm486_0f, dynarec_ops_386, dynarec_ops_ibm486_0f); #else x86_setopcodes(ops_386, ops_ibm486_0f); -#endif +#endif /* USE_DYNAREC */ x86_setopcodes_2386(ops_2386_386, ops_2386_ibm486_0f); cpu_features = CPU_FEATURE_MSR; fallthrough; @@ -961,7 +961,7 @@ cpu_set(void) x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_287_df_a16; x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_287_df_a32; } -#endif +#endif /* USE_DYNAREC */ if (fpu_softfloat) { x86_opcodes_d9_a16 = ops_sf_fpu_287_d9_a16; x86_opcodes_d9_a32 = ops_sf_fpu_287_d9_a32; @@ -1067,7 +1067,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_486_0f, dynarec_ops_386, dynarec_ops_486_0f); #else x86_setopcodes(ops_386, ops_486_0f); -#endif +#endif /* USE_DYNAREC */ x86_setopcodes_2386(ops_2386_386, ops_2386_486_0f); timing_rr = 1; /* register dest - register src */ @@ -1107,7 +1107,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_486_0f, dynarec_ops_386, dynarec_ops_486_0f); #else x86_setopcodes(ops_386, ops_486_0f); -#endif +#endif /* USE_DYNAREC */ x86_setopcodes_2386(ops_2386_386, ops_2386_486_0f); timing_rr = 1; /* register dest - register src */ @@ -1160,7 +1160,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_486_0f, dynarec_ops_386, dynarec_ops_486_0f); #else x86_setopcodes(ops_386, ops_486_0f); -#endif +#endif /* USE_DYNAREC */ x86_setopcodes_2386(ops_2386_386, ops_2386_486_0f); timing_rr = 1; /* register dest - register src */ @@ -1209,7 +1209,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_stpc_0f); else x86_setopcodes(ops_386, ops_c486_0f); -#endif +#endif /* USE_DYNAREC */ timing_rr = 1; /* register dest - register src */ timing_rm = 3; /* register dest - memory src */ @@ -1252,7 +1252,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_c486_0f, dynarec_ops_386, dynarec_ops_c486_0f); #else x86_setopcodes(ops_386, ops_c486_0f); -#endif +#endif /* USE_DYNAREC */ timing_rr = 1; /* register dest - register src */ timing_rm = 1; /* register dest - memory src */ @@ -1301,7 +1301,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_winchip2_0f); else x86_setopcodes(ops_386, ops_winchip_0f); -#endif +#endif /* USE_DYNAREC */ timing_rr = 1; /* register dest - register src */ timing_rm = 2; /* register dest - memory src */ @@ -1350,7 +1350,7 @@ cpu_set(void) codegen_timing_set(&codegen_timing_winchip2); else codegen_timing_set(&codegen_timing_winchip); -#endif +#endif /* USE_DYNAREC */ break; case CPU_P24T: @@ -1366,7 +1366,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_pentiummmx_0f); else x86_setopcodes(ops_386, ops_pentium_0f); -#endif +#endif /* USE_DYNAREC */ timing_rr = 1; /* register dest - register src */ timing_rm = 2; /* register dest - memory src */ @@ -1409,10 +1409,10 @@ cpu_set(void) cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE | CR4_PCE; #ifdef USE_DYNAREC codegen_timing_set(&codegen_timing_pentium); -#endif +#endif /* USE_DYNAREC */ break; -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +#ifdef USE_CYRIX_6X86 case CPU_Cx6x86: case CPU_Cx6x86L: case CPU_CxGX1: @@ -1434,7 +1434,7 @@ cpu_set(void) x86_dynarec_opcodes_df_a16 = dynarec_ops_fpu_686_df_a16; x86_dynarec_opcodes_df_a32 = dynarec_ops_fpu_686_df_a32; } -# endif +# endif /* USE_DYNAREC */ if (fpu_softfloat) { x86_opcodes_da_a16 = ops_sf_fpu_686_da_a16; x86_opcodes_da_a32 = ops_sf_fpu_686_da_a32; @@ -1472,7 +1472,7 @@ cpu_set(void) # if 0 x86_setopcodes(ops_386, ops_c6x86_0f); # endif -# endif +# endif /* USE_DYNAREC */ timing_rr = 1; /* register dest - register src */ timing_rm = 1; /* register dest - memory src */ @@ -1524,19 +1524,19 @@ cpu_set(void) # ifdef USE_DYNAREC codegen_timing_set(&codegen_timing_686); -# endif +# endif /* USE_DYNAREC */ if ((cpu_s->cpu_type == CPU_Cx6x86L) || (cpu_s->cpu_type == CPU_Cx6x86MX)) ccr4 = 0x80; else if (CPU_Cx6x86) CPUID = 0; /* Disabled on powerup by default */ break; -#endif +#endif /* USE_CYRIX_6X86 */ -#if defined(DEV_BRANCH) && defined(USE_AMD_K5) +#ifdef USE_AMD_K5 case CPU_K5: case CPU_5K86: -#endif +#endif /* USE_AMD_K5 */ case CPU_K6: case CPU_K6_2: case CPU_K6_2C: @@ -1546,7 +1546,7 @@ cpu_set(void) #ifdef USE_DYNAREC if (cpu_s->cpu_type >= CPU_K6_2) x86_setopcodes(ops_386, ops_k62_0f, dynarec_ops_386, dynarec_ops_k62_0f); -# if defined(DEV_BRANCH) && defined(USE_AMD_K5) +# ifdef USE_AMD_K5 else if (cpu_s->cpu_type == CPU_K6) x86_setopcodes(ops_386, ops_k6_0f, dynarec_ops_386, dynarec_ops_k6_0f); else @@ -1554,11 +1554,11 @@ cpu_set(void) # else else x86_setopcodes(ops_386, ops_k6_0f, dynarec_ops_386, dynarec_ops_k6_0f); -# endif +# endif /* USE_AMD_K5 */ #else if (cpu_s->cpu_type >= CPU_K6_2) x86_setopcodes(ops_386, ops_k62_0f); -# if defined(DEV_BRANCH) && defined(USE_AMD_K5) +# ifdef USE_AMD_K5 else if (cpu_s->cpu_type == CPU_K6) x86_setopcodes(ops_386, ops_k6_0f); else @@ -1566,14 +1566,14 @@ cpu_set(void) # else else x86_setopcodes(ops_386, ops_k6_0f); -# endif -#endif +# endif /* USE_AMD_K5 */ +#endif /* USE_DYNAREC */ if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P)) { x86_opcodes_3DNOW = ops_3DNOWE; #ifdef USE_DYNAREC x86_dynarec_opcodes_3DNOW = dynarec_ops_3DNOWE; -#endif +#endif /* USE_DYNAREC */ } timing_rr = 1; /* register dest - register src */ @@ -1613,7 +1613,7 @@ cpu_set(void) cpu_features |= CPU_FEATURE_3DNOW; if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P)) cpu_features |= CPU_FEATURE_3DNOWE; -#if defined(DEV_BRANCH) && defined(USE_AMD_K5) +#ifdef USE_AMD_K5 cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE; if (cpu_s->cpu_type >= CPU_K6) { cpu_CR4_mask |= (CR4_VME | CR4_PVI | CR4_PSE); @@ -1629,11 +1629,11 @@ cpu_set(void) cpu_CR4_mask |= CR4_PCE; else if (cpu_s->cpu_type >= CPU_K6_2C) cpu_CR4_mask |= CR4_PGE; -#endif +#endif /* USE_AMD_K5 */ #ifdef USE_DYNAREC codegen_timing_set(&codegen_timing_k6); -#endif +#endif /* USE_DYNAREC */ break; case CPU_PENTIUMPRO: @@ -1668,7 +1668,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_pentium2d_0f); else x86_setopcodes(ops_386, ops_pentium2_0f); -#endif +#endif /* USE_DYNAREC */ if (fpu_softfloat) { x86_opcodes_da_a16 = ops_sf_fpu_686_da_a16; x86_opcodes_da_a32 = ops_sf_fpu_686_da_a32; @@ -1726,7 +1726,7 @@ cpu_set(void) #ifdef USE_DYNAREC codegen_timing_set(&codegen_timing_p6); -#endif +#endif /* USE_DYNAREC */ break; case CPU_CYRIX3S: @@ -1734,7 +1734,7 @@ cpu_set(void) x86_setopcodes(ops_386, ops_winchip2_0f, dynarec_ops_386, dynarec_ops_winchip2_0f); #else x86_setopcodes(ops_386, ops_winchip2_0f); -#endif +#endif /* USE_DYNAREC */ timing_rr = 1; /* register dest - register src */ timing_rm = 2; /* register dest - memory src */ timing_mr = 2; /* memory dest - register src */ @@ -1774,7 +1774,7 @@ cpu_set(void) #ifdef USE_DYNAREC codegen_timing_set(&codegen_timing_winchip); -#endif +#endif /* USE_DYNAREC */ break; default: @@ -1812,7 +1812,7 @@ cpu_set(void) cpu_exec = exec386_dynarec; cpu_use_exec = 1; } else -#endif +#endif /* defined(USE_DYNAREC) && !defined(USE_GDBSTUB) */ /* Use exec386 for CPU_IBM486SLC because it can reach 100 MHz. */ if ((cpu_s->cpu_type == CPU_IBM486SLC) || (cpu_s->cpu_type == CPU_IBM486BL) || cpu_iscyrix || (cpu_s->cpu_type > CPU_486DLC) || cpu_override_interpreter) { @@ -2065,7 +2065,7 @@ cpu_CPUID(void) EAX = EBX = ECX = EDX = 0; break; -#if defined(DEV_BRANCH) && defined(USE_AMD_K5) +#ifdef USE_AMD_K5 case CPU_K5: if (!EAX) { EAX = 0x00000001; @@ -2123,7 +2123,7 @@ cpu_CPUID(void) break; } break; -#endif +#endif /* USE_AMD_K5 */ case CPU_K6: switch (EAX) { @@ -2354,7 +2354,7 @@ cpu_CPUID(void) EAX = EBX = ECX = EDX = 0; break; -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +#ifdef USE_CYRIX_6X86 case CPU_Cx6x86: if (!EAX) { EAX = 0x00000001; @@ -2410,7 +2410,7 @@ cpu_CPUID(void) } else EAX = EBX = ECX = EDX = 0; break; -#endif +#endif /* USE_CYRIX_6X86 */ case CPU_PENTIUMPRO: if (!EAX) { @@ -2565,10 +2565,10 @@ cpu_ven_reset(void) msr.amd_psor = (cpu_s->cpu_type >= CPU_K6_3) ? 0x008cULL : 0x018cULL; fallthrough; case CPU_K6_2: -#if defined(DEV_BRANCH) && defined(USE_AMD_K5) +#ifdef USE_AMD_K5 case CPU_K5: case CPU_5K86: -#endif +#endif /* USE_AMD_K5 */ case CPU_K6: msr.amd_efer = (cpu_s->cpu_type >= CPU_K6_2C) ? 2ULL : 0ULL; break; @@ -2789,10 +2789,10 @@ cpu_RDMSR(void) } break; -#if defined(DEV_BRANCH) && defined(USE_AMD_K5) +#ifdef USE_AMD_K5 case CPU_K5: case CPU_5K86: -#endif +#endif /* USE_AMD_K5 */ case CPU_K6: case CPU_K6_2: case CPU_K6_2C: @@ -3075,7 +3075,7 @@ pentium_invalid_rdmsr: cpu_log("RDMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX); break; -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +#ifdef USE_CYRIX_6X86 case CPU_Cx6x86: case CPU_Cx6x86L: case CPU_CxGX1: @@ -3115,7 +3115,7 @@ pentium_invalid_rdmsr: } cpu_log("RDMSR: ECX = %08X, val = %08X%08X\n", ECX, EDX, EAX); break; -#endif +#endif /* USE_CYRIX_6X86 */ case CPU_PENTIUMPRO: case CPU_PENTIUM2: @@ -3638,10 +3638,10 @@ cpu_WRMSR(void) } break; -#if defined(DEV_BRANCH) && defined(USE_AMD_K5) +#ifdef USE_AMD_K5 case CPU_K5: case CPU_5K86: -#endif +#endif /* USE_AMD_K5 */ case CPU_K6: case CPU_K6_2: case CPU_K6_2C: @@ -3902,7 +3902,7 @@ pentium_invalid_wrmsr: } break; -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +#ifdef USE_CYRIX_6X86 case CPU_Cx6x86: case CPU_Cx6x86L: case CPU_CxGX1: @@ -3936,7 +3936,7 @@ pentium_invalid_wrmsr: break; } break; -#endif +#endif /* USE_CYRIX_6X86 */ case CPU_PENTIUMPRO: case CPU_PENTIUM2: @@ -4249,14 +4249,14 @@ cpu_write(uint16_t addr, uint8_t val, UNUSED(void *priv)) case 0xe8: /* CCR4 */ if ((ccr3 & 0xf0) == 0x10) { ccr4 = val; -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +#ifdef USE_CYRIX_6X86 if (cpu_s->cpu_type >= CPU_Cx6x86) { if (val & 0x80) CPUID = cpu_s->cpuid_model; else CPUID = 0; } -#endif +#endif /* USE_CYRIX_6X86 */ } break; case 0xe9: /* CCR5 */ @@ -4330,7 +4330,7 @@ x86_setopcodes(const OpFn *opcodes, const OpFn *opcodes_0f) x86_opcodes = opcodes; x86_opcodes_0f = opcodes_0f; } -#endif +#endif /* USE_DYNAREC */ void x86_setopcodes_2386(const OpFn *opcodes, const OpFn *opcodes_0f) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index ace51eed8..120cc6a1e 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -4474,7 +4474,7 @@ const cpu_family_t cpu_families[] = { { .name = "", 0 } } }, -#if defined(DEV_BRANCH) && defined(USE_AMD_K5) +#ifdef USE_AMD_K5 { .package = CPU_PKG_SOCKET5_7, .manufacturer = "AMD", @@ -4629,7 +4629,7 @@ const cpu_family_t cpu_families[] = { { .name = "", 0 } } }, -#endif +#endif /* USE_AMD_K5 */ { .package = CPU_PKG_SOCKET5_7, .manufacturer = "AMD", @@ -5982,7 +5982,7 @@ const cpu_family_t cpu_families[] = { { .name = "", 0 } } }, -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +#ifdef USE_CYRIX_6X86 { .package = CPU_PKG_SOCKET5_7, .manufacturer = "Cyrix", @@ -6342,7 +6342,7 @@ const cpu_family_t cpu_families[] = { { .name = "", 0 } } }, -#endif +#endif /* USE_CYRIX_6X86 */ { .package = CPU_PKG_SOCKET8, .manufacturer = "Intel", diff --git a/src/cpu/x86_ops.h b/src/cpu/x86_ops.h index 86f54ee3b..3dfb3f917 100644 --- a/src/cpu/x86_ops.h +++ b/src/cpu/x86_ops.h @@ -90,10 +90,10 @@ extern const OpFn dynarec_ops_winchip2_0f[1024]; extern const OpFn dynarec_ops_pentium_0f[1024]; extern const OpFn dynarec_ops_pentiummmx_0f[1024]; -# if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +# ifdef USE_CYRIX_6X86 extern const OpFn dynarec_ops_c6x86_0f[1024]; extern const OpFn dynarec_ops_c6x86mx_0f[1024]; -# endif +# endif /* USE_CYRIX_6X86 */ extern const OpFn dynarec_ops_k6_0f[1024]; extern const OpFn dynarec_ops_k62_0f[1024]; @@ -232,10 +232,10 @@ extern const OpFn ops_winchip2_0f[1024]; extern const OpFn ops_pentium_0f[1024]; extern const OpFn ops_pentiummmx_0f[1024]; -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +#ifdef USE_CYRIX_6X86 extern const OpFn ops_c6x86_0f[1024]; extern const OpFn ops_c6x86mx_0f[1024]; -#endif +#endif /* USE_CYRIX_6X86 */ extern const OpFn ops_k6_0f[1024]; extern const OpFn ops_k62_0f[1024]; diff --git a/src/cpu/x86_ops_mmx_mov.h b/src/cpu/x86_ops_mmx_mov.h index c72c8143d..8855f8ccd 100644 --- a/src/cpu/x86_ops_mmx_mov.h +++ b/src/cpu/x86_ops_mmx_mov.h @@ -110,7 +110,7 @@ opMOVD_mm_l_a32(uint32_t fetchdat) return 0; } -#if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +#ifdef USE_CYRIX_6X86 /*Cyrix maps both MOVD and SMINT to the same opcode*/ static int opMOVD_mm_l_a16_cx(uint32_t fetchdat) @@ -170,7 +170,7 @@ opMOVD_mm_l_a32_cx(uint32_t fetchdat) return 0; } -#endif +#endif /* USE_CYRIX_6X86 */ static int opMOVQ_q_mm_a16(uint32_t fetchdat) diff --git a/src/device/isamem.c b/src/device/isamem.c index d6fa04a64..f2332a5cc 100644 --- a/src/device/isamem.c +++ b/src/device/isamem.c @@ -1699,7 +1699,7 @@ static const device_t brxt_device = { .config = brxt_config }; -#if defined(DEV_BRANCH) && defined(USE_ISAMEM_BRAT) +#ifdef USE_ISAMEM_BRAT static const device_config_t brat_config[] = { // clang-format off { @@ -1804,7 +1804,7 @@ static const device_t brat_device = { .force_redraw = NULL, .config = brat_config }; -#endif +#endif /* USE_ISAMEM_BRAT */ static const device_config_t lotech_config[] = { // clang-format off @@ -1871,7 +1871,7 @@ static const device_t lotech_device = { .config = lotech_config }; -#if defined(DEV_BRANCH) && defined(USE_ISAMEM_RAMPAGE) +#ifdef USE_ISAMEM_RAMPAGE // TODO: Dual Paging support // TODO: Conventional memory suppport static const device_config_t rampage_config[] = { @@ -1939,9 +1939,9 @@ static const device_t rampage_device = { .force_redraw = NULL, .config = rampage_config }; -#endif +#endif /* USE_ISAMEM_RAMPAGE */ -#if defined(DEV_BRANCH) && defined(USE_ISAMEM_IAB) +#ifdef USE_ISAMEM_IAB static const device_config_t iab_config[] = { // clang-format off { @@ -2038,7 +2038,7 @@ static const device_t iab_device = { .force_redraw = NULL, .config = iab_config }; -#endif +#endif /* USE_ISAMEM_IAB */ static const struct { const device_t *dev; @@ -2063,15 +2063,15 @@ static const struct { { &ev159_device }, { &ev165a_device }, { &brxt_device }, -#if defined(DEV_BRANCH) && defined(USE_ISAMEM_BRAT) +#ifdef USE_ISAMEM_BRAT { &brat_device }, -#endif -#if defined(DEV_BRANCH) && defined(USE_ISAMEM_RAMPAGE) +#endif /* USE_ISAMEM_BRAT */ +#ifdef USE_ISAMEM_RAMPAGE { &rampage_device }, -#endif -#if defined(DEV_BRANCH) && defined(USE_ISAMEM_IAB) +#endif /* USE_ISAMEM_RAMPAGE */ +#ifdef USE_ISAMEM_IAB { &iab_device }, -#endif +#endif /* USE_ISAMEM_IAB */ { &lotech_device }, { NULL } // clang-format on diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index 63882222e..b90f4a77a 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -928,11 +928,11 @@ kbd_read(uint16_t port, void *priv) else { /* LaserXT = Always 512k RAM; LaserXT/3 = Bit 0: set = 512k, clear = 256k. */ -#if defined(DEV_BRANCH) && defined(USE_LASERXT) +#ifdef USE_LASERXT if (kbd->type == KBD_TYPE_VTECH) ret = ((mem_size == 512) ? 0x0d : 0x0c) | (hasfpu ? 0x02 : 0x00); else -#endif +#endif /* USE_LASERXT */ ret = (kbd->pd & 0x0d) | (hasfpu ? 0x02 : 0x00); } } @@ -1292,7 +1292,7 @@ const device_t keyboard_xt_t1x00_device = { .config = NULL }; -#if defined(DEV_BRANCH) && defined(USE_LASERXT) +#ifdef USE_LASERXT const device_t keyboard_xt_lxt3_device = { .name = "VTech Laser XT3 Keyboard", .internal_name = "keyboard_xt_lxt3", @@ -1306,7 +1306,7 @@ const device_t keyboard_xt_lxt3_device = { .force_redraw = NULL, .config = NULL }; -#endif +#endif /* USE_LASERXT */ const device_t keyboard_xt_olivetti_device = { .name = "Olivetti XT Keyboard", diff --git a/src/include/86box/chipset.h b/src/include/86box/chipset.h index 90647da9a..e47bb489f 100644 --- a/src/include/86box/chipset.h +++ b/src/include/86box/chipset.h @@ -195,7 +195,7 @@ extern const device_t nec_mate_unk_device; extern const device_t phoenix_486_jumper_device; extern const device_t phoenix_486_jumper_pci_device; -#if defined(DEV_BRANCH) && defined(USE_OLIVETTI) +#ifdef USE_OLIVETTI extern const device_t olivetti_eva_device; -#endif +#endif /* USE_OLIVETTI */ #endif /*EMU_CHIPSET_H*/ diff --git a/src/include/86box/keyboard.h b/src/include/86box/keyboard.h index eec64990e..f233637ff 100644 --- a/src/include/86box/keyboard.h +++ b/src/include/86box/keyboard.h @@ -222,9 +222,9 @@ extern const device_t keyboard_xt86_device; extern const device_t keyboard_xt_compaq_device; extern const device_t keyboard_xt_t1x00_device; extern const device_t keyboard_tandy_device; -# if defined(DEV_BRANCH) && defined(USE_LASERXT) +# ifdef USE_LASERXT extern const device_t keyboard_xt_lxt3_device; -# endif /*defined(DEV_BRANCH) && defined(USE_LASERXT) */ +# endif /* USE_LASERXT */ extern const device_t keyboard_xt_olivetti_device; extern const device_t keyboard_xt_zenith_device; extern const device_t keyboard_xt_hyundai_device; diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index 8afd5e28f..cf0c9b5f8 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -437,9 +437,9 @@ extern int machine_at_ibmxt286_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 -#if defined(DEV_BRANCH) && defined(USE_OPEN_AT) +#ifdef USE_OPEN_AT extern int machine_at_openat_init(const machine_t *); -#endif +#endif /* USE_OPEN_AT */ /* m_at_286_386sx.c */ extern int machine_at_tg286m_init(const machine_t *); @@ -468,9 +468,9 @@ extern int machine_at_deskmaster286_init(const machine_t *); extern int machine_at_pc8_init(const machine_t *); extern int machine_at_3302_init(const machine_t *); -#if defined(DEV_BRANCH) && defined(USE_OLIVETTI) +#ifdef USE_OLIVETTI extern int machine_at_m290_init(const machine_t *); -#endif +#endif /* USE_OLIVETTI */ extern int machine_at_shuttle386sx_init(const machine_t *); extern int machine_at_adi386sx_init(const machine_t *); diff --git a/src/include/86box/midi.h b/src/include/86box/midi.h index 57a20ae5c..3a41c2cb5 100644 --- a/src/include/86box/midi.h +++ b/src/include/86box/midi.h @@ -104,18 +104,18 @@ extern void midi_in_sysex(uint8_t *buffer, uint32_t len); #ifdef EMU_DEVICE_H extern const device_t rtmidi_output_device; extern const device_t rtmidi_input_device; -# if defined(DEV_BRANCH) && defined(USE_OPL4ML) +# ifdef USE_OPL4ML extern const device_t opl4_midi_device; -# endif +# endif /* USE_OPL4ML */ # ifdef USE_FLUIDSYNTH extern const device_t fluidsynth_device; -# endif +# endif /* USE_FLUIDSYNTH */ # ifdef USE_MUNT extern const device_t mt32_old_device; extern const device_t mt32_new_device; extern const device_t cm32l_device; extern const device_t cm32ln_device; -# endif +# endif /* USE_MUNT */ #endif #endif /*EMU_SOUND_MIDI_H*/ diff --git a/src/include/86box/sio.h b/src/include/86box/sio.h index 7f40203b4..2dbe97ab0 100644 --- a/src/include/86box/sio.h +++ b/src/include/86box/sio.h @@ -75,9 +75,9 @@ extern const device_t prime3b_ide_device; extern const device_t prime3c_device; extern const device_t prime3c_ide_device; extern const device_t ps1_m2133_sio; -#if defined(DEV_BRANCH) && defined(USE_SIO_DETECT) +#ifdef USE_SIO_DETECT extern const device_t sio_detect_device; -#endif +#endif /* USE_SIO_DETECT */ extern const device_t um8663af_device; extern const device_t um8663af_ide_device; extern const device_t um8663af_sec_device; diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 9cbd0399f..1037e213f 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -330,9 +330,9 @@ extern const device_t ati28800k_device; extern const device_t ati28800k_spc4620p_device; extern const device_t ati28800k_spc6033p_device; extern const device_t compaq_ati28800_device; -# if defined(DEV_BRANCH) && defined(USE_XL24) +# ifdef USE_XL24 extern const device_t ati28800_wonderxl24_device; -# endif +# endif /* USE_XL24 */ /* Bochs */ extern const device_t bochs_svga_device; @@ -448,7 +448,7 @@ extern const device_t mystique_220_device; extern const device_t millennium_ii_device; #ifdef USE_G100 extern const device_t productiva_g100_device; -#endif +#endif /* USE_G100 */ /* Oak OTI-0x7 */ extern const device_t oti037c_device; diff --git a/src/machine/m_at.c b/src/machine/m_at.c index 6343af4dc..122c5cdef 100644 --- a/src/machine/m_at.c +++ b/src/machine/m_at.c @@ -275,7 +275,7 @@ machine_at_wellamerastar_init(const machine_t *model) return ret; } -#if defined(DEV_BRANCH) && defined(USE_OPEN_AT) +#ifdef USE_OPEN_AT int machine_at_openat_init(const machine_t *model) { @@ -291,4 +291,4 @@ machine_at_openat_init(const machine_t *model) return ret; } -#endif +#endif /* USE_OPEN_AT */ diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index 4632e00df..995301e4f 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -965,7 +965,7 @@ machine_at_pc916sx_init(const machine_t *model) return ret; } -#if defined(DEV_BRANCH) && defined(USE_OLIVETTI) +#ifdef USE_OLIVETTI int machine_at_m290_init(const machine_t *model) { @@ -988,4 +988,4 @@ machine_at_m290_init(const machine_t *model) return ret; } -#endif +#endif /* USE_OLIVETTI */ diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 12cec1357..d7e2840a9 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -935,7 +935,7 @@ machine_at_tx97_init(const machine_t *model) return ret; } -#if defined(DEV_BRANCH) && defined(USE_AN430TX) +#ifdef USE_AN430TX int machine_at_an430tx_init(const machine_t *model) { @@ -979,7 +979,7 @@ machine_at_an430tx_init(const machine_t *model) return ret; } -#endif +#endif /* USE_AN430TX */ int machine_at_ym430tx_init(const machine_t *model) diff --git a/src/sound/midi.c b/src/sound/midi.c index bf92249c4..9edf0a2aa 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -76,19 +76,19 @@ static const MIDI_OUT_DEVICE devices[] = { { &device_none }, #ifdef USE_FLUIDSYNTH { &fluidsynth_device }, -#endif +#endif /* USE_FLUIDSYNTH */ #ifdef USE_MUNT { &mt32_old_device }, { &mt32_new_device }, { &cm32l_device }, { &cm32ln_device }, -#endif +#endif /*USE_MUNT */ #ifdef USE_RTMIDI { &rtmidi_output_device }, -#endif -#if defined(DEV_BRANCH) && defined(USE_OPL4ML) +#endif /* USE_RTMIDI */ +#ifdef USE_OPL4ML { &opl4_midi_device }, -#endif +#endif /* USE_OPL4ML */ { NULL } // clang-format on }; @@ -98,7 +98,7 @@ static const MIDI_IN_DEVICE midi_in_devices[] = { { &device_none }, #ifdef USE_RTMIDI { &rtmidi_input_device }, -#endif +#endif /* USE_RTMIDI */ { NULL } // clang-format on }; diff --git a/src/sound/snd_gus.c b/src/sound/snd_gus.c index d0af5c564..10b6f00dc 100644 --- a/src/sound/snd_gus.c +++ b/src/sound/snd_gus.c @@ -16,9 +16,9 @@ #include <86box/pic.h> #include <86box/sound.h> #include <86box/timer.h> -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX # include <86box/snd_ad1848.h> -#endif +#endif /*USE_GUSMAX */ #include <86box/plat_fallthrough.h> #include <86box/plat_unused.h> @@ -144,11 +144,11 @@ typedef struct gus_t { uint8_t usrr; -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX uint8_t max_ctrl; ad1848_t ad1848; -#endif +#endif /*USE_GUSMAX */ } gus_t; static int gus_gf1_irqs[8] = { -1, 2, 5, 3, 7, 11, 12, 15 }; @@ -256,9 +256,9 @@ writegus(uint16_t addr, uint8_t val, void *priv) int d; int old; uint16_t port; -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX uint16_t csioport; -#endif +#endif /*USE_GUSMAX */ if ((addr == 0x388) || (addr == 0x389)) port = addr; @@ -606,10 +606,10 @@ writegus(uint16_t addr, uint8_t val, void *priv) gus->irq_midi = gus->irq; } else gus->irq_midi = gus_midi_irqs[(val >> 3) & 7]; -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if (gus->type == GUS_MAX) ad1848_setirq(&gus->ad1848, gus->irq); -#endif +#endif /*USE_GUSMAX */ gus->sb_nmi = val & 0x80; } else { @@ -622,10 +622,10 @@ writegus(uint16_t addr, uint8_t val, void *priv) gus->dma2 = gus->dma; } else gus->dma2 = gus_dmas[(val >> 3) & 7]; -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if (gus->type == GUS_MAX) ad1848_setdma(&gus->ad1848, gus->dma2); -#endif +#endif /*USE_GUSMAX */ } break; case 1: @@ -683,7 +683,7 @@ writegus(uint16_t addr, uint8_t val, void *priv) break; case 0x306: case 0x706: -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if (gus->type == GUS_MAX) { if (gus->dma >= 4) val |= 0x10; @@ -703,7 +703,7 @@ writegus(uint16_t addr, uint8_t val, void *priv) } } } -#endif +#endif /*USE_GUSMAX */ break; default: @@ -755,11 +755,11 @@ readgus(uint16_t addr, void *priv) return val; case 0x20F: -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if (gus->type == GUS_MAX) val = 0x02; else -#endif +#endif /*USE_GUSMAX */ val = 0x00; break; @@ -878,11 +878,11 @@ readgus(uint16_t addr, void *priv) break; case 0x306: case 0x706: -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if (gus->type == GUS_MAX) val = 0x0a; /* GUS MAX */ else -#endif +#endif /*USE_GUSMAX */ val = 0xff; /*Pre 3.7 - no mixer*/ break; @@ -939,7 +939,7 @@ readgus(uint16_t addr, void *priv) gus->ad_status &= ~0x01; #ifdef OLD_NMI_BEHAVIOR nmi = 0; -#endif +#endif /* OLD_NMI_BEHAVIOR */ fallthrough; case 0x389: val = gus->ad_data; @@ -1182,24 +1182,24 @@ gus_get_buffer(int32_t *buffer, int len, void *priv) { gus_t *gus = (gus_t *) priv; -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if ((gus->type == GUS_MAX) && (gus->max_ctrl)) ad1848_update(&gus->ad1848); -#endif +#endif /*USE_GUSMAX */ gus_update(gus); for (int c = 0; c < len * 2; c++) { -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if ((gus->type == GUS_MAX) && (gus->max_ctrl)) buffer[c] += (int32_t) (gus->ad1848.buffer[c] / 2); -#endif +#endif /*USE_GUSMAX */ buffer[c] += (int32_t) gus->buffer[c & 1][c >> 1]; } -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if ((gus->type == GUS_MAX) && (gus->max_ctrl)) gus->ad1848.pos = 0; -#endif +#endif /*USE_GUSMAX */ gus->pos = 0; } @@ -1332,9 +1332,9 @@ gus_reset(void *priv) gus->usrr = 0; -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX gus->max_ctrl = 0; -#endif +#endif /*USE_GUSMAX */ gus->irq_state = 0; gus->midi_irq_state = 0; @@ -1383,7 +1383,7 @@ gus_init(UNUSED(const device_t *info)) io_sethandler(0x0506 + gus->base, 0x0001, readgus, NULL, NULL, writegus, NULL, NULL, gus); io_sethandler(0x0388, 0x0002, readgus, NULL, NULL, writegus, NULL, NULL, gus); -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if (gus->type == GUS_MAX) { ad1848_init(&gus->ad1848, AD1848_TYPE_CS4231); ad1848_setirq(&gus->ad1848, 5); @@ -1391,7 +1391,7 @@ gus_init(UNUSED(const device_t *info)) io_sethandler(0x10C + gus->base, 4, ad1848_read, NULL, NULL, ad1848_write, NULL, NULL, &gus->ad1848); } -#endif +#endif /*USE_GUSMAX */ timer_add(&gus->samp_timer, gus_poll_wave, gus, 1); timer_add(&gus->timer_1, gus_poll_timer_1, gus, 1); @@ -1424,10 +1424,10 @@ gus_speed_changed(void *priv) else gus->samp_latch = (uint64_t) (TIMER_USEC * (1000000.0 / gusfreqs[gus->voices - 14])); -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX if ((gus->type == GUS_MAX) && (gus->max_ctrl)) ad1848_speed_changed(&gus->ad1848); -#endif +#endif /*USE_GUSMAX */ } static const device_config_t gus_config[] = { @@ -1445,12 +1445,12 @@ static const device_config_t gus_config[] = { .description = "Classic", .value = GUS_CLASSIC }, -#if defined(DEV_BRANCH) && defined(USE_GUSMAX) +#ifdef USE_GUSMAX { .description = "MAX", .value = GUS_MAX }, -#endif +#endif /*USE_GUSMAX */ { NULL } }, }, diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 368312fcb..16bb36201 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -37,9 +37,9 @@ #include <86box/vid_svga_render.h> #define VGAWONDERXL 1 -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 # define VGAWONDERXL24 2 -#endif +#endif /* USE_XL24 */ #define BIOS_ATIKOR_PATH "roms/video/ati28800/atikorvga.bin" #define BIOS_ATIKOR_4620P_PATH_L "roms/machines/spc4620p/31005h.u8" @@ -52,10 +52,10 @@ #define BIOS_VGAXL_EVEN_PATH "roms/video/ati28800/xleven.bin" #define BIOS_VGAXL_ODD_PATH "roms/video/ati28800/xlodd.bin" -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 # define BIOS_XL24_EVEN_PATH "roms/video/ati28800/112-14318-102.bin" # define BIOS_XL24_ODD_PATH "roms/video/ati28800/112-14319-102.bin" -#endif +#endif /* USE_XL24 */ #define BIOS_ROM_PATH "roms/video/ati28800/bios.bin" #define BIOS_VGAXL_ROM_PATH "roms/video/ati28800/ATI_VGAWonder_XL.bin" @@ -609,7 +609,7 @@ ati28800_init(const device_t *info) ati28800->svga.ramdac = device_add(&sc11486_ramdac_device); break; -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 case VGAWONDERXL24: ati28800->id = 6; rom_init_interleaved(&ati28800->bios_rom, @@ -618,7 +618,7 @@ ati28800_init(const device_t *info) 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); break; -#endif +#endif /* USE_XL24 */ default: ati28800->id = 5; @@ -653,11 +653,11 @@ ati28800_init(const device_t *info) ati_eeprom_load(&ati28800->eeprom, "ati28800xl.nvr", 0); break; -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 case VGAWONDERXL24: ati_eeprom_load(&ati28800->eeprom, "ati28800xl24.nvr", 0); break; -#endif +#endif /* USE_XL24 */ default: ati_eeprom_load(&ati28800->eeprom, "ati28800.nvr", 0); @@ -685,13 +685,13 @@ compaq_ati28800_available(void) return (rom_present(BIOS_VGAXL_ROM_PATH)); } -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 static int ati28800_wonderxl24_available(void) { return (rom_present(BIOS_XL24_EVEN_PATH) && rom_present(BIOS_XL24_ODD_PATH)); } -#endif +#endif /* USE_XL24 */ static void ati28800_close(void *priv) @@ -749,7 +749,7 @@ static const device_config_t ati28800_config[] = { } }; -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 static const device_config_t ati28800_wonderxl_config[] = { { .name = "memory", @@ -778,7 +778,7 @@ static const device_config_t ati28800_wonderxl_config[] = { .type = CONFIG_END } }; -#endif +#endif /* USE_XL24 */ // clang-format on const device_t ati28800_device = { @@ -851,7 +851,7 @@ const device_t compaq_ati28800_device = { .config = ati28800_config }; -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 const device_t ati28800_wonderxl24_device = { .name = "ATI-28800 (VGA Wonder XL24)", .internal_name = "ati28800w", @@ -865,4 +865,4 @@ const device_t ati28800_wonderxl24_device = { .force_redraw = ati28800_force_redraw, .config = ati28800_wonderxl_config }; -#endif +#endif /* USE_XL24 */ diff --git a/src/video/vid_table.c b/src/video/vid_table.c index b6e1bd2f9..13639d05d 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -60,9 +60,9 @@ video_cards[] = { { &ati18800_vga88_device }, { &ati28800_device }, { &compaq_ati28800_device }, -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 { &ati28800_wonderxl24_device }, -#endif +#endif /* USE_XL24 */ { &ati18800_device }, { &ati18800_wonder_device }, { &cga_device }, @@ -236,7 +236,7 @@ video_cards[] = { { &s3_trio3d2x_agp_device }, #ifdef USE_G100 { &productiva_g100_device, VIDEO_FLAG_TYPE_SPECIAL }, -#endif +#endif /*USE_G100 */ { &velocity_100_agp_device }, { &velocity_200_agp_device }, { &voodoo_3_1000_agp_device }, From ccb6b357426126a079955d9cbede37892a694e31 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 9 Aug 2024 04:43:36 -0400 Subject: [PATCH 305/624] Fix the Radisys EPC-2102 --- src/machine/machine_table.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index a9d83f241..0864ce25d 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -12105,11 +12105,9 @@ const machine_t machines[] = { .ram = { .min = 8192, .max = 262144, - .max = 786432, .step = 8192 }, .nvrmask = 127, - .nvrmask = 255, .kbc_device = NULL, .kbc_p1 = 0xff, .gpio = 0xffffffff, From 7d73eb8400be907415c665d59c9e7e733ef499ce Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 9 Aug 2024 20:10:27 -0400 Subject: [PATCH 306/624] Correctly devbranch mitsumi CDROM --- CMakeLists.txt | 1 + src/cdrom/CMakeLists.txt | 8 +++++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e307d6d2f..2d5a9dc1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -151,6 +151,7 @@ endif() # ------ ----------- ---- --------- --------- cmake_dependent_option(AMD_K5 "AMD K5" ON "DEV_BRANCH" OFF) cmake_dependent_option(AN430TX "Intel AN430TX" ON "DEV_BRANCH" OFF) +cmake_dependent_option(CDROM_MITSUMI "Mitsumi CDROM" ON "DEV_BRANCH" OFF) cmake_dependent_option(CYRIX_6X86 "Cyrix 6x86" ON "DEV_BRANCH" OFF) cmake_dependent_option(G100 "Matrox Productiva G100" ON "DEV_BRANCH" OFF) cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" ON "DEV_BRANCH" OFF) diff --git a/src/cdrom/CMakeLists.txt b/src/cdrom/CMakeLists.txt index 897b353cb..0b4455eda 100644 --- a/src/cdrom/CMakeLists.txt +++ b/src/cdrom/CMakeLists.txt @@ -17,8 +17,14 @@ find_package(PkgConfig REQUIRED) pkg_check_modules(SNDFILE REQUIRED IMPORTED_TARGET sndfile) -add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c cdrom_ioctl.c cdrom_mitsumi.c) +add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c cdrom_ioctl.c) target_link_libraries(86Box PkgConfig::SNDFILE) + +if(CDROM_MITSUMI) + target_compile_definitions(cdrom PRIVATE USE_CDROM_MITSUMI) + target_sources(cdrom PRIVATE cdrom_mitsumi.c) +endif() + if (WIN32) # MSYS2 target_link_libraries(86Box -static ${SNDFILE_STATIC_LIBRARIES}) From 719efd3aa46310c3d3cb84ef0a2e9b9c59481405 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 9 Aug 2024 18:55:25 -0400 Subject: [PATCH 307/624] More DEV_BRANCH related cleaning --- src/CMakeLists.txt | 4 ---- src/cpu/386_ops.h | 8 ++++---- src/include/86box/machine.h | 8 ++++---- src/machine/machine_table.c | 20 ++++++++++---------- 4 files changed, 18 insertions(+), 22 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 93a6f4d4c..4b3da5791 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -48,10 +48,6 @@ if(DYNAREC) add_compile_definitions(USE_DYNAREC) endif() -if(DEV_BRANCH) - add_compile_definitions(DEV_BRANCH) -endif() - if(DISCORD) add_compile_definitions(DISCORD) target_sources(86Box PRIVATE discord.c) diff --git a/src/cpu/386_ops.h b/src/cpu/386_ops.h index 3e0d191f2..130166344 100644 --- a/src/cpu/386_ops.h +++ b/src/cpu/386_ops.h @@ -1384,7 +1384,7 @@ const OpFn OP_TABLE(pentium_0f)[1024] = { // clang-format on }; -# if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +# ifdef USE_CYRIX_6X86 const OpFn OP_TABLE(c6x86_0f)[1024] = { // clang-format off /*16-bit data, 16-bit addr*/ @@ -1476,7 +1476,7 @@ const OpFn OP_TABLE(c6x86_0f)[1024] = { /*f0*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, // clang-format on }; -# endif +# endif /* USE_CYRIX_6X86 */ const OpFn OP_TABLE(pentiummmx_0f)[1024] = { // clang-format off @@ -1754,7 +1754,7 @@ const OpFn OP_TABLE(k62_0f)[1024] = { // clang-format on }; -# if defined(DEV_BRANCH) && defined(USE_CYRIX_6X86) +# ifdef USE_CYRIX_6X86 const OpFn OP_TABLE(c6x86mx_0f)[1024] = { // clang-format off /*16-bit data, 16-bit addr*/ @@ -1846,7 +1846,7 @@ const OpFn OP_TABLE(c6x86mx_0f)[1024] = { /*f0*/ ILLEGAL, opPSLLW_a32, opPSLLD_a32, opPSLLQ_a32, ILLEGAL, opPMADDWD_a32, ILLEGAL, ILLEGAL, opPSUBB_a32, opPSUBW_a32, opPSUBD_a32, ILLEGAL, opPADDB_a32, opPADDW_a32, opPADDD_a32, ILLEGAL, // clang-format on }; -# endif +# endif /* USE_CYRIX_6X86 */ const OpFn OP_TABLE(pentiumpro_0f)[1024] = { // clang-format off diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index cf0c9b5f8..953ee7585 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -726,9 +726,9 @@ extern int machine_at_i430vx_init(const machine_t *); extern int machine_at_ma23c_init(const machine_t *); extern int machine_at_nupro592_init(const machine_t *); extern int machine_at_tx97_init(const machine_t *); -#if defined(DEV_BRANCH) && defined(USE_AN430TX) +#ifdef USE_AN430TX extern int machine_at_an430tx_init(const machine_t *); -#endif +#endif /* USE_AN430TX */ extern int machine_at_ym430tx_init(const machine_t *); extern int machine_at_thunderbolt_init(const machine_t *); extern int machine_at_mb540n_init(const machine_t *); @@ -941,10 +941,10 @@ extern int machine_xt_compaq_deskpro_init(const machine_t *); extern int machine_xt_compaq_portable_init(const machine_t *); /* m_xt_laserxt.c */ -#if defined(DEV_BRANCH) && defined(USE_LASERXT) +#ifdef USE_LASERXT extern int machine_xt_laserxt_init(const machine_t *); extern int machine_xt_lxt3_init(const machine_t *); -#endif +#endif /* USE_LASERXT */ /* m_xt_philips.c */ extern int machine_xt_p3105_init(const machine_t *); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 0864ce25d..9e1ee2205 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -1654,7 +1654,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#if defined(DEV_BRANCH) && defined(USE_LASERXT) +#ifdef USE_LASERXT { .name = "[8088] VTech Laser Turbo XT", .internal_name = "ltxt", @@ -1694,7 +1694,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif /* defined(DEV_BRANCH) && defined(USE_LASERXT) */ +#endif /* USE_LASERXT */ /* Has a standard PS/2 KBC (so, use IBM PS/2 Type 1). */ { .name = "[8088] Xi8088", @@ -2519,7 +2519,7 @@ const machine_t machines[] = { .net_device = NULL }, -#if defined(DEV_BRANCH) && defined(USE_LASERXT) +#ifdef USE_LASERXT { .name = "[8086] VTech Laser XT3", .internal_name = "lxt3", @@ -2559,7 +2559,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif /* defined(DEV_BRANCH) && defined(USE_LASERXT) */ +#endif /* USE_LASERXT */ /* 286 AT machines */ /* Has IBM AT KBC firmware. */ @@ -3003,7 +3003,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#if defined(DEV_BRANCH) && defined(USE_OLIVETTI) +#ifdef USE_OLIVETTI /* Has Olivetti KBC firmware. */ { .name = "[ISA] Olivetti M290", @@ -3044,8 +3044,8 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif /* defined(DEV_BRANCH) && defined(USE_OLIVETTI) */ -#if defined(DEV_BRANCH) && defined(USE_OPEN_AT) +#endif /* USE_OLIVETTI */ +#ifdef USE_OPEN_AT /* Has IBM AT KBC firmware. */ { .name = "[ISA] OpenAT", @@ -3086,7 +3086,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif /* defined(DEV_BRANCH) && defined(USE_OPEN_AT) */ +#endif /* USE_OPEN_AT */ /* Has IBM AT KBC firmware. */ { .name = "[ISA] Phoenix IBM AT", @@ -12282,7 +12282,7 @@ const machine_t machines[] = { .snd_device = &cs4236b_device, .net_device = &pcnet_am79c973_onboard_device }, -#if defined(DEV_BRANCH) && defined(USE_AN430TX) +#ifdef USE_AN430TX /* This has the Phoenix MultiKey KBC firmware. */ { .name = "[i430TX] Intel AN430TX", @@ -12323,7 +12323,7 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, -#endif /* defined(DEV_BRANCH) && defined(USE_AN430TX) */ +#endif /* USE_AN430TX */ /* This has the AMIKey KBC firmware, which is an updated 'F' type. */ { .name = "[i430TX] Intel YM430TX", From b7624e5b002a70418ed6e6514dd348e5982f3904 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 11 Aug 2024 20:53:01 +0200 Subject: [PATCH 308/624] DEC Tulip: Correctly return 0 when aborting receive on the first descriptor and no longer block broadcast packets. --- src/network/net_tulip.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/network/net_tulip.c b/src/network/net_tulip.c index 03eb21e88..060e11fba 100644 --- a/src/network/net_tulip.c +++ b/src/network/net_tulip.c @@ -452,7 +452,9 @@ tulip_copy_rx_bytes(TULIPState *s, struct tulip_descriptor *desc) static bool tulip_filter_address(TULIPState *s, const uint8_t *addr) { +#ifdef BLOCK_BROADCAST static const char broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +#endif bool ret = false; for (uint8_t i = 0; i < 16 && ret == false; i++) { @@ -461,9 +463,15 @@ tulip_filter_address(TULIPState *s, const uint8_t *addr) } } +/* + Do not block broadcast packets - needed for connections to the guest + to succeed when using SLiRP. + */ +#ifdef BLOCK_BROADCAST if (!memcmp(addr, broadcast, ETH_ALEN)) { return true; } +#endif if (s->csr[6] & (CSR6_PR | CSR6_RA)) { /* Promiscuous mode enabled */ @@ -488,7 +496,7 @@ tulip_receive(void *priv, uint8_t *buf, int size) { struct tulip_descriptor desc; TULIPState *s = (TULIPState *) priv; - + int first = 1; if (size < 14 || size > sizeof(s->rx_frame) - 4 || s->rx_frame_len || tulip_rx_stopped(s)) @@ -506,7 +514,11 @@ tulip_receive(void *priv, uint8_t *buf, int size) if (!(desc.status & RDES0_OWN)) { s->csr[5] |= CSR5_RU; tulip_update_int(s); - return s->rx_frame_size - s->rx_frame_len; + if (first) + /* Stop at the very beginning, tell the host 0 bytes have been received. */ + return 0; + else + return (s->rx_frame_size - s->rx_frame_len) % s->rx_frame_size; } desc.status = 0; @@ -527,6 +539,7 @@ tulip_receive(void *priv, uint8_t *buf, int size) } tulip_desc_write(s, s->current_rx_desc, &desc); tulip_next_rx_descriptor(s, &desc); + first = 0; } while (s->rx_frame_len); return 1; From 524721406175956c3ee7c828227f0708d4179c8e Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 12 Aug 2024 19:52:52 +0200 Subject: [PATCH 309/624] Video changes of the day (August 12th, 2024, S3/TGUI/SVGA)) SVGA: Added an indicator of the internal line to make matters easier for some vertical resolution problems. TGUI 9400CXi: Fixed the basic acceleration as much as I could. TGUI 9440AGi+: As with the line indicator, make matters easier for some resolution problems plus some refactoring of the bpp. Added write protection to some regs based on some documentation on the vt8601. TGUI cursor: fixed the left edge of the cursor X offset. S3: Apply the vblankstart = dispend statement only on enhanced modes, fixes vertical display on The Incredible Machine for DOS. Commented out some excess logs. --- src/include/86box/vid_svga.h | 1 + src/video/vid_s3.c | 11 +- src/video/vid_svga.c | 8 +- src/video/vid_tgui9440.c | 403 +++++++++++++++++++++-------------- 4 files changed, 255 insertions(+), 168 deletions(-) diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 3d68c1a34..fef9b2122 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -87,6 +87,7 @@ typedef struct svga_t { int dac_b; int vtotal; int dispend; + int vdisp; int vsyncstart; int split; int vblankstart; diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 2ad525892..7dc070fd3 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -3233,6 +3233,8 @@ s3_recalctimings(svga_t *svga) svga->hdisp = svga->hdisp_old; svga->ma_latch |= (s3->ma_ext << 16); + svga->lowres = (!!(svga->attrregs[0x10] & 0x40) && !(svga->crtc[0x3a] & 0x10)); + if (s3->chip >= S3_86C928) { if (svga->crtc[0x5d] & 0x01) svga->htotal |= 0x100; @@ -3246,8 +3248,8 @@ s3_recalctimings(svga_t *svga) svga->dispend |= 0x400; if (svga->crtc[0x5e] & 0x04) svga->vblankstart |= 0x400; - else - svga->vblankstart = svga->dispend; + else if ((svga->crtc[0x3a] & 0x10) && !svga->lowres) + svga->vblankstart = svga->dispend; /*Applies only to Enhanced modes*/ if (svga->crtc[0x5e] & 0x10) svga->vsyncstart |= 0x400; if (svga->crtc[0x5e] & 0x40) @@ -3294,8 +3296,6 @@ s3_recalctimings(svga_t *svga) break; } - svga->lowres = (!!(svga->attrregs[0x10] & 0x40) && !(svga->crtc[0x3a] & 0x10)); - if (s3->chip != S3_86C801) mask |= 0x01; switch (svga->crtc[0x50] & mask) { @@ -4140,6 +4140,9 @@ s3_recalctimings(svga_t *svga) if (svga->crtc[0x31] & 0x08) { svga->vram_display_mask = s3->vram_mask; if (svga->bpp == 8) { + if (!(svga->crtc[0x5e] & 0x04)) + svga->vblankstart = svga->dispend; /*Applies only to Enhanced modes*/ + /*Enhanced 4bpp mode, just like the 8bpp mode per the spec. */ svga->render = svga_render_8bpp_highres; svga->rowoffset <<= 1; diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 93c1eb669..bd31abd23 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -687,7 +687,7 @@ svga_recalctimings(svga_t *svga) } else if ((svga->gdcreg[5] & 0x60) == 0x20) { if (svga->seqregs[1] & 8) { /*Low res (320)*/ svga->render = svga_render_2bpp_lowres; - pclog("2 bpp low res\n"); + svga_log("2 bpp low res\n"); } else svga->render = svga_render_2bpp_highres; } else { @@ -859,8 +859,10 @@ svga_recalctimings(svga_t *svga) svga->y_add = (svga->monitor->mon_overscan_y >> 1); svga->x_add = (svga->monitor->mon_overscan_x >> 1); - if (svga->vblankstart < svga->dispend) + if (svga->vblankstart < svga->dispend) { + svga_log("DISPEND > VBLANKSTART.\n"); svga->dispend = svga->vblankstart; + } crtcconst = svga->clock * svga->char_width; if (ibm8514_active && (svga->dev8514 != NULL)) { @@ -1222,9 +1224,11 @@ svga_poll(void *priv) if (!svga->override) { if (svga->vertical_linedbl) { wy = (svga->lastline - svga->firstline) << 1; + svga->vdisp = wy + 1; svga_doblit(wx, wy, svga); } else { wy = svga->lastline - svga->firstline; + svga->vdisp = wy + 1; svga_doblit(wx, wy, svga); } } diff --git a/src/video/vid_tgui9440.c b/src/video/vid_tgui9440.c index 25988fcc6..9ec7e6105 100644 --- a/src/video/vid_tgui9440.c +++ b/src/video/vid_tgui9440.c @@ -145,12 +145,11 @@ typedef struct tgui_t { uint32_t pattern_32[8 * 8]; } accel; - uint8_t ext_gdc_regs[16]; /*TGUI9400CXi only*/ - uint8_t copy_latch[16]; + uint8_t copy_latch[16]; /*TGUI9400CXi only*/ uint8_t tgui_3d8, tgui_3d9; int oldmode; - uint8_t oldctrl1, newctrl1; + uint8_t oldctrl1; uint8_t oldctrl2, newctrl2; uint8_t oldgr0e, newgr0e; @@ -160,6 +159,7 @@ typedef struct tgui_t { int ramdac_state; uint8_t ramdac_ctrl; + uint8_t alt_clock; int clock_m, clock_n, clock_k; @@ -212,9 +212,6 @@ static void tgui_ext_writel(uint32_t addr, uint32_t val, void *priv); static __inline uint32_t dword_remap(svga_t *svga, uint32_t in_addr) { - if (svga->packed_chain4) - return in_addr; - return ((in_addr << 2) & 0x3fff0) | ((in_addr >> 14) & 0xc) | (in_addr & ~0x3fffc); } @@ -297,7 +294,7 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) { tgui_t *tgui = (tgui_t *) priv; svga_t *svga = &tgui->svga; - uint8_t old; + uint8_t old, o; if (((addr & 0xFFF0) == 0x3D0 || (addr & 0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; @@ -331,6 +328,15 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) svga->read_bank = svga->write_bank; return; + case 0x5a: + case 0x5b: + case 0x5c: + case 0x5d: + case 0x5e: + case 0x5f: + svga->seqregs[svga->seqaddr] = val; + return; + default: break; } @@ -344,20 +350,7 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) if (tgui->ramdac_state == 4) { tgui->ramdac_state = 0; tgui->ramdac_ctrl = val; - switch ((tgui->ramdac_ctrl >> 4) & 0x0f) { - case 1: - svga->bpp = 15; - break; - case 3: - svga->bpp = 16; - break; - case 0x0d: - svga->bpp = (tgui->type >= TGUI_9660) ? 32 : 24; - break; - default: - svga->bpp = 8; - break; - } + //pclog("TGUI ramdac ctrl=%02x.\n", (tgui->ramdac_ctrl >> 4) & 0x0f); svga_recalctimings(svga); return; } @@ -374,30 +367,35 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) break; case 0x3CF: - if (svga->gdcaddr == 0x23) { - svga->dpms = !!(val & 0x03); - svga_recalctimings(svga); - } - if (tgui->type == TGUI_9400CXI && svga->gdcaddr >= 16 && svga->gdcaddr < 32) { - old = tgui->ext_gdc_regs[svga->gdcaddr & 15]; - tgui->ext_gdc_regs[svga->gdcaddr & 15] = val; - if (svga->gdcaddr == 16) - tgui_recalcmapping(tgui); - return; - } + o = svga->gdcreg[svga->gdcaddr]; switch (svga->gdcaddr) { - case 0x6: + case 2: + svga->colourcompare = val; + break; + case 4: + svga->readplane = val & 3; + break; + case 5: + svga->writemode = val & 3; + svga->readmode = val & 8; + svga->chain2_read = val & 0x10; + break; + case 6: if (svga->gdcreg[6] != val) { svga->gdcreg[6] = val; tgui_recalcmapping(tgui); } - return; + break; + case 7: + svga->colournocare = val; + break; case 0x0e: svga->gdcreg[0xe] = val ^ 2; if ((svga->gdcreg[0xf] & 1) == 1) svga->read_bank = (svga->gdcreg[0xe]) * 65536; break; + case 0x0f: if (val & 1) svga->read_bank = (svga->gdcreg[0xe]) * 65536; @@ -414,6 +412,12 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) svga->write_bank = (svga->seqregs[0xe]) * 65536; break; + case 0x23: + svga->dpms = !!(val & 0x03); + svga_recalctimings(svga); + break; + + case 0x2f: case 0x5a: case 0x5b: case 0x5c: @@ -426,11 +430,36 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) default: break; } - break; + svga->gdcreg[svga->gdcaddr] = val; + + if (tgui->type == TGUI_9400CXI) { + if ((svga->gdcaddr >= 0x10) && (svga->gdcaddr <= 0x1f)) { + tgui_recalcmapping(tgui); + return; + } + } + svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && !svga->gdcreg[1]) && ((svga->chain4 && (svga->packed_chain4 || svga->force_old_addr)) || svga->fb_only); + if (((svga->gdcaddr == 5) && ((val ^ o) & 0x70)) || ((svga->gdcaddr == 6) && ((val ^ o) & 1))) + svga_recalctimings(svga); + return; case 0x3D4: svga->crtcreg = val; return; case 0x3D5: + if (!(svga->seqregs[0x0e] & 0x80) && !tgui->oldmode) { + switch (svga->crtcreg) { + case 0x21: + case 0x29: + case 0x2a: + case 0x38: + case 0x39: + case 0x3b: + case 0x3c: + return; + default: + break; + } + } if ((svga->crtcreg < 7) && (svga->crtc[0x11] & 0x80)) return; if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80)) @@ -484,7 +513,8 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) if ((tgui->accel.ger22 & 0xff) == 8) { if (svga->bpp != 24) { svga->hwcursor.x <<= 1; - if ((tgui->type == TGUI_9440) && (svga->crtc[0x1e] & 4)) + svga_recalctimings(svga); + if ((svga->vdisp == 1022) && svga->interlace) svga->hwcursor.x >>= 1; } } @@ -534,6 +564,10 @@ tgui_out(uint16_t addr, uint8_t val, void *priv) svga->read_bank = (val & 0x3f) * 65536; return; + case 0x3DB: + tgui->alt_clock = val & 0xe3; + return; + case 0x43c8: tgui->clock_n = val & 0x7f; tgui->clock_m = (tgui->clock_m & ~1) | (val >> 7); @@ -594,6 +628,8 @@ tgui_in(uint16_t addr, void *priv) return tgui->oldctrl1 | 0x88; return svga->seqregs[0x0e]; } + if ((svga->seqaddr >= 0x5a) && (svga->seqaddr <= 0x5f)) + return svga->seqregs[svga->seqaddr]; break; case 0x3C6: @@ -613,10 +649,10 @@ tgui_in(uint16_t addr, void *priv) break; case 0x3CF: - if (tgui->type == TGUI_9400CXI && svga->gdcaddr >= 16 && svga->gdcaddr < 32) - return tgui->ext_gdc_regs[svga->gdcaddr & 15]; if (svga->gdcaddr >= 0x5a && svga->gdcaddr <= 0x5f) return svga->gdcreg[svga->gdcaddr]; + if (svga->gdcaddr == 0x2f) + return svga->gdcreg[svga->gdcaddr]; break; case 0x3D4: return svga->crtcreg; @@ -639,6 +675,8 @@ tgui_in(uint16_t addr, void *priv) return tgui->tgui_3d8; case 0x3d9: return tgui->tgui_3d9; + case 0x3db: + return tgui->alt_clock; default: break; @@ -653,28 +691,49 @@ tgui_recalctimings(svga_t *svga) uint8_t ger22lower = (tgui->accel.ger22 & 0xff); uint8_t ger22upper = (tgui->accel.ger22 >> 8); - if (!svga->rowoffset) - svga->rowoffset = 0x100; - - if (svga->crtc[0x29] & 0x10) - svga->rowoffset |= 0x100; + if (tgui->type >= TGUI_9440) { + if ((svga->crtc[0x38] & 0x19) == 0x09) + svga->bpp = 32; + else { + switch ((tgui->ramdac_ctrl >> 4) & 0x0f) { + case 0x01: + svga->bpp = 15; + break; + case 0x03: + svga->bpp = 16; + break; + case 0x0d: + svga->bpp = 24; + break; + default: + svga->bpp = 8; + break; + } + } + } if ((tgui->type >= TGUI_9440) && (svga->bpp >= 24)) - svga->hdisp = (svga->crtc[1] + 1) * 8; + svga->hdisp = (svga->crtc[1] + 1) << 3; + + if (((svga->crtc[0x29] & 0x30) && (svga->bpp >= 15)) || !svga->rowoffset) + svga->rowoffset |= 0x100; + + //pclog("BPP=%d, DataWidth=%02x, CRTC29 bit 4-5=%02x, pixbusmode=%02x, rowoffset=%02x, doublerowoffset=%x.\n", svga->bpp, svga->crtc[0x2a] & 0x40, svga->crtc[0x29] & 0x30, svga->crtc[0x38], svga->rowoffset, svga->gdcreg[0x2f] & 4); if ((svga->crtc[0x1e] & 0xA0) == 0xA0) svga->ma_latch |= 0x10000; - if ((svga->crtc[0x27] & 0x01) == 0x01) + if (svga->crtc[0x27] & 0x01) svga->ma_latch |= 0x20000; - if ((svga->crtc[0x27] & 0x02) == 0x02) + if (svga->crtc[0x27] & 0x02) svga->ma_latch |= 0x40000; - if ((svga->crtc[0x27] & 0x04) == 0x04) + if (svga->crtc[0x27] & 0x04) svga->ma_latch |= 0x80000; if (svga->crtc[0x27] & 0x08) svga->split |= 0x400; if (svga->crtc[0x27] & 0x10) svga->dispend |= 0x400; + if (svga->crtc[0x27] & 0x20) svga->vsyncstart |= 0x400; if (svga->crtc[0x27] & 0x40) @@ -687,15 +746,18 @@ tgui_recalctimings(svga_t *svga) svga->lowres = 0; } + svga->interlace = !!(svga->crtc[0x1e] & 4); + if (svga->interlace && (tgui->type < TGUI_9440)) + svga->rowoffset >>= 1; + + if (svga->vdisp == 1020) + svga->vdisp += 2; + if ((tgui->oldctrl2 & 0x10) || (svga->crtc[0x2a] & 0x40)) svga->ma_latch <<= 1; svga->lowres = !(svga->crtc[0x2a] & 0x40); - svga->interlace = !!(svga->crtc[0x1e] & 4); - if (svga->interlace && (tgui->type < TGUI_9440)) - svga->rowoffset >>= 1; - if (tgui->type >= TGUI_9440) { if (svga->miscout & 8) svga->clock = (cpuclock * (double) (1ULL << 32)) / (((tgui->clock_n + 8) * 14318180.0) / ((tgui->clock_m + 2) * (1 << tgui->clock_k))); @@ -752,6 +814,7 @@ tgui_recalctimings(svga_t *svga) default: break; } + if (svga->gdcreg[0xf] & 0x08) { svga->htotal <<= 1; svga->hdisp <<= 1; @@ -763,7 +826,24 @@ tgui_recalctimings(svga_t *svga) switch (svga->bpp) { case 8: svga->render = svga_render_8bpp_highres; + if (svga->vdisp == 1022) { + if (svga->interlace) + svga->dispend++; + else + svga->dispend += 2; + } if (tgui->type >= TGUI_9660) { + switch (svga->vdisp) { + case 1024: + case 1200: + svga->htotal <<= 1; + svga->hdisp <<= 1; + svga->hdisp_time <<= 1; + break; + default: + break; + } +#if OLD_CODE if (svga->dispend == ((1024 >> 1) - 2)) svga->dispend += 2; if (svga->dispend == (1024 >> 1)) @@ -776,6 +856,7 @@ tgui_recalctimings(svga_t *svga) else if (!svga->interlace && (svga->dispend == 768)) svga->hdisp <<= 1; } +#endif if (ger22upper & 0x80) { svga->htotal <<= 1; @@ -785,15 +866,12 @@ tgui_recalctimings(svga_t *svga) switch (svga->hdisp) { case 640: if (!ger22lower) - svga->rowoffset = 80; + svga->rowoffset = 0x50; break; default: break; } - } else { - if ((svga->hdisp == 1280) && (svga->dispend == (1020 >> 1)) && svga->interlace) - svga->dispend++; } break; case 15: @@ -812,11 +890,10 @@ tgui_recalctimings(svga_t *svga) svga->hdisp = (svga->hdisp << 1) / 3; break; case 32: + if (svga->rowoffset == 0x100) + svga->rowoffset <<= 1; + svga->render = svga_render_32bpp_highres; - if (tgui->type >= TGUI_9660) { - if (!ger22upper) - svga->rowoffset <<= 1; - } break; default: @@ -831,14 +908,14 @@ tgui_recalcmapping(tgui_t *tgui) svga_t *svga = &tgui->svga; if (tgui->type == TGUI_9400CXI) { - if (tgui->ext_gdc_regs[0] & EXT_CTRL_LATCH_COPY) { + if (svga->gdcreg[0x10] & EXT_CTRL_LATCH_COPY) { mem_mapping_set_handler(&tgui->linear_mapping, tgui_ext_linear_read, NULL, NULL, tgui_ext_linear_write, tgui_ext_linear_writew, tgui_ext_linear_writel); mem_mapping_set_handler(&svga->mapping, tgui_ext_read, NULL, NULL, tgui_ext_write, tgui_ext_writew, tgui_ext_writel); - } else if (tgui->ext_gdc_regs[0] & EXT_CTRL_MONO_EXPANSION) { + } else if (svga->gdcreg[0x10] & EXT_CTRL_MONO_EXPANSION) { mem_mapping_set_handler(&tgui->linear_mapping, svga_read_linear, svga_readw_linear, svga_readl_linear, tgui_ext_linear_write, tgui_ext_linear_writew, tgui_ext_linear_writel); @@ -934,7 +1011,7 @@ tgui_recalcmapping(tgui_t *tgui) } if (tgui->type >= TGUI_9440) { - if ((tgui->mmio_base != 0x00000000) && (svga->crtc[0x39] & 1)) + if ((tgui->mmio_base != 0x00000000) && (svga->crtc[0x39] & 0x01)) mem_mapping_set_addr(&tgui->mmio_mapping, tgui->mmio_base, 0x10000); else mem_mapping_disable(&tgui->mmio_mapping); @@ -945,7 +1022,7 @@ static void tgui_hwcursor_draw(svga_t *svga, int displine) { uint32_t dat[2]; - int offset = svga->hwcursor_latch.x + svga->hwcursor_latch.xoff; + int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff; int pitch = (svga->hwcursor_latch.cur_xsize == 64) ? 16 : 8; if (svga->interlace && svga->hwcursor_oddeven) @@ -1127,26 +1204,24 @@ tgui_ext_linear_read(uint32_t addr, void *priv) svga_t *svga = (svga_t *) priv; tgui_t *tgui = (tgui_t *) svga->priv; - cycles -= video_timing_read_b; + cycles -= svga->monitor->mon_video_timing_read_b; addr &= svga->decode_mask; if (addr >= svga->vram_max) return 0xff; addr &= svga->vram_mask; - addr &= (tgui->ext_gdc_regs[0] & EXT_CTRL_LATCH_COPY) ? ~0x0f : ~0x07; - addr = dword_remap(svga, addr); + addr &= ~0x0f; + addr = dword_remap(svga, addr); - if (tgui->ext_gdc_regs[0] & EXT_CTRL_LATCH_COPY) { - for (int c = 0; c < 16; c++) { - tgui->copy_latch[c] = svga->vram[addr]; - addr += (c & 3) ? 1 : 13; - addr &= svga->vram_mask; - } - return svga->vram[addr]; + for (int i = 0; i < 16; i++) { + tgui->copy_latch[i] = svga->vram[addr]; + addr += ((i & 3) == 3) ? 0x0d : 0x01; } - return svga_read_linear(addr, svga); + addr &= svga->vram_mask; + + return svga->vram[addr]; } static uint8_t @@ -1164,65 +1239,77 @@ tgui_ext_linear_write(uint32_t addr, uint8_t val, void *priv) { svga_t *svga = (svga_t *) priv; const tgui_t *tgui = (tgui_t *) svga->priv; - int c; - int bpp = (tgui->ext_gdc_regs[0] & EXT_CTRL_16BIT); - uint8_t fg[2] = { tgui->ext_gdc_regs[4], tgui->ext_gdc_regs[5] }; - uint8_t bg[2] = { tgui->ext_gdc_regs[1], tgui->ext_gdc_regs[2] }; - uint8_t mask = tgui->ext_gdc_regs[7]; + int bpp = (svga->gdcreg[0x10] & EXT_CTRL_16BIT); + uint8_t fg[2] = { svga->gdcreg[0x14], svga->gdcreg[0x15] }; + uint8_t bg[2] = { svga->gdcreg[0x11], svga->gdcreg[0x12] }; - cycles -= video_timing_write_b; + cycles -= svga->monitor->mon_video_timing_write_b; addr &= svga->decode_mask; if (addr >= svga->vram_max) return; - addr &= svga->vram_mask; - addr &= (tgui->ext_gdc_regs[0] & EXT_CTRL_LATCH_COPY) ? ~0x0f : ~0x07; - addr = dword_remap(svga, addr); + addr &= svga->vram_mask; + addr &= (svga->gdcreg[0x10] & EXT_CTRL_LATCH_COPY) ? ~0x0f : ~0x07; + addr = dword_remap(svga, addr); + svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; - if (tgui->ext_gdc_regs[0] & EXT_CTRL_LATCH_COPY) { - for (c = 0; c < 16; c++) { - svga->vram[addr] = tgui->copy_latch[c]; - addr += ((c & 3) == 3) ? 13 : 1; + if (svga->gdcreg[0x10] & EXT_CTRL_LATCH_COPY) { + for (int i = 0; i < 8; i++) { + if (val & (0x80 >> i)) + svga->vram[addr] = tgui->copy_latch[i]; + + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } - } else if (tgui->ext_gdc_regs[0] & (EXT_CTRL_MONO_EXPANSION | EXT_CTRL_MONO_TRANSPARENT)) { - if (tgui->ext_gdc_regs[0] & EXT_CTRL_MONO_TRANSPARENT) { + } else { + if (svga->gdcreg[0x10] & EXT_CTRL_MONO_TRANSPARENT) { if (bpp) { - for (c = 7; c >= 0; c--) { - if ((val & mask) & (1 << c)) - svga->vram[addr] = fg[(c & 1) ^ 1]; - addr += (c & 3) ? 1 : 13; + for (int i = 0; i < 8; i++) { + if (val & (0x80 >> i)) + svga->vram[addr] = fg[i & 1]; + + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } } else { - for (c = 7; c >= 0; c--) { - if ((val & mask) & (1 << c)) - svga->vram[addr] = tgui->ext_gdc_regs[4]; - addr += (c == 4) ? 13 : 1; + for (int i = 0; i < 8; i++) { + if (val & (0x80 >> i)) + svga->vram[addr] = fg[0]; + + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } } } else { if (bpp) { - for (c = 7; c >= 0; c--) { - if (mask & (1 << c)) - svga->vram[addr] = (val & (1 << c)) ? fg[(c & 1) ^ 1] : bg[(c & 1) ^ 1]; - addr += (c & 3) ? 1 : 13; + for (int i = 0; i < 8; i++) { + if (val & (0x80 >> i)) { + if (svga->gdcreg[0x17] & (0x80 >> i)) + svga->vram[addr] = fg[i & 1]; + } else { + if (svga->gdcreg[0x17] & (0x80 >> i)) + svga->vram[addr] = bg[i & 1]; + } + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } } else { - for (c = 7; c >= 0; c--) { - if (mask & (1 << c)) - svga->vram[addr] = (val & (1 << c)) ? tgui->ext_gdc_regs[4] : tgui->ext_gdc_regs[1]; - addr += (c == 4) ? 13 : 1; + for (int i = 0; i < 8; i++) { + if (val & (0x80 >> i)) { + if (svga->gdcreg[0x17] & (0x80 >> i)) + svga->vram[addr] = fg[0]; + } else { + if (svga->gdcreg[0x17] & (0x80 >> i)) + svga->vram[addr] = bg[0]; + } + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } } } - } else - svga_write_linear(addr, val, svga); + } } static void @@ -1230,94 +1317,85 @@ tgui_ext_linear_writew(uint32_t addr, uint16_t val, void *priv) { svga_t *svga = (svga_t *) priv; const tgui_t *tgui = (tgui_t *) svga->priv; - int c; - int bpp = (tgui->ext_gdc_regs[0] & EXT_CTRL_16BIT); - uint8_t fg[2] = { tgui->ext_gdc_regs[4], tgui->ext_gdc_regs[5] }; - uint8_t bg[2] = { tgui->ext_gdc_regs[1], tgui->ext_gdc_regs[2] }; - uint16_t mask = (tgui->ext_gdc_regs[7] << 8) | tgui->ext_gdc_regs[8]; + int bpp = (svga->gdcreg[0x10] & EXT_CTRL_16BIT); + uint8_t fg[2] = { svga->gdcreg[0x14], svga->gdcreg[0x15] }; + uint8_t bg[2] = { svga->gdcreg[0x11], svga->gdcreg[0x12] }; + uint16_t mask = svga->gdcreg[0x18] | (svga->gdcreg[0x17] << 8); - cycles -= video_timing_write_w; + cycles -= svga->monitor->mon_video_timing_write_w; addr &= svga->decode_mask; if (addr >= svga->vram_max) return; + addr &= svga->vram_mask; - addr &= (tgui->ext_gdc_regs[0] & EXT_CTRL_LATCH_COPY) ? ~0x0f : ~0x07; + addr &= ~0x0f; + addr = dword_remap(svga, addr); - addr = dword_remap(svga, addr); svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; - val = (val >> 8) | (val << 8); - if (tgui->ext_gdc_regs[0] & EXT_CTRL_LATCH_COPY) { - for (c = 0; c < 16; c++) { - svga->vram[addr] = tgui->copy_latch[c]; - addr += (c & 3) ? 1 : 13; + if (svga->gdcreg[0x10] & EXT_CTRL_LATCH_COPY) { + for (int i = 0; i < 16; i++) { + if (val & (0x8000 >> i)) + svga->vram[addr] = tgui->copy_latch[i]; + + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } - } else if (tgui->ext_gdc_regs[0] & (EXT_CTRL_MONO_EXPANSION | EXT_CTRL_MONO_TRANSPARENT)) { - if (tgui->ext_gdc_regs[0] & EXT_CTRL_MONO_TRANSPARENT) { + } else { + if (svga->gdcreg[0x10] & EXT_CTRL_MONO_TRANSPARENT) { if (bpp) { - for (c = 15; c >= 0; c--) { - if ((val & mask) & (1 << c)) - svga->vram[addr] = fg[(c & 1) ^ 1]; - addr += (c & 3) ? 1 : 13; + for (int i = 0; i < 16; i++) { + if (val & (0x8000 >> i)) + svga->vram[addr] = fg[i & 1]; + + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } } else { - for (c = 15; c >= 0; c--) { - if ((val & mask) & (1 << c)) - svga->vram[addr] = tgui->ext_gdc_regs[4]; + for (int i = 0; i < 16; i++) { + if (val & (0x8000 >> i)) + svga->vram[addr] = fg[0]; - addr += (c & 3) ? 1 : 13; + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } } } else { if (bpp) { - for (c = 15; c >= 0; c--) { - if (mask & (1 << c)) - svga->vram[addr] = (val & (1 << c)) ? fg[(c & 1) ^ 1] : bg[(c & 1) ^ 1]; - addr += (c & 3) ? 1 : 13; + for (int i = 0; i < 16; i++) { + if (val & (0x8000 >> i)) { + if (mask & (0x8000 >> i)) + svga->vram[addr] = fg[i & 1]; + } else { + if (mask & (0x8000 >> i)) + svga->vram[addr] = bg[i & 1]; + } + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } } else { - for (c = 15; c >= 0; c--) { - if (mask & (1 << c)) - svga->vram[addr] = (val & (1 << c)) ? tgui->ext_gdc_regs[4] : tgui->ext_gdc_regs[1]; - - addr += (c & 3) ? 1 : 13; + for (int i = 0; i < 16; i++) { + if (val & (0x8000 >> i)) { + if (mask & (0x8000 >> i)) + svga->vram[addr] = fg[0]; + } else { + if (mask & (0x8000 >> i)) + svga->vram[addr] = bg[0]; + } + addr += ((i & 3) == 3) ? 0x0d : 0x01; addr &= svga->vram_mask; } } } - } else - svga_writew_linear(addr, val, svga); + } } static void tgui_ext_linear_writel(uint32_t addr, uint32_t val, void *priv) { - svga_t *svga = (svga_t *) priv; - const tgui_t *tgui = (tgui_t *) svga->priv; - - cycles -= video_timing_write_l; - - addr &= svga->decode_mask; - if (addr >= svga->vram_max) - return; - addr &= svga->vram_mask; - addr &= (tgui->ext_gdc_regs[0] & EXT_CTRL_LATCH_COPY) ? ~0x0f : ~0x07; - - addr = dword_remap(svga, addr); - svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; - - if (tgui->ext_gdc_regs[0] & (EXT_CTRL_MONO_EXPANSION | EXT_CTRL_MONO_TRANSPARENT | EXT_CTRL_LATCH_COPY)) { - tgui_ext_linear_writew(addr, val & 0xffff, priv); - tgui_ext_linear_writew(addr + 2, val >> 16, priv); - } else { - svga_writel_linear(addr, val, svga); - } + tgui_ext_linear_writew(addr, val, priv); } static void @@ -1490,6 +1568,8 @@ tgui_accel_command(int count, uint32_t cpu_dat, tgui_t *tgui) case 32: tgui->accel.pitch <<= 1; break; + default: + break; } #if 0 pclog("TGUI accel command = %x, ger22 = %04x, hdisp = %d, dispend = %d, vtotal = %d, rowoffset = %d, svgabpp = %d, interlace = %d, accelbpp = %d, pitch = %d.\n", tgui->accel.command, tgui->accel.ger22, svga->hdisp, svga->dispend, svga->vtotal, svga->rowoffset, svga->bpp, svga->interlace, tgui->accel.bpp, tgui->accel.pitch); @@ -3219,7 +3299,6 @@ tgui_init(const device_t *info) if (tgui->type >= TGUI_9440) { svga->packed_chain4 = 1; - tgui->i2c = i2c_gpio_init("ddc_tgui"); tgui->ddc = ddc_init(i2c_gpio_get_bus(tgui->i2c)); } From 6cc761518526a26619f48aabc41f966f02526b89 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 13 Aug 2024 00:26:53 +0200 Subject: [PATCH 310/624] Keyboard AT: Send ACK before the resent scan code on command FE, fixes #4713. --- src/device/keyboard_at.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index bcb4d646b..882174e4e 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -2102,6 +2102,7 @@ keyboard_at_write(void *priv) /* TODO: This is supposed to resend multiple bytes after some commands. */ case 0xfe: /* resend last scan code */ keyboard_at_log("%s: resend last scan code\n", dev->name); + kbc_at_dev_queue_add(dev, 0xfa, 0); kbc_at_dev_queue_add(dev, dev->last_scan_code, 0); break; From 059c6156df70df3dc431f5a2760d7bc37fd7edd6 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 10 Aug 2024 19:57:46 -0400 Subject: [PATCH 311/624] Break out the K5 timings --- src/codegen/codegen.h | 1 + src/codegen_new/codegen.h | 1 + src/cpu/CMakeLists.txt | 6 + src/cpu/codegen_timing_k5.c | 2232 +++++++++++++++++++++++++++++++++++ 4 files changed, 2240 insertions(+) create mode 100644 src/cpu/codegen_timing_k5.c diff --git a/src/codegen/codegen.h b/src/codegen/codegen.h index 6d30211a6..d020fc57f 100644 --- a/src/codegen/codegen.h +++ b/src/codegen/codegen.h @@ -311,6 +311,7 @@ extern codegen_timing_t codegen_timing_686; extern codegen_timing_t codegen_timing_486; extern codegen_timing_t codegen_timing_winchip; extern codegen_timing_t codegen_timing_winchip2; +extern codegen_timing_t codegen_timing_k5; extern codegen_timing_t codegen_timing_k6; extern codegen_timing_t codegen_timing_p6; diff --git a/src/codegen_new/codegen.h b/src/codegen_new/codegen.h index deeeb899c..eecfa249b 100644 --- a/src/codegen_new/codegen.h +++ b/src/codegen_new/codegen.h @@ -341,6 +341,7 @@ extern codegen_timing_t codegen_timing_686; extern codegen_timing_t codegen_timing_486; extern codegen_timing_t codegen_timing_winchip; extern codegen_timing_t codegen_timing_winchip2; +extern codegen_timing_t codegen_timing_k5; extern codegen_timing_t codegen_timing_k6; extern codegen_timing_t codegen_timing_p6; diff --git a/src/cpu/CMakeLists.txt b/src/cpu/CMakeLists.txt index a3677767d..b12356ccc 100644 --- a/src/cpu/CMakeLists.txt +++ b/src/cpu/CMakeLists.txt @@ -19,6 +19,12 @@ add_library(cpu OBJECT cpu.c cpu_table.c fpu.c x86.c 808x.c 386.c 386_common.c if(AMD_K5) target_compile_definitions(cpu PRIVATE USE_AMD_K5) + +if(DYNAREC) + add_library(ctk5 OBJECT codegen_timing_k5.c) + target_link_libraries(86Box ctk5) +endif() + endif() if(CYRIX_6X86) diff --git a/src/cpu/codegen_timing_k5.c b/src/cpu/codegen_timing_k5.c new file mode 100644 index 000000000..bdcc0ce43 --- /dev/null +++ b/src/cpu/codegen_timing_k5.c @@ -0,0 +1,2232 @@ +/*Most of the vector instructions here are a total guess. + Some of the timings are based on http://http://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000562_k5_InstLatX86.txt*/ +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/mem.h> +#include "cpu.h" +#include <86box/machine.h> + +#include "x86.h" +#include "x86_ops.h" +#include "x86seg_common.h" +#include "x87_sf.h" +#include "x87.h" +#include "386_common.h" +#include "codegen.h" +#include "codegen_ops.h" +#include "codegen_timing_common.h" + +typedef enum uop_type_t { + UOP_ALU = 0, /*Executes in Integer X or Y units*/ + UOP_ALUX, /*Executes in Integer X unit*/ + UOP_LOAD, /*Executes in Load unit*/ + UOP_STORE, /*Executes in Store unit*/ + UOP_FLOAD, /*Executes in Load unit*/ + UOP_FSTORE, /*Executes in Store unit*/ + UOP_MLOAD, /*Executes in Load unit*/ + UOP_MSTORE, /*Executes in Store unit*/ + UOP_FLOAT, /*Executes in Floating Point unit*/ + UOP_MEU, /*Executes in Multimedia unit*/ + UOP_MEU_SHIFT, /*Executes in Multimedia unit or ALU X/Y. Uses MMX shifter*/ + UOP_MEU_MUL, /*Executes in Multimedia unit or ALU X/Y. Uses MMX/3DNow multiplier*/ + UOP_MEU_3DN, /*Executes in Multimedia unit or ALU X/Y. Uses 3DNow ALU*/ + UOP_BRANCH, /*Executes in Branch unit*/ + UOP_LIMM /*Does not require an execution unit*/ +} uop_type_t; + +typedef enum decode_type_t { + DECODE_SHORT, + DECODE_LONG, + DECODE_VECTOR +} decode_type_t; + +#define MAX_UOPS 10 + +typedef struct risc86_uop_t { + uop_type_t type; + int throughput; + int latency; +} risc86_uop_t; + +typedef struct risc86_instruction_t { + int nr_uops; + decode_type_t decode_type; + risc86_uop_t uop[MAX_UOPS]; +} risc86_instruction_t; + +static const risc86_instruction_t alu_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t alux_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t load_alu_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t load_alux_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t alu_store_op = { + .nr_uops = 3, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t alux_store_op = { + .nr_uops = 3, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; + +static const risc86_instruction_t branch_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_BRANCH, .throughput = 1, .latency = 1} +}; + +static const risc86_instruction_t limm_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LIMM, .throughput = 1, .latency = 1} +}; + +static const risc86_instruction_t load_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2} +}; + +static const risc86_instruction_t store_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1} +}; + +static const risc86_instruction_t bswap_op = { + .nr_uops = 1, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t leave_op = { + .nr_uops = 3, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t lods_op = { + .nr_uops = 2, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t loop_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_BRANCH, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t mov_reg_seg_op = { + .nr_uops = 1, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, +}; +static const risc86_instruction_t movs_op = { + .nr_uops = 4, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[3] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t pop_reg_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t pop_mem_op = { + .nr_uops = 3, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t push_imm_op = { + .nr_uops = 1, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 2}, +}; +static const risc86_instruction_t push_mem_op = { + .nr_uops = 2, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t push_seg_op = { + .nr_uops = 2, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t stos_op = { + .nr_uops = 2, + .decode_type = DECODE_LONG, + .uop[1] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[3] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t test_reg_op = { + .nr_uops = 1, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t test_reg_b_op = { + .nr_uops = 1, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t test_mem_imm_op = { + .nr_uops = 2, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t test_mem_imm_b_op = { + .nr_uops = 2, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t xchg_op = { + .nr_uops = 3, + .decode_type = DECODE_LONG, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; + +static const risc86_instruction_t m3dn_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_MEU_3DN, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t mmx_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_MEU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t mmx_mul_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_MEU_MUL, .throughput = 1, .latency = 2} +}; +static const risc86_instruction_t mmx_shift_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_MEU_SHIFT, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t load_3dn_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_MEU_3DN, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t load_mmx_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_MEU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t load_mmx_mul_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_MEU_MUL, .throughput = 1, .latency = 2} +}; +static const risc86_instruction_t load_mmx_shift_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_MEU_SHIFT, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t mload_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_MLOAD, .throughput = 1, .latency = 2} +}; + +static const risc86_instruction_t mstore_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_MSTORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t pmul_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_MEU_MUL, .throughput = 1, .latency = 2} +}; +static const risc86_instruction_t pmul_mem_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_MEU_MUL, .throughput = 1, .latency = 2} +}; + +static const risc86_instruction_t float_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_FLOAT, .throughput = 2, .latency = 2} +}; +static const risc86_instruction_t load_float_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_FLOAT, .throughput = 2, .latency = 2} +}; +static const risc86_instruction_t fstore_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_FSTORE, .throughput = 1, .latency = 1} +}; + +static const risc86_instruction_t fdiv_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_FLOAT, .throughput = 40, .latency = 40} +}; +static const risc86_instruction_t fdiv_mem_op = { + .nr_uops = 2, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2 }, + .uop[1] = { .type = UOP_FLOAT, .throughput = 40, .latency = 40} +}; +static const risc86_instruction_t fsin_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_FLOAT, .throughput = 62, .latency = 62} +}; +static const risc86_instruction_t fsqrt_op = { + .nr_uops = 1, + .decode_type = DECODE_SHORT, + .uop[0] = {.type = UOP_FLOAT, .throughput = 41, .latency = 41} +}; + +static const risc86_instruction_t vector_fldcw_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_FLOAT, .throughput = 8, .latency = 8} +}; +static const risc86_instruction_t vector_float_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_FLOAT, .throughput = 2, .latency = 2} +}; +static const risc86_instruction_t vector_float_l_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_FLOAT, .throughput = 50, .latency = 50} +}; +static const risc86_instruction_t vector_flde_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_FLOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_FLOAD, .throughput = 1, .latency = 2}, + .uop[2] = { .type = UOP_FLOAT, .throughput = 2, .latency = 2} +}; +static const risc86_instruction_t vector_fste_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_FLOAT, .throughput = 2, .latency = 2}, + .uop[1] = { .type = UOP_FSTORE, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_FSTORE, .throughput = 1, .latency = 1} +}; + +static const risc86_instruction_t vector_alu1_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_alu2_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_alu3_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_alu6_op = { + .nr_uops = 6, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[3] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[4] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[5] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_alux1_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_alux3_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_alux6_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[3] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[4] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[5] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_alu_store_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_alux_store_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_arpl_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, + .uop[1] = { .type = UOP_ALU, .throughput = 3, .latency = 3} +}; +static const risc86_instruction_t vector_bound_op = { + .nr_uops = 4, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[3] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_bsx_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 10, .latency = 10} +}; +static const risc86_instruction_t vector_call_far_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_BRANCH, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_cli_sti_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 7, .latency = 7} +}; +static const risc86_instruction_t vector_cmps_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_cmpsb_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_cmpxchg_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, +}; +static const risc86_instruction_t vector_cmpxchg_b_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, +}; +static const risc86_instruction_t vector_cpuid_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 22, .latency = 22} +}; +static const risc86_instruction_t vector_div16_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 10, .latency = 10} +}; +static const risc86_instruction_t vector_div16_mem_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2 }, + .uop[1] = { .type = UOP_ALUX, .throughput = 10, .latency = 10} +}; +static const risc86_instruction_t vector_div32_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 18, .latency = 18} +}; +static const risc86_instruction_t vector_div32_mem_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2 }, + .uop[1] = { .type = UOP_ALUX, .throughput = 18, .latency = 18} +}; +static const risc86_instruction_t vector_emms_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 25, .latency = 25} +}; +static const risc86_instruction_t vector_enter_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 2 }, + .uop[1] = { .type = UOP_ALU, .throughput = 10, .latency = 10} +}; +static const risc86_instruction_t vector_femms_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 6, .latency = 6} +}; +static const risc86_instruction_t vector_in_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 10, .latency = 11} +}; +static const risc86_instruction_t vector_ins_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 10, .latency = 11}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1 }, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1 } +}; +static const risc86_instruction_t vector_int_op = { + .nr_uops = 5, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 20, .latency = 20}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1 }, + .uop[2] = { .type = UOP_STORE, .throughput = 1, .latency = 1 }, + .uop[3] = { .type = UOP_STORE, .throughput = 1, .latency = 1 }, + .uop[4] = { .type = UOP_BRANCH, .throughput = 1, .latency = 1 } +}; +static const risc86_instruction_t vector_iret_op = { + .nr_uops = 5, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2 }, + .uop[1] = { .type = UOP_LOAD, .throughput = 1, .latency = 2 }, + .uop[2] = { .type = UOP_LOAD, .throughput = 1, .latency = 2 }, + .uop[3] = { .type = UOP_ALU, .throughput = 20, .latency = 20}, + .uop[4] = { .type = UOP_BRANCH, .throughput = 1, .latency = 1 } +}; +static const risc86_instruction_t vector_invd_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 1000, .latency = 1000} +}; +static const risc86_instruction_t vector_jmp_far_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3}, + .uop[1] = { .type = UOP_BRANCH, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_load_alu_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_load_alux_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_loop_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_BRANCH, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_lss_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[2] = { .type = UOP_ALU, .throughput = 3, .latency = 3} +}; +static const risc86_instruction_t vector_mov_mem_seg_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_mov_seg_mem_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 3, .latency = 3} +}; +static const risc86_instruction_t vector_mov_seg_reg_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 3, .latency = 3} +}; +static const risc86_instruction_t vector_mul_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_mul_mem_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_mul64_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_mul64_mem_op = { + .nr_uops = 4, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[3] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_out_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_STORE, .throughput = 10, .latency = 10} +}; +static const risc86_instruction_t vector_outs_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1 }, + .uop[1] = { .type = UOP_STORE, .throughput = 10, .latency = 10}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1 } +}; +static const risc86_instruction_t vector_pusha_op = { + .nr_uops = 8, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[3] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[4] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[5] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[6] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[7] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_popa_op = { + .nr_uops = 8, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_LOAD, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_LOAD, .throughput = 1, .latency = 1}, + .uop[3] = { .type = UOP_LOAD, .throughput = 1, .latency = 1}, + .uop[4] = { .type = UOP_LOAD, .throughput = 1, .latency = 1}, + .uop[5] = { .type = UOP_LOAD, .throughput = 1, .latency = 1}, + .uop[6] = { .type = UOP_LOAD, .throughput = 1, .latency = 1}, + .uop[7] = { .type = UOP_LOAD, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_popf_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2 }, + .uop[1] = { .type = UOP_ALUX, .throughput = 17, .latency = 17} +}; +static const risc86_instruction_t vector_push_mem_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_pushf_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_ret_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_BRANCH, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_retf_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 3, .latency = 3}, + .uop[2] = { .type = UOP_BRANCH, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_scas_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_scasb_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_setcc_mem_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_FSTORE, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_setcc_reg_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_test_mem_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_test_mem_b_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 2}, + .uop[1] = { .type = UOP_ALUX, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_xchg_mem_op = { + .nr_uops = 3, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_LOAD, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_STORE, .throughput = 1, .latency = 1}, + .uop[2] = { .type = UOP_ALU, .throughput = 1, .latency = 1} +}; +static const risc86_instruction_t vector_xlat_op = { + .nr_uops = 2, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 1, .latency = 1}, + .uop[1] = { .type = UOP_LOAD, .throughput = 1, .latency = 2} +}; +static const risc86_instruction_t vector_wbinvd_op = { + .nr_uops = 1, + .decode_type = DECODE_VECTOR, + .uop[0] = {.type = UOP_ALU, .throughput = 10000, .latency = 10000} +}; + +#define INVALID NULL + +static const risc86_instruction_t *opcode_timings_k5[256] = { + // clang-format off +/* ADD ADD ADD ADD*/ +/*00*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, +/* ADD ADD PUSH ES POP ES*/ + &alux_op, &alu_op, &push_seg_op, &vector_mov_seg_mem_op, +/* OR OR OR OR*/ + &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, +/* OR OR PUSH CS */ + &alux_op, &alu_op, &push_seg_op, INVALID, + +/* ADC ADC ADC ADC*/ +/*10*/ &vector_alux_store_op, &vector_alu_store_op, &vector_load_alux_op, &vector_load_alu_op, +/* ADC ADC PUSH SS POP SS*/ + &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, +/* SBB SBB SBB SBB*/ +/*10*/ &vector_alux_store_op, &vector_alu_store_op, &vector_load_alux_op, &vector_load_alu_op, +/* SBB SBB PUSH DS POP DS*/ + &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + +/* AND AND AND AND*/ +/*20*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, +/* AND AND DAA*/ + &alux_op, &alu_op, INVALID, &vector_alux1_op, +/* SUB SUB SUB SUB*/ + &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, +/* SUB SUB DAS*/ + &alux_op, &alu_op, INVALID, &vector_alux1_op, + +/* XOR XOR XOR XOR*/ +/*30*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, +/* XOR XOR AAA*/ + &alux_op, &alu_op, INVALID, &vector_alux6_op, +/* CMP CMP CMP CMP*/ + &load_alux_op, &load_alu_op, &load_alux_op, &load_alu_op, +/* CMP CMP AAS*/ + &alux_op, &alu_op, INVALID, &vector_alux6_op, + +/* INC EAX INC ECX INC EDX INC EBX*/ +/*40*/ &alu_op, &alu_op, &alu_op, &alu_op, +/* INC ESP INC EBP INC ESI INC EDI*/ + &alu_op, &alu_op, &alu_op, &alu_op, +/* DEC EAX DEC ECX DEC EDX DEC EBX*/ + &alu_op, &alu_op, &alu_op, &alu_op, +/* DEC ESP DEC EBP DEC ESI DEC EDI*/ + &alu_op, &alu_op, &alu_op, &alu_op, + +/* PUSH EAX PUSH ECX PUSH EDX PUSH EBX*/ +/*50*/ &store_op, &store_op, &store_op, &store_op, +/* PUSH ESP PUSH EBP PUSH ESI PUSH EDI*/ + &store_op, &store_op, &store_op, &store_op, +/* POP EAX POP ECX POP EDX POP EBX*/ + &pop_reg_op, &pop_reg_op, &pop_reg_op, &pop_reg_op, +/* POP ESP POP EBP POP ESI POP EDI*/ + &pop_reg_op, &pop_reg_op, &pop_reg_op, &pop_reg_op, + +/* PUSHA POPA BOUND ARPL*/ +/*60*/ &vector_pusha_op, &vector_popa_op, &vector_bound_op, &vector_arpl_op, + INVALID, INVALID, INVALID, INVALID, +/* PUSH imm IMUL PUSH imm IMUL*/ + &push_imm_op, &vector_mul_op, &push_imm_op, &vector_mul_op, +/* INSB INSW OUTSB OUTSW*/ + &vector_ins_op, &vector_ins_op, &vector_outs_op, &vector_outs_op, + +/* Jxx*/ +/*70*/ &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + +/*80*/ INVALID, INVALID, INVALID, INVALID, +/* TEST TEST XCHG XCHG*/ + &vector_test_mem_b_op, &vector_test_mem_op, &vector_xchg_mem_op, &vector_xchg_mem_op, +/* MOV MOV MOV MOV*/ + &store_op, &store_op, &load_op, &load_op, +/* MOV from seg LEA MOV to seg POP*/ + &vector_mov_mem_seg_op, &store_op, &vector_mov_seg_mem_op, &pop_mem_op, + +/* NOP XCHG XCHG XCHG*/ +/*90*/ &limm_op, &xchg_op, &xchg_op, &xchg_op, +/* XCHG XCHG XCHG XCHG*/ + &xchg_op, &xchg_op, &xchg_op, &xchg_op, +/* CBW CWD CALL far WAIT*/ + &vector_alu1_op, &vector_alu1_op, &vector_call_far_op, &limm_op, +/* PUSHF POPF SAHF LAHF*/ + &vector_pushf_op, &vector_popf_op, &vector_alux1_op, &vector_alux1_op, + +/* MOV MOV MOV MOV*/ +/*a0*/ &load_op, &load_op, &store_op, &store_op, +/* MOVSB MOVSW CMPSB CMPSW*/ + &movs_op, &movs_op, &vector_cmpsb_op, &vector_cmps_op, +/* TEST TEST STOSB STOSW*/ + &test_reg_b_op, &test_reg_op, &stos_op, &stos_op, +/* LODSB LODSW SCASB SCASW*/ + &lods_op, &lods_op, &vector_scasb_op, &vector_scas_op, + +/* MOV*/ +/*b0*/ &limm_op, &limm_op, &limm_op, &limm_op, + &limm_op, &limm_op, &limm_op, &limm_op, + &limm_op, &limm_op, &limm_op, &limm_op, + &limm_op, &limm_op, &limm_op, &limm_op, + +/* RET imm RET*/ +/*c0*/ INVALID, INVALID, &vector_ret_op, &vector_ret_op, +/* LES LDS MOV MOV*/ + &vector_lss_op, &vector_lss_op, &store_op, &store_op, +/* ENTER LEAVE RETF RETF*/ + &vector_enter_op, &leave_op, &vector_retf_op, &vector_retf_op, +/* INT3 INT INTO IRET*/ + &vector_int_op, &vector_int_op, &vector_int_op, &vector_iret_op, + + +/*d0*/ INVALID, INVALID, INVALID, INVALID, +/* AAM AAD SETALC XLAT*/ + &vector_alux6_op, &vector_alux3_op, &vector_alux1_op, &vector_xlat_op, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, +/* LOOPNE LOOPE LOOP JCXZ*/ +/*e0*/ &vector_loop_op, &vector_loop_op, &loop_op, &vector_loop_op, +/* IN AL IN AX OUT_AL OUT_AX*/ + &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, +/* CALL JMP JMP JMP*/ + &store_op, &branch_op, &vector_jmp_far_op, &branch_op, +/* IN AL IN AX OUT_AL OUT_AX*/ + &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + +/* REPNE REPE*/ +/*f0*/ INVALID, INVALID, INVALID, INVALID, +/* HLT CMC*/ + &vector_alux1_op, &vector_alu2_op, INVALID, INVALID, +/* CLC STC CLI STI*/ + &vector_alu1_op, &vector_alu1_op, &vector_cli_sti_op, &vector_cli_sti_op, +/* CLD STD INCDEC*/ + &vector_alu1_op, &vector_alu1_op, &alux_store_op, INVALID + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_mod3[256] = { + // clang-format off +/* ADD ADD ADD ADD*/ +/*00*/ &alux_op, &alu_op, &alux_op, &alu_op, +/* ADD ADD PUSH ES POP ES*/ + &alux_op, &alu_op, &push_seg_op, &vector_mov_seg_mem_op, +/* OR OR OR OR*/ + &alux_op, &alu_op, &alux_op, &alu_op, +/* OR OR PUSH CS */ + &alux_op, &alu_op, &push_seg_op, INVALID, + +/* ADC ADC ADC ADC*/ +/*10*/ &vector_alux1_op, &vector_alu1_op, &vector_alux1_op, &vector_alu1_op, +/* ADC ADC PUSH SS POP SS*/ + &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, +/* SBB SBB SBB SBB*/ + &vector_alux1_op, &vector_alu1_op, &vector_alux1_op, &vector_alu1_op, +/* SBB SBB PUSH DS POP DS*/ + &vector_alux1_op, &vector_alu1_op, &push_seg_op, &vector_mov_seg_mem_op, + +/* AND AND AND AND*/ +/*20*/ &alux_op, &alu_op, &alux_op, &alu_op, +/* AND AND DAA*/ + &alux_op, &alu_op, INVALID, &vector_alux1_op, +/* SUB SUB SUB SUB*/ + &alux_op, &alu_op, &alux_op, &alu_op, +/* SUB SUB DAS*/ + &alux_op, &alu_op, INVALID, &vector_alux1_op, + +/* XOR XOR XOR XOR*/ +/*30*/ &alux_op, &alu_op, &alux_op, &alu_op, +/* XOR XOR AAA*/ + &alux_op, &alu_op, INVALID, &vector_alux6_op, +/* CMP CMP CMP CMP*/ + &alux_op, &alu_op, &alux_op, &alu_op, +/* CMP CMP AAS*/ + &alux_op, &alu_op, INVALID, &vector_alux6_op, + +/* INC EAX INC ECX INC EDX INC EBX*/ +/*40*/ &alu_op, &alu_op, &alu_op, &alu_op, +/* INC ESP INC EBP INC ESI INC EDI*/ + &alu_op, &alu_op, &alu_op, &alu_op, +/* DEC EAX DEC ECX DEC EDX DEC EBX*/ + &alu_op, &alu_op, &alu_op, &alu_op, +/* DEC ESP DEC EBP DEC ESI DEC EDI*/ + &alu_op, &alu_op, &alu_op, &alu_op, + +/* PUSH EAX PUSH ECX PUSH EDX PUSH EBX*/ +/*50*/ &store_op, &store_op, &store_op, &store_op, +/* PUSH ESP PUSH EBP PUSH ESI PUSH EDI*/ + &store_op, &store_op, &store_op, &store_op, +/* POP EAX POP ECX POP EDX POP EBX*/ + &pop_reg_op, &pop_reg_op, &pop_reg_op, &pop_reg_op, +/* POP ESP POP EBP POP ESI POP EDI*/ + &pop_reg_op, &pop_reg_op, &pop_reg_op, &pop_reg_op, + +/* PUSHA POPA BOUND ARPL*/ +/*60*/ &vector_pusha_op, &vector_popa_op, &vector_bound_op, &vector_arpl_op, + INVALID, INVALID, INVALID, INVALID, +/* PUSH imm IMUL PUSH imm IMUL*/ + &push_imm_op, &vector_mul_op, &push_imm_op, &vector_mul_op, +/* INSB INSW OUTSB OUTSW*/ + &vector_ins_op, &vector_ins_op, &vector_outs_op, &vector_outs_op, + +/* Jxx*/ +/*70*/ &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + +/*80*/ INVALID, INVALID, INVALID, INVALID, +/* TEST TEST XCHG XCHG*/ + &vector_alu1_op, &vector_alu1_op, &vector_alu3_op, &vector_alu3_op, +/* MOV MOV MOV MOV*/ + &store_op, &store_op, &load_op, &load_op, +/* MOV from seg LEA MOV to seg POP*/ + &mov_reg_seg_op, &store_op, &vector_mov_seg_reg_op, &pop_reg_op, + +/* NOP XCHG XCHG XCHG*/ +/*90*/ &limm_op, &xchg_op, &xchg_op, &xchg_op, +/* XCHG XCHG XCHG XCHG*/ + &xchg_op, &xchg_op, &xchg_op, &xchg_op, +/* CBW CWD CALL far WAIT*/ + &vector_alu1_op, &vector_alu1_op, &vector_call_far_op, &limm_op, +/* PUSHF POPF SAHF LAHF*/ + &vector_pushf_op, &vector_popf_op, &vector_alux1_op, &vector_alux1_op, + +/* MOV MOV MOV MOV*/ +/*a0*/ &load_op, &load_op, &store_op, &store_op, +/* MOVSB MOVSW CMPSB CMPSW*/ + &movs_op, &movs_op, &vector_cmpsb_op, &vector_cmps_op, +/* TEST TEST STOSB STOSW*/ + &test_reg_b_op, &test_reg_op, &stos_op, &stos_op, +/* LODSB LODSW SCASB SCASW*/ + &lods_op, &lods_op, &vector_scasb_op, &vector_scas_op, + +/* MOV*/ +/*b0*/ &limm_op, &limm_op, &limm_op, &limm_op, + &limm_op, &limm_op, &limm_op, &limm_op, + &limm_op, &limm_op, &limm_op, &limm_op, + &limm_op, &limm_op, &limm_op, &limm_op, + +/* RET imm RET*/ +/*c0*/ INVALID, INVALID, &vector_ret_op, &vector_ret_op, +/* LES LDS MOV MOV*/ + &vector_lss_op, &vector_lss_op, &store_op, &store_op, +/* ENTER LEAVE RETF RETF*/ + &vector_enter_op, &leave_op, &vector_retf_op, &vector_retf_op, +/* INT3 INT INTO IRET*/ + &vector_int_op, &vector_int_op, &vector_int_op, &vector_iret_op, + + +/*d0*/ INVALID, INVALID, INVALID, INVALID, +/* AAM AAD SETALC XLAT*/ + &vector_alux6_op, &vector_alux3_op, &vector_alux1_op, &vector_xlat_op, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, +/* LOOPNE LOOPE LOOP JCXZ*/ +/*e0*/ &vector_loop_op, &vector_loop_op, &loop_op, &vector_loop_op, +/* IN AL IN AX OUT_AL OUT_AX*/ + &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, +/* CALL JMP JMP JMP*/ + &store_op, &branch_op, &vector_jmp_far_op, &branch_op, +/* IN AL IN AX OUT_AL OUT_AX*/ + &vector_in_op, &vector_in_op, &vector_out_op, &vector_out_op, + +/* REPNE REPE*/ +/*f0*/ INVALID, INVALID, INVALID, INVALID, +/* HLT CMC*/ + &vector_alux1_op, &vector_alu2_op, INVALID, INVALID, +/* CLC STC CLI STI*/ + &vector_alu1_op, &vector_alu1_op, &vector_cli_sti_op, &vector_cli_sti_op, +/* CLD STD INCDEC*/ + &vector_alu1_op, &vector_alu1_op, &vector_alux1_op, INVALID + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_0f[256] = { + // clang-format off +/*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, + INVALID, &vector_alu6_op, &vector_alu6_op, INVALID, + &vector_invd_op, &vector_wbinvd_op, INVALID, INVALID, + INVALID, &load_op, &vector_femms_op, &load_3dn_op, + +/*10*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*20*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, + &vector_alu6_op, &vector_alu6_op, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*30*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*40*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*50*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*60*/ &load_mmx_op, &load_mmx_op, &load_mmx_op, &load_mmx_op, + &load_mmx_op, &load_mmx_op, &load_mmx_op, &load_mmx_op, + &load_mmx_op, &load_mmx_op, &load_mmx_op, &load_mmx_op, + INVALID, INVALID, &mload_op, &mload_op, + +/*70*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, + &load_mmx_op, &load_mmx_op, &load_mmx_op, &vector_emms_op, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, &mstore_op, &mstore_op, + +/*80*/ &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + +/*90*/ &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, + &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, + &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, + &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, &vector_setcc_reg_op, + +/*a0*/ &push_seg_op, &vector_mov_seg_mem_op, &vector_cpuid_op, &vector_load_alu_op, + &vector_alu_store_op, &vector_alu_store_op, INVALID, INVALID, + &push_seg_op, &vector_mov_seg_mem_op, INVALID, &vector_load_alu_op, + &vector_alu_store_op, &vector_alu_store_op, INVALID, &vector_mul_op, + +/*b0*/ &vector_cmpxchg_b_op, &vector_cmpxchg_op, &vector_lss_op, &vector_load_alu_op, + &vector_lss_op, &vector_lss_op, &load_alux_op, &load_alu_op, + INVALID, INVALID, &vector_load_alu_op, &vector_load_alu_op, + &vector_bsx_op, &vector_bsx_op, &load_alux_op, &load_alu_op, + +/*c0*/ &vector_alux_store_op, &vector_alu_store_op, INVALID, INVALID, + INVALID, INVALID, INVALID, &vector_cmpxchg_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, + +/*d0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, + INVALID, &load_mmx_mul_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, + +/*e0*/ &load_mmx_op, &load_mmx_shift_op, &load_mmx_shift_op, INVALID, + INVALID, &pmul_mem_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, + &load_mmx_op, &load_mmx_op, INVALID, &load_mmx_op, + +/*f0*/ INVALID, &load_mmx_shift_op, &load_mmx_shift_op, &load_mmx_shift_op, + INVALID, &pmul_mem_op, INVALID, INVALID, + &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, + &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_0f_mod3[256] = { + // clang-format off +/*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, + INVALID, &vector_alu6_op, &vector_alu6_op, INVALID, + &vector_invd_op, &vector_wbinvd_op, INVALID, INVALID, + INVALID, INVALID, &vector_femms_op, &m3dn_op, + +/*10*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*20*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, + &vector_alu6_op, &vector_alu6_op, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*30*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*40*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*50*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*60*/ &mmx_op, &mmx_op, &mmx_op, &mmx_op, + &mmx_op, &mmx_op, &mmx_op, &mmx_op, + &mmx_op, &mmx_op, &mmx_op, &mmx_op, + INVALID, INVALID, &mmx_op, &mmx_op, + +/*70*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + &mmx_op, &mmx_op, &mmx_op, &vector_emms_op, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, &mmx_op, &mmx_op, + +/*80*/ &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + &branch_op, &branch_op, &branch_op, &branch_op, + +/*90*/ &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, + &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, + &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, + &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, &vector_setcc_mem_op, + +/*a0*/ &push_seg_op, &vector_mov_seg_mem_op, &vector_cpuid_op, &vector_alu1_op, + &vector_alu1_op, &vector_alu1_op, INVALID, INVALID, + &push_seg_op, &vector_mov_seg_mem_op, INVALID, &vector_alu1_op, + &vector_alu1_op, &vector_alu1_op, INVALID, &vector_mul_op, + +/*b0*/ &vector_cmpxchg_b_op, &vector_cmpxchg_op, &vector_lss_op, &vector_alu1_op, + &vector_lss_op, &vector_lss_op, &alux_op, &alu_op, + INVALID, INVALID, &vector_alu1_op, &vector_alu1_op, + &vector_bsx_op, &vector_bsx_op, &alux_op, &alu_op, + +/*c0*/ &vector_alux1_op, &vector_alu1_op, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, + &bswap_op, &bswap_op, &bswap_op, &bswap_op, + +/*d0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + INVALID, &mmx_mul_op, INVALID, INVALID, + &mmx_op, &mmx_op, INVALID, &mmx_op, + &mmx_op, &mmx_op, INVALID, &mmx_op, + +/*e0*/ &mmx_op, &mmx_shift_op, &mmx_shift_op, INVALID, + INVALID, &pmul_op, INVALID, INVALID, + &mmx_op, &mmx_op, INVALID, &mmx_op, + &mmx_op, &mmx_op, INVALID, &mmx_op, + +/*f0*/ INVALID, &mmx_shift_op, &mmx_shift_op, &mmx_shift_op, + INVALID, &pmul_op, INVALID, INVALID, + &mmx_op, &mmx_op, &mmx_op, INVALID, + &mmx_op, &mmx_op, &mmx_op, INVALID, + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_0f0f[256] = { + // clang-format off +/*00*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, &load_3dn_op, INVALID, INVALID, + +/*10*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, &load_3dn_op, INVALID, INVALID, + +/*20*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*30*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*40*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*50*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*60*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*70*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*80*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*90*/ &load_3dn_op, INVALID, INVALID, INVALID, + &load_3dn_op, INVALID, &load_3dn_op, &load_3dn_op, + INVALID, INVALID, &load_3dn_op, INVALID, + INVALID, INVALID, &load_3dn_op, INVALID, + +/*a0*/ &load_3dn_op, INVALID, INVALID, INVALID, + &load_3dn_op, INVALID, &load_mmx_mul_op, &load_mmx_mul_op, + INVALID, INVALID, &load_3dn_op, INVALID, + INVALID, INVALID, &load_3dn_op, INVALID, + +/*b0*/ &load_3dn_op, INVALID, INVALID, INVALID, + &load_mmx_mul_op, INVALID, &load_mmx_mul_op, &load_mmx_mul_op, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, &load_mmx_op, + +/*c0*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*d0*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*e0*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*f0*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_0f0f_mod3[256] = { + // clang-format off +/*00*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, &m3dn_op, INVALID, INVALID, + +/*10*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, &m3dn_op, INVALID, INVALID, + +/*20*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*30*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*40*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*50*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*60*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*70*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*80*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*90*/ &m3dn_op, INVALID, INVALID, INVALID, + &m3dn_op, INVALID, &m3dn_op, &m3dn_op, + INVALID, INVALID, &m3dn_op, INVALID, + INVALID, INVALID, &m3dn_op, INVALID, + +/*a0*/ &m3dn_op, INVALID, INVALID, INVALID, + &m3dn_op, INVALID, &mmx_mul_op, &mmx_mul_op, + INVALID, INVALID, &m3dn_op, INVALID, + INVALID, INVALID, &m3dn_op, INVALID, + +/*b0*/ &m3dn_op, INVALID, INVALID, INVALID, + &mmx_mul_op, INVALID, &mmx_mul_op, &mmx_mul_op, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, &mmx_op, + +/*c0*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*d0*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*e0*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/*f0*/ INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_shift[8] = { + // clang-format off + &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, + &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_shift_b[8] = { + // clang-format off + &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, + &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_shift_mod3[8] = { + // clang-format off + &vector_alu1_op, &vector_alu1_op, &vector_alu1_op, &vector_alu1_op, + &alu_op, &alu_op, &alu_op, &alu_op + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_shift_b_mod3[8] = { + // clang-format off + &vector_alux1_op, &vector_alux1_op, &vector_alux1_op, &vector_alux1_op, + &alux_op, &alux_op, &alux_op, &alux_op + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_80[8] = { + // clang-format off + &alux_store_op, &alux_store_op, &vector_alux_store_op, &vector_alux_store_op, + &alux_store_op, &alux_store_op, &alux_store_op, &alux_store_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_80_mod3[8] = { + // clang-format off + &alux_op, &alux_op, &alux_store_op, &alux_store_op, + &alux_op, &alux_op, &alux_op, &alux_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_8x[8] = { + // clang-format off + &alu_store_op, &alu_store_op, &vector_alu_store_op, &vector_alu_store_op, + &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_8x_mod3[8] = { + // clang-format off + &alu_op, &alu_op, &alu_store_op, &alu_store_op, + &alu_op, &alu_op, &alu_op, &alu_op, + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_f6[8] = { + // clang-format off +/* TST NOT NEG*/ + &test_mem_imm_b_op, INVALID, &vector_alux_store_op, &vector_alux_store_op, +/* MUL IMUL DIV IDIV*/ + &vector_mul_mem_op, &vector_mul_mem_op, &vector_div16_mem_op, &vector_div16_mem_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_f6_mod3[8] = { + // clang-format off +/* TST NOT NEG*/ + &test_reg_b_op, INVALID, &alux_op, &alux_op, +/* MUL IMUL DIV IDIV*/ + &vector_mul_op, &vector_mul_op, &vector_div16_op, &vector_div16_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_f7[8] = { + // clang-format off +/* TST NOT NEG*/ + &test_mem_imm_op, INVALID, &vector_alu_store_op, &vector_alu_store_op, +/* MUL IMUL DIV IDIV*/ + &vector_mul64_mem_op, &vector_mul64_mem_op, &vector_div32_mem_op, &vector_div32_mem_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_f7_mod3[8] = { + // clang-format off +/* TST NOT NEG*/ + &test_reg_op, INVALID, &alu_op, &alu_op, +/* MUL IMUL DIV IDIV*/ + &vector_mul64_op, &vector_mul64_op, &vector_div32_op, &vector_div32_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_ff[8] = { + // clang-format off +/* INC DEC CALL CALL far*/ + &alu_store_op, &alu_store_op, &store_op, &vector_call_far_op, +/* JMP JMP far PUSH*/ + &branch_op, &vector_jmp_far_op, &push_mem_op, INVALID + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_ff_mod3[8] = { + // clang-format off +/* INC DEC CALL CALL far*/ + &vector_alu1_op, &vector_alu1_op, &store_op, &vector_call_far_op, +/* JMP JMP far PUSH*/ + &branch_op, &vector_jmp_far_op, &vector_push_mem_op, INVALID + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_d8[8] = { + // clang-format off +/* FADDs FMULs FCOMs FCOMPs*/ + &load_float_op, &load_float_op, &load_float_op, &load_float_op, +/* FSUBs FSUBRs FDIVs FDIVRs*/ + &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_d8_mod3[8] = { + // clang-format off +/* FADD FMUL FCOM FCOMP*/ + &float_op, &float_op, &float_op, &float_op, +/* FSUB FSUBR FDIV FDIVR*/ + &float_op, &float_op, &fdiv_op, &fdiv_op, + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_d9[8] = { + // clang-format off +/* FLDs FSTs FSTPs*/ + &load_float_op, INVALID, &fstore_op, &fstore_op, +/* FLDENV FLDCW FSTENV FSTCW*/ + &vector_float_l_op, &vector_fldcw_op, &vector_float_l_op, &vector_float_op + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_d9_mod3[64] = { + // clang-format off + /*FLD*/ + &float_op, &float_op, &float_op, &float_op, + &float_op, &float_op, &float_op, &float_op, + /*FXCH*/ + &float_op, &float_op, &float_op, &float_op, + &float_op, &float_op, &float_op, &float_op, + /*FNOP*/ + &float_op, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + /*FSTP*/ + &float_op, &float_op, &float_op, &float_op, + &float_op, &float_op, &float_op, &float_op, +/* opFCHS opFABS*/ + &float_op, &float_op, INVALID, INVALID, +/* opFTST opFXAM*/ + &float_op, &float_op, INVALID, INVALID, +/* opFLD1 opFLDL2T opFLDL2E opFLDPI*/ + &float_op, &float_op, &float_op, &float_op, +/* opFLDEG2 opFLDLN2 opFLDZ*/ + &float_op, &float_op, &float_op, INVALID, +/* opF2XM1 opFYL2X opFPTAN opFPATAN*/ + &fsin_op, &fsin_op, &fsin_op, &fsin_op, +/* opFDECSTP opFINCSTP,*/ + INVALID, INVALID, &float_op, &float_op, +/* opFPREM opFSQRT opFSINCOS*/ + &fdiv_op, INVALID, &fsqrt_op, &fsin_op, +/* opFRNDINT opFSCALE opFSIN opFCOS*/ + &float_op, &fdiv_op, &fsin_op, &fsin_op + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_da[8] = { + // clang-format off +/* FIADDl FIMULl FICOMl FICOMPl*/ + &load_float_op, &load_float_op, &load_float_op, &load_float_op, +/* FISUBl FISUBRl FIDIVl FIDIVRl*/ + &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_da_mod3[8] = { + // clang-format off + INVALID, INVALID, INVALID, INVALID, +/* FCOMPP*/ + INVALID, &float_op, INVALID, INVALID + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_db[8] = { + // clang-format off +/* FLDil FSTil FSTPil*/ + &load_float_op, INVALID, &fstore_op, &fstore_op, +/* FLDe FSTPe*/ + INVALID, &vector_flde_op, INVALID, &vector_fste_op + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_db_mod3[64] = { + // clang-format off + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + +/* opFNOP opFCLEX opFINIT*/ + INVALID, &float_op, &float_op, &float_op, +/* opFNOP opFNOP*/ + &float_op, &float_op, INVALID, INVALID, + + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + + INVALID, INVALID, INVALID, INVALID, + INVALID, INVALID, INVALID, INVALID, + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_dc[8] = { + // clang-format off +/* FADDd FMULd FCOMd FCOMPd*/ + &load_float_op, &load_float_op, &load_float_op, &load_float_op, +/* FSUBd FSUBRd FDIVd FDIVRd*/ + &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_dc_mod3[8] = { + // clang-format off +/* opFADDr opFMULr*/ + &float_op, &float_op, INVALID, INVALID, +/* opFSUBRr opFSUBr opFDIVRr opFDIVr*/ + &float_op, &float_op, &fdiv_op, &fdiv_op + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_dd[8] = { + // clang-format off +/* FLDd FSTd FSTPd*/ + &load_float_op, INVALID, &fstore_op, &fstore_op, +/* FRSTOR FSAVE FSTSW*/ + &vector_float_l_op, INVALID, &vector_float_l_op, &vector_float_l_op + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_dd_mod3[8] = { + // clang-format off +/* FFFREE FST FSTP*/ + &float_op, INVALID, &float_op, &float_op, +/* FUCOM FUCOMP*/ + &float_op, &float_op, INVALID, INVALID + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_de[8] = { + // clang-format off +/* FIADDw FIMULw FICOMw FICOMPw*/ + &load_float_op, &load_float_op, &load_float_op, &load_float_op, +/* FISUBw FISUBRw FIDIVw FIDIVRw*/ + &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_de_mod3[8] = { + // clang-format off +/* FADDP FMULP FCOMPP*/ + &float_op, &float_op, INVALID, &float_op, +/* FSUBP FSUBRP FDIVP FDIVRP*/ + &float_op, &float_op, &fdiv_op, &fdiv_op, + // clang-format on +}; + +static const risc86_instruction_t *opcode_timings_k5_df[8] = { + // clang-format off +/* FILDiw FISTiw FISTPiw*/ + &load_float_op, INVALID, &fstore_op, &fstore_op, +/* FILDiq FBSTP FISTPiq*/ + INVALID, &load_float_op, &vector_float_l_op, &fstore_op, + // clang-format on +}; +static const risc86_instruction_t *opcode_timings_k5_df_mod3[8] = { + // clang-format off + INVALID, INVALID, INVALID, INVALID, +/* FSTSW AX*/ + &float_op, INVALID, INVALID, INVALID + // clang-format on +}; + +static uint8_t last_prefix; +static int prefixes; + +static int decode_timestamp; +static int last_complete_timestamp; + +typedef struct k5_unit_t { + uint32_t uop_mask; + int first_available_cycle; +} k5_unit_t; + +static int nr_units; +static k5_unit_t *units; + +/*k5 has dedicated MMX unit*/ +static k5_unit_t k5_units[] = { + { .uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX) }, /*Integer X*/ + { .uop_mask = (1 << UOP_ALU) }, /*Integer Y*/ + { .uop_mask = (1 << UOP_MEU) | (1 << UOP_MEU_SHIFT) | (1 << UOP_MEU_MUL) }, /*Multimedia*/ + { .uop_mask = (1 << UOP_FLOAT) }, /*Floating point*/ + { .uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD) }, /*Load*/ + { .uop_mask = (1 << UOP_STORE) | (1 << UOP_FSTORE) | (1 << UOP_MSTORE) }, /*Store*/ + { .uop_mask = (1 << UOP_BRANCH) } /*Branch*/ +}; +#define NR_k5_UNITS (sizeof(k5_units) / sizeof(k5_unit_t)) + +/*k5-2 and later integrate MMX into ALU X & Y, sharing multiplier, shifter and + 3DNow ALU between two execution units*/ +static k5_unit_t k5_2_units[] = { + { .uop_mask = (1 << UOP_ALU) | (1 << UOP_ALUX) | (1 << UOP_MEU) | /*Integer X*/ + (1 << UOP_MEU_SHIFT) | (1 << UOP_MEU_MUL) | (1 << UOP_MEU_3DN) }, + { .uop_mask = (1 << UOP_ALU) | (1 << UOP_MEU) | /*Integer Y*/ + (1 << UOP_MEU_SHIFT) | (1 << UOP_MEU_MUL) | (1 << UOP_MEU_3DN) }, + { .uop_mask = (1 << UOP_FLOAT) }, /*Floating point*/ + { .uop_mask = (1 << UOP_LOAD) | (1 << UOP_FLOAD) | (1 << UOP_MLOAD) }, /*Load*/ + { .uop_mask = (1 << UOP_STORE) | (1 << UOP_FSTORE) | (1 << UOP_MSTORE) }, /*Store*/ + { .uop_mask = (1 << UOP_BRANCH) } /*Branch*/ +}; +#define NR_k5_2_UNITS (sizeof(k5_2_units) / sizeof(k5_unit_t)) + +/*First available cycles of shared execution units. Each of these can be submitted + to by ALU X and Y*/ +static int mul_first_available_cycle; +static int shift_first_available_cycle; +static int m3dnow_first_available_cycle; + +static int +uop_run(const risc86_uop_t *uop, int decode_time) +{ + k5_unit_t *best_unit = NULL; + int best_start_cycle = 99999; + + /*UOP_LIMM does not require execution*/ + if (uop->type == UOP_LIMM) + return decode_time; + + /*Handle shared units on k5-2 and later*/ + if (units == k5_2_units) { + if (uop->type == UOP_MEU_MUL && decode_time < mul_first_available_cycle) + decode_time = mul_first_available_cycle; + else if (uop->type == UOP_MEU_SHIFT && decode_time < mul_first_available_cycle) + decode_time = shift_first_available_cycle; + else if (uop->type == UOP_MEU_3DN && decode_time < mul_first_available_cycle) + decode_time = m3dnow_first_available_cycle; + } + + /*Find execution unit for this uOP*/ + for (int c = 0; c < nr_units; c++) { + if (units[c].uop_mask & (1 << uop->type)) { + if (units[c].first_available_cycle < best_start_cycle) { + best_unit = &units[c]; + best_start_cycle = units[c].first_available_cycle; + } + } + } + if (!best_unit) + fatal("uop_run: can not find execution unit\n"); + + if (best_start_cycle < decode_time) + best_start_cycle = decode_time; + best_unit->first_available_cycle = best_start_cycle + uop->throughput; + + if (units == k5_2_units) { + if (uop->type == UOP_MEU_MUL) + mul_first_available_cycle = best_start_cycle + uop->throughput; + else if (uop->type == UOP_MEU_SHIFT) + shift_first_available_cycle = best_start_cycle + uop->throughput; + else if (uop->type == UOP_MEU_3DN) + m3dnow_first_available_cycle = best_start_cycle + uop->throughput; + } + + return best_start_cycle + uop->throughput; +} + +/*The k5 decoder can decode, per clock : + - 1 or 2 'short' instructions, each up to 2 uOPs and 7 bytes long + - 1 'long' instruction, up to 4 uOPs + - 1 'vector' instruction, up to 4 uOPs per cycle, plus (I think) 1 cycle startup delay) +*/ +static struct { + int nr_uops; + const risc86_uop_t *uops[4]; + /*Earliest time a uop can start. If the timestamp is -1, then the uop is + part of a dependency chain and the start time is the completion time of + the previous uop*/ + int earliest_start[4]; +} decode_buffer; + +#define NR_OPQUADS 6 +/*Timestamps of when the last six opquads completed. The k5 scheduler retires + opquads in order, so this is needed to determine when the next can be scheduled*/ +static int opquad_completion_timestamp[NR_OPQUADS]; +static int next_opquad = 0; + +#define NR_REGS 8 +/*Timestamp of when last operation on an integer register completed*/ +static int reg_available_timestamp[NR_REGS]; +/*Timestamp of when last operation on an FPU register completed*/ +static int fpu_st_timestamp[8]; +/*Completion time of the last uop to be processed. Used to calculate timing of + dependent uop chains*/ +static int last_uop_timestamp = 0; + +void +decode_flush_k5(void) +{ + int uop_timestamp = 0; + + /*Decoded opquad can not be submitted if there are no free spaces in the + opquad buffer*/ + if (decode_timestamp < opquad_completion_timestamp[next_opquad]) + decode_timestamp = opquad_completion_timestamp[next_opquad]; + + /*Ensure that uops can not be submitted before they have been decoded*/ + if (decode_timestamp > last_uop_timestamp) + last_uop_timestamp = decode_timestamp; + + /*Submit uops to execution units, and determine the latest completion time*/ + for (int c = 0; c < decode_buffer.nr_uops; c++) { + int start_timestamp; + + if (decode_buffer.earliest_start[c] == -1) + start_timestamp = last_uop_timestamp; + else + start_timestamp = decode_buffer.earliest_start[c]; + + last_uop_timestamp = uop_run(decode_buffer.uops[c], start_timestamp); + if (last_uop_timestamp > uop_timestamp) + uop_timestamp = last_uop_timestamp; + } + + /*Calculate opquad completion time. Since opquads complete in order, it + must be after the last completion.*/ + if (uop_timestamp <= last_complete_timestamp) + last_complete_timestamp = last_complete_timestamp + 1; + else + last_complete_timestamp = uop_timestamp; + + /*Advance to next opquad in buffer*/ + opquad_completion_timestamp[next_opquad] = last_complete_timestamp; + next_opquad++; + if (next_opquad == NR_OPQUADS) + next_opquad = 0; + + decode_timestamp++; + decode_buffer.nr_uops = 0; +} + +/*The instruction is only of interest here if it's longer than 7 bytes, as that's the + limit on k5 short decoding*/ +static int +codegen_timing_instr_length(uint64_t deps, uint32_t fetchdat, int op_32) +{ + int len = prefixes + 1; /*Opcode*/ + if (deps & MODRM) { + len++; /*ModR/M*/ + if (deps & HAS_IMM8) + len++; + if (deps & HAS_IMM1632) + len += (op_32 & 0x100) ? 4 : 2; + + if (op_32 & 0x200) { + if ((fetchdat & 7) == 4 && (fetchdat & 0xc0) != 0xc0) { + /* Has SIB*/ + len++; + if ((fetchdat & 0xc0) == 0x40) + len++; + else if ((fetchdat & 0xc0) == 0x80) + len += 4; + else if ((fetchdat & 0x700) == 0x500) + len += 4; + } else { + if ((fetchdat & 0xc0) == 0x40) + len++; + else if ((fetchdat & 0xc0) == 0x80) + len += 4; + else if ((fetchdat & 0xc7) == 0x05) + len += 4; + } + } else { + if ((fetchdat & 0xc0) == 0x40) + len++; + else if ((fetchdat & 0xc0) == 0x80) + len += 2; + else if ((fetchdat & 0xc7) == 0x06) + len += 2; + } + } + + return len; +} + +static void +decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetchdat, int op_32, int bit8) +{ + uint32_t regmask_required; + uint32_t regmask_modified; + int c; + int d; + int earliest_start = 0; + decode_type_t decode_type = ins->decode_type; + int instr_length = codegen_timing_instr_length(deps, fetchdat, op_32); + + /*Generate input register mask, and determine the earliest time this + instruction can start. This is not accurate, as this is calculated per + x86 instruction when it should be handled per uop*/ + regmask_required = get_dstdep_mask(deps, fetchdat, bit8); + regmask_required |= get_addr_regmask(deps, fetchdat, op_32); + for (c = 0; c < 8; c++) { + if (regmask_required & (1 << c)) { + if (reg_available_timestamp[c] > decode_timestamp) + earliest_start = reg_available_timestamp[c]; + } + } + if ((deps & FPU_RW_ST0) && fpu_st_timestamp[0] > decode_timestamp) + earliest_start = fpu_st_timestamp[0]; + if ((deps & FPU_RW_ST1) && fpu_st_timestamp[1] > decode_timestamp) + earliest_start = fpu_st_timestamp[1]; + if (deps & FPU_RW_STREG) { + int reg = fetchdat & 7; + + if (fpu_st_timestamp[reg] > decode_timestamp) + earliest_start = fpu_st_timestamp[reg]; + } + + /*Short decoders are limited to 7 bytes*/ + if (decode_type == DECODE_SHORT && instr_length > 7) + decode_type = DECODE_LONG; + /*Long decoder is limited to 11 bytes*/ + else if (instr_length > 11) + decode_type = DECODE_VECTOR; + + switch (decode_type) { + case DECODE_SHORT: + if (decode_buffer.nr_uops) { + decode_buffer.uops[decode_buffer.nr_uops] = &ins->uop[0]; + decode_buffer.earliest_start[decode_buffer.nr_uops] = earliest_start; + if (ins->nr_uops > 1) { + decode_buffer.uops[decode_buffer.nr_uops + 1] = &ins->uop[1]; + decode_buffer.earliest_start[decode_buffer.nr_uops + 1] = -1; + } + decode_buffer.nr_uops += ins->nr_uops; + + decode_flush_k5(); + } else { + decode_buffer.nr_uops = ins->nr_uops; + decode_buffer.uops[0] = &ins->uop[0]; + decode_buffer.earliest_start[0] = earliest_start; + if (ins->nr_uops > 1) { + decode_buffer.uops[1] = &ins->uop[1]; + decode_buffer.earliest_start[1] = -1; + } + } + break; + + case DECODE_LONG: + if (decode_buffer.nr_uops) + decode_flush_k5(); + + decode_buffer.nr_uops = ins->nr_uops; + for (c = 0; c < ins->nr_uops; c++) { + decode_buffer.uops[c] = &ins->uop[c]; + if (c == 0) + decode_buffer.earliest_start[c] = earliest_start; + else + decode_buffer.earliest_start[c] = -1; + } + decode_flush_k5(); + break; + + case DECODE_VECTOR: + if (decode_buffer.nr_uops) + decode_flush_k5(); + + decode_timestamp++; + d = 0; + + for (c = 0; c < ins->nr_uops; c++) { + decode_buffer.uops[d] = &ins->uop[c]; + if (c == 0) + decode_buffer.earliest_start[d] = earliest_start; + else + decode_buffer.earliest_start[d] = -1; + d++; + + if (d == 4) { + d = 0; + decode_buffer.nr_uops = 4; + decode_flush_k5(); + } + } + if (d) { + decode_buffer.nr_uops = d; + decode_flush_k5(); + } + break; + } + + /*Update write timestamps for any output registers*/ + regmask_modified = get_dstdep_mask(deps, fetchdat, bit8); + for (c = 0; c < 8; c++) { + if (regmask_modified & (1 << c)) + reg_available_timestamp[c] = last_complete_timestamp; + } + if (deps & FPU_POP) { + for (c = 0; c < 7; c++) + fpu_st_timestamp[c] = fpu_st_timestamp[c + 1]; + fpu_st_timestamp[7] = 0; + } + if (deps & FPU_POP2) { + for (c = 0; c < 6; c++) + fpu_st_timestamp[c] = fpu_st_timestamp[c + 2]; + fpu_st_timestamp[6] = fpu_st_timestamp[7] = 0; + } + if (deps & FPU_PUSH) { + for (c = 0; c < 7; c++) + fpu_st_timestamp[c + 1] = fpu_st_timestamp[c]; + fpu_st_timestamp[0] = 0; + } + if (deps & FPU_WRITE_ST0) + fpu_st_timestamp[0] = last_complete_timestamp; + if (deps & FPU_WRITE_ST1) + fpu_st_timestamp[1] = last_complete_timestamp; + if (deps & FPU_WRITE_STREG) { + int reg = fetchdat & 7; + if (deps & FPU_POP) + reg--; + if (reg >= 0 && !(reg == 0 && (deps & FPU_WRITE_ST0)) && !(reg == 1 && (deps & FPU_WRITE_ST1))) + fpu_st_timestamp[reg] = last_complete_timestamp; + } +} + +void +codegen_timing_k5_block_start(void) +{ + int c; + + for (c = 0; c < nr_units; c++) + units[c].first_available_cycle = 0; + + mul_first_available_cycle = 0; + shift_first_available_cycle = 0; + m3dnow_first_available_cycle = 0; + + decode_timestamp = 0; + last_complete_timestamp = 0; + + for (c = 0; c < NR_OPQUADS; c++) + opquad_completion_timestamp[c] = 0; + next_opquad = 0; + + for (c = 0; c < NR_REGS; c++) + reg_available_timestamp[c] = 0; + for (c = 0; c < 8; c++) + fpu_st_timestamp[c] = 0; +} + +void +codegen_timing_k5_start(void) +{ + if (cpu_s->cpu_type == CPU_K5) { + units = k5_units; + nr_units = NR_k5_UNITS; + } else { + units = k5_2_units; + nr_units = NR_k5_2_UNITS; + } + last_prefix = 0; + prefixes = 0; +} + +void +codegen_timing_k5_prefix(uint8_t prefix, uint32_t fetchdat) +{ + if (prefix != 0x0f) + decode_timestamp++; + + last_prefix = prefix; + prefixes++; +} + +void +codegen_timing_k5_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t op_pc) +{ + const risc86_instruction_t **ins_table; + const uint64_t *deps; + int mod3 = ((fetchdat & 0xc0) == 0xc0); + int old_last_complete_timestamp = last_complete_timestamp; + int bit8 = !(opcode & 1); + + switch (last_prefix) { + case 0x0f: + if (opcode == 0x0f) { + /*3DNow has the actual opcode after ModR/M, SIB and any offset*/ + uint32_t opcode_pc = op_pc + 1; /*Byte after ModR/M*/ + uint8_t modrm = fetchdat & 0xff; + uint8_t sib = (fetchdat >> 8) & 0xff; + + if ((modrm & 0xc0) != 0xc0) { + if (op_32 & 0x200) { + if ((modrm & 7) == 4) { + /* Has SIB*/ + opcode_pc++; + if ((modrm & 0xc0) == 0x40) + opcode_pc++; + else if ((modrm & 0xc0) == 0x80) + opcode_pc += 4; + else if ((sib & 0x07) == 0x05) + opcode_pc += 4; + } else { + if ((modrm & 0xc0) == 0x40) + opcode_pc++; + else if ((modrm & 0xc0) == 0x80) + opcode_pc += 4; + else if ((modrm & 0xc7) == 0x05) + opcode_pc += 4; + } + } else { + if ((modrm & 0xc0) == 0x40) + opcode_pc++; + else if ((modrm & 0xc0) == 0x80) + opcode_pc += 2; + else if ((modrm & 0xc7) == 0x06) + opcode_pc += 2; + } + } + + opcode = fastreadb(cs + opcode_pc); + + ins_table = mod3 ? opcode_timings_k5_0f0f_mod3 : opcode_timings_k5_0f0f; + deps = mod3 ? opcode_deps_0f0f_mod3 : opcode_deps_0f0f; + } else { + ins_table = mod3 ? opcode_timings_k5_0f_mod3 : opcode_timings_k5_0f; + deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; + } + break; + + case 0xd8: + ins_table = mod3 ? opcode_timings_k5_d8_mod3 : opcode_timings_k5_d8; + deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8; + opcode = (opcode >> 3) & 7; + break; + case 0xd9: + ins_table = mod3 ? opcode_timings_k5_d9_mod3 : opcode_timings_k5_d9; + deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9; + opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; + break; + case 0xda: + ins_table = mod3 ? opcode_timings_k5_da_mod3 : opcode_timings_k5_da; + deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da; + opcode = (opcode >> 3) & 7; + break; + case 0xdb: + ins_table = mod3 ? opcode_timings_k5_db_mod3 : opcode_timings_k5_db; + deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db; + opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; + break; + case 0xdc: + ins_table = mod3 ? opcode_timings_k5_dc_mod3 : opcode_timings_k5_dc; + deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc; + opcode = (opcode >> 3) & 7; + break; + case 0xdd: + ins_table = mod3 ? opcode_timings_k5_dd_mod3 : opcode_timings_k5_dd; + deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd; + opcode = (opcode >> 3) & 7; + break; + case 0xde: + ins_table = mod3 ? opcode_timings_k5_de_mod3 : opcode_timings_k5_de; + deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de; + opcode = (opcode >> 3) & 7; + break; + case 0xdf: + ins_table = mod3 ? opcode_timings_k5_df_mod3 : opcode_timings_k5_df; + deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df; + opcode = (opcode >> 3) & 7; + break; + + default: + switch (opcode) { + case 0x80: + case 0x82: + ins_table = mod3 ? opcode_timings_k5_80_mod3 : opcode_timings_k5_80; + deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; + opcode = (fetchdat >> 3) & 7; + break; + case 0x81: + case 0x83: + ins_table = mod3 ? opcode_timings_k5_8x_mod3 : opcode_timings_k5_8x; + deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; + opcode = (fetchdat >> 3) & 7; + break; + + case 0xc0: + case 0xd0: + case 0xd2: + ins_table = mod3 ? opcode_timings_k5_shift_b_mod3 : opcode_timings_k5_shift_b; + deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; + opcode = (fetchdat >> 3) & 7; + break; + + case 0xc1: + case 0xd1: + case 0xd3: + ins_table = mod3 ? opcode_timings_k5_shift_mod3 : opcode_timings_k5_shift; + deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; + opcode = (fetchdat >> 3) & 7; + break; + + case 0xf6: + ins_table = mod3 ? opcode_timings_k5_f6_mod3 : opcode_timings_k5_f6; + deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6; + opcode = (fetchdat >> 3) & 7; + break; + case 0xf7: + ins_table = mod3 ? opcode_timings_k5_f7_mod3 : opcode_timings_k5_f7; + deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7; + opcode = (fetchdat >> 3) & 7; + break; + case 0xff: + ins_table = mod3 ? opcode_timings_k5_ff_mod3 : opcode_timings_k5_ff; + deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff; + opcode = (fetchdat >> 3) & 7; + break; + + default: + ins_table = mod3 ? opcode_timings_k5_mod3 : opcode_timings_k5; + deps = mod3 ? opcode_deps_mod3 : opcode_deps; + break; + } + } + + if (ins_table[opcode]) + decode_instruction(ins_table[opcode], deps[opcode], fetchdat, op_32, bit8); + else + decode_instruction(&vector_alu1_op, 0, fetchdat, op_32, bit8); + codegen_block_cycles += (last_complete_timestamp - old_last_complete_timestamp); +} + +void +codegen_timing_k5_block_end(void) +{ + if (decode_buffer.nr_uops) { + int old_last_complete_timestamp = last_complete_timestamp; + decode_flush_k5(); + codegen_block_cycles += (last_complete_timestamp - old_last_complete_timestamp); + } +} + +int +codegen_timing_k5_jump_cycles(void) +{ + if (decode_buffer.nr_uops) + return 1; + return 0; +} + +codegen_timing_t codegen_timing_k5 = { + codegen_timing_k5_start, + codegen_timing_k5_prefix, + codegen_timing_k5_opcode, + codegen_timing_k5_block_start, + codegen_timing_k5_block_end, + codegen_timing_k5_jump_cycles +}; From 2f1b64d43b2752ccb2dd829bc89a9b8bef22de1e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 10 Aug 2024 20:00:48 -0400 Subject: [PATCH 312/624] Remove excess http:// from links --- src/cpu/codegen_timing_k5.c | 2 +- src/cpu/codegen_timing_k6.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpu/codegen_timing_k5.c b/src/cpu/codegen_timing_k5.c index bdcc0ce43..42b1129fe 100644 --- a/src/cpu/codegen_timing_k5.c +++ b/src/cpu/codegen_timing_k5.c @@ -1,5 +1,5 @@ /*Most of the vector instructions here are a total guess. - Some of the timings are based on http://http://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000562_k5_InstLatX86.txt*/ + Some of the timings are based on https://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000502_k5_InstLatX86.txt*/ #include #include #include diff --git a/src/cpu/codegen_timing_k6.c b/src/cpu/codegen_timing_k6.c index 6a2871884..21263a25e 100644 --- a/src/cpu/codegen_timing_k6.c +++ b/src/cpu/codegen_timing_k6.c @@ -1,5 +1,5 @@ /*Most of the vector instructions here are a total guess. - Some of the timings are based on http://http://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000562_K6_InstLatX86.txt*/ + Some of the timings are based on https://web.archive.org/web/20181122095446/http://users.atw.hu/instlatx64/AuthenticAMD0000562_K6_InstLatX86.txt*/ #include #include #include From 1f2bd5626b8d4db6c4465d353cff814ffe5a7487 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 10 Aug 2024 20:25:44 -0400 Subject: [PATCH 313/624] Dont compile codegen_timing_686.c without dynarec --- src/cpu/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cpu/CMakeLists.txt b/src/cpu/CMakeLists.txt index b12356ccc..8ae97e2e6 100644 --- a/src/cpu/CMakeLists.txt +++ b/src/cpu/CMakeLists.txt @@ -30,9 +30,11 @@ endif() if(CYRIX_6X86) target_compile_definitions(cpu PRIVATE USE_CYRIX_6X86) +if(DYNAREC) add_library(ct686 OBJECT codegen_timing_686.c) target_link_libraries(86Box ct686) endif() +endif() if(DYNAREC) target_sources(cpu PRIVATE 386_dynarec_ops.c) From 244545f33720c38dbcfbf20fc1959835d57d2ff4 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 11 Aug 2024 20:43:56 -0400 Subject: [PATCH 314/624] Rename K6's decode_flush --- src/cpu/codegen_timing_k6.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cpu/codegen_timing_k6.c b/src/cpu/codegen_timing_k6.c index 21263a25e..e4c5d9493 100644 --- a/src/cpu/codegen_timing_k6.c +++ b/src/cpu/codegen_timing_k6.c @@ -1769,7 +1769,7 @@ static int fpu_st_timestamp[8]; static int last_uop_timestamp = 0; void -decode_flush(void) +decode_flush_k6(void) { int uop_timestamp = 0; @@ -1908,7 +1908,7 @@ decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetc } decode_buffer.nr_uops += ins->nr_uops; - decode_flush(); + decode_flush_k6(); } else { decode_buffer.nr_uops = ins->nr_uops; decode_buffer.uops[0] = &ins->uop[0]; @@ -1922,7 +1922,7 @@ decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetc case DECODE_LONG: if (decode_buffer.nr_uops) - decode_flush(); + decode_flush_k6(); decode_buffer.nr_uops = ins->nr_uops; for (c = 0; c < ins->nr_uops; c++) { @@ -1932,12 +1932,12 @@ decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetc else decode_buffer.earliest_start[c] = -1; } - decode_flush(); + decode_flush_k6(); break; case DECODE_VECTOR: if (decode_buffer.nr_uops) - decode_flush(); + decode_flush_k6(); decode_timestamp++; d = 0; @@ -1953,12 +1953,12 @@ decode_instruction(const risc86_instruction_t *ins, uint64_t deps, uint32_t fetc if (d == 4) { d = 0; decode_buffer.nr_uops = 4; - decode_flush(); + decode_flush_k6(); } } if (d) { decode_buffer.nr_uops = d; - decode_flush(); + decode_flush_k6(); } break; } @@ -2209,7 +2209,7 @@ codegen_timing_k6_block_end(void) { if (decode_buffer.nr_uops) { int old_last_complete_timestamp = last_complete_timestamp; - decode_flush(); + decode_flush_k6(); codegen_block_cycles += (last_complete_timestamp - old_last_complete_timestamp); } } From f38b6c00c672607ab51065fb6dfa70b2dba3894e Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 12 Aug 2024 19:23:06 -0400 Subject: [PATCH 315/624] Several C files were referenced multiple times. --- src/chipset/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chipset/CMakeLists.txt b/src/chipset/CMakeLists.txt index 3f7f6e43d..36e840dc7 100644 --- a/src/chipset/CMakeLists.txt +++ b/src/chipset/CMakeLists.txt @@ -21,7 +21,7 @@ add_library(chipset OBJECT 82c100.c acc2168.c cs8230.c ali1429.c ali1435.c ali14 sis_85c496.c sis_85c50x.c sis_5511.c sis_5571.c sis_5581.c sis_5591.c sis_5600.c sis_5511_h2p.c sis_5571_h2p.c sis_5581_h2p.c sis_5591_h2p.c sis_5600_h2p.c sis_5513_p2i.c sis_5513_ide.c sis_5572_usb.c sis_5595_pmu.c sis_55xx.c via_vt82c49x.c - via_vt82c505.c sis_85c310.c sis_85c4xx.c sis_85c496.c sis_85c50x.c gc100.c stpc.c + via_vt82c505.c gc100.c stpc.c umc_8886.c umc_hb4.c umc_8890.c via_apollo.c via_pipc.c vl82c480.c wd76c10.c) if(OLIVETTI) From ad3eaf17a91ab8d8b36d803242bbd523117f4cc7 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 12 Aug 2024 20:01:54 -0400 Subject: [PATCH 316/624] More unique names --- src/cpu/codegen_timing_486.c | 98 +++++++++++++-------------- src/cpu/codegen_timing_686.c | 108 +++++++++++++++--------------- src/cpu/codegen_timing_k6.c | 108 +++++++++++++++--------------- src/cpu/codegen_timing_p6.c | 102 ++++++++++++++-------------- src/cpu/codegen_timing_pentium.c | 98 +++++++++++++-------------- src/cpu/codegen_timing_winchip.c | 98 +++++++++++++-------------- src/cpu/codegen_timing_winchip2.c | 96 +++++++++++++------------- 7 files changed, 354 insertions(+), 354 deletions(-) diff --git a/src/cpu/codegen_timing_486.c b/src/cpu/codegen_timing_486.c index 548a9ec28..90d682211 100644 --- a/src/cpu/codegen_timing_486.c +++ b/src/cpu/codegen_timing_486.c @@ -18,7 +18,7 @@ #define CYCLES(c) (int *) c #define CYCLES2(c16, c32) (int *) ((-1 & ~0xffff) | c16 | (c32 << 8)) -static int *opcode_timings[256] = { +static int *opcode_timings_486[256] = { // clang-format off /*00*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), NULL, /*10*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), @@ -42,7 +42,7 @@ static int *opcode_timings[256] = { // clang-format on }; -static int *opcode_timings_mod3[256] = { +static int *opcode_timings_486_mod3[256] = { // clang-format off /*00*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), NULL, /*10*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), @@ -66,7 +66,7 @@ static int *opcode_timings_mod3[256] = { // clang-format on }; -static int *opcode_timings_0f[256] = { +static int *opcode_timings_486_0f[256] = { // clang-format off /*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL, /*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -89,7 +89,7 @@ static int *opcode_timings_0f[256] = { /*f0*/ NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, NULL, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, // clang-format on }; -static int *opcode_timings_0f_mod3[256] = { +static int *opcode_timings_486_0f_mod3[256] = { // clang-format off /*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL, /*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -113,65 +113,65 @@ static int *opcode_timings_0f_mod3[256] = { // clang-format on }; -static int *opcode_timings_shift[8] = { +static int *opcode_timings_486_shift[8] = { // clang-format off CYCLES(7), CYCLES(7), CYCLES(10), CYCLES(10), CYCLES(7), CYCLES(7), CYCLES(7), CYCLES(7) }; -static int *opcode_timings_shift_mod3[8] = { +static int *opcode_timings_486_shift_mod3[8] = { // clang-format off CYCLES(3), CYCLES(3), CYCLES(9), CYCLES(9), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3) // clang-format on }; -static int *opcode_timings_f6[8] = { +static int *opcode_timings_486_f6[8] = { // clang-format off &timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19) // clang-format on }; -static int *opcode_timings_f6_mod3[8] = { +static int *opcode_timings_486_f6_mod3[8] = { // clang-format off &timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19) // clang-format on }; -static int *opcode_timings_f7[8] = { +static int *opcode_timings_486_f7[8] = { // clang-format off &timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43) // clang-format on }; -static int *opcode_timings_f7_mod3[8] = { +static int *opcode_timings_486_f7_mod3[8] = { // clang-format off &timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43) }; -static int *opcode_timings_ff[8] = { +static int *opcode_timings_486_ff[8] = { // clang-format off &timing_mm, &timing_mm, CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), NULL }; -static int *opcode_timings_ff_mod3[8] = { +static int *opcode_timings_486_ff_mod3[8] = { // clang-format off &timing_rr, &timing_rr, CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), NULL // clang-format on }; -static int *opcode_timings_d8[8] = { +static int *opcode_timings_486_d8[8] = { // clang-format off /* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/ CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73) // clang-format on }; -static int *opcode_timings_d8_mod3[8] = { +static int *opcode_timings_486_d8_mod3[8] = { // clang-format off /* FADD FMUL FCOM FCOMP FSUB FSUBR FDIV FDIVR*/ CYCLES(8), CYCLES(16), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73) // clang-format on }; -static int *opcode_timings_d9[8] = { +static int *opcode_timings_486_d9[8] = { // clang-format off /* FLDs FSTs FSTPs FLDENV FLDCW FSTENV FSTCW*/ CYCLES(3), NULL, CYCLES(7), CYCLES(7), CYCLES(34), CYCLES(4), CYCLES(67), CYCLES(3) // clang-format on }; -static int *opcode_timings_d9_mod3[64] = { +static int *opcode_timings_486_d9_mod3[64] = { // clang-format off /*FLD*/ CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), CYCLES(4), @@ -192,25 +192,25 @@ static int *opcode_timings_d9_mod3[64] = { // clang-format on }; -static int *opcode_timings_da[8] = { +static int *opcode_timings_486_da[8] = { // clang-format off /* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/ CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73) // clang-format on }; -static int *opcode_timings_da_mod3[8] = { +static int *opcode_timings_486_da_mod3[8] = { // clang-format off NULL, NULL, NULL, NULL, NULL, CYCLES(5), NULL, NULL // clang-format on }; -static int *opcode_timings_db[8] = { +static int *opcode_timings_486_db[8] = { // clang-format off /* FLDil FSTil FSTPil FLDe FSTPe*/ CYCLES(9), NULL, CYCLES(28), CYCLES(28), NULL, CYCLES(5), NULL, CYCLES(6) // clang-format on }; -static int *opcode_timings_db_mod3[64] = { +static int *opcode_timings_486_db_mod3[64] = { // clang-format off NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -224,74 +224,74 @@ static int *opcode_timings_db_mod3[64] = { // clang-format on }; -static int *opcode_timings_dc[8] = { +static int *opcode_timings_486_dc[8] = { // clang-format off /* opFADDd_a16 opFMULd_a16 opFCOMd_a16 opFCOMPd_a16 opFSUBd_a16 opFSUBRd_a16 opFDIVd_a16 opFDIVRd_a16*/ CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73) // clang-format on }; -static int *opcode_timings_dc_mod3[8] = { +static int *opcode_timings_486_dc_mod3[8] = { // clang-format off /* opFADDr opFMULr opFSUBRr opFSUBr opFDIVRr opFDIVr*/ CYCLES(8), CYCLES(16), NULL, NULL, CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73) // clang-format on }; -static int *opcode_timings_dd[8] = { +static int *opcode_timings_486_dd[8] = { // clang-format off /* FLDd FSTd FSTPd FRSTOR FSAVE FSTSW*/ CYCLES(3), NULL, CYCLES(8), CYCLES(8), CYCLES(131), NULL, CYCLES(154), CYCLES(3) // clang-format on }; -static int *opcode_timings_dd_mod3[8] = { +static int *opcode_timings_486_dd_mod3[8] = { // clang-format off /* FFFREE FST FSTP FUCOM FUCOMP*/ CYCLES(3), NULL, CYCLES(3), CYCLES(3), CYCLES(4), CYCLES(4), NULL, NULL // clang-format on }; -static int *opcode_timings_de[8] = { +static int *opcode_timings_486_de[8] = { // clang-format off /* FADDiw FMULiw FCOMiw FCOMPiw FSUBil FSUBRil FDIVil FDIVRil*/ CYCLES(8), CYCLES(11), CYCLES(4), CYCLES(4), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73) // clang-format on }; -static int *opcode_timings_de_mod3[8] = { +static int *opcode_timings_486_de_mod3[8] = { // clang-format off /* FADD FMUL FCOMPP FSUB FSUBR FDIV FDIVR*/ CYCLES(8), CYCLES(16), NULL, CYCLES(5), CYCLES(8), CYCLES(8), CYCLES(73), CYCLES(73) // clang-format on }; -static int *opcode_timings_df[8] = { +static int *opcode_timings_486_df[8] = { // clang-format off /* FILDiw FISTiw FISTPiw FILDiq FBSTP FISTPiq*/ CYCLES(13), NULL, CYCLES(29), CYCLES(29), NULL, CYCLES(10), CYCLES(172), CYCLES(28) // clang-format on }; -static int *opcode_timings_df_mod3[8] = { +static int *opcode_timings_486_df_mod3[8] = { // clang-format off /* FFREE FST FSTP FUCOM FUCOMP*/ CYCLES(3), NULL, CYCLES(3), CYCLES(3), CYCLES(4), CYCLES(4), NULL, NULL // clang-format on }; -static int *opcode_timings_8x[8] = { +static int *opcode_timings_486_8x[8] = { // clang-format off &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm // clang-format on }; -static int *opcode_timings_8x_mod3[8] = { +static int *opcode_timings_486_8x_mod3[8] = { // clang-format off &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm // clang-format on }; -static int *opcode_timings_81[8] = { +static int *opcode_timings_486_81[8] = { // clang-format off &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm // clang-format on }; -static int *opcode_timings_81_mod3[8] = { +static int *opcode_timings_486_81_mod3[8] = { // clang-format off &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm // clang-format on @@ -330,7 +330,7 @@ codegen_timing_486_start(void) void codegen_timing_486_prefix(uint8_t prefix, uint32_t fetchdat) { - timing_count += COUNT(opcode_timings[prefix], 0); + timing_count += COUNT(opcode_timings_486[prefix], 0); last_prefix = prefix; } @@ -344,47 +344,47 @@ codegen_timing_486_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u switch (last_prefix) { case 0x0f: - timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + timings = mod3 ? opcode_timings_486_0f_mod3 : opcode_timings_486_0f; deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: - timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8; + timings = mod3 ? opcode_timings_486_d8_mod3 : opcode_timings_486_d8; deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8; opcode = (opcode >> 3) & 7; break; case 0xd9: - timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9; + timings = mod3 ? opcode_timings_486_d9_mod3 : opcode_timings_486_d9; deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xda: - timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da; + timings = mod3 ? opcode_timings_486_da_mod3 : opcode_timings_486_da; deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da; opcode = (opcode >> 3) & 7; break; case 0xdb: - timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db; + timings = mod3 ? opcode_timings_486_db_mod3 : opcode_timings_486_db; deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xdc: - timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc; + timings = mod3 ? opcode_timings_486_dc_mod3 : opcode_timings_486_dc; deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc; opcode = (opcode >> 3) & 7; break; case 0xdd: - timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd; + timings = mod3 ? opcode_timings_486_dd_mod3 : opcode_timings_486_dd; deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd; opcode = (opcode >> 3) & 7; break; case 0xde: - timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de; + timings = mod3 ? opcode_timings_486_de_mod3 : opcode_timings_486_de; deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de; opcode = (opcode >> 3) & 7; break; case 0xdf: - timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df; + timings = mod3 ? opcode_timings_486_df_mod3 : opcode_timings_486_df; deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df; opcode = (opcode >> 3) & 7; break; @@ -394,12 +394,12 @@ codegen_timing_486_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u case 0x80: case 0x82: case 0x83: - timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x; + timings = mod3 ? opcode_timings_486_8x_mod3 : opcode_timings_486_8x; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; case 0x81: - timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81; + timings = mod3 ? opcode_timings_486_81_mod3 : opcode_timings_486_81; deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81; opcode = (fetchdat >> 3) & 7; break; @@ -410,29 +410,29 @@ codegen_timing_486_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u case 0xd1: case 0xd2: case 0xd3: - timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift; + timings = mod3 ? opcode_timings_486_shift_mod3 : opcode_timings_486_shift; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; case 0xf6: - timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6; + timings = mod3 ? opcode_timings_486_f6_mod3 : opcode_timings_486_f6; deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6; opcode = (fetchdat >> 3) & 7; break; case 0xf7: - timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7; + timings = mod3 ? opcode_timings_486_f7_mod3 : opcode_timings_486_f7; deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7; opcode = (fetchdat >> 3) & 7; break; case 0xff: - timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff; + timings = mod3 ? opcode_timings_486_ff_mod3 : opcode_timings_486_ff; deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff; opcode = (fetchdat >> 3) & 7; break; default: - timings = mod3 ? opcode_timings_mod3 : opcode_timings; + timings = mod3 ? opcode_timings_486_mod3 : opcode_timings_486; deps = mod3 ? opcode_deps_mod3 : opcode_deps; break; } diff --git a/src/cpu/codegen_timing_686.c b/src/cpu/codegen_timing_686.c index 6ea5ac543..285881956 100644 --- a/src/cpu/codegen_timing_686.c +++ b/src/cpu/codegen_timing_686.c @@ -65,7 +65,7 @@ static uint32_t prev_fetchdat; static uint32_t last_regmask_modified; static uint32_t regmask_modified; -static uint32_t opcode_timings[256] = { +static uint32_t opcode_timings_686[256] = { // clang-format off /* ADD ADD ADD ADD*/ /*00*/ PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM, PAIR_XY | CYCLES_RM, @@ -202,7 +202,7 @@ static uint32_t opcode_timings[256] = { // clang-format on }; -static uint32_t opcode_timings_mod3[256] = { +static uint32_t opcode_timings_686_mod3[256] = { // clang-format off /* ADD ADD ADD ADD*/ /*00*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, @@ -340,7 +340,7 @@ static uint32_t opcode_timings_mod3[256] = { // clang-format on }; -static uint32_t opcode_timings_0f[256] = { +static uint32_t opcode_timings_686_0f[256] = { // clang-format off /*00*/ PAIR_NP | CYCLES(20), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(10), INVALID, PAIR_NP | CYCLES(195), PAIR_NP | CYCLES(7), INVALID, @@ -423,7 +423,7 @@ static uint32_t opcode_timings_0f[256] = { PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, PAIR_X | CYCLES_RM, INVALID, // clang-format on }; -static uint32_t opcode_timings_0f_mod3[256] = { +static uint32_t opcode_timings_686_0f_mod3[256] = { // clang-format off /*00*/ PAIR_NP | CYCLES(20), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(10), INVALID, PAIR_NP | CYCLES(195), PAIR_NP | CYCLES(7), INVALID, @@ -506,44 +506,44 @@ static uint32_t opcode_timings_0f_mod3[256] = { // clang-format on }; -static uint32_t opcode_timings_shift[8] = { +static uint32_t opcode_timings_686_shift[8] = { // clang-format off PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, // clang-format on }; -static uint32_t opcode_timings_shift_mod3[8] = { +static uint32_t opcode_timings_686_shift_mod3[8] = { // clang-format off PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, // clang-format on }; -static uint32_t opcode_timings_shift_imm[8] = { +static uint32_t opcode_timings_686_shift_imm[8] = { // clang-format off PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES(8), PAIR_XY | CYCLES(9), PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, // clang-format on }; -static uint32_t opcode_timings_shift_imm_mod3[8] = { +static uint32_t opcode_timings_686_shift_imm_mod3[8] = { // clang-format off PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES(3), PAIR_XY | CYCLES(4), PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, // clang-format on }; -static uint32_t opcode_timings_shift_cl[8] = { +static uint32_t opcode_timings_686_shift_cl[8] = { // clang-format off PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(8), PAIR_XY | CYCLES(9), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), // clang-format on }; -static uint32_t opcode_timings_shift_cl_mod3[8] = { +static uint32_t opcode_timings_686_shift_cl_mod3[8] = { // clang-format off PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(8), PAIR_XY | CYCLES(9), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), PAIR_XY | CYCLES(2), // clang-format on }; -static uint32_t opcode_timings_f6[8] = { +static uint32_t opcode_timings_686_f6[8] = { // clang-format off /* TST NOT NEG*/ PAIR_XY | CYCLES_RM, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1), @@ -551,7 +551,7 @@ static uint32_t opcode_timings_f6[8] = { PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(18), PAIR_NP | CYCLES(18) // clang-format on }; -static uint32_t opcode_timings_f6_mod3[8] = { +static uint32_t opcode_timings_686_f6_mod3[8] = { // clang-format off /* TST NOT NEG*/ PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1), @@ -559,7 +559,7 @@ static uint32_t opcode_timings_f6_mod3[8] = { PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(18), PAIR_NP | CYCLES(18) // clang-format on }; -static uint32_t opcode_timings_f7[8] = { +static uint32_t opcode_timings_686_f7[8] = { // clang-format off /* TST NOT NEG*/ PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1), @@ -567,7 +567,7 @@ static uint32_t opcode_timings_f7[8] = { PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(19,27), PAIR_NP | CYCLES_MULTI(22,30) // clang-format on }; -static uint32_t opcode_timings_f7_mod3[8] = { +static uint32_t opcode_timings_686_f7_mod3[8] = { // clang-format off /* TST NOT NEG*/ PAIR_XY | CYCLES_REG, INVALID, PAIR_XY | CYCLES(1), PAIR_XY | CYCLES(1), @@ -575,7 +575,7 @@ static uint32_t opcode_timings_f7_mod3[8] = { PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(4,10), PAIR_NP | CYCLES_MULTI(19,27), PAIR_NP | CYCLES_MULTI(22,30) // clang-format on }; -static uint32_t opcode_timings_ff[8] = { +static uint32_t opcode_timings_686_ff[8] = { // clang-format off /* INC DEC CALL CALL far*/ PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_X_BRANCH | CYCLES(3), PAIR_NP | CYCLES(5), @@ -583,7 +583,7 @@ static uint32_t opcode_timings_ff[8] = { PAIR_X_BRANCH | CYCLES(3), PAIR_NP | CYCLES(5), PAIR_XY | CYCLES(1), INVALID // clang-format on }; -static uint32_t opcode_timings_ff_mod3[8] = { +static uint32_t opcode_timings_686_ff_mod3[8] = { // clang-format off /* INC DEC CALL CALL far*/ PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_X_BRANCH | CYCLES(1), PAIR_XY | CYCLES(5), @@ -592,7 +592,7 @@ static uint32_t opcode_timings_ff_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_d8[8] = { +static uint32_t opcode_timings_686_d8[8] = { // clang-format off /* FADDs FMULs FCOMs FCOMPs*/ PAIR_X | CYCLES(7), PAIR_X | CYCLES(6), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), @@ -600,7 +600,7 @@ static uint32_t opcode_timings_d8[8] = { PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), PAIR_X | CYCLES(34), PAIR_X | CYCLES(34) // clang-format on }; -static uint32_t opcode_timings_d8_mod3[8] = { +static uint32_t opcode_timings_686_d8_mod3[8] = { // clang-format off /* FADD FMUL FCOM FCOMP*/ PAIR_X | CYCLES(7), PAIR_X | CYCLES(6), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), @@ -609,7 +609,7 @@ static uint32_t opcode_timings_d8_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_d9[8] = { +static uint32_t opcode_timings_686_d9[8] = { // clang-format off /* FLDs FSTs FSTPs*/ PAIR_X | CYCLES(2), INVALID, PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), @@ -617,7 +617,7 @@ static uint32_t opcode_timings_d9[8] = { PAIR_X | CYCLES(30), PAIR_X | CYCLES(4), PAIR_X | CYCLES(24), PAIR_X | CYCLES(5) // clang-format on }; -static uint32_t opcode_timings_d9_mod3[64] = { +static uint32_t opcode_timings_686_d9_mod3[64] = { // clang-format off /*FLD*/ PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), @@ -650,7 +650,7 @@ static uint32_t opcode_timings_d9_mod3[64] = { // clang-format on }; -static uint32_t opcode_timings_da[8] = { +static uint32_t opcode_timings_686_da[8] = { // clang-format off /* FIADDl FIMULl FICOMl FICOMPl*/ PAIR_X | CYCLES(12), PAIR_X | CYCLES(11), PAIR_X | CYCLES(10), PAIR_X | CYCLES(10), @@ -658,14 +658,14 @@ static uint32_t opcode_timings_da[8] = { PAIR_X | CYCLES(29), PAIR_X | CYCLES(27), PAIR_X | CYCLES(38), PAIR_X | CYCLES(48) // clang-format on }; -static uint32_t opcode_timings_da_mod3[8] = { +static uint32_t opcode_timings_686_da_mod3[8] = { // clang-format off PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), INVALID, PAIR_X | CYCLES(5), INVALID, INVALID // clang-format on }; -static uint32_t opcode_timings_db[8] = { +static uint32_t opcode_timings_686_db[8] = { // clang-format off /* FLDil FSTil FSTPil*/ PAIR_X | CYCLES(2), INVALID, PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), @@ -673,7 +673,7 @@ static uint32_t opcode_timings_db[8] = { INVALID, PAIR_X | CYCLES(2), INVALID, PAIR_X | CYCLES(2) // clang-format on }; -static uint32_t opcode_timings_db_mod3[64] = { +static uint32_t opcode_timings_686_db_mod3[64] = { // clang-format off PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), PAIR_X | CYCLES(4), @@ -703,7 +703,7 @@ static uint32_t opcode_timings_db_mod3[64] = { // clang-format on }; -static uint32_t opcode_timings_dc[8] = { +static uint32_t opcode_timings_686_dc[8] = { // clang-format off /* FADDd FMULd FCOMd FCOMPd*/ PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), @@ -711,7 +711,7 @@ static uint32_t opcode_timings_dc[8] = { PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), PAIR_X | CYCLES(34), PAIR_X | CYCLES(34) // clang-format on }; -static uint32_t opcode_timings_dc_mod3[8] = { +static uint32_t opcode_timings_686_dc_mod3[8] = { // clang-format off /* opFADDr opFMULr*/ PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), INVALID, INVALID, @@ -720,7 +720,7 @@ static uint32_t opcode_timings_dc_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_dd[8] = { +static uint32_t opcode_timings_686_dd[8] = { // clang-format off /* FLDd FSTd FSTPd*/ PAIR_X | CYCLES(2), INVALID, PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), @@ -728,7 +728,7 @@ static uint32_t opcode_timings_dd[8] = { PAIR_X | CYCLES(72), INVALID, PAIR_X | CYCLES(67), PAIR_X | CYCLES(2) // clang-format on }; -static uint32_t opcode_timings_dd_mod3[8] = { +static uint32_t opcode_timings_686_dd_mod3[8] = { // clang-format off /* FFFREE FST FSTP*/ PAIR_X | CYCLES(3), INVALID, PAIR_X | CYCLES(2), PAIR_X | CYCLES(2), @@ -737,14 +737,14 @@ static uint32_t opcode_timings_dd_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_de[8] = { +static uint32_t opcode_timings_686_de[8] = { // clang-format off /* FIADDw FIMULw FICOMw FICOMPw*/ PAIR_X | CYCLES(12), PAIR_X | CYCLES(11), PAIR_X | CYCLES(10), PAIR_X | CYCLES(10), /* FISUBw FISUBRw FIDIVw FIDIVRw*/ PAIR_X | CYCLES(27), PAIR_X | CYCLES(27), PAIR_X | CYCLES(38), PAIR_X | CYCLES(38) }; -static uint32_t opcode_timings_de_mod3[8] = { +static uint32_t opcode_timings_686_de_mod3[8] = { // clang-format off /* FADD FMUL FCOMPP*/ PAIR_X | CYCLES(7), PAIR_X | CYCLES(7), INVALID, PAIR_X | CYCLES(7), @@ -753,7 +753,7 @@ static uint32_t opcode_timings_de_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_df[8] = { +static uint32_t opcode_timings_686_df[8] = { // clang-format off /* FILDiw FISTiw FISTPiw*/ PAIR_X | CYCLES(8), INVALID, PAIR_X | CYCLES(10), PAIR_X | CYCLES(13), @@ -761,7 +761,7 @@ static uint32_t opcode_timings_df[8] = { INVALID, PAIR_X | CYCLES(8), PAIR_X | CYCLES(63), PAIR_X | CYCLES(13) // clang-format on }; -static uint32_t opcode_timings_df_mod3[8] = { +static uint32_t opcode_timings_686_df_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FSTSW AX*/ @@ -769,25 +769,25 @@ static uint32_t opcode_timings_df_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_8x[8] = { +static uint32_t opcode_timings_686_8x[8] = { // clang-format off PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM // clang-format on }; -static uint32_t opcode_timings_8x_mod3[8] = { +static uint32_t opcode_timings_686_8x_mod3[8] = { // clang-format off PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG // clang-format on }; -static uint32_t opcode_timings_81[8] = { +static uint32_t opcode_timings_686_81[8] = { // clang-format off PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RMW, PAIR_XY | CYCLES_RM // clang-format on }; -static uint32_t opcode_timings_81_mod3[8] = { +static uint32_t opcode_timings_686_81_mod3[8] = { // clang-format off PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG, PAIR_XY | CYCLES_REG @@ -874,47 +874,47 @@ codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u switch (last_prefix) { case 0x0f: - timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + timings = mod3 ? opcode_timings_686_0f_mod3 : opcode_timings_686_0f; deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: - timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8; + timings = mod3 ? opcode_timings_686_d8_mod3 : opcode_timings_686_d8; deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8; opcode = (opcode >> 3) & 7; break; case 0xd9: - timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9; + timings = mod3 ? opcode_timings_686_d9_mod3 : opcode_timings_686_d9; deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xda: - timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da; + timings = mod3 ? opcode_timings_686_da_mod3 : opcode_timings_686_da; deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da; opcode = (opcode >> 3) & 7; break; case 0xdb: - timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db; + timings = mod3 ? opcode_timings_686_db_mod3 : opcode_timings_686_db; deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xdc: - timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc; + timings = mod3 ? opcode_timings_686_dc_mod3 : opcode_timings_686_dc; deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc; opcode = (opcode >> 3) & 7; break; case 0xdd: - timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd; + timings = mod3 ? opcode_timings_686_dd_mod3 : opcode_timings_686_dd; deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd; opcode = (opcode >> 3) & 7; break; case 0xde: - timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de; + timings = mod3 ? opcode_timings_686_de_mod3 : opcode_timings_686_de; deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de; opcode = (opcode >> 3) & 7; break; case 0xdf: - timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df; + timings = mod3 ? opcode_timings_686_df_mod3 : opcode_timings_686_df; deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df; opcode = (opcode >> 3) & 7; break; @@ -924,55 +924,55 @@ codegen_timing_686_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(u case 0x80: case 0x82: case 0x83: - timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x; + timings = mod3 ? opcode_timings_686_8x_mod3 : opcode_timings_686_8x; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; case 0x81: - timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81; + timings = mod3 ? opcode_timings_686_81_mod3 : opcode_timings_686_81; deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81; opcode = (fetchdat >> 3) & 7; break; case 0xc0: case 0xc1: - timings = mod3 ? opcode_timings_shift_imm_mod3 : opcode_timings_shift_imm; + timings = mod3 ? opcode_timings_686_shift_imm_mod3 : opcode_timings_686_shift_imm; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; case 0xd0: case 0xd1: - timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift; + timings = mod3 ? opcode_timings_686_shift_mod3 : opcode_timings_686_shift; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; case 0xd2: case 0xd3: - timings = mod3 ? opcode_timings_shift_cl_mod3 : opcode_timings_shift_cl; + timings = mod3 ? opcode_timings_686_shift_cl_mod3 : opcode_timings_686_shift_cl; deps = mod3 ? opcode_deps_shift_cl_mod3 : opcode_deps_shift_cl; opcode = (fetchdat >> 3) & 7; break; case 0xf6: - timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6; + timings = mod3 ? opcode_timings_686_f6_mod3 : opcode_timings_686_f6; deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6; opcode = (fetchdat >> 3) & 7; break; case 0xf7: - timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7; + timings = mod3 ? opcode_timings_686_f7_mod3 : opcode_timings_686_f7; deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7; opcode = (fetchdat >> 3) & 7; break; case 0xff: - timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff; + timings = mod3 ? opcode_timings_686_ff_mod3 : opcode_timings_686_ff; deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff; opcode = (fetchdat >> 3) & 7; break; default: - timings = mod3 ? opcode_timings_mod3 : opcode_timings; + timings = mod3 ? opcode_timings_686_mod3 : opcode_timings_686; deps = mod3 ? opcode_deps_mod3 : opcode_deps; break; } diff --git a/src/cpu/codegen_timing_k6.c b/src/cpu/codegen_timing_k6.c index e4c5d9493..5566fbbcd 100644 --- a/src/cpu/codegen_timing_k6.c +++ b/src/cpu/codegen_timing_k6.c @@ -759,7 +759,7 @@ static const risc86_instruction_t vector_wbinvd_op = { #define INVALID NULL -static const risc86_instruction_t *opcode_timings[256] = { +static const risc86_instruction_t *opcode_timings_k6[256] = { // clang-format off /* ADD ADD ADD ADD*/ /*00*/ &alux_store_op, &alu_store_op, &load_alux_op, &load_alu_op, @@ -896,7 +896,7 @@ static const risc86_instruction_t *opcode_timings[256] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_mod3[256] = { +static const risc86_instruction_t *opcode_timings_k6_mod3[256] = { // clang-format off /* ADD ADD ADD ADD*/ /*00*/ &alux_op, &alu_op, &alux_op, &alu_op, @@ -1033,7 +1033,7 @@ static const risc86_instruction_t *opcode_timings_mod3[256] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_0f[256] = { +static const risc86_instruction_t *opcode_timings_k6_0f[256] = { // clang-format off /*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, INVALID, &vector_alu6_op, &vector_alu6_op, INVALID, @@ -1116,7 +1116,7 @@ static const risc86_instruction_t *opcode_timings_0f[256] = { &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, // clang-format on }; -static const risc86_instruction_t *opcode_timings_0f_mod3[256] = { +static const risc86_instruction_t *opcode_timings_k6_0f_mod3[256] = { // clang-format off /*00*/ &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, &vector_alu6_op, INVALID, &vector_alu6_op, &vector_alu6_op, INVALID, @@ -1200,7 +1200,7 @@ static const risc86_instruction_t *opcode_timings_0f_mod3[256] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_0f0f[256] = { +static const risc86_instruction_t *opcode_timings_k6_0f0f[256] = { // clang-format off /*00*/ INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -1283,7 +1283,7 @@ static const risc86_instruction_t *opcode_timings_0f0f[256] = { INVALID, INVALID, INVALID, INVALID, // clang-format on }; -static const risc86_instruction_t *opcode_timings_0f0f_mod3[256] = { +static const risc86_instruction_t *opcode_timings_k6_0f0f_mod3[256] = { // clang-format off /*00*/ INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -1367,57 +1367,57 @@ static const risc86_instruction_t *opcode_timings_0f0f_mod3[256] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_shift[8] = { +static const risc86_instruction_t *opcode_timings_k6_shift[8] = { // clang-format off &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &vector_alu_store_op // clang-format on }; -static const risc86_instruction_t *opcode_timings_shift_b[8] = { +static const risc86_instruction_t *opcode_timings_k6_shift_b[8] = { // clang-format off &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &vector_alux_store_op // clang-format on }; -static const risc86_instruction_t *opcode_timings_shift_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_shift_mod3[8] = { // clang-format off &vector_alu1_op, &vector_alu1_op, &vector_alu1_op, &vector_alu1_op, &alu_op, &alu_op, &alu_op, &alu_op // clang-format on }; -static const risc86_instruction_t *opcode_timings_shift_b_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_shift_b_mod3[8] = { // clang-format off &vector_alux1_op, &vector_alux1_op, &vector_alux1_op, &vector_alux1_op, &alux_op, &alux_op, &alux_op, &alux_op // clang-format on }; -static const risc86_instruction_t *opcode_timings_80[8] = { +static const risc86_instruction_t *opcode_timings_k6_80[8] = { // clang-format off &alux_store_op, &alux_store_op, &vector_alux_store_op, &vector_alux_store_op, &alux_store_op, &alux_store_op, &alux_store_op, &alux_store_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_80_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_80_mod3[8] = { // clang-format off &alux_op, &alux_op, &alux_store_op, &alux_store_op, &alux_op, &alux_op, &alux_op, &alux_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_8x[8] = { +static const risc86_instruction_t *opcode_timings_k6_8x[8] = { // clang-format off &alu_store_op, &alu_store_op, &vector_alu_store_op, &vector_alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_8x_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_8x_mod3[8] = { // clang-format off &alu_op, &alu_op, &alu_store_op, &alu_store_op, &alu_op, &alu_op, &alu_op, &alu_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_f6[8] = { +static const risc86_instruction_t *opcode_timings_k6_f6[8] = { // clang-format off /* TST NOT NEG*/ &test_mem_imm_b_op, INVALID, &vector_alux_store_op, &vector_alux_store_op, @@ -1425,7 +1425,7 @@ static const risc86_instruction_t *opcode_timings_f6[8] = { &vector_mul_mem_op, &vector_mul_mem_op, &vector_div16_mem_op, &vector_div16_mem_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_f6_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_f6_mod3[8] = { // clang-format off /* TST NOT NEG*/ &test_reg_b_op, INVALID, &alux_op, &alux_op, @@ -1433,7 +1433,7 @@ static const risc86_instruction_t *opcode_timings_f6_mod3[8] = { &vector_mul_op, &vector_mul_op, &vector_div16_op, &vector_div16_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_f7[8] = { +static const risc86_instruction_t *opcode_timings_k6_f7[8] = { // clang-format off /* TST NOT NEG*/ &test_mem_imm_op, INVALID, &vector_alu_store_op, &vector_alu_store_op, @@ -1441,7 +1441,7 @@ static const risc86_instruction_t *opcode_timings_f7[8] = { &vector_mul64_mem_op, &vector_mul64_mem_op, &vector_div32_mem_op, &vector_div32_mem_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_f7_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_f7_mod3[8] = { // clang-format off /* TST NOT NEG*/ &test_reg_op, INVALID, &alu_op, &alu_op, @@ -1449,7 +1449,7 @@ static const risc86_instruction_t *opcode_timings_f7_mod3[8] = { &vector_mul64_op, &vector_mul64_op, &vector_div32_op, &vector_div32_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_ff[8] = { +static const risc86_instruction_t *opcode_timings_k6_ff[8] = { // clang-format off /* INC DEC CALL CALL far*/ &alu_store_op, &alu_store_op, &store_op, &vector_call_far_op, @@ -1457,7 +1457,7 @@ static const risc86_instruction_t *opcode_timings_ff[8] = { &branch_op, &vector_jmp_far_op, &push_mem_op, INVALID // clang-format on }; -static const risc86_instruction_t *opcode_timings_ff_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_ff_mod3[8] = { // clang-format off /* INC DEC CALL CALL far*/ &vector_alu1_op, &vector_alu1_op, &store_op, &vector_call_far_op, @@ -1466,7 +1466,7 @@ static const risc86_instruction_t *opcode_timings_ff_mod3[8] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_d8[8] = { +static const risc86_instruction_t *opcode_timings_k6_d8[8] = { // clang-format off /* FADDs FMULs FCOMs FCOMPs*/ &load_float_op, &load_float_op, &load_float_op, &load_float_op, @@ -1474,7 +1474,7 @@ static const risc86_instruction_t *opcode_timings_d8[8] = { &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_d8_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_d8_mod3[8] = { // clang-format off /* FADD FMUL FCOM FCOMP*/ &float_op, &float_op, &float_op, &float_op, @@ -1483,7 +1483,7 @@ static const risc86_instruction_t *opcode_timings_d8_mod3[8] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_d9[8] = { +static const risc86_instruction_t *opcode_timings_k6_d9[8] = { // clang-format off /* FLDs FSTs FSTPs*/ &load_float_op, INVALID, &fstore_op, &fstore_op, @@ -1491,7 +1491,7 @@ static const risc86_instruction_t *opcode_timings_d9[8] = { &vector_float_l_op, &vector_fldcw_op, &vector_float_l_op, &vector_float_op // clang-format on }; -static const risc86_instruction_t *opcode_timings_d9_mod3[64] = { +static const risc86_instruction_t *opcode_timings_k6_d9_mod3[64] = { // clang-format off /*FLD*/ &float_op, &float_op, &float_op, &float_op, @@ -1524,7 +1524,7 @@ static const risc86_instruction_t *opcode_timings_d9_mod3[64] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_da[8] = { +static const risc86_instruction_t *opcode_timings_k6_da[8] = { // clang-format off /* FIADDl FIMULl FICOMl FICOMPl*/ &load_float_op, &load_float_op, &load_float_op, &load_float_op, @@ -1532,7 +1532,7 @@ static const risc86_instruction_t *opcode_timings_da[8] = { &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_da_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_da_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FCOMPP*/ @@ -1540,7 +1540,7 @@ static const risc86_instruction_t *opcode_timings_da_mod3[8] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_db[8] = { +static const risc86_instruction_t *opcode_timings_k6_db[8] = { // clang-format off /* FLDil FSTil FSTPil*/ &load_float_op, INVALID, &fstore_op, &fstore_op, @@ -1548,7 +1548,7 @@ static const risc86_instruction_t *opcode_timings_db[8] = { INVALID, &vector_flde_op, INVALID, &vector_fste_op // clang-format on }; -static const risc86_instruction_t *opcode_timings_db_mod3[64] = { +static const risc86_instruction_t *opcode_timings_k6_db_mod3[64] = { // clang-format off INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -1578,7 +1578,7 @@ static const risc86_instruction_t *opcode_timings_db_mod3[64] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_dc[8] = { +static const risc86_instruction_t *opcode_timings_k6_dc[8] = { // clang-format off /* FADDd FMULd FCOMd FCOMPd*/ &load_float_op, &load_float_op, &load_float_op, &load_float_op, @@ -1586,7 +1586,7 @@ static const risc86_instruction_t *opcode_timings_dc[8] = { &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_dc_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_dc_mod3[8] = { // clang-format off /* opFADDr opFMULr*/ &float_op, &float_op, INVALID, INVALID, @@ -1595,7 +1595,7 @@ static const risc86_instruction_t *opcode_timings_dc_mod3[8] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_dd[8] = { +static const risc86_instruction_t *opcode_timings_k6_dd[8] = { // clang-format off /* FLDd FSTd FSTPd*/ &load_float_op, INVALID, &fstore_op, &fstore_op, @@ -1603,7 +1603,7 @@ static const risc86_instruction_t *opcode_timings_dd[8] = { &vector_float_l_op, INVALID, &vector_float_l_op, &vector_float_l_op // clang-format on }; -static const risc86_instruction_t *opcode_timings_dd_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_dd_mod3[8] = { // clang-format off /* FFFREE FST FSTP*/ &float_op, INVALID, &float_op, &float_op, @@ -1612,7 +1612,7 @@ static const risc86_instruction_t *opcode_timings_dd_mod3[8] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_de[8] = { +static const risc86_instruction_t *opcode_timings_k6_de[8] = { // clang-format off /* FIADDw FIMULw FICOMw FICOMPw*/ &load_float_op, &load_float_op, &load_float_op, &load_float_op, @@ -1620,7 +1620,7 @@ static const risc86_instruction_t *opcode_timings_de[8] = { &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_de_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_de_mod3[8] = { // clang-format off /* FADDP FMULP FCOMPP*/ &float_op, &float_op, INVALID, &float_op, @@ -1629,7 +1629,7 @@ static const risc86_instruction_t *opcode_timings_de_mod3[8] = { // clang-format on }; -static const risc86_instruction_t *opcode_timings_df[8] = { +static const risc86_instruction_t *opcode_timings_k6_df[8] = { // clang-format off /* FILDiw FISTiw FISTPiw*/ &load_float_op, INVALID, &fstore_op, &fstore_op, @@ -1637,7 +1637,7 @@ static const risc86_instruction_t *opcode_timings_df[8] = { INVALID, &load_float_op, &vector_float_l_op, &fstore_op, // clang-format on }; -static const risc86_instruction_t *opcode_timings_df_mod3[8] = { +static const risc86_instruction_t *opcode_timings_k6_df_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FSTSW AX*/ @@ -2094,51 +2094,51 @@ codegen_timing_k6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t opcode = fastreadb(cs + opcode_pc); - ins_table = mod3 ? opcode_timings_0f0f_mod3 : opcode_timings_0f0f; + ins_table = mod3 ? opcode_timings_k6_0f0f_mod3 : opcode_timings_k6_0f0f; deps = mod3 ? opcode_deps_0f0f_mod3 : opcode_deps_0f0f; } else { - ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + ins_table = mod3 ? opcode_timings_k6_0f_mod3 : opcode_timings_k6_0f; deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; } break; case 0xd8: - ins_table = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8; + ins_table = mod3 ? opcode_timings_k6_d8_mod3 : opcode_timings_k6_d8; deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8; opcode = (opcode >> 3) & 7; break; case 0xd9: - ins_table = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9; + ins_table = mod3 ? opcode_timings_k6_d9_mod3 : opcode_timings_k6_d9; deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xda: - ins_table = mod3 ? opcode_timings_da_mod3 : opcode_timings_da; + ins_table = mod3 ? opcode_timings_k6_da_mod3 : opcode_timings_k6_da; deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da; opcode = (opcode >> 3) & 7; break; case 0xdb: - ins_table = mod3 ? opcode_timings_db_mod3 : opcode_timings_db; + ins_table = mod3 ? opcode_timings_k6_db_mod3 : opcode_timings_k6_db; deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xdc: - ins_table = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc; + ins_table = mod3 ? opcode_timings_k6_dc_mod3 : opcode_timings_k6_dc; deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc; opcode = (opcode >> 3) & 7; break; case 0xdd: - ins_table = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd; + ins_table = mod3 ? opcode_timings_k6_dd_mod3 : opcode_timings_k6_dd; deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd; opcode = (opcode >> 3) & 7; break; case 0xde: - ins_table = mod3 ? opcode_timings_de_mod3 : opcode_timings_de; + ins_table = mod3 ? opcode_timings_k6_de_mod3 : opcode_timings_k6_de; deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de; opcode = (opcode >> 3) & 7; break; case 0xdf: - ins_table = mod3 ? opcode_timings_df_mod3 : opcode_timings_df; + ins_table = mod3 ? opcode_timings_k6_df_mod3 : opcode_timings_k6_df; deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df; opcode = (opcode >> 3) & 7; break; @@ -2147,13 +2147,13 @@ codegen_timing_k6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t switch (opcode) { case 0x80: case 0x82: - ins_table = mod3 ? opcode_timings_80_mod3 : opcode_timings_80; + ins_table = mod3 ? opcode_timings_k6_80_mod3 : opcode_timings_k6_80; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; case 0x81: case 0x83: - ins_table = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x; + ins_table = mod3 ? opcode_timings_k6_8x_mod3 : opcode_timings_k6_8x; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; @@ -2161,7 +2161,7 @@ codegen_timing_k6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t case 0xc0: case 0xd0: case 0xd2: - ins_table = mod3 ? opcode_timings_shift_b_mod3 : opcode_timings_shift_b; + ins_table = mod3 ? opcode_timings_k6_shift_b_mod3 : opcode_timings_k6_shift_b; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; @@ -2169,29 +2169,29 @@ codegen_timing_k6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, uint32_t case 0xc1: case 0xd1: case 0xd3: - ins_table = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift; + ins_table = mod3 ? opcode_timings_k6_shift_mod3 : opcode_timings_k6_shift; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; case 0xf6: - ins_table = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6; + ins_table = mod3 ? opcode_timings_k6_f6_mod3 : opcode_timings_k6_f6; deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6; opcode = (fetchdat >> 3) & 7; break; case 0xf7: - ins_table = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7; + ins_table = mod3 ? opcode_timings_k6_f7_mod3 : opcode_timings_k6_f7; deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7; opcode = (fetchdat >> 3) & 7; break; case 0xff: - ins_table = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff; + ins_table = mod3 ? opcode_timings_k6_ff_mod3 : opcode_timings_k6_ff; deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff; opcode = (fetchdat >> 3) & 7; break; default: - ins_table = mod3 ? opcode_timings_mod3 : opcode_timings; + ins_table = mod3 ? opcode_timings_k6_mod3 : opcode_timings_k6; deps = mod3 ? opcode_deps_mod3 : opcode_deps; break; } diff --git a/src/cpu/codegen_timing_p6.c b/src/cpu/codegen_timing_p6.c index 25c098ca4..a22813068 100644 --- a/src/cpu/codegen_timing_p6.c +++ b/src/cpu/codegen_timing_p6.c @@ -787,7 +787,7 @@ static const macro_op_t wbinvd_op = { }; #define INVALID NULL -static const macro_op_t *opcode_timings[256] = { +static const macro_op_t *opcode_timings_p6[256] = { // clang-format off /* ADD ADD ADD ADD*/ /*00*/ &alup0_store_op, &alu_store_op, &load_alup0_op, &load_alu_op, @@ -924,7 +924,7 @@ static const macro_op_t *opcode_timings[256] = { // clang-format on }; -static const macro_op_t *opcode_timings_mod3[256] = { +static const macro_op_t *opcode_timings_p6_mod3[256] = { // clang-format off /* ADD ADD ADD ADD*/ /*00*/ &alup0_op, &alu_op, &alup0_op, &alu_op, @@ -1062,7 +1062,7 @@ static const macro_op_t *opcode_timings_mod3[256] = { // clang-format on }; -static const macro_op_t *opcode_timings_0f[256] = { +static const macro_op_t *opcode_timings_p6_0f[256] = { // clang-format off /*00*/ &alu6_op, &alu6_op, &alu6_op, &alu6_op, INVALID, &alu6_op, &alu6_op, INVALID, @@ -1145,7 +1145,7 @@ static const macro_op_t *opcode_timings_0f[256] = { &load_mmx_op, &load_mmx_op, &load_mmx_op, INVALID, // clang-format on }; -static const macro_op_t *opcode_timings_0f_mod3[256] = { +static const macro_op_t *opcode_timings_p6_0f_mod3[256] = { // clang-format off /*00*/ &alu6_op, &alu6_op, &alu6_op, &alu6_op, INVALID, &alu6_op, &alu6_op, INVALID, @@ -1228,58 +1228,58 @@ static const macro_op_t *opcode_timings_0f_mod3[256] = { &mmx_op, &mmx_op, &mmx_op, INVALID, }; -static const macro_op_t *opcode_timings_shift[8] = +static const macro_op_t *opcode_timings_p6_shift[8] = { // clang-format off &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op // clang-format on }; -static const macro_op_t *opcode_timings_shift_b[8] = { +static const macro_op_t *opcode_timings_p6_shift_b[8] = { // clang-format off &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op // clang-format on }; -static const macro_op_t *opcode_timings_shift_mod3[8] = { +static const macro_op_t *opcode_timings_p6_shift_mod3[8] = { // clang-format off &complex_alu1_op, &complex_alu1_op, &complex_alu1_op, &complex_alu1_op, &alu_op, &alu_op, &alu_op, &alu_op // clang-format on }; -static const macro_op_t *opcode_timings_shift_b_mod3[8] = { +static const macro_op_t *opcode_timings_p6_shift_b_mod3[8] = { // clang-format off &complex_alup0_1_op, &complex_alup0_1_op, &complex_alup0_1_op, &complex_alup0_1_op, &alup0_op, &alup0_op, &alup0_op, &alup0_op // clang-format on }; -static const macro_op_t *opcode_timings_80[8] = { +static const macro_op_t *opcode_timings_p6_80[8] = { // clang-format off &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, &alup0_store_op, // clang-format on }; -static const macro_op_t *opcode_timings_80_mod3[8] = { +static const macro_op_t *opcode_timings_p6_80_mod3[8] = { // clang-format off &alup0_op, &alup0_op, &alup0_store_op, &alup0_store_op, &alup0_op, &alup0_op, &alup0_op, &alup0_op, // clang-format on }; -static const macro_op_t *opcode_timings_8x[8] = { +static const macro_op_t *opcode_timings_p6_8x[8] = { // clang-format off &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, &alu_store_op, // clang-format on }; -static const macro_op_t *opcode_timings_8x_mod3[8] = { +static const macro_op_t *opcode_timings_p6_8x_mod3[8] = { // clang-format off &alu_op, &alu_op, &alu_store_op, &alu_store_op, &alu_op, &alu_op, &alu_op, &alu_op, // clang-format on }; -static const macro_op_t *opcode_timings_f6[8] = { +static const macro_op_t *opcode_timings_p6_f6[8] = { // clang-format off /* TST NOT NEG*/ &test_mem_imm_b_op, INVALID, &alup0_store_op, &alup0_store_op, @@ -1287,7 +1287,7 @@ static const macro_op_t *opcode_timings_f6[8] = { &mul_mem_op, &mul_mem_op, &div16_mem_op, &div16_mem_op, // clang-format on }; -static const macro_op_t *opcode_timings_f6_mod3[8] = { +static const macro_op_t *opcode_timings_p6_f6_mod3[8] = { // clang-format off /* TST NOT NEG*/ &test_reg_b_op, INVALID, &alup0_op, &alup0_op, @@ -1295,7 +1295,7 @@ static const macro_op_t *opcode_timings_f6_mod3[8] = { &mul_op, &mul_op, &div16_op, &div16_op, // clang-format on }; -static const macro_op_t *opcode_timings_f7[8] = { +static const macro_op_t *opcode_timings_p6_f7[8] = { // clang-format off /* TST NOT NEG*/ &test_mem_imm_op, INVALID, &alu_store_op, &alu_store_op, @@ -1303,7 +1303,7 @@ static const macro_op_t *opcode_timings_f7[8] = { &mul64_mem_op, &mul64_mem_op, &div32_mem_op, &div32_mem_op, // clang-format on }; -static const macro_op_t *opcode_timings_f7_mod3[8] = { +static const macro_op_t *opcode_timings_p6_f7_mod3[8] = { // clang-format off /* TST NOT NEG*/ &test_reg_op, INVALID, &alu_op, &alu_op, @@ -1311,7 +1311,7 @@ static const macro_op_t *opcode_timings_f7_mod3[8] = { &mul64_op, &mul64_op, &div32_op, &div32_op, // clang-format on }; -static const macro_op_t *opcode_timings_ff[8] = { +static const macro_op_t *opcode_timings_p6_ff[8] = { // clang-format off /* INC DEC CALL CALL far*/ &alu_store_op, &alu_store_op, &store_op, &call_far_op, @@ -1319,7 +1319,7 @@ static const macro_op_t *opcode_timings_ff[8] = { &branch_op, &jmp_far_op, &push_mem_op, INVALID // clang-format on }; -static const macro_op_t *opcode_timings_ff_mod3[8] = { +static const macro_op_t *opcode_timings_p6_ff_mod3[8] = { // clang-format off /* INC DEC CALL CALL far*/ &complex_alu1_op, &complex_alu1_op, &store_op, &call_far_op, @@ -1328,7 +1328,7 @@ static const macro_op_t *opcode_timings_ff_mod3[8] = { // clang-format on }; -static const macro_op_t *opcode_timings_d8[8] = { +static const macro_op_t *opcode_timings_p6_d8[8] = { // clang-format off /* FADDs FMULs FCOMs FCOMPs*/ &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, @@ -1336,7 +1336,7 @@ static const macro_op_t *opcode_timings_d8[8] = { &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, // clang-format on }; -static const macro_op_t *opcode_timings_d8_mod3[8] = { +static const macro_op_t *opcode_timings_p6_d8_mod3[8] = { // clang-format off /* FADD FMUL FCOM FCOMP*/ &fadd_op, &fmul_op, &float_op, &float_op, @@ -1345,7 +1345,7 @@ static const macro_op_t *opcode_timings_d8_mod3[8] = { // clang-format on }; -static const macro_op_t *opcode_timings_d9[8] = { +static const macro_op_t *opcode_timings_p6_d9[8] = { // clang-format off /* FLDs FSTs FSTPs*/ &load_float_op, INVALID, &fstore_op, &fstore_op, @@ -1353,7 +1353,7 @@ static const macro_op_t *opcode_timings_d9[8] = { &complex_float_l_op, &fldcw_op, &complex_float_l_op, &complex_float_op // clang-format on }; -static const macro_op_t *opcode_timings_d9_mod3[64] = { +static const macro_op_t *opcode_timings_p6_d9_mod3[64] = { // clang-format off /*FLD*/ &float_op, &float_op, &float_op, &float_op, @@ -1386,7 +1386,7 @@ static const macro_op_t *opcode_timings_d9_mod3[64] = { // clang-format on }; -static const macro_op_t *opcode_timings_da[8] = { +static const macro_op_t *opcode_timings_p6_da[8] = { // clang-format off /* FIADDl FIMULl FICOMl FICOMPl*/ &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, @@ -1394,7 +1394,7 @@ static const macro_op_t *opcode_timings_da[8] = { &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, // clang-format on }; -static const macro_op_t *opcode_timings_da_mod3[8] = { +static const macro_op_t *opcode_timings_p6_da_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FCOMPP*/ @@ -1402,7 +1402,7 @@ static const macro_op_t *opcode_timings_da_mod3[8] = { // clang-format on }; -static const macro_op_t *opcode_timings_db[8] = { +static const macro_op_t *opcode_timings_p6_db[8] = { // clang-format off /* FLDil FSTil FSTPil*/ &load_float_op, INVALID, &fstore_op, &fstore_op, @@ -1410,7 +1410,7 @@ static const macro_op_t *opcode_timings_db[8] = { INVALID, &flde_op, INVALID, &fste_op // clang-format on }; -static const macro_op_t *opcode_timings_db_mod3[64] = { +static const macro_op_t *opcode_timings_p6_db_mod3[64] = { // clang-format off INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -1440,7 +1440,7 @@ static const macro_op_t *opcode_timings_db_mod3[64] = { // clang-format on }; -static const macro_op_t *opcode_timings_dc[8] = { +static const macro_op_t *opcode_timings_p6_dc[8] = { // clang-format off /* FADDd FMULd FCOMd FCOMPd*/ &load_fadd_op, &load_fmul_op, &load_float_op, &load_float_op, @@ -1448,7 +1448,7 @@ static const macro_op_t *opcode_timings_dc[8] = { &load_float_op, &load_float_op, &fdiv_mem_op, &fdiv_mem_op, // clang-format on }; -static const macro_op_t *opcode_timings_dc_mod3[8] = { +static const macro_op_t *opcode_timings_p6_dc_mod3[8] = { // clang-format off /* opFADDr opFMULr*/ &fadd_op, &fmul_op, INVALID, INVALID, @@ -1457,7 +1457,7 @@ static const macro_op_t *opcode_timings_dc_mod3[8] = { // clang-format on }; -static const macro_op_t *opcode_timings_dd[8] = { +static const macro_op_t *opcode_timings_p6_dd[8] = { // clang-format off /* FLDd FSTd FSTPd*/ &load_float_op, INVALID, &fstore_op, &fstore_op, @@ -1465,7 +1465,7 @@ static const macro_op_t *opcode_timings_dd[8] = { &complex_float_l_op, INVALID, &complex_float_l_op, &complex_float_l_op // clang-format on }; -static const macro_op_t *opcode_timings_dd_mod3[8] = { +static const macro_op_t *opcode_timings_p6_dd_mod3[8] = { // clang-format off /* FFFREE FST FSTP*/ &float_op, INVALID, &float_op, &float_op, @@ -1474,7 +1474,7 @@ static const macro_op_t *opcode_timings_dd_mod3[8] = { // clang-format on }; -static const macro_op_t *opcode_timings_de[8] = { +static const macro_op_t *opcode_timings_p6_de[8] = { // clang-format off /* FIADDw FIMULw FICOMw FICOMPw*/ &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, @@ -1482,7 +1482,7 @@ static const macro_op_t *opcode_timings_de[8] = { &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, &load_fiadd_op, // clang-format on }; -static const macro_op_t *opcode_timings_de_mod3[8] = { +static const macro_op_t *opcode_timings_p6_de_mod3[8] = { // clang-format off /* FADDP FMULP FCOMPP*/ &fadd_op, &fmul_op, INVALID, &float_op, @@ -1491,7 +1491,7 @@ static const macro_op_t *opcode_timings_de_mod3[8] = { // clang-format on }; -static const macro_op_t *opcode_timings_df[8] = { +static const macro_op_t *opcode_timings_p6_df[8] = { // clang-format off /* FILDiw FISTiw FISTPiw*/ &load_float_op, INVALID, &fstore_op, &fstore_op, @@ -1499,7 +1499,7 @@ static const macro_op_t *opcode_timings_df[8] = { INVALID, &load_float_op, &complex_float_l_op, &fstore_op, // clang-format on }; -static const macro_op_t *opcode_timings_df_mod3[8] = { +static const macro_op_t *opcode_timings_p6_df_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FSTSW AX*/ @@ -1865,47 +1865,47 @@ codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(ui switch (last_prefix) { case 0x0f: - ins_table = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + ins_table = mod3 ? opcode_timings_p6_0f_mod3 : opcode_timings_p6_0f; deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: - ins_table = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8; + ins_table = mod3 ? opcode_timings_p6_d8_mod3 : opcode_timings_p6_d8; deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8; opcode = (opcode >> 3) & 7; break; case 0xd9: - ins_table = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9; + ins_table = mod3 ? opcode_timings_p6_d9_mod3 : opcode_timings_p6_d9; deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xda: - ins_table = mod3 ? opcode_timings_da_mod3 : opcode_timings_da; + ins_table = mod3 ? opcode_timings_p6_da_mod3 : opcode_timings_p6_da; deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da; opcode = (opcode >> 3) & 7; break; case 0xdb: - ins_table = mod3 ? opcode_timings_db_mod3 : opcode_timings_db; + ins_table = mod3 ? opcode_timings_p6_db_mod3 : opcode_timings_p6_db; deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xdc: - ins_table = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc; + ins_table = mod3 ? opcode_timings_p6_dc_mod3 : opcode_timings_p6_dc; deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc; opcode = (opcode >> 3) & 7; break; case 0xdd: - ins_table = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd; + ins_table = mod3 ? opcode_timings_p6_dd_mod3 : opcode_timings_p6_dd; deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd; opcode = (opcode >> 3) & 7; break; case 0xde: - ins_table = mod3 ? opcode_timings_de_mod3 : opcode_timings_de; + ins_table = mod3 ? opcode_timings_p6_de_mod3 : opcode_timings_p6_de; deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de; opcode = (opcode >> 3) & 7; break; case 0xdf: - ins_table = mod3 ? opcode_timings_df_mod3 : opcode_timings_df; + ins_table = mod3 ? opcode_timings_p6_df_mod3 : opcode_timings_p6_df; deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df; opcode = (opcode >> 3) & 7; break; @@ -1914,13 +1914,13 @@ codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(ui switch (opcode) { case 0x80: case 0x82: - ins_table = mod3 ? opcode_timings_80_mod3 : opcode_timings_80; + ins_table = mod3 ? opcode_timings_p6_80_mod3 : opcode_timings_p6_80; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; case 0x81: case 0x83: - ins_table = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x; + ins_table = mod3 ? opcode_timings_p6_8x_mod3 : opcode_timings_p6_8x; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; @@ -1928,7 +1928,7 @@ codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(ui case 0xc0: case 0xd0: case 0xd2: - ins_table = mod3 ? opcode_timings_shift_b_mod3 : opcode_timings_shift_b; + ins_table = mod3 ? opcode_timings_p6_shift_b_mod3 : opcode_timings_p6_shift_b; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; @@ -1936,29 +1936,29 @@ codegen_timing_p6_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUSED(ui case 0xc1: case 0xd1: case 0xd3: - ins_table = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift; + ins_table = mod3 ? opcode_timings_p6_shift_mod3 : opcode_timings_p6_shift; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; case 0xf6: - ins_table = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6; + ins_table = mod3 ? opcode_timings_p6_f6_mod3 : opcode_timings_p6_f6; deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6; opcode = (fetchdat >> 3) & 7; break; case 0xf7: - ins_table = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7; + ins_table = mod3 ? opcode_timings_p6_f7_mod3 : opcode_timings_p6_f7; deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7; opcode = (fetchdat >> 3) & 7; break; case 0xff: - ins_table = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff; + ins_table = mod3 ? opcode_timings_p6_ff_mod3 : opcode_timings_p6_ff; deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff; opcode = (fetchdat >> 3) & 7; break; default: - ins_table = mod3 ? opcode_timings_mod3 : opcode_timings; + ins_table = mod3 ? opcode_timings_p6_mod3 : opcode_timings_p6; deps = mod3 ? opcode_deps_mod3 : opcode_deps; break; } diff --git a/src/cpu/codegen_timing_pentium.c b/src/cpu/codegen_timing_pentium.c index af344307f..aa78ee1c9 100644 --- a/src/cpu/codegen_timing_pentium.c +++ b/src/cpu/codegen_timing_pentium.c @@ -110,7 +110,7 @@ static uint32_t addr_regmask; static int fpu_latency; static int fpu_st_latency[8]; -static uint64_t opcode_timings[256] = { +static uint64_t opcode_timings_p6[256] = { // clang-format off /* ADD ADD ADD ADD*/ /*00*/ PAIR_UV | CYCLES_RMW, PAIR_UV | CYCLES_RMW, PAIR_UV | CYCLES_RM, PAIR_UV | CYCLES_RM, @@ -247,7 +247,7 @@ static uint64_t opcode_timings[256] = { // clang-format on }; -static uint64_t opcode_timings_mod3[256] = { +static uint64_t opcode_timings_p6_mod3[256] = { // clang-format off /* ADD ADD ADD ADD*/ /*00*/ PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, @@ -385,7 +385,7 @@ static uint64_t opcode_timings_mod3[256] = { // clang-format on }; -static uint64_t opcode_timings_0f[256] = { +static uint64_t opcode_timings_p6_0f[256] = { // clang-format off /*00*/ PAIR_NP | CYCLES(20), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(10), INVALID, PAIR_NP | CYCLES(195), PAIR_NP | CYCLES(7), INVALID, @@ -468,7 +468,7 @@ static uint64_t opcode_timings_0f[256] = { PAIR_U | CYCLES_RM, PAIR_U | CYCLES_RM, PAIR_U | CYCLES_RM, INVALID, // clang-format on }; -static uint64_t opcode_timings_0f_mod3[256] = { +static uint64_t opcode_timings_p6_0f_mod3[256] = { // clang-format off /*00*/ PAIR_NP | CYCLES(20), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(10), INVALID, PAIR_NP | CYCLES(195), PAIR_NP | CYCLES(7), INVALID, @@ -552,20 +552,20 @@ static uint64_t opcode_timings_0f_mod3[256] = { // clang-format on }; -static uint64_t opcode_timings_shift[8] = { +static uint64_t opcode_timings_p6_shift[8] = { // clang-format off PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, PAIR_U | CYCLES_RMW, // clang-format on }; -static uint64_t opcode_timings_shift_mod3[8] = { +static uint64_t opcode_timings_p6_shift_mod3[8] = { // clang-format off PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, PAIR_U | CYCLES_REG, // clang-format on }; -static uint64_t opcode_timings_f6[8] = { +static uint64_t opcode_timings_p6_f6[8] = { // clang-format off /* TST NOT NEG*/ PAIR_UV | CYCLES_RM, INVALID, PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3), @@ -573,7 +573,7 @@ static uint64_t opcode_timings_f6[8] = { PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(17), PAIR_NP | CYCLES(22) // clang-format on }; -static uint64_t opcode_timings_f6_mod3[8] = { +static uint64_t opcode_timings_p6_f6_mod3[8] = { // clang-format off /* TST NOT NEG*/ PAIR_UV | CYCLES_REG, INVALID, PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3), @@ -581,7 +581,7 @@ static uint64_t opcode_timings_f6_mod3[8] = { PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(11), PAIR_NP | CYCLES(17), PAIR_NP | CYCLES(22) // clang-format on }; -static uint64_t opcode_timings_f7[8] = { +static uint64_t opcode_timings_p6_f7[8] = { // clang-format off /* TST NOT NEG*/ PAIR_UV | CYCLES_RM, INVALID, PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3), @@ -589,7 +589,7 @@ static uint64_t opcode_timings_f7[8] = { PAIR_NP | CYCLES_MULTI(11,10), PAIR_NP | CYCLES_MULTI(11,10), PAIR_NP | CYCLES_MULTI(25,41), PAIR_NP | CYCLES_MULTI(30,46) // clang-format on }; -static uint64_t opcode_timings_f7_mod3[8] = { +static uint64_t opcode_timings_p6_f7_mod3[8] = { // clang-format off /* TST NOT NEG*/ PAIR_UV | CYCLES_REG, INVALID, PAIR_NP | CYCLES(3), PAIR_NP | CYCLES(3), @@ -597,7 +597,7 @@ static uint64_t opcode_timings_f7_mod3[8] = { PAIR_NP | CYCLES_MULTI(11,10), PAIR_NP | CYCLES_MULTI(11,10), PAIR_NP | CYCLES_MULTI(25,41), PAIR_NP | CYCLES_MULTI(30,46) // clang-format on }; -static uint64_t opcode_timings_ff[8] = { +static uint64_t opcode_timings_p6_ff[8] = { // clang-format off /* INC DEC CALL CALL far*/ PAIR_UV | CYCLES_RMW, PAIR_UV | CYCLES_RMW, PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(0), @@ -605,7 +605,7 @@ static uint64_t opcode_timings_ff[8] = { PAIR_NP | CYCLES(2), PAIR_NP | CYCLES(0), PAIR_NP | CYCLES(2), INVALID // clang-format on }; -static uint64_t opcode_timings_ff_mod3[8] = { +static uint64_t opcode_timings_p6_ff_mod3[8] = { // clang-format off /* INC DEC CALL CALL far*/ PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_NP | CYCLES(4), PAIR_NP | CYCLES(0), @@ -614,7 +614,7 @@ static uint64_t opcode_timings_ff_mod3[8] = { // clang-format on }; -static uint64_t opcode_timings_d8[8] = { +static uint64_t opcode_timings_p6_d8[8] = { // clang-format off /* FADDs FMULs FCOMs FCOMPs*/ PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0), @@ -622,7 +622,7 @@ static uint64_t opcode_timings_d8[8] = { PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(39,38,2), PAIR_FX | FPU_CYCLES(39,38,2) // clang-format on }; -static uint64_t opcode_timings_d8_mod3[8] = { +static uint64_t opcode_timings_p6_d8_mod3[8] = { // clang-format off /* FADD FMUL FCOM FCOMP*/ PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0), @@ -631,7 +631,7 @@ static uint64_t opcode_timings_d8_mod3[8] = { // clang-format on }; -static uint64_t opcode_timings_d9[8] = { +static uint64_t opcode_timings_p6_d9[8] = { // clang-format off /* FLDs FSTs FSTPs*/ PAIR_FX | FPU_CYCLES(1,0,0), INVALID, PAIR_NP | FPU_CYCLES(2,0,0), PAIR_NP | FPU_CYCLES(2,0,0), @@ -639,7 +639,7 @@ static uint64_t opcode_timings_d9[8] = { PAIR_NP | FPU_CYCLES(32,0,0), PAIR_NP | FPU_CYCLES(8,0,0), PAIR_NP | FPU_CYCLES(48,0,0), PAIR_NP | FPU_CYCLES(2,0,0) // clang-format on }; -static uint64_t opcode_timings_d9_mod3[64] = { +static uint64_t opcode_timings_p6_d9_mod3[64] = { // clang-format off /*FLD*/ PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0), @@ -672,7 +672,7 @@ static uint64_t opcode_timings_d9_mod3[64] = { // clang-format on }; -static uint64_t opcode_timings_da[8] = { +static uint64_t opcode_timings_p6_da[8] = { // clang-format off /* FIADDl FIMULl FICOMl FICOMPl*/ PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(4,0,0), PAIR_NP | FPU_CYCLES(4,0,0), @@ -680,7 +680,7 @@ static uint64_t opcode_timings_da[8] = { PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(42,38,2), PAIR_NP | FPU_CYCLES(42,38,2) // clang-format on }; -static uint64_t opcode_timings_da_mod3[8] = { +static uint64_t opcode_timings_p6_da_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FCOMPP*/ @@ -688,7 +688,7 @@ static uint64_t opcode_timings_da_mod3[8] = { // clang-format on }; -static uint64_t opcode_timings_db[8] = { +static uint64_t opcode_timings_p6_db[8] = { // clang-format off /* FLDil FSTil FSTPil*/ PAIR_NP | FPU_CYCLES(3,2,2), INVALID, PAIR_NP | FPU_CYCLES(6,0,0), PAIR_NP | FPU_CYCLES(6,0,0), @@ -696,7 +696,7 @@ static uint64_t opcode_timings_db[8] = { INVALID, PAIR_NP | FPU_CYCLES(3,0,0), INVALID, PAIR_NP | FPU_CYCLES(3,0,0) // clang-format on }; -static uint64_t opcode_timings_db_mod3[64] = { +static uint64_t opcode_timings_p6_db_mod3[64] = { // clang-format off INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -726,7 +726,7 @@ static uint64_t opcode_timings_db_mod3[64] = { // clang-format on }; -static uint64_t opcode_timings_dc[8] = { +static uint64_t opcode_timings_p6_dc[8] = { // clang-format off /* FADDd FMULd FCOMd FCOMPd*/ PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(1,0,0), PAIR_FX | FPU_CYCLES(1,0,0), @@ -734,7 +734,7 @@ static uint64_t opcode_timings_dc[8] = { PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(39,38,2), PAIR_FX | FPU_CYCLES(39,38,2) // clang-format on }; -static uint64_t opcode_timings_dc_mod3[8] = { +static uint64_t opcode_timings_p6_dc_mod3[8] = { // clang-format off /* opFADDr opFMULr*/ PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), INVALID, INVALID, @@ -743,7 +743,7 @@ static uint64_t opcode_timings_dc_mod3[8] = { // clang-format on }; -static uint64_t opcode_timings_dd[8] = { +static uint64_t opcode_timings_p6_dd[8] = { // clang-format off /* FLDd FSTd FSTPd*/ PAIR_FX | FPU_CYCLES(1,0,0), INVALID, PAIR_NP | FPU_CYCLES(2,0,0), PAIR_NP | FPU_CYCLES(2,0,0), @@ -751,7 +751,7 @@ static uint64_t opcode_timings_dd[8] = { PAIR_NP | FPU_CYCLES(70,0,0), INVALID, PAIR_NP | FPU_CYCLES(127,0,0), PAIR_NP | FPU_CYCLES(6,0,0) // clang-format on }; -static uint64_t opcode_timings_dd_mod3[8] = { +static uint64_t opcode_timings_p6_dd_mod3[8] = { // clang-format off /* FFFREE FST FSTP*/ PAIR_NP | FPU_CYCLES(2,0,0), INVALID, PAIR_NP | FPU_CYCLES(1,0,0), PAIR_NP | FPU_CYCLES(1,0,0), @@ -760,7 +760,7 @@ static uint64_t opcode_timings_dd_mod3[8] = { // clang-format on }; -static uint64_t opcode_timings_de[8] = { +static uint64_t opcode_timings_p6_de[8] = { // clang-format off /* FIADDw FIMULw FICOMw FICOMPw*/ PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(4,0,0), PAIR_NP | FPU_CYCLES(4,0,0), @@ -768,7 +768,7 @@ static uint64_t opcode_timings_de[8] = { PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(6,2,2), PAIR_NP | FPU_CYCLES(42,38,2), PAIR_NP | FPU_CYCLES(42,38,2) // clang-format on }; -static uint64_t opcode_timings_de_mod3[8] = { +static uint64_t opcode_timings_p6_de_mod3[8] = { // clang-format off /* FADDP FMULP FCOMPP*/ PAIR_FX | FPU_CYCLES(3,2,2), PAIR_FX | FPU_CYCLES(3,2,2), INVALID, PAIR_FX | FPU_CYCLES(1,0,0), @@ -777,7 +777,7 @@ static uint64_t opcode_timings_de_mod3[8] = { // clang-format on }; -static uint64_t opcode_timings_df[8] = { +static uint64_t opcode_timings_p6_df[8] = { // clang-format off /* FILDiw FISTiw FISTPiw*/ PAIR_NP | FPU_CYCLES(3,2,2), INVALID, PAIR_NP | FPU_CYCLES(6,0,0), PAIR_NP | FPU_CYCLES(6,0,0), @@ -785,7 +785,7 @@ static uint64_t opcode_timings_df[8] = { INVALID, PAIR_NP | FPU_CYCLES(3,2,2), PAIR_NP | FPU_CYCLES(148,0,0), PAIR_NP | FPU_CYCLES(6,0,0) // clang-format on }; -static uint64_t opcode_timings_df_mod3[8] = { +static uint64_t opcode_timings_p6_df_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FSTSW AX*/ @@ -793,25 +793,25 @@ static uint64_t opcode_timings_df_mod3[8] = { // clang-format on }; -static uint64_t opcode_timings_81[8] = { +static uint64_t opcode_timings_p6_81[8] = { // clang-format off PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RMW | CYCLES_IMM1632, PAIR_UV | CYCLES_RM | CYCLES_IMM1632 // clang-format on }; -static uint64_t opcode_timings_81_mod3[8] = { +static uint64_t opcode_timings_p6_81_mod3[8] = { // clang-format off PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG // clang-format on }; -static uint64_t opcode_timings_8x[8] = { +static uint64_t opcode_timings_p6_8x[8] = { // clang-format off PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RMW | CYCLES_IMM8, PAIR_UV | CYCLES_RM | CYCLES_IMM8 // clang-format on }; -static uint64_t opcode_timings_8x_mod3[8] = { +static uint64_t opcode_timings_p6_8x_mod3[8] = { // clang-format off PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG, PAIR_UV | CYCLES_REG @@ -1097,47 +1097,47 @@ codegen_timing_pentium_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS switch (last_prefix) { case 0x0f: - timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + timings = mod3 ? opcode_timings_p6_0f_mod3 : opcode_timings_p6_0f; deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: - timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8; + timings = mod3 ? opcode_timings_p6_d8_mod3 : opcode_timings_p6_d8; deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8; opcode = (opcode >> 3) & 7; break; case 0xd9: - timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9; + timings = mod3 ? opcode_timings_p6_d9_mod3 : opcode_timings_p6_d9; deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xda: - timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da; + timings = mod3 ? opcode_timings_p6_da_mod3 : opcode_timings_p6_da; deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da; opcode = (opcode >> 3) & 7; break; case 0xdb: - timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db; + timings = mod3 ? opcode_timings_p6_db_mod3 : opcode_timings_p6_db; deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xdc: - timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc; + timings = mod3 ? opcode_timings_p6_dc_mod3 : opcode_timings_p6_dc; deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc; opcode = (opcode >> 3) & 7; break; case 0xdd: - timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd; + timings = mod3 ? opcode_timings_p6_dd_mod3 : opcode_timings_p6_dd; deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd; opcode = (opcode >> 3) & 7; break; case 0xde: - timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de; + timings = mod3 ? opcode_timings_p6_de_mod3 : opcode_timings_p6_de; deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de; opcode = (opcode >> 3) & 7; break; case 0xdf: - timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df; + timings = mod3 ? opcode_timings_p6_df_mod3 : opcode_timings_p6_df; deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df; opcode = (opcode >> 3) & 7; break; @@ -1147,12 +1147,12 @@ codegen_timing_pentium_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS case 0x80: case 0x82: case 0x83: - timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x; + timings = mod3 ? opcode_timings_p6_8x_mod3 : opcode_timings_p6_8x; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; case 0x81: - timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81; + timings = mod3 ? opcode_timings_p6_81_mod3 : opcode_timings_p6_81; deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81; opcode = (fetchdat >> 3) & 7; break; @@ -1161,36 +1161,36 @@ codegen_timing_pentium_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS case 0xc1: case 0xd0: case 0xd1: - timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift; + timings = mod3 ? opcode_timings_p6_shift_mod3 : opcode_timings_p6_shift; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; case 0xd2: case 0xd3: - timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift; + timings = mod3 ? opcode_timings_p6_shift_mod3 : opcode_timings_p6_shift; deps = mod3 ? opcode_deps_shift_cl_mod3 : opcode_deps_shift_cl; opcode = (fetchdat >> 3) & 7; break; case 0xf6: - timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6; + timings = mod3 ? opcode_timings_p6_f6_mod3 : opcode_timings_p6_f6; deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6; opcode = (fetchdat >> 3) & 7; break; case 0xf7: - timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7; + timings = mod3 ? opcode_timings_p6_f7_mod3 : opcode_timings_p6_f7; deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7; opcode = (fetchdat >> 3) & 7; break; case 0xff: - timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff; + timings = mod3 ? opcode_timings_p6_ff_mod3 : opcode_timings_p6_ff; deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff; opcode = (fetchdat >> 3) & 7; break; default: - timings = mod3 ? opcode_timings_mod3 : opcode_timings; + timings = mod3 ? opcode_timings_p6_mod3 : opcode_timings_p6; deps = mod3 ? opcode_deps_mod3 : opcode_deps; break; } diff --git a/src/cpu/codegen_timing_winchip.c b/src/cpu/codegen_timing_winchip.c index 76ea8b954..3597517ce 100644 --- a/src/cpu/codegen_timing_winchip.c +++ b/src/cpu/codegen_timing_winchip.c @@ -18,7 +18,7 @@ #define CYCLES(c) (int *) c #define CYCLES2(c16, c32) (int *) ((-1 & ~0xffff) | c16 | (c32 << 8)) -static int *opcode_timings[256] = { +static int *opcode_timings_winchip[256] = { // clang-format off /*00*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), NULL, /*10*/ &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_mr, &timing_mr, &timing_rm, &timing_rm, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), @@ -42,7 +42,7 @@ static int *opcode_timings[256] = { // clang-format on }; -static int *opcode_timings_mod3[256] = { +static int *opcode_timings_winchip_mod3[256] = { // clang-format off /*00*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), NULL, /*10*/ &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, &timing_rr, CYCLES(2), CYCLES(3), @@ -66,7 +66,7 @@ static int *opcode_timings_mod3[256] = { // clang-format on }; -static int *opcode_timings_0f[256] = { +static int *opcode_timings_winchip_0f[256] = { // clang-format off /*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL, /*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -89,7 +89,7 @@ static int *opcode_timings_0f[256] = { /*f0*/ NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, NULL, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, &timing_rm, &timing_rm, &timing_rm, NULL, // clang-format on }; -static int *opcode_timings_0f_mod3[256] = { +static int *opcode_timings_winchip_0f_mod3[256] = { // clang-format off /*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), NULL, CYCLES(195), CYCLES(7), NULL, CYCLES(1000), CYCLES(10000), NULL, NULL, NULL, NULL, NULL, NULL, /*10*/ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -113,68 +113,68 @@ static int *opcode_timings_0f_mod3[256] = { // clang-format on }; -static int *opcode_timings_shift[8] = { +static int *opcode_timings_winchip_shift[8] = { // clang-format off CYCLES(7), CYCLES(7), CYCLES(10), CYCLES(10), CYCLES(7), CYCLES(7), CYCLES(7), CYCLES(7) // clang-format on }; -static int *opcode_timings_shift_mod3[8] = { +static int *opcode_timings_winchip_shift_mod3[8] = { // clang-format off CYCLES(3), CYCLES(3), CYCLES(9), CYCLES(9), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3) // clang-format on }; -static int *opcode_timings_f6[8] = { +static int *opcode_timings_winchip_f6[8] = { // clang-format off &timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19) // clang-format on }; -static int *opcode_timings_f6_mod3[8] = { +static int *opcode_timings_winchip_f6_mod3[8] = { // clang-format off &timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19) // clang-format on }; -static int *opcode_timings_f7[8] = { +static int *opcode_timings_winchip_f7[8] = { // clang-format off &timing_rm, NULL, &timing_mm, &timing_mm, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43) // clang-format on }; -static int *opcode_timings_f7_mod3[8] = { +static int *opcode_timings_winchip_f7_mod3[8] = { // clang-format off &timing_rr, NULL, &timing_rr, &timing_rr, CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43) // clang-format on }; -static int *opcode_timings_ff[8] = { +static int *opcode_timings_winchip_ff[8] = { // clang-format off &timing_mm, &timing_mm, CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), NULL // clang-format on }; -static int *opcode_timings_ff_mod3[8] = { +static int *opcode_timings_winchip_ff_mod3[8] = { // clang-format off &timing_rr, &timing_rr, CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), NULL // clang-format on }; -static int *opcode_timings_d8[8] = { +static int *opcode_timings_winchip_d8[8] = { // clang-format off /* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/ CYCLES(10), CYCLES(12), CYCLES(9), CYCLES(9), CYCLES(10), CYCLES(10), CYCLES(78), CYCLES(78) // clang-format on }; -static int *opcode_timings_d8_mod3[8] = { +static int *opcode_timings_winchip_d8_mod3[8] = { // clang-format off /* FADD FMUL FCOM FCOMP FSUB FSUBR FDIV FDIVR*/ CYCLES(4), CYCLES(6), CYCLES(3), CYCLES(3), CYCLES(4), CYCLES(4), CYCLES(72), CYCLES(72) // clang-format on }; -static int *opcode_timings_d9[8] = { +static int *opcode_timings_winchip_d9[8] = { // clang-format off /* FLDs FSTs FSTPs FLDENV FLDCW FSTENV FSTCW*/ CYCLES(2), NULL, CYCLES(7), CYCLES(7), CYCLES(34), CYCLES(4), CYCLES(67), CYCLES(3) // clang-format on }; -static int *opcode_timings_d9_mod3[64] = { +static int *opcode_timings_winchip_d9_mod3[64] = { // clang-format off /*FLD*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), @@ -195,25 +195,25 @@ static int *opcode_timings_d9_mod3[64] = { // clang-format on }; -static int *opcode_timings_da[8] = { +static int *opcode_timings_winchip_da[8] = { // clang-format off /* FADDil FMULil FCOMil FCOMPil FSUBil FSUBRil FDIVil FDIVRil*/ CYCLES(10), CYCLES(12), CYCLES(9), CYCLES(9), CYCLES(10), CYCLES(10), CYCLES(78), CYCLES(78) // clang-format on }; -static int *opcode_timings_da_mod3[8] = { +static int *opcode_timings_winchip_da_mod3[8] = { // clang-format off NULL, NULL, NULL, NULL, NULL, CYCLES(5), NULL, NULL // clang-format on }; -static int *opcode_timings_db[8] = { +static int *opcode_timings_winchip_db[8] = { // clang-format off /* FLDil FSTil FSTPil FLDe FSTPe*/ CYCLES(6), NULL, CYCLES(7), CYCLES(7), NULL, CYCLES(8), NULL, CYCLES(8) // clang-format on }; -static int *opcode_timings_db_mod3[64] = { +static int *opcode_timings_winchip_db_mod3[64] = { // clang-format off NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -227,71 +227,71 @@ static int *opcode_timings_db_mod3[64] = { // clang-format on }; -static int *opcode_timings_dc[8] = { +static int *opcode_timings_winchip_dc[8] = { // clang-format off /* opFADDd_a16 opFMULd_a16 opFCOMd_a16 opFCOMPd_a16 opFSUBd_a16 opFSUBRd_a16 opFDIVd_a16 opFDIVRd_a16*/ CYCLES(6), CYCLES(8), CYCLES(5), CYCLES(5), CYCLES(6), CYCLES(6), CYCLES(74), CYCLES(74) // clang-format on }; -static int *opcode_timings_dc_mod3[8] = { +static int *opcode_timings_winchip_dc_mod3[8] = { // clang-format off /* opFADDr opFMULr opFSUBRr opFSUBr opFDIVRr opFDIVr*/ CYCLES(4), CYCLES(6), NULL, NULL, CYCLES(4), CYCLES(4), CYCLES(72), CYCLES(72) // clang-format on }; -static int *opcode_timings_dd[8] = { +static int *opcode_timings_winchip_dd[8] = { // clang-format off /* FLDd FSTd FSTPd FRSTOR FSAVE FSTSW*/ CYCLES(2), NULL, CYCLES(8), CYCLES(8), CYCLES(131), NULL, CYCLES(154), CYCLES(5) // clang-format on }; -static int *opcode_timings_dd_mod3[8] = { +static int *opcode_timings_winchip_dd_mod3[8] = { // clang-format off /* FFFREE FST FSTP FUCOM FUCOMP*/ CYCLES(3), NULL, CYCLES(1), CYCLES(1), CYCLES(3), CYCLES(3), NULL, NULL // clang-format on }; -static int *opcode_timings_de[8] = { +static int *opcode_timings_winchip_de[8] = { // clang-format off /* FADDiw FMULiw FCOMiw FCOMPiw FSUBil FSUBRil FDIVil FDIVRil*/ CYCLES(10), CYCLES(12), CYCLES(9), CYCLES(9), CYCLES(10), CYCLES(10), CYCLES(78), CYCLES(78) // clang-format on }; -static int *opcode_timings_de_mod3[8] = { +static int *opcode_timings_winchip_de_mod3[8] = { // clang-format off /* FADD FMUL FCOMPP FSUB FSUBR FDIV FDIVR*/ CYCLES(4), CYCLES(6), NULL, CYCLES(3), CYCLES(4), CYCLES(4), CYCLES(72), CYCLES(72) // clang-format on }; -static int *opcode_timings_df[8] = { +static int *opcode_timings_winchip_df[8] = { // clang-format off /* FILDiw FISTiw FISTPiw FILDiq FBSTP FISTPiq*/ CYCLES(6), NULL, CYCLES(7), CYCLES(7), NULL, CYCLES(8), CYCLES(172), CYCLES(8) // clang-format on }; -static int *opcode_timings_df_mod3[8] = { +static int *opcode_timings_winchip_df_mod3[8] = { // clang-format off /* FFREE FST FSTP FUCOM FUCOMP*/ CYCLES(3), NULL, CYCLES(1), CYCLES(1), CYCLES(3), CYCLES(3), NULL, NULL // clang-format on }; -static int *opcode_timings_8x[8] = { +static int *opcode_timings_winchip_8x[8] = { // clang-format off &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm }; -static int *opcode_timings_8x_mod3[8] = +static int *opcode_timings_winchip_8x_mod3[8] = { &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm }; -static int *opcode_timings_81[8] = +static int *opcode_timings_winchip_81[8] = { &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm }; -static int *opcode_timings_81_mod3[8] = +static int *opcode_timings_winchip_81_mod3[8] = { &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_mr, &timing_rm // clang-format on @@ -330,7 +330,7 @@ codegen_timing_winchip_start(void) void codegen_timing_winchip_prefix(uint8_t prefix, uint32_t fetchdat) { - timing_count += COUNT(opcode_timings[prefix], 0); + timing_count += COUNT(opcode_timings_winchip[prefix], 0); last_prefix = prefix; } @@ -344,47 +344,47 @@ codegen_timing_winchip_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS switch (last_prefix) { case 0x0f: - timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + timings = mod3 ? opcode_timings_winchip_0f_mod3 : opcode_timings_winchip_0f; deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: - timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8; + timings = mod3 ? opcode_timings_winchip_d8_mod3 : opcode_timings_winchip_d8; deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8; opcode = (opcode >> 3) & 7; break; case 0xd9: - timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9; + timings = mod3 ? opcode_timings_winchip_d9_mod3 : opcode_timings_winchip_d9; deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xda: - timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da; + timings = mod3 ? opcode_timings_winchip_da_mod3 : opcode_timings_winchip_da; deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da; opcode = (opcode >> 3) & 7; break; case 0xdb: - timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db; + timings = mod3 ? opcode_timings_winchip_db_mod3 : opcode_timings_winchip_db; deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xdc: - timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc; + timings = mod3 ? opcode_timings_winchip_dc_mod3 : opcode_timings_winchip_dc; deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc; opcode = (opcode >> 3) & 7; break; case 0xdd: - timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd; + timings = mod3 ? opcode_timings_winchip_dd_mod3 : opcode_timings_winchip_dd; deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd; opcode = (opcode >> 3) & 7; break; case 0xde: - timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de; + timings = mod3 ? opcode_timings_winchip_de_mod3 : opcode_timings_winchip_de; deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de; opcode = (opcode >> 3) & 7; break; case 0xdf: - timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df; + timings = mod3 ? opcode_timings_winchip_df_mod3 : opcode_timings_winchip_df; deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df; opcode = (opcode >> 3) & 7; break; @@ -394,12 +394,12 @@ codegen_timing_winchip_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS case 0x80: case 0x82: case 0x83: - timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x; + timings = mod3 ? opcode_timings_winchip_8x_mod3 : opcode_timings_winchip_8x; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; case 0x81: - timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81; + timings = mod3 ? opcode_timings_winchip_81_mod3 : opcode_timings_winchip_81; deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81; opcode = (fetchdat >> 3) & 7; break; @@ -410,29 +410,29 @@ codegen_timing_winchip_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNUS case 0xd1: case 0xd2: case 0xd3: - timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift; + timings = mod3 ? opcode_timings_winchip_shift_mod3 : opcode_timings_winchip_shift; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; case 0xf6: - timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6; + timings = mod3 ? opcode_timings_winchip_f6_mod3 : opcode_timings_winchip_f6; deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6; opcode = (fetchdat >> 3) & 7; break; case 0xf7: - timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7; + timings = mod3 ? opcode_timings_winchip_f7_mod3 : opcode_timings_winchip_f7; deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7; opcode = (fetchdat >> 3) & 7; break; case 0xff: - timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff; + timings = mod3 ? opcode_timings_winchip_ff_mod3 : opcode_timings_winchip_ff; deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff; opcode = (fetchdat >> 3) & 7; break; default: - timings = mod3 ? opcode_timings_mod3 : opcode_timings; + timings = mod3 ? opcode_timings_winchip_mod3 : opcode_timings_winchip; deps = mod3 ? opcode_deps_mod3 : opcode_deps; break; } diff --git a/src/cpu/codegen_timing_winchip2.c b/src/cpu/codegen_timing_winchip2.c index ea206f068..f37fe3366 100644 --- a/src/cpu/codegen_timing_winchip2.c +++ b/src/cpu/codegen_timing_winchip2.c @@ -63,7 +63,7 @@ #define INVALID 0 -static uint32_t opcode_timings[256] = { +static uint32_t opcode_timings_winchip2[256] = { // clang-format off /*00*/ CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES(1), CYCLES(2), INVALID, /*10*/ CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), @@ -87,7 +87,7 @@ static uint32_t opcode_timings[256] = { // clang-format on }; -static uint32_t opcode_timings_mod3[256] = { +static uint32_t opcode_timings_winchip2_mod3[256] = { // clang-format off /*00*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), INVALID, /*10*/ CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(1), CYCLES(2), CYCLES(3), @@ -111,7 +111,7 @@ static uint32_t opcode_timings_mod3[256] = { // clang-format on }; -static uint32_t opcode_timings_0f[256] = { +static uint32_t opcode_timings_winchip2_0f[256] = { // clang-format off /*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), INVALID, CYCLES(195), CYCLES(7), INVALID, CYCLES(1000), CYCLES(10000), INVALID, INVALID, INVALID, CYCLES_3DNOW(1), CYCLES(1), CYCLES_3DNOW(1), /*10*/ INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -134,7 +134,7 @@ static uint32_t opcode_timings_0f[256] = { /*f0*/ INVALID, CYCLES_MMX_SHIFT(2), CYCLES_MMX_SHIFT(2), CYCLES_MMX_SHIFT(2), INVALID, CYCLES_MMX_MUL(2), INVALID, INVALID, CYCLES_MMX_ANY(2), CYCLES_MMX_ANY(2), CYCLES_MMX_ANY(2), INVALID, CYCLES_MMX_ANY(2), CYCLES_MMX_ANY(2), CYCLES_MMX_ANY(2), INVALID, // clang-format on }; -static uint32_t opcode_timings_0f_mod3[256] = { +static uint32_t opcode_timings_winchip2_0f_mod3[256] = { // clang-format off /*00*/ CYCLES(20), CYCLES(11), CYCLES(11), CYCLES(10), INVALID, CYCLES(195), CYCLES(7), INVALID, CYCLES(1000), CYCLES(10000), INVALID, INVALID, INVALID, CYCLES_3DNOW(1), CYCLES(1), CYCLES_3DNOW(1), /*10*/ INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -158,49 +158,49 @@ static uint32_t opcode_timings_0f_mod3[256] = { // clang-format on }; -static uint32_t opcode_timings_shift[8] = { +static uint32_t opcode_timings_winchip2_shift[8] = { // clang-format off CYCLES(7), CYCLES(7), CYCLES(10), CYCLES(10), CYCLES(7), CYCLES(7), CYCLES(7), CYCLES(7) // clang-format on }; -static uint32_t opcode_timings_shift_mod3[8] = { +static uint32_t opcode_timings_winchip2_shift_mod3[8] = { // clang-format off CYCLES(3), CYCLES(3), CYCLES(9), CYCLES(9), CYCLES(3), CYCLES(3), CYCLES(3), CYCLES(3) // clang-format on }; -static uint32_t opcode_timings_f6[8] = { +static uint32_t opcode_timings_winchip2_f6[8] = { // clang-format off CYCLES(2), INVALID, CYCLES(2), CYCLES(2), CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19) // clang-format on }; -static uint32_t opcode_timings_f6_mod3[8] = { +static uint32_t opcode_timings_winchip2_f6_mod3[8] = { // clang-format off CYCLES(1), INVALID, CYCLES(1), CYCLES(1), CYCLES(13), CYCLES(14), CYCLES(16), CYCLES(19) // clang-format on }; -static uint32_t opcode_timings_f7[8] = { +static uint32_t opcode_timings_winchip2_f7[8] = { // clang-format off CYCLES(2), INVALID, CYCLES(2), CYCLES(2), CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43) // clang-format on }; -static uint32_t opcode_timings_f7_mod3[8] = { +static uint32_t opcode_timings_winchip2_f7_mod3[8] = { // clang-format off CYCLES(1), INVALID, CYCLES(1), CYCLES(1), CYCLES(21), CYCLES2(22,38), CYCLES2(24,40), CYCLES2(27,43) // clang-format on }; -static uint32_t opcode_timings_ff[8] = { +static uint32_t opcode_timings_winchip2_ff[8] = { // clang-format off CYCLES(2), CYCLES(2), CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), INVALID // clang-format on }; -static uint32_t opcode_timings_ff_mod3[8] = { +static uint32_t opcode_timings_winchip2_ff_mod3[8] = { // clang-format off CYCLES(1), CYCLES(1), CYCLES(5), CYCLES(0), CYCLES(5), CYCLES(0), CYCLES(5), INVALID // clang-format on }; -static uint32_t opcode_timings_d8[8] = { +static uint32_t opcode_timings_winchip2_d8[8] = { // clang-format off /* FADDs FMULs FCOMs FCOMPs*/ FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), @@ -208,7 +208,7 @@ static uint32_t opcode_timings_d8[8] = { FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(39,38,2), FPU_CYCLES(39,38,2) // clang-format on }; -static uint32_t opcode_timings_d8_mod3[8] = { +static uint32_t opcode_timings_winchip2_d8_mod3[8] = { // clang-format off /* FADD FMUL FCOM FCOMP*/ FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), @@ -217,7 +217,7 @@ static uint32_t opcode_timings_d8_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_d9[8] = { +static uint32_t opcode_timings_winchip2_d9[8] = { // clang-format off /* FLDs FSTs FSTPs*/ FPU_CYCLES(1,0,0), INVALID, FPU_CYCLES(2,0,0), FPU_CYCLES(2,0,0), @@ -225,7 +225,7 @@ static uint32_t opcode_timings_d9[8] = { FPU_CYCLES(32,0,0), FPU_CYCLES(8,0,0), FPU_CYCLES(48,0,0), FPU_CYCLES(2,0,0) // clang-format on }; -static uint32_t opcode_timings_d9_mod3[64] = { +static uint32_t opcode_timings_winchip2_d9_mod3[64] = { // clang-format off /*FLD*/ FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), @@ -258,7 +258,7 @@ static uint32_t opcode_timings_d9_mod3[64] = { // clang-format on }; -static uint32_t opcode_timings_da[8] = { +static uint32_t opcode_timings_winchip2_da[8] = { // clang-format off /* FIADDl FIMULl FICOMl FICOMPl*/ FPU_CYCLES(6,2,2), FPU_CYCLES(6,2,2), FPU_CYCLES(4,0,0), FPU_CYCLES(4,0,0), @@ -266,7 +266,7 @@ static uint32_t opcode_timings_da[8] = { FPU_CYCLES(6,2,2), FPU_CYCLES(6,2,2), FPU_CYCLES(42,38,2), FPU_CYCLES(42,38,2) // clang-format on }; -static uint32_t opcode_timings_da_mod3[8] = { +static uint32_t opcode_timings_winchip2_da_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FCOMPP*/ @@ -274,7 +274,7 @@ static uint32_t opcode_timings_da_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_db[8] = { +static uint32_t opcode_timings_winchip2_db[8] = { // clang-format off /* FLDil FSTil FSTPil*/ FPU_CYCLES(3,2,2), INVALID, FPU_CYCLES(6,0,0), FPU_CYCLES(6,0,0), @@ -282,7 +282,7 @@ static uint32_t opcode_timings_db[8] = { INVALID, FPU_CYCLES(3,0,0), INVALID, FPU_CYCLES(3,0,0) // clang-format on }; -static uint32_t opcode_timings_db_mod3[64] = { +static uint32_t opcode_timings_winchip2_db_mod3[64] = { // clang-format off INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, @@ -312,7 +312,7 @@ static uint32_t opcode_timings_db_mod3[64] = { // clang-format on }; -static uint32_t opcode_timings_dc[8] = { +static uint32_t opcode_timings_winchip2_dc[8] = { // clang-format off /* FADDd FMULd FCOMd FCOMPd*/ FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), @@ -320,7 +320,7 @@ static uint32_t opcode_timings_dc[8] = { FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), FPU_CYCLES(39,38,2), FPU_CYCLES(39,38,2) // clang-format on }; -static uint32_t opcode_timings_dc_mod3[8] = { +static uint32_t opcode_timings_winchip2_dc_mod3[8] = { // clang-format off /* opFADDr opFMULr*/ FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2),INVALID, INVALID, @@ -329,7 +329,7 @@ static uint32_t opcode_timings_dc_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_dd[8] = { +static uint32_t opcode_timings_winchip2_dd[8] = { // clang-format off /* FLDd FSTd FSTPd*/ FPU_CYCLES(1,0,0), INVALID, FPU_CYCLES(2,0,0), FPU_CYCLES(2,0,0), @@ -337,7 +337,7 @@ static uint32_t opcode_timings_dd[8] = { FPU_CYCLES(70,0,0), INVALID, FPU_CYCLES(127,0,0), FPU_CYCLES(6,0,0) // clang-format on }; -static uint32_t opcode_timings_dd_mod3[8] = { +static uint32_t opcode_timings_winchip2_dd_mod3[8] = { // clang-format off /* FFFREE FST FSTP*/ FPU_CYCLES(2,0,0), INVALID, FPU_CYCLES(1,0,0), FPU_CYCLES(1,0,0), @@ -346,7 +346,7 @@ static uint32_t opcode_timings_dd_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_de[8] = { +static uint32_t opcode_timings_winchip2_de[8] = { // clang-format off /* FIADDw FIMULw FICOMw FICOMPw*/ FPU_CYCLES(6,2,2), FPU_CYCLES(6,2,2), FPU_CYCLES(4,0,0), FPU_CYCLES(4,0,0), @@ -354,7 +354,7 @@ static uint32_t opcode_timings_de[8] = { FPU_CYCLES(6,2,2), FPU_CYCLES(6,2,2), FPU_CYCLES(42,38,2), FPU_CYCLES(42,38,2) // clang-format on }; -static uint32_t opcode_timings_de_mod3[8] = { +static uint32_t opcode_timings_winchip2_de_mod3[8] = { // clang-format off /* FADDP FMULP FCOMPP*/ FPU_CYCLES(3,2,2), FPU_CYCLES(3,2,2), INVALID, FPU_CYCLES(1,0,0), @@ -363,7 +363,7 @@ static uint32_t opcode_timings_de_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_df[8] = { +static uint32_t opcode_timings_winchip2_df[8] = { // clang-format off /* FILDiw FISTiw FISTPiw*/ FPU_CYCLES(3,2,2), INVALID, FPU_CYCLES(6,0,0), FPU_CYCLES(6,0,0), @@ -371,7 +371,7 @@ static uint32_t opcode_timings_df[8] = { INVALID, FPU_CYCLES(3,2,2), FPU_CYCLES(148,0,0), FPU_CYCLES(6,0,0) // clang-format on }; -static uint32_t opcode_timings_df_mod3[8] = { +static uint32_t opcode_timings_winchip2_df_mod3[8] = { // clang-format off INVALID, INVALID, INVALID, INVALID, /* FSTSW AX*/ @@ -379,22 +379,22 @@ static uint32_t opcode_timings_df_mod3[8] = { // clang-format on }; -static uint32_t opcode_timings_8x[8] = { +static uint32_t opcode_timings_winchip2_8x[8] = { // clang-format off CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2) // clang-format on }; -static uint32_t opcode_timings_8x_mod3[8] = { +static uint32_t opcode_timings_winchip2_8x_mod3[8] = { // clang-format off CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2) // clang-format on }; -static uint32_t opcode_timings_81[8] = { +static uint32_t opcode_timings_winchip2_81[8] = { // clang-format off CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2) // clang-format on }; -static uint32_t opcode_timings_81_mod3[8] = { +static uint32_t opcode_timings_winchip2_81_mod3[8] = { // clang-format off CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2), CYCLES(2) // clang-format on @@ -613,47 +613,47 @@ codegen_timing_winchip2_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNU switch (last_prefix) { case 0x0f: - timings = mod3 ? opcode_timings_0f_mod3 : opcode_timings_0f; + timings = mod3 ? opcode_timings_winchip2_0f_mod3 : opcode_timings_winchip2_0f; deps = mod3 ? opcode_deps_0f_mod3 : opcode_deps_0f; break; case 0xd8: - timings = mod3 ? opcode_timings_d8_mod3 : opcode_timings_d8; + timings = mod3 ? opcode_timings_winchip2_d8_mod3 : opcode_timings_winchip2_d8; deps = mod3 ? opcode_deps_d8_mod3 : opcode_deps_d8; opcode = (opcode >> 3) & 7; break; case 0xd9: - timings = mod3 ? opcode_timings_d9_mod3 : opcode_timings_d9; + timings = mod3 ? opcode_timings_winchip2_d9_mod3 : opcode_timings_winchip2_d9; deps = mod3 ? opcode_deps_d9_mod3 : opcode_deps_d9; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xda: - timings = mod3 ? opcode_timings_da_mod3 : opcode_timings_da; + timings = mod3 ? opcode_timings_winchip2_da_mod3 : opcode_timings_winchip2_da; deps = mod3 ? opcode_deps_da_mod3 : opcode_deps_da; opcode = (opcode >> 3) & 7; break; case 0xdb: - timings = mod3 ? opcode_timings_db_mod3 : opcode_timings_db; + timings = mod3 ? opcode_timings_winchip2_db_mod3 : opcode_timings_winchip2_db; deps = mod3 ? opcode_deps_db_mod3 : opcode_deps_db; opcode = mod3 ? opcode & 0x3f : (opcode >> 3) & 7; break; case 0xdc: - timings = mod3 ? opcode_timings_dc_mod3 : opcode_timings_dc; + timings = mod3 ? opcode_timings_winchip2_dc_mod3 : opcode_timings_winchip2_dc; deps = mod3 ? opcode_deps_dc_mod3 : opcode_deps_dc; opcode = (opcode >> 3) & 7; break; case 0xdd: - timings = mod3 ? opcode_timings_dd_mod3 : opcode_timings_dd; + timings = mod3 ? opcode_timings_winchip2_dd_mod3 : opcode_timings_winchip2_dd; deps = mod3 ? opcode_deps_dd_mod3 : opcode_deps_dd; opcode = (opcode >> 3) & 7; break; case 0xde: - timings = mod3 ? opcode_timings_de_mod3 : opcode_timings_de; + timings = mod3 ? opcode_timings_winchip2_de_mod3 : opcode_timings_winchip2_de; deps = mod3 ? opcode_deps_de_mod3 : opcode_deps_de; opcode = (opcode >> 3) & 7; break; case 0xdf: - timings = mod3 ? opcode_timings_df_mod3 : opcode_timings_df; + timings = mod3 ? opcode_timings_winchip2_df_mod3 : opcode_timings_winchip2_df; deps = mod3 ? opcode_deps_df_mod3 : opcode_deps_df; opcode = (opcode >> 3) & 7; break; @@ -663,12 +663,12 @@ codegen_timing_winchip2_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNU case 0x80: case 0x82: case 0x83: - timings = mod3 ? opcode_timings_8x_mod3 : opcode_timings_8x; + timings = mod3 ? opcode_timings_winchip2_8x_mod3 : opcode_timings_winchip2_8x; deps = mod3 ? opcode_deps_8x_mod3 : opcode_deps_8x; opcode = (fetchdat >> 3) & 7; break; case 0x81: - timings = mod3 ? opcode_timings_81_mod3 : opcode_timings_81; + timings = mod3 ? opcode_timings_winchip2_81_mod3 : opcode_timings_winchip2_81; deps = mod3 ? opcode_deps_81_mod3 : opcode_deps_81; opcode = (fetchdat >> 3) & 7; break; @@ -679,29 +679,29 @@ codegen_timing_winchip2_opcode(uint8_t opcode, uint32_t fetchdat, int op_32, UNU case 0xd1: case 0xd2: case 0xd3: - timings = mod3 ? opcode_timings_shift_mod3 : opcode_timings_shift; + timings = mod3 ? opcode_timings_winchip2_shift_mod3 : opcode_timings_winchip2_shift; deps = mod3 ? opcode_deps_shift_mod3 : opcode_deps_shift; opcode = (fetchdat >> 3) & 7; break; case 0xf6: - timings = mod3 ? opcode_timings_f6_mod3 : opcode_timings_f6; + timings = mod3 ? opcode_timings_winchip2_f6_mod3 : opcode_timings_winchip2_f6; deps = mod3 ? opcode_deps_f6_mod3 : opcode_deps_f6; opcode = (fetchdat >> 3) & 7; break; case 0xf7: - timings = mod3 ? opcode_timings_f7_mod3 : opcode_timings_f7; + timings = mod3 ? opcode_timings_winchip2_f7_mod3 : opcode_timings_winchip2_f7; deps = mod3 ? opcode_deps_f7_mod3 : opcode_deps_f7; opcode = (fetchdat >> 3) & 7; break; case 0xff: - timings = mod3 ? opcode_timings_ff_mod3 : opcode_timings_ff; + timings = mod3 ? opcode_timings_winchip2_ff_mod3 : opcode_timings_winchip2_ff; deps = mod3 ? opcode_deps_ff_mod3 : opcode_deps_ff; opcode = (fetchdat >> 3) & 7; break; default: - timings = mod3 ? opcode_timings_mod3 : opcode_timings; + timings = mod3 ? opcode_timings_winchip2_mod3 : opcode_timings_winchip2; deps = mod3 ? opcode_deps_mod3 : opcode_deps; break; } From bc4e33f09f312580b791979c814e7bc61ce20192 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Mon, 12 Aug 2024 20:53:02 -0400 Subject: [PATCH 317/624] fix cmake for the no dynarec case Temp test --- src/CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 4b3da5791..0841fabdd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -139,8 +139,10 @@ include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) include_directories(include) if(NEW_DYNAREC) include_directories(cpu codegen_new) -else() +elseif(DYNAREC) include_directories(cpu codegen) +else() + include_directories(cpu) endif() add_subdirectory(cdrom) @@ -149,7 +151,7 @@ add_subdirectory(chipset) add_subdirectory(cpu) if(NEW_DYNAREC) add_subdirectory(codegen_new) -else() +elseif(DYNAREC) add_subdirectory(codegen) endif() From 70c622aecdd9e730b8baaf0aa420629318a5d1af Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 14 Aug 2024 19:24:55 +0200 Subject: [PATCH 318/624] S3 ViRGE class: Rethreading for future investigation. --- src/video/vid_s3_virge.c | 213 ++++++++++++++++++++++++--------------- 1 file changed, 133 insertions(+), 80 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index d2f99ba14..3ad183468 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -58,7 +58,7 @@ static int dither[4][4] = { #define FIFO_ENTRIES (virge->fifo_write_idx - virge->fifo_read_idx) #define FIFO_FULL ((virge->fifo_write_idx - virge->fifo_read_idx) >= FIFO_SIZE) -#define FIFO_EMPTY (virge->fifo_read_idx == virge->fifo_write_idx) +#define FIFO_NOT_EMPTY (virge->fifo_read_idx < virge->fifo_write_idx) #define FIFO_TYPE 0xff000000 #define FIFO_ADDR 0x00ffffff @@ -74,9 +74,6 @@ static int dither[4][4] = { #define ROM_DIAMOND_STEALTH3D_4000 "roms/video/s3virge/86c357.bin" #define ROM_TRIO3D2X "roms/video/s3virge/TRIO3D2X_8mbsdr.VBI" -#define FIFO_STATE_IDLE 0 -#define FIFO_STATE_RUN 1 - enum { S3_VIRGE_325, S3_DIAMOND_STEALTH3D_2000, @@ -278,18 +275,22 @@ typedef struct virge_t { uint64_t blitter_time; int fifo_slots_num; - struct { - uint32_t addr_type; - uint32_t val; - } fifo[FIFO_SIZE]; + fifo_entry_t fifo[FIFO_SIZE]; + atomic_int fifo_write_idx, fifo_read_idx; - - pc_timer_t fifo_timer; - pc_timer_t render_timer; - atomic_int virge_busy; + + uint8_t render_thread_run; + thread_t *render_thread; + event_t *wake_render_thread; + event_t *not_full_event; + + uint8_t fifo_thread_run; + thread_t *fifo_thread; + event_t *wake_fifo_thread; + event_t *fifo_not_full_event; + int local; - int fifo_state; uint8_t subsys_stat, subsys_cntl, advfunc_cntl; @@ -297,8 +298,6 @@ typedef struct virge_t { void *i2c, *ddc; - int waiting; - int onboard; } virge_t; @@ -323,6 +322,8 @@ static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv); static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv); static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv); +static void s3_virge_fifo_thread(void *priv); + enum { CMD_SET_AE = 1, CMD_SET_HC = (1 << 1), @@ -395,12 +396,42 @@ s3_virge_log(const char *fmt, ...) # define s3_virge_log(fmt, ...) #endif +static __inline void +s3_virge_wake_fifo_thread(virge_t *virge) +{ + thread_set_event(virge->wake_fifo_thread); /*Wake up FIFO thread if moving from idle*/ +} + +static void +s3_virge_wait_fifo_idle(virge_t *virge) +{ + while (FIFO_NOT_EMPTY) { + s3_virge_wake_fifo_thread(virge); + thread_wait_event(virge->fifo_not_full_event, 1); + } +} + +static void +s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) +{ + if (FIFO_FULL) { + thread_reset_event(virge->fifo_not_full_event); + thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } + virge->fifo[virge->fifo_write_idx].val = val; + virge->fifo[virge->fifo_write_idx].addr_type = (addr & FIFO_ADDR) | type; + + virge->fifo_write_idx++; + if ((FIFO_ENTRIES < 8) || (FIFO_ENTRIES > 0xe000)) + s3_virge_wake_fifo_thread(virge); +} + static void queue_triangle(virge_t *virge) { if (RB_FULL) { - s3_virge_log("RB FULL, TBD.\n"); - return; + thread_reset_event(virge->not_full_event); + thread_wait_event(virge->not_full_event, -1); /*Wait for room in ringbuffer*/ } virge->s3d_buffer[virge->s3d_write_idx] = virge->s3d_tri; @@ -409,7 +440,7 @@ queue_triangle(virge_t *virge) virge->s3d_write_idx = 0; if (!virge->s3d_busy) - timer_set_delay_u64(&virge->render_timer, 100 * TIMER_USEC); + thread_set_event(virge->wake_render_thread); /*Wake up render thread if moving from idle*/ } static void @@ -422,25 +453,27 @@ s3_virge_update_irqs(virge_t *virge) } static void -s3_virge_render_timer(void *priv) +s3_virge_render_thread(void *priv) { virge_t *virge = (virge_t *) priv; - virge->s3d_busy = 1; - while (virge->s3d_read_idx < virge->s3d_write_idx) { - s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx]); - virge->s3d_read_idx++; - if (virge->s3d_read_idx >= RB_SIZE) - virge->s3d_read_idx = 0; + if (virge->render_thread_run) { + thread_wait_event(virge->wake_render_thread, -1); + thread_reset_event(virge->wake_render_thread); + virge->s3d_busy = 1; + while (virge->s3d_read_idx < virge->s3d_write_idx) { + s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx]); + virge->s3d_read_idx++; + if (virge->s3d_read_idx >= RB_SIZE) + virge->s3d_read_idx = 0; - if (RB_ENTRIES == RB_MASK) - timer_disable(&virge->render_timer); + if (RB_ENTRIES == RB_MASK) + thread_set_event(virge->not_full_event); + } + virge->s3d_busy = 0; + virge->subsys_stat |= INT_S3D_DONE; + s3_virge_update_irqs(virge); } - virge->s3d_busy = 0; - virge->s3d_read_idx = 0; - virge->s3d_write_idx = 0; - virge->subsys_stat |= INT_S3D_DONE; - s3_virge_update_irqs(virge); } static void @@ -1387,7 +1420,7 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) case 0xad00: /*2D Polygon Command Set*/ virge->s3d.cmd_set = val; if (!(val & CMD_SET_AE)) { - s3_virge_log("MMIO WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); + pclog("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; @@ -1403,7 +1436,7 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) virge->s3d.rdest_x = (val >> 16) & 0x7ff; virge->s3d.rdest_y = val & 0x7ff; if (virge->s3d.cmd_set & CMD_SET_AE) { - s3_virge_log("MMIO WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); + pclog("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; @@ -1424,7 +1457,7 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) virge->s3d.lycnt = val & 0x7ff; virge->s3d.line_dir = val >> 31; if (virge->s3d.cmd_set & CMD_SET_AE) { - s3_virge_log("MMIO WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); + pclog("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; @@ -1447,7 +1480,7 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) case 0xad7c: /*2D Polygon Y Count*/ virge->s3d.pycnt = val & 0x300007ff; if (virge->s3d.cmd_set & CMD_SET_AE) { - s3_virge_log("MMIO WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); + pclog("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; @@ -1619,19 +1652,19 @@ s3_virge_mmio_read(uint32_t addr, void *priv) switch (addr & 0xffff) { case 0x8504: if (!virge->virge_busy) - virge->fifo_state = FIFO_STATE_RUN; + s3_virge_wake_fifo_thread(virge); ret = virge->subsys_stat; return ret; case 0x8505: ret = 0xc0; - if (virge->s3d_busy || virge->virge_busy || (virge->fifo_read_idx < virge->fifo_write_idx)) + if (virge->s3d_busy || virge->virge_busy || FIFO_NOT_EMPTY) ret |= 0x10; else ret |= 0x30; if (!virge->virge_busy) - virge->fifo_state = FIFO_STATE_RUN; + s3_virge_wake_fifo_thread(virge); return ret; case 0x850c: @@ -1721,14 +1754,14 @@ s3_virge_mmio_read_w(uint32_t addr, void *priv) switch (addr & 0xfffe) { case 0x8504: ret = 0xc000; - if (virge->s3d_busy || virge->virge_busy || (virge->fifo_read_idx < virge->fifo_write_idx)) + if (virge->s3d_busy || virge->virge_busy || FIFO_NOT_EMPTY) ret |= 0x1000; else ret |= 0x3000; ret |= virge->subsys_stat; if (!virge->virge_busy) - virge->fifo_state = FIFO_STATE_RUN; + s3_virge_wake_fifo_thread(virge); return ret; case 0x850c: @@ -1822,14 +1855,15 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) case 0x8504: ret = 0x0000c000; - if (virge->s3d_busy || virge->virge_busy || (virge->fifo_read_idx < virge->fifo_write_idx)) + if (virge->s3d_busy || virge->virge_busy || FIFO_NOT_EMPTY) ret |= 0x00001000; else ret |= 0x00003000; ret |= virge->subsys_stat; if (!virge->virge_busy) - virge->fifo_state = FIFO_STATE_RUN; + s3_virge_wake_fifo_thread(virge); + pclog("Subsys status DWORD, busy=%d, fiford=%d, fifowr=%d.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx); break; case 0x850c: @@ -1852,96 +1886,122 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) case 0xa4d4: case 0xa8d4: case 0xacd4: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_base; break; case 0xa4d8: case 0xa8d8: case 0xacd8: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.dest_base; break; case 0xa4dc: case 0xa8dc: case 0xacdc: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.clip_l << 16) | virge->s3d.clip_r; break; case 0xa4e0: case 0xa8e0: case 0xace0: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.clip_t << 16) | virge->s3d.clip_b; break; case 0xa4e4: case 0xa8e4: case 0xace4: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.dest_str << 16) | virge->s3d.src_str; break; case 0xa4e8: case 0xace8: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.mono_pat_0; break; case 0xa4ec: case 0xacec: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.mono_pat_1; break; case 0xa4f0: case 0xacf0: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pat_bg_clr; break; case 0xa4f4: case 0xa8f4: case 0xacf4: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pat_fg_clr; break; case 0xa4f8: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_bg_clr; break; case 0xa4fc: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.src_fg_clr; break; case 0xa500: case 0xa900: case 0xad00: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.cmd_set; break; case 0xa504: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.r_width << 16) | virge->s3d.r_height; break; case 0xa508: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.rsrc_x << 16) | virge->s3d.rsrc_y; break; case 0xa50c: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.rdest_x << 16) | virge->s3d.rdest_y; break; case 0xa96c: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.lxend0 << 16) | virge->s3d.lxend1; break; case 0xa970: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.ldx; break; case 0xa974: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.lxstart; break; case 0xa978: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.lystart; break; case 0xa97c: + s3_virge_wait_fifo_idle(virge); ret = (virge->s3d.line_dir << 31) | virge->s3d.lycnt; break; case 0xad68: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.prdx; break; case 0xad6c: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.prxstart; break; case 0xad70: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pldx; break; case 0xad74: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.plxstart; break; case 0xad78: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pystart; break; case 0xad7c: + s3_virge_wait_fifo_idle(virge); ret = virge->s3d.pycnt; break; @@ -1955,15 +2015,17 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) } static void -s3_virge_fifo_timer(void *priv) +s3_virge_fifo_thread(void *priv) { virge_t *virge = (virge_t *)priv; - timer_advance_u64(&virge->fifo_timer, 100 * TIMER_USEC); - - while (virge->fifo_state == FIFO_STATE_RUN) { + while (virge->fifo_thread_run) { + thread_set_event(virge->fifo_not_full_event); + thread_wait_event(virge->wake_fifo_thread, -1); + thread_reset_event(virge->wake_fifo_thread); virge->virge_busy = 1; - while (virge->fifo_read_idx < virge->fifo_write_idx) { + while (FIFO_NOT_EMPTY) { + s3_virge_log("COMMAND: RD=%d, WR=%d, addr=%04x.\n", virge->fifo_read_idx, virge->fifo_write_idx, virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR); switch (virge->fifo[virge->fifo_read_idx].addr_type & FIFO_TYPE) { case FIFO_WRITE_BYTE: s3_virge_mmio_fifo_write(virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val, virge); @@ -1980,38 +2042,14 @@ s3_virge_fifo_timer(void *priv) virge->fifo[virge->fifo_read_idx].addr_type = FIFO_INVALID; virge->fifo_read_idx++; - if (virge->fifo_read_idx >= FIFO_SIZE) - virge->fifo_read_idx = 0; - - s3_virge_log("ReadIDX=%d.\n", virge->fifo_read_idx); } virge->virge_busy = 0; + s3_virge_log("Complete.\n"); virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; s3_virge_update_irqs(virge); - virge->fifo_read_idx = 0; - virge->fifo_write_idx = 0; - virge->fifo_state = FIFO_STATE_IDLE; } } -static void -s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) -{ - if (FIFO_FULL) { - s3_virge_log("FIFO FULL, TBD.\n"); - return; - } - - virge->fifo[virge->fifo_write_idx].val = val; - virge->fifo[virge->fifo_write_idx].addr_type = (addr & FIFO_ADDR) | type; - virge->fifo_write_idx++; - if (virge->fifo_write_idx >= FIFO_SIZE) - virge->fifo_write_idx = 0; - - s3_virge_log("WriteIDX=%d.\n", virge->fifo_write_idx); - virge->fifo_state = FIFO_STATE_RUN; -} - static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) { @@ -2105,7 +2143,7 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) virge_t *virge = (virge_t *) priv; svga_t *svga = &virge->svga; - s3_virge_log("[%04X:%08X]: MMIO WriteL addr = %04x, val = %04x\n", CS, cpu_state.pc, addr & 0xfffc, val); + pclog("[%04X:%08X]: MMIO WriteL addr = %04x, val = %04x\n", CS, cpu_state.pc, addr & 0xfffc, val); if (((addr & 0xfffc) < 0x8000) || ((addr & 0xe000) == 0xa000)) s3_virge_queue(virge, addr, val, FIFO_WRITE_DWORD); else { @@ -4397,9 +4435,6 @@ s3_virge_disable_handlers(virge_t *dev) reset_state->svga.timer = dev->svga.timer; reset_state->svga.timer8514 = dev->svga.timer8514; - - reset_state->fifo_timer = dev->fifo_timer; - reset_state->render_timer = dev->render_timer; } static void @@ -4412,7 +4447,6 @@ s3_virge_reset(void *priv) dev->virge_busy = 0; dev->fifo_write_idx = 0; dev->fifo_read_idx = 0; - dev->fifo_state = FIFO_STATE_IDLE; dev->s3d_busy = 0; dev->s3d_write_idx = 0; dev->s3d_read_idx = 0; @@ -4657,8 +4691,15 @@ s3_virge_init(const device_t *info) virge->svga.force_old_addr = 1; - timer_add(&virge->fifo_timer, s3_virge_fifo_timer, virge, 1); - timer_add(&virge->render_timer, s3_virge_render_timer, virge, 0); + virge->wake_render_thread = thread_create_event(); + virge->not_full_event = thread_create_event(); + virge->render_thread_run = 1; + virge->render_thread = thread_create(s3_virge_render_thread, virge); + + virge->wake_fifo_thread = thread_create_event(); + virge->fifo_not_full_event = thread_create_event(); + virge->fifo_thread_run = 1; + virge->fifo_thread = thread_create(s3_virge_fifo_thread, virge); virge->local = info->local; @@ -4672,6 +4713,18 @@ s3_virge_close(void *priv) { virge_t *virge = (virge_t *) priv; + virge->render_thread_run = 0; + thread_set_event(virge->wake_render_thread); + thread_wait(virge->render_thread); + thread_destroy_event(virge->not_full_event); + thread_destroy_event(virge->wake_render_thread); + + virge->fifo_thread_run = 0; + thread_set_event(virge->wake_fifo_thread); + thread_wait(virge->fifo_thread); + thread_destroy_event(virge->fifo_not_full_event); + thread_destroy_event(virge->wake_fifo_thread); + svga_close(&virge->svga); ddc_close(virge->ddc); From a7b7b1af679469c849be9b45727a603ca14ea840 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 14 Aug 2024 20:33:32 +0200 Subject: [PATCH 319/624] Attempt at fixing the threading of the ViRGE. --- src/video/vid_s3_virge.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 3ad183468..9c581ea39 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -275,9 +275,13 @@ typedef struct virge_t { uint64_t blitter_time; int fifo_slots_num; - fifo_entry_t fifo[FIFO_SIZE]; + struct { + uint32_t addr_type; + uint32_t val; + } fifo[FIFO_SIZE]; atomic_int fifo_write_idx, fifo_read_idx; + atomic_int fifo_write_idx2; atomic_int virge_busy; uint8_t render_thread_run; @@ -422,7 +426,8 @@ s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) virge->fifo[virge->fifo_write_idx].addr_type = (addr & FIFO_ADDR) | type; virge->fifo_write_idx++; - if ((FIFO_ENTRIES < 8) || (FIFO_ENTRIES > 0xe000)) + + if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8) s3_virge_wake_fifo_thread(virge); } @@ -1420,7 +1425,7 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) case 0xad00: /*2D Polygon Command Set*/ virge->s3d.cmd_set = val; if (!(val & CMD_SET_AE)) { - pclog("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); + s3_virge_log("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; @@ -1436,7 +1441,7 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) virge->s3d.rdest_x = (val >> 16) & 0x7ff; virge->s3d.rdest_y = val & 0x7ff; if (virge->s3d.cmd_set & CMD_SET_AE) { - pclog("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); + s3_virge_log("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; @@ -1457,7 +1462,7 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) virge->s3d.lycnt = val & 0x7ff; virge->s3d.line_dir = val >> 31; if (virge->s3d.cmd_set & CMD_SET_AE) { - pclog("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); + s3_virge_log("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; @@ -1480,7 +1485,7 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) case 0xad7c: /*2D Polygon Y Count*/ virge->s3d.pycnt = val & 0x300007ff; if (virge->s3d.cmd_set & CMD_SET_AE) { - pclog("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); + s3_virge_log("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); s3_virge_bitblt(virge, -1, 0); } break; @@ -1863,7 +1868,8 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) ret |= virge->subsys_stat; if (!virge->virge_busy) s3_virge_wake_fifo_thread(virge); - pclog("Subsys status DWORD, busy=%d, fiford=%d, fifowr=%d.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx); + + s3_virge_log("Subsys status DWORD, busy=%d, fiford=%d, fifowr=%d.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx2); break; case 0x850c: @@ -2025,7 +2031,7 @@ s3_virge_fifo_thread(void *priv) thread_reset_event(virge->wake_fifo_thread); virge->virge_busy = 1; while (FIFO_NOT_EMPTY) { - s3_virge_log("COMMAND: RD=%d, WR=%d, addr=%04x.\n", virge->fifo_read_idx, virge->fifo_write_idx, virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR); + s3_virge_log("COMMAND: RD=%d, WR=%d, addr=%04x, val=%08x.\n", virge->fifo_read_idx, virge->fifo_write_idx, virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val); switch (virge->fifo[virge->fifo_read_idx].addr_type & FIFO_TYPE) { case FIFO_WRITE_BYTE: s3_virge_mmio_fifo_write(virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val, virge); @@ -2042,11 +2048,18 @@ s3_virge_fifo_thread(void *priv) virge->fifo[virge->fifo_read_idx].addr_type = FIFO_INVALID; virge->fifo_read_idx++; + + if (FIFO_ENTRIES > 0xe000) + thread_set_event(virge->fifo_not_full_event); + } + if (virge->fifo_read_idx >= virge->fifo_write_idx) { + virge->fifo_read_idx = 0; + virge->fifo_write_idx = 0; + virge->virge_busy = 0; + s3_virge_log("Complete.\n"); + virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; + s3_virge_update_irqs(virge); } - virge->virge_busy = 0; - s3_virge_log("Complete.\n"); - virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; - s3_virge_update_irqs(virge); } } @@ -2143,7 +2156,7 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) virge_t *virge = (virge_t *) priv; svga_t *svga = &virge->svga; - pclog("[%04X:%08X]: MMIO WriteL addr = %04x, val = %04x\n", CS, cpu_state.pc, addr & 0xfffc, val); + s3_virge_log("[%04X:%08X]: MMIO WriteL addr = %04x, val = %04x\n", CS, cpu_state.pc, addr & 0xfffc, val); if (((addr & 0xfffc) < 0x8000) || ((addr & 0xe000) == 0xa000)) s3_virge_queue(virge, addr, val, FIFO_WRITE_DWORD); else { From 08fc20bcc5a099a67e30bf56039f50f7e99755e7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 14 Aug 2024 22:47:06 +0200 Subject: [PATCH 320/624] S3 Virge: Bring the threading completely up to par with PCem. --- src/video/vid_s3_virge.c | 952 ++++++++++++++++++++------------------- 1 file changed, 482 insertions(+), 470 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 9c581ea39..c5ed474bf 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -54,11 +54,13 @@ static int dither[4][4] = { #define RB_FULL (RB_ENTRIES == RB_SIZE) #define RB_EMPTY (!RB_ENTRIES) -#define FIFO_SIZE (16 * 4096) +#define FIFO_SIZE 65536 +#define FIFO_MASK (FIFO_SIZE - 1) +#define FIFO_ENTRY_SIZE (1 << 31) #define FIFO_ENTRIES (virge->fifo_write_idx - virge->fifo_read_idx) #define FIFO_FULL ((virge->fifo_write_idx - virge->fifo_read_idx) >= FIFO_SIZE) -#define FIFO_NOT_EMPTY (virge->fifo_read_idx < virge->fifo_write_idx) +#define FIFO_EMPTY (virge->fifo_read_idx == virge->fifo_write_idx) #define FIFO_TYPE 0xff000000 #define FIFO_ADDR 0x00ffffff @@ -231,7 +233,7 @@ typedef struct virge_t { uint32_t dest_l, dest_r; } s3d; - s3d_t s3d_tri; + s3d_t s3d_tri; s3d_t s3d_buffer[RB_SIZE]; atomic_int s3d_read_idx, s3d_write_idx; @@ -275,21 +277,18 @@ typedef struct virge_t { uint64_t blitter_time; int fifo_slots_num; - struct { - uint32_t addr_type; - uint32_t val; - } fifo[FIFO_SIZE]; + fifo_entry_t fifo[FIFO_SIZE]; - atomic_int fifo_write_idx, fifo_read_idx; - atomic_int fifo_write_idx2; - atomic_int virge_busy; + atomic_int fifo_write_idx, fifo_read_idx; + atomic_int virge_busy; + + atomic_int fifo_thread_run, render_thread_run; - uint8_t render_thread_run; thread_t *render_thread; event_t *wake_render_thread; + event_t *wake_main_thread; event_t *not_full_event; - uint8_t fifo_thread_run; thread_t *fifo_thread; event_t *wake_fifo_thread; event_t *fifo_not_full_event; @@ -312,6 +311,10 @@ static video_timings_t timing_diamond_stealth3d_3000_pci = { .type = VIDEO_PCI, static video_timings_t timing_virge_dx_pci = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 }; static video_timings_t timing_virge_agp = { .type = VIDEO_AGP, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 }; +static inline void wake_fifo_thread(virge_t *virge) { + thread_set_event(virge->wake_fifo_thread); /*Wake up FIFO thread if moving from idle*/ +} + static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri); static void s3_virge_recalctimings(svga_t *svga); @@ -326,7 +329,8 @@ static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv); static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv); static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv); -static void s3_virge_fifo_thread(void *priv); +static void queue_triangle(virge_t *virge); +static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type); enum { CMD_SET_AE = 1, @@ -406,48 +410,6 @@ s3_virge_wake_fifo_thread(virge_t *virge) thread_set_event(virge->wake_fifo_thread); /*Wake up FIFO thread if moving from idle*/ } -static void -s3_virge_wait_fifo_idle(virge_t *virge) -{ - while (FIFO_NOT_EMPTY) { - s3_virge_wake_fifo_thread(virge); - thread_wait_event(virge->fifo_not_full_event, 1); - } -} - -static void -s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) -{ - if (FIFO_FULL) { - thread_reset_event(virge->fifo_not_full_event); - thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ - } - virge->fifo[virge->fifo_write_idx].val = val; - virge->fifo[virge->fifo_write_idx].addr_type = (addr & FIFO_ADDR) | type; - - virge->fifo_write_idx++; - - if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8) - s3_virge_wake_fifo_thread(virge); -} - -static void -queue_triangle(virge_t *virge) -{ - if (RB_FULL) { - thread_reset_event(virge->not_full_event); - thread_wait_event(virge->not_full_event, -1); /*Wait for room in ringbuffer*/ - } - - virge->s3d_buffer[virge->s3d_write_idx] = virge->s3d_tri; - virge->s3d_write_idx++; - if (virge->s3d_write_idx >= RB_SIZE) - virge->s3d_write_idx = 0; - - if (!virge->s3d_busy) - thread_set_event(virge->wake_render_thread); /*Wake up render thread if moving from idle*/ -} - static void s3_virge_update_irqs(virge_t *virge) { @@ -457,30 +419,6 @@ s3_virge_update_irqs(virge_t *virge) pci_clear_irq(virge->pci_slot, PCI_INTA, &virge->irq_state); } -static void -s3_virge_render_thread(void *priv) -{ - virge_t *virge = (virge_t *) priv; - - if (virge->render_thread_run) { - thread_wait_event(virge->wake_render_thread, -1); - thread_reset_event(virge->wake_render_thread); - virge->s3d_busy = 1; - while (virge->s3d_read_idx < virge->s3d_write_idx) { - s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx]); - virge->s3d_read_idx++; - if (virge->s3d_read_idx >= RB_SIZE) - virge->s3d_read_idx = 0; - - if (RB_ENTRIES == RB_MASK) - thread_set_event(virge->not_full_event); - } - virge->s3d_busy = 0; - virge->subsys_stat |= INT_S3D_DONE; - s3_virge_update_irqs(virge); - } -} - static void s3_virge_out(uint16_t addr, uint8_t val, void *priv) { @@ -1152,6 +1090,388 @@ s3_virge_vblank_start(svga_t *svga) s3_virge_update_irqs(virge); } +static void s3_virge_wait_fifo_idle(virge_t *virge) { + while (!FIFO_EMPTY) { + wake_fifo_thread(virge); + thread_wait_event(virge->fifo_not_full_event, 1); + } +} + +static uint8_t +s3_virge_mmio_read(uint32_t addr, void *priv) +{ + virge_t *virge = (virge_t *) priv; + uint8_t ret = 0xff; + + s3_virge_log("[%04X:%08X]: MMIO ReadB addr = %04x\n", CS, cpu_state.pc, addr & 0xffff); + + switch (addr & 0xffff) { + case 0x8504: + if (!virge->virge_busy) + s3_virge_wake_fifo_thread(virge); + + ret = virge->subsys_stat; + return ret; + case 0x8505: + ret = 0xc0; + if (virge->s3d_busy || virge->virge_busy || !FIFO_EMPTY) + ret |= 0x10; + else + ret |= 0x30; + + if (!virge->virge_busy) + s3_virge_wake_fifo_thread(virge); + return ret; + + case 0x850c: + ret = virge->advfunc_cntl & 0x3f; + ret |= virge->fifo_slots_num << 6; + ret &= 0xff; + return ret; + case 0x850d: + ret = virge->fifo_slots_num >> 2; + return ret; + + case 0x83b0: + case 0x83b1: + case 0x83b2: + case 0x83b3: + case 0x83b4: + case 0x83b5: + case 0x83b6: + case 0x83b7: + case 0x83b8: + case 0x83b9: + case 0x83ba: + case 0x83bb: + case 0x83bc: + case 0x83bd: + case 0x83be: + case 0x83bf: + case 0x83c0: + case 0x83c1: + case 0x83c2: + case 0x83c3: + case 0x83c4: + case 0x83c5: + case 0x83c6: + case 0x83c7: + case 0x83c8: + case 0x83c9: + case 0x83ca: + case 0x83cb: + case 0x83cc: + case 0x83cd: + case 0x83ce: + case 0x83cf: + case 0x83d0: + case 0x83d1: + case 0x83d2: + case 0x83d3: + case 0x83d4: + case 0x83d5: + case 0x83d6: + case 0x83d7: + case 0x83d8: + case 0x83d9: + case 0x83da: + case 0x83db: + case 0x83dc: + case 0x83dd: + case 0x83de: + case 0x83df: + return s3_virge_in(addr & 0x3ff, virge); + + case 0x859c: + return virge->cmd_dma; + + case 0xff20: + case 0xff21: + ret = virge->serialport & ~(SERIAL_PORT_SCR | SERIAL_PORT_SDR); + if ((virge->serialport & SERIAL_PORT_SCW) && i2c_gpio_get_scl(virge->i2c)) + ret |= SERIAL_PORT_SCR; + if ((virge->serialport & SERIAL_PORT_SDW) && i2c_gpio_get_sda(virge->i2c)) + ret |= SERIAL_PORT_SDR; + return ret; + + default: + break; + } + return 0xff; +} + +static uint16_t +s3_virge_mmio_read_w(uint32_t addr, void *priv) +{ + virge_t *virge = (virge_t *) priv; + uint16_t ret = 0xffff; + + s3_virge_log("[%04X:%08X]: MMIO ReadW addr = %04x\n", CS, cpu_state.pc, addr & 0xfffe); + + switch (addr & 0xfffe) { + case 0x8504: + ret = 0xc000; + if (virge->s3d_busy || virge->virge_busy || !FIFO_EMPTY) + ret |= 0x1000; + else + ret |= 0x3000; + + ret |= virge->subsys_stat; + if (!virge->virge_busy) + s3_virge_wake_fifo_thread(virge); + return ret; + + case 0x850c: + ret = virge->advfunc_cntl & 0x3f; + ret |= virge->fifo_slots_num << 6; + return ret; + + case 0x859c: + return virge->cmd_dma; + + default: + return s3_virge_mmio_read(addr, virge) | (s3_virge_mmio_read(addr + 1, virge) << 8); + } + + return 0xffff; +} + +static uint32_t +s3_virge_mmio_read_l(uint32_t addr, void *priv) +{ + virge_t *virge = (virge_t *) priv; + uint32_t ret = 0xffffffff; + + switch (addr & 0xfffc) { + case 0x8180: + ret = virge->streams.pri_ctrl; + break; + case 0x8184: + ret = virge->streams.chroma_ctrl; + break; + case 0x8190: + ret = virge->streams.sec_ctrl; + break; + case 0x8194: + ret = virge->streams.chroma_upper_bound; + break; + case 0x8198: + ret = virge->streams.sec_filter; + break; + case 0x81a0: + ret = virge->streams.blend_ctrl; + break; + case 0x81c0: + ret = virge->streams.pri_fb0; + break; + case 0x81c4: + ret = virge->streams.pri_fb1; + break; + case 0x81c8: + ret = virge->streams.pri_stride; + break; + case 0x81cc: + ret = virge->streams.buffer_ctrl; + break; + case 0x81d0: + ret = virge->streams.sec_fb0; + break; + case 0x81d4: + ret = virge->streams.sec_fb1; + break; + case 0x81d8: + ret = virge->streams.sec_stride; + break; + case 0x81dc: + ret = virge->streams.overlay_ctrl; + break; + case 0x81e0: + ret = virge->streams.k1_vert_scale; + break; + case 0x81e4: + ret = virge->streams.k2_vert_scale; + break; + case 0x81e8: + ret = virge->streams.dda_vert_accumulator; + break; + case 0x81ec: + ret = virge->streams.fifo_ctrl; + break; + case 0x81f0: + ret = virge->streams.pri_start; + break; + case 0x81f4: + ret = virge->streams.pri_size; + break; + case 0x81f8: + ret = virge->streams.sec_start; + break; + case 0x81fc: + ret = virge->streams.sec_size; + break; + + case 0x8504: + ret = 0x0000c000; + if (virge->s3d_busy || virge->virge_busy || !FIFO_EMPTY) + ret |= 0x00001000; + else + ret |= 0x00003000; + + ret |= virge->subsys_stat; + if (!virge->virge_busy) + s3_virge_wake_fifo_thread(virge); + + s3_virge_log("Subsys status DWORD, busy=%d, fiford=%d, fifowr=%d.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx2); + break; + + case 0x850c: + ret = virge->advfunc_cntl & 0x3f; + ret |= virge->fifo_slots_num << 6; + break; + + case 0x8590: + ret = virge->cmd_dma_base; + break; + case 0x8594: + break; + case 0x8598: + ret = virge->dma_ptr; + break; + case 0x859c: + ret = virge->cmd_dma; + break; + + case 0xa4d4: + case 0xa8d4: + case 0xacd4: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.src_base; + break; + case 0xa4d8: + case 0xa8d8: + case 0xacd8: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.dest_base; + break; + case 0xa4dc: + case 0xa8dc: + case 0xacdc: + s3_virge_wait_fifo_idle(virge); + ret = (virge->s3d.clip_l << 16) | virge->s3d.clip_r; + break; + case 0xa4e0: + case 0xa8e0: + case 0xace0: + s3_virge_wait_fifo_idle(virge); + ret = (virge->s3d.clip_t << 16) | virge->s3d.clip_b; + break; + case 0xa4e4: + case 0xa8e4: + case 0xace4: + s3_virge_wait_fifo_idle(virge); + ret = (virge->s3d.dest_str << 16) | virge->s3d.src_str; + break; + case 0xa4e8: + case 0xace8: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.mono_pat_0; + break; + case 0xa4ec: + case 0xacec: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.mono_pat_1; + break; + case 0xa4f0: + case 0xacf0: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.pat_bg_clr; + break; + case 0xa4f4: + case 0xa8f4: + case 0xacf4: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.pat_fg_clr; + break; + case 0xa4f8: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.src_bg_clr; + break; + case 0xa4fc: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.src_fg_clr; + break; + case 0xa500: + case 0xa900: + case 0xad00: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.cmd_set; + break; + case 0xa504: + s3_virge_wait_fifo_idle(virge); + ret = (virge->s3d.r_width << 16) | virge->s3d.r_height; + break; + case 0xa508: + s3_virge_wait_fifo_idle(virge); + ret = (virge->s3d.rsrc_x << 16) | virge->s3d.rsrc_y; + break; + case 0xa50c: + s3_virge_wait_fifo_idle(virge); + ret = (virge->s3d.rdest_x << 16) | virge->s3d.rdest_y; + break; + case 0xa96c: + s3_virge_wait_fifo_idle(virge); + ret = (virge->s3d.lxend0 << 16) | virge->s3d.lxend1; + break; + case 0xa970: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.ldx; + break; + case 0xa974: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.lxstart; + break; + case 0xa978: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.lystart; + break; + case 0xa97c: + s3_virge_wait_fifo_idle(virge); + ret = (virge->s3d.line_dir << 31) | virge->s3d.lycnt; + break; + case 0xad68: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.prdx; + break; + case 0xad6c: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.prxstart; + break; + case 0xad70: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.pldx; + break; + case 0xad74: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.plxstart; + break; + case 0xad78: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.pystart; + break; + case 0xad7c: + s3_virge_wait_fifo_idle(virge); + ret = virge->s3d.pycnt; + break; + + default: + ret = s3_virge_mmio_read_w(addr, priv) | (s3_virge_mmio_read_w(addr + 2, priv) << 16); + break; + } + + s3_virge_log("MMIO ReadL addr = %04x, val = %08x.\n", addr & 0xfffc, ret); + return ret; +} + static void s3_virge_mmio_fifo_write(uint32_t addr, uint8_t val, virge_t *virge) { @@ -1646,380 +1966,6 @@ s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) } } -static uint8_t -s3_virge_mmio_read(uint32_t addr, void *priv) -{ - virge_t *virge = (virge_t *) priv; - uint8_t ret = 0xff; - - s3_virge_log("[%04X:%08X]: MMIO ReadB addr = %04x\n", CS, cpu_state.pc, addr & 0xffff); - - switch (addr & 0xffff) { - case 0x8504: - if (!virge->virge_busy) - s3_virge_wake_fifo_thread(virge); - - ret = virge->subsys_stat; - return ret; - case 0x8505: - ret = 0xc0; - if (virge->s3d_busy || virge->virge_busy || FIFO_NOT_EMPTY) - ret |= 0x10; - else - ret |= 0x30; - - if (!virge->virge_busy) - s3_virge_wake_fifo_thread(virge); - return ret; - - case 0x850c: - ret = virge->advfunc_cntl & 0x3f; - ret |= virge->fifo_slots_num << 6; - ret &= 0xff; - return ret; - case 0x850d: - ret = virge->fifo_slots_num >> 2; - return ret; - - case 0x83b0: - case 0x83b1: - case 0x83b2: - case 0x83b3: - case 0x83b4: - case 0x83b5: - case 0x83b6: - case 0x83b7: - case 0x83b8: - case 0x83b9: - case 0x83ba: - case 0x83bb: - case 0x83bc: - case 0x83bd: - case 0x83be: - case 0x83bf: - case 0x83c0: - case 0x83c1: - case 0x83c2: - case 0x83c3: - case 0x83c4: - case 0x83c5: - case 0x83c6: - case 0x83c7: - case 0x83c8: - case 0x83c9: - case 0x83ca: - case 0x83cb: - case 0x83cc: - case 0x83cd: - case 0x83ce: - case 0x83cf: - case 0x83d0: - case 0x83d1: - case 0x83d2: - case 0x83d3: - case 0x83d4: - case 0x83d5: - case 0x83d6: - case 0x83d7: - case 0x83d8: - case 0x83d9: - case 0x83da: - case 0x83db: - case 0x83dc: - case 0x83dd: - case 0x83de: - case 0x83df: - return s3_virge_in(addr & 0x3ff, virge); - - case 0x859c: - return virge->cmd_dma; - - case 0xff20: - case 0xff21: - ret = virge->serialport & ~(SERIAL_PORT_SCR | SERIAL_PORT_SDR); - if ((virge->serialport & SERIAL_PORT_SCW) && i2c_gpio_get_scl(virge->i2c)) - ret |= SERIAL_PORT_SCR; - if ((virge->serialport & SERIAL_PORT_SDW) && i2c_gpio_get_sda(virge->i2c)) - ret |= SERIAL_PORT_SDR; - return ret; - - default: - break; - } - return 0xff; -} -static uint16_t -s3_virge_mmio_read_w(uint32_t addr, void *priv) -{ - virge_t *virge = (virge_t *) priv; - uint16_t ret = 0xffff; - - s3_virge_log("[%04X:%08X]: MMIO ReadW addr = %04x\n", CS, cpu_state.pc, addr & 0xfffe); - - switch (addr & 0xfffe) { - case 0x8504: - ret = 0xc000; - if (virge->s3d_busy || virge->virge_busy || FIFO_NOT_EMPTY) - ret |= 0x1000; - else - ret |= 0x3000; - - ret |= virge->subsys_stat; - if (!virge->virge_busy) - s3_virge_wake_fifo_thread(virge); - return ret; - - case 0x850c: - ret = virge->advfunc_cntl & 0x3f; - ret |= virge->fifo_slots_num << 6; - return ret; - - case 0x859c: - return virge->cmd_dma; - - default: - return s3_virge_mmio_read(addr, virge) | (s3_virge_mmio_read(addr + 1, virge) << 8); - } - - return 0xffff; -} - -static uint32_t -s3_virge_mmio_read_l(uint32_t addr, void *priv) -{ - virge_t *virge = (virge_t *) priv; - uint32_t ret = 0xffffffff; - - switch (addr & 0xfffc) { - case 0x8180: - ret = virge->streams.pri_ctrl; - break; - case 0x8184: - ret = virge->streams.chroma_ctrl; - break; - case 0x8190: - ret = virge->streams.sec_ctrl; - break; - case 0x8194: - ret = virge->streams.chroma_upper_bound; - break; - case 0x8198: - ret = virge->streams.sec_filter; - break; - case 0x81a0: - ret = virge->streams.blend_ctrl; - break; - case 0x81c0: - ret = virge->streams.pri_fb0; - break; - case 0x81c4: - ret = virge->streams.pri_fb1; - break; - case 0x81c8: - ret = virge->streams.pri_stride; - break; - case 0x81cc: - ret = virge->streams.buffer_ctrl; - break; - case 0x81d0: - ret = virge->streams.sec_fb0; - break; - case 0x81d4: - ret = virge->streams.sec_fb1; - break; - case 0x81d8: - ret = virge->streams.sec_stride; - break; - case 0x81dc: - ret = virge->streams.overlay_ctrl; - break; - case 0x81e0: - ret = virge->streams.k1_vert_scale; - break; - case 0x81e4: - ret = virge->streams.k2_vert_scale; - break; - case 0x81e8: - ret = virge->streams.dda_vert_accumulator; - break; - case 0x81ec: - ret = virge->streams.fifo_ctrl; - break; - case 0x81f0: - ret = virge->streams.pri_start; - break; - case 0x81f4: - ret = virge->streams.pri_size; - break; - case 0x81f8: - ret = virge->streams.sec_start; - break; - case 0x81fc: - ret = virge->streams.sec_size; - break; - - case 0x8504: - ret = 0x0000c000; - if (virge->s3d_busy || virge->virge_busy || FIFO_NOT_EMPTY) - ret |= 0x00001000; - else - ret |= 0x00003000; - - ret |= virge->subsys_stat; - if (!virge->virge_busy) - s3_virge_wake_fifo_thread(virge); - - s3_virge_log("Subsys status DWORD, busy=%d, fiford=%d, fifowr=%d.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx2); - break; - - case 0x850c: - ret = virge->advfunc_cntl & 0x3f; - ret |= virge->fifo_slots_num << 6; - break; - - case 0x8590: - ret = virge->cmd_dma_base; - break; - case 0x8594: - break; - case 0x8598: - ret = virge->dma_ptr; - break; - case 0x859c: - ret = virge->cmd_dma; - break; - - case 0xa4d4: - case 0xa8d4: - case 0xacd4: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.src_base; - break; - case 0xa4d8: - case 0xa8d8: - case 0xacd8: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.dest_base; - break; - case 0xa4dc: - case 0xa8dc: - case 0xacdc: - s3_virge_wait_fifo_idle(virge); - ret = (virge->s3d.clip_l << 16) | virge->s3d.clip_r; - break; - case 0xa4e0: - case 0xa8e0: - case 0xace0: - s3_virge_wait_fifo_idle(virge); - ret = (virge->s3d.clip_t << 16) | virge->s3d.clip_b; - break; - case 0xa4e4: - case 0xa8e4: - case 0xace4: - s3_virge_wait_fifo_idle(virge); - ret = (virge->s3d.dest_str << 16) | virge->s3d.src_str; - break; - case 0xa4e8: - case 0xace8: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.mono_pat_0; - break; - case 0xa4ec: - case 0xacec: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.mono_pat_1; - break; - case 0xa4f0: - case 0xacf0: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.pat_bg_clr; - break; - case 0xa4f4: - case 0xa8f4: - case 0xacf4: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.pat_fg_clr; - break; - case 0xa4f8: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.src_bg_clr; - break; - case 0xa4fc: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.src_fg_clr; - break; - case 0xa500: - case 0xa900: - case 0xad00: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.cmd_set; - break; - case 0xa504: - s3_virge_wait_fifo_idle(virge); - ret = (virge->s3d.r_width << 16) | virge->s3d.r_height; - break; - case 0xa508: - s3_virge_wait_fifo_idle(virge); - ret = (virge->s3d.rsrc_x << 16) | virge->s3d.rsrc_y; - break; - case 0xa50c: - s3_virge_wait_fifo_idle(virge); - ret = (virge->s3d.rdest_x << 16) | virge->s3d.rdest_y; - break; - case 0xa96c: - s3_virge_wait_fifo_idle(virge); - ret = (virge->s3d.lxend0 << 16) | virge->s3d.lxend1; - break; - case 0xa970: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.ldx; - break; - case 0xa974: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.lxstart; - break; - case 0xa978: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.lystart; - break; - case 0xa97c: - s3_virge_wait_fifo_idle(virge); - ret = (virge->s3d.line_dir << 31) | virge->s3d.lycnt; - break; - case 0xad68: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.prdx; - break; - case 0xad6c: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.prxstart; - break; - case 0xad70: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.pldx; - break; - case 0xad74: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.plxstart; - break; - case 0xad78: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.pystart; - break; - case 0xad7c: - s3_virge_wait_fifo_idle(virge); - ret = virge->s3d.pycnt; - break; - - default: - ret = s3_virge_mmio_read(addr, virge) | (s3_virge_mmio_read(addr + 1, virge) << 8) | (s3_virge_mmio_read(addr + 2, virge) << 16) | (s3_virge_mmio_read(addr + 3, virge) << 24); - break; - } - - s3_virge_log("MMIO ReadL addr = %04x, val = %08x.\n", addr & 0xfffc, ret); - return ret; -} - static void s3_virge_fifo_thread(void *priv) { @@ -2030,39 +1976,66 @@ s3_virge_fifo_thread(void *priv) thread_wait_event(virge->wake_fifo_thread, -1); thread_reset_event(virge->wake_fifo_thread); virge->virge_busy = 1; - while (FIFO_NOT_EMPTY) { + while (!FIFO_EMPTY) { s3_virge_log("COMMAND: RD=%d, WR=%d, addr=%04x, val=%08x.\n", virge->fifo_read_idx, virge->fifo_write_idx, virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val); - switch (virge->fifo[virge->fifo_read_idx].addr_type & FIFO_TYPE) { + + uint64_t start_time = plat_timer_read(); + uint64_t end_time; + fifo_entry_t *fifo = &virge->fifo[virge->fifo_read_idx & FIFO_MASK]; + uint32_t val = fifo->val; + + switch (fifo->addr_type & FIFO_TYPE) { case FIFO_WRITE_BYTE: - s3_virge_mmio_fifo_write(virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val, virge); + s3_virge_mmio_fifo_write(fifo->addr_type & FIFO_ADDR, + val, virge); break; case FIFO_WRITE_WORD: - s3_virge_mmio_fifo_write_w(virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val, virge); + s3_virge_mmio_fifo_write_w(fifo->addr_type & FIFO_ADDR, + val, virge); break; case FIFO_WRITE_DWORD: - s3_virge_mmio_fifo_write_l(virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val, virge); + s3_virge_mmio_fifo_write_l(fifo->addr_type & FIFO_ADDR, + val, virge); break; default: break; } - virge->fifo[virge->fifo_read_idx].addr_type = FIFO_INVALID; virge->fifo_read_idx++; + fifo->addr_type = FIFO_INVALID; if (FIFO_ENTRIES > 0xe000) thread_set_event(virge->fifo_not_full_event); + + end_time = plat_timer_read(); + virge->blitter_time += end_time - start_time; } - if (virge->fifo_read_idx >= virge->fifo_write_idx) { - virge->fifo_read_idx = 0; - virge->fifo_write_idx = 0; - virge->virge_busy = 0; - s3_virge_log("Complete.\n"); - virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; - s3_virge_update_irqs(virge); - } + virge->virge_busy = 0; + virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; + s3_virge_update_irqs(virge); } } +static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) { + fifo_entry_t *fifo = &virge->fifo[virge->fifo_write_idx & FIFO_MASK]; + + if (FIFO_FULL) { + thread_reset_event(virge->fifo_not_full_event); + if (FIFO_FULL) + thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } + + fifo->val = val; + fifo->addr_type = (addr & FIFO_ADDR) | type; + + virge->fifo_write_idx++; + + if (FIFO_ENTRIES > 0xe000) + wake_fifo_thread(virge); + if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8) + wake_fifo_thread(virge); +} + static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) { @@ -3834,6 +3807,43 @@ s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) virge->blitter_time += end_time - start_time; } +static void +s3_virge_render_thread(void *priv) +{ + virge_t *virge = (virge_t *) priv; + + while (virge->render_thread_run) { + thread_wait_event(virge->wake_render_thread, -1); + thread_reset_event(virge->wake_render_thread); + virge->s3d_busy = 1; + while (!RB_EMPTY) { + s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx & RB_MASK]); + virge->s3d_read_idx++; + + if (RB_ENTRIES == RB_SIZE - 1) + thread_set_event(virge->not_full_event); + } + virge->s3d_busy = 0; + virge->subsys_stat |= INT_S3D_DONE; + s3_virge_update_irqs(virge); + } +} + +static void +queue_triangle(virge_t *virge) +{ + if (RB_FULL) { + thread_reset_event(virge->not_full_event); + if (RB_FULL) + thread_wait_event(virge->not_full_event, -1); /*Wait for room in ringbuffer*/ + } + + virge->s3d_buffer[virge->s3d_write_idx & RB_MASK] = virge->s3d_tri; + virge->s3d_write_idx++; + if (!virge->s3d_busy) + thread_set_event(virge->wake_render_thread); /*Wake up render thread if moving from idle*/ +} + static void s3_virge_hwcursor_draw(svga_t *svga, int displine) { @@ -4704,14 +4714,15 @@ s3_virge_init(const device_t *info) virge->svga.force_old_addr = 1; - virge->wake_render_thread = thread_create_event(); - virge->not_full_event = thread_create_event(); virge->render_thread_run = 1; + virge->wake_render_thread = thread_create_event(); + virge->wake_main_thread = thread_create_event(); + virge->not_full_event = thread_create_event(); virge->render_thread = thread_create(s3_virge_render_thread, virge); + virge->fifo_thread_run = 1; virge->wake_fifo_thread = thread_create_event(); virge->fifo_not_full_event = thread_create_event(); - virge->fifo_thread_run = 1; virge->fifo_thread = thread_create(s3_virge_fifo_thread, virge); virge->local = info->local; @@ -4730,6 +4741,7 @@ s3_virge_close(void *priv) thread_set_event(virge->wake_render_thread); thread_wait(virge->render_thread); thread_destroy_event(virge->not_full_event); + thread_destroy_event(virge->wake_main_thread); thread_destroy_event(virge->wake_render_thread); virge->fifo_thread_run = 0; From a0d662e9c5f0e342a5542c674c65328724a2129a Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 15 Aug 2024 23:04:48 +0200 Subject: [PATCH 321/624] S3 changes (and TVP3026) of the day (August 15th, 2024) 1. TVP3026: disable lut mapping on 24bpp modes (mainly the S3 Vision968 drivers which use the TVP3026 ramdac). 2. S3 Vision968 (MiroVideo 40SV Ergo): Corrected 1280x1024 24bpp resolution. 3. ViRGE class: limit the FIFO entries in the bitblt regs to less than 16 entries and make the Image Transfers FIFO writes wraparound to 1 and reads to 0 (to allow at least a read to a write in the thread without hanging the entire emulator). Fixes Win3.1 PBRUSH colors while keeping performance on par with PCem. --- src/video/vid_s3.c | 11 +++++ src/video/vid_s3_virge.c | 76 ++++++++++++++++++++++------------ src/video/vid_tvp3026_ramdac.c | 2 +- 3 files changed, 62 insertions(+), 27 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 7dc070fd3..d2b5a87fe 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -3965,6 +3965,17 @@ s3_recalctimings(svga_t *svga) svga->dots_per_clock = (svga->dots_per_clock << 1) / 3; break; + case S3_VISION968: + switch (s3->card_type) { + case S3_MIROVIDEO40SV_ERGO_968: + svga->hdisp = (svga->hdisp / 3) << 2; + svga->dots_per_clock = (svga->hdisp / 3) << 2; + break; + default: + break; + } + break; + case S3_TRIO64: case S3_TRIO32: svga->hdisp /= 3; diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index c5ed474bf..ea3a899f4 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -311,10 +311,6 @@ static video_timings_t timing_diamond_stealth3d_3000_pci = { .type = VIDEO_PCI, static video_timings_t timing_virge_dx_pci = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 }; static video_timings_t timing_virge_agp = { .type = VIDEO_AGP, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 }; -static inline void wake_fifo_thread(virge_t *virge) { - thread_set_event(virge->wake_fifo_thread); /*Wake up FIFO thread if moving from idle*/ -} - static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri); static void s3_virge_recalctimings(svga_t *svga); @@ -761,21 +757,21 @@ s3_virge_recalctimings(svga_t *svga) } if (svga->crtc[0x5d] & 0x01) - svga->htotal += 0x100; + svga->htotal |= 0x100; if (svga->crtc[0x5d] & 0x02) { - svga->hdisp_time += 0x100; - svga->hdisp += 0x100 * svga->dots_per_clock; + svga->hdisp_time |= 0x100; + svga->hdisp |= (0x100 * svga->dots_per_clock); } if (svga->crtc[0x5e] & 0x01) - svga->vtotal += 0x400; + svga->vtotal |= 0x400; if (svga->crtc[0x5e] & 0x02) - svga->dispend += 0x400; + svga->dispend |= 0x400; if (svga->crtc[0x5e] & 0x04) - svga->vblankstart += 0x400; + svga->vblankstart |= 0x400; if (svga->crtc[0x5e] & 0x10) - svga->vsyncstart += 0x400; + svga->vsyncstart |= 0x400; if (svga->crtc[0x5e] & 0x40) - svga->split += 0x400; + svga->split |= 0x400; svga->interlace = svga->crtc[0x42] & 0x20; if (((svga->miscout >> 2) & 3) == 3) { @@ -821,9 +817,9 @@ s3_virge_recalctimings(svga_t *svga) { svga->ma_latch |= (virge->ma_ext << 16); if (svga->crtc[0x51] & 0x30) - svga->rowoffset += (svga->crtc[0x51] & 0x30) << 4; + svga->rowoffset |= (svga->crtc[0x51] & 0x30) << 4; else if (svga->crtc[0x43] & 0x04) - svga->rowoffset += 0x100; + svga->rowoffset |= 0x100; if (!svga->rowoffset) svga->rowoffset = 256; @@ -1092,7 +1088,7 @@ s3_virge_vblank_start(svga_t *svga) static void s3_virge_wait_fifo_idle(virge_t *virge) { while (!FIFO_EMPTY) { - wake_fifo_thread(virge); + s3_virge_wake_fifo_thread(virge); thread_wait_event(virge->fifo_not_full_event, 1); } } @@ -1121,6 +1117,8 @@ s3_virge_mmio_read(uint32_t addr, void *priv) if (!virge->virge_busy) s3_virge_wake_fifo_thread(virge); + + s3_virge_log("Subsys status BYTE1, busy=%d, fiford=%d, fifowr=%d, ret=%x.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx, ret); return ret; case 0x850c: @@ -1321,7 +1319,7 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) if (!virge->virge_busy) s3_virge_wake_fifo_thread(virge); - s3_virge_log("Subsys status DWORD, busy=%d, fiford=%d, fifowr=%d.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx2); + s3_virge_log("Subsys status DWORD, busy=%d, fiford=%d, fifowr=%d.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx); break; case 0x850c: @@ -1972,17 +1970,19 @@ s3_virge_fifo_thread(void *priv) virge_t *virge = (virge_t *)priv; while (virge->fifo_thread_run) { + s3_virge_log("Thread, entries=%d.\n", FIFO_ENTRIES); thread_set_event(virge->fifo_not_full_event); - thread_wait_event(virge->wake_fifo_thread, -1); - thread_reset_event(virge->wake_fifo_thread); + //thread_wait_event(virge->wake_fifo_thread, -1); + //thread_reset_event(virge->wake_fifo_thread); virge->virge_busy = 1; + s3_virge_log("Busy.\n"); while (!FIFO_EMPTY) { s3_virge_log("COMMAND: RD=%d, WR=%d, addr=%04x, val=%08x.\n", virge->fifo_read_idx, virge->fifo_write_idx, virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val); - uint64_t start_time = plat_timer_read(); uint64_t end_time; fifo_entry_t *fifo = &virge->fifo[virge->fifo_read_idx & FIFO_MASK]; uint32_t val = fifo->val; + int op_type = (((fifo->addr_type & FIFO_ADDR) & 0x1c00) >> 10) - 1; switch (fifo->addr_type & FIFO_TYPE) { case FIFO_WRITE_BYTE: @@ -2004,8 +2004,14 @@ s3_virge_fifo_thread(void *priv) virge->fifo_read_idx++; fifo->addr_type = FIFO_INVALID; - if (FIFO_ENTRIES > 0xe000) + if (op_type) { + if (FIFO_ENTRIES > 0xe000) + thread_set_event(virge->fifo_not_full_event); + } else { thread_set_event(virge->fifo_not_full_event); + if (((fifo->addr_type & FIFO_ADDR) & 0xffff) >= 0x8000) + virge->fifo_read_idx &= FIFO_MASK; + } end_time = plat_timer_read(); virge->blitter_time += end_time - start_time; @@ -2016,7 +2022,10 @@ s3_virge_fifo_thread(void *priv) } } -static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) { +static void +s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) +{ + int op_type = ((addr & 0x1c00) >> 10) - 1; fifo_entry_t *fifo = &virge->fifo[virge->fifo_write_idx & FIFO_MASK]; if (FIFO_FULL) { @@ -2030,10 +2039,25 @@ static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t virge->fifo_write_idx++; - if (FIFO_ENTRIES > 0xe000) - wake_fifo_thread(virge); - if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8) - wake_fifo_thread(virge); + if (op_type) { + if (FIFO_ENTRIES > 0xe000) + s3_virge_wake_fifo_thread(virge); + if ((FIFO_ENTRIES > 0xe000) || (FIFO_ENTRIES < 8)) + s3_virge_wake_fifo_thread(virge); + } else { + if (FIFO_ENTRIES < 16) { + s3_virge_wake_fifo_thread(virge); + s3_virge_log("FIFO ENTRIES=%d.\n", FIFO_ENTRIES); + } else { + s3_virge_log("FIFO FULL.\n"); + thread_reset_event(virge->fifo_not_full_event); + thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } + if (((addr & 0xffff) >= 0x8000)) { + if (virge->fifo_write_idx == FIFO_SIZE) + virge->fifo_write_idx = 1; + } + } } static void @@ -3820,7 +3844,7 @@ s3_virge_render_thread(void *priv) s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx & RB_MASK]); virge->s3d_read_idx++; - if (RB_ENTRIES == RB_SIZE - 1) + if (RB_ENTRIES == RB_MASK) thread_set_event(virge->not_full_event); } virge->s3d_busy = 0; diff --git a/src/video/vid_tvp3026_ramdac.c b/src/video/vid_tvp3026_ramdac.c index b50d0406b..6c001b461 100644 --- a/src/video/vid_tvp3026_ramdac.c +++ b/src/video/vid_tvp3026_ramdac.c @@ -516,7 +516,7 @@ tvp3026_recalctimings(void *priv, svga_t *svga) svga->interlace = !!(ramdac->ccr & 0x40); /* TODO: Figure out gamma correction for 15/16 bpp color. */ - svga->lut_map = !!(svga->bpp >= 15 && (ramdac->true_color & 0xf0) != 0x00); + svga->lut_map = !!((svga->bpp >= 15 && (svga->bpp != 24)) && (ramdac->true_color & 0xf0) != 0x00); if (!(ramdac->clock_sel & 0x70)) { if (ramdac->mcr != 0x98) { From 537e6f76de2e762a9e92f5727fed96dcefd8e9af Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 16 Aug 2024 05:43:55 +0200 Subject: [PATCH 322/624] S3 ViRGE: Replace code with re-cleaned-up PCem code with our changes manually re-applied, also revert hardware cursor offset checks, which fixes black bars in games. --- src/video/vid_s3_virge.c | 3782 ++++++++++++++++++-------------------- 1 file changed, 1756 insertions(+), 2026 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index ea3a899f4..aecd309e3 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -40,31 +40,25 @@ #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> +#ifdef MIN + #undef MIN +#endif +#ifdef MAX + #undef MAX +#endif +#ifdef CLAMP + #undef CLAMP +#endif + +static uint64_t virge_time = 0; + static int dither[4][4] = { - {0, 4, 1, 5}, - { 6, 2, 7, 3}, - { 1, 5, 0, 4}, - { 7, 3, 6, 2}, + {0, 4, 1, 5}, + {6, 2, 7, 3}, + {1, 5, 0, 4}, + {7, 3, 6, 2} }; -#define RB_SIZE 256 -#define RB_MASK (RB_SIZE - 1) - -#define RB_ENTRIES (virge->s3d_write_idx - virge->s3d_read_idx) -#define RB_FULL (RB_ENTRIES == RB_SIZE) -#define RB_EMPTY (!RB_ENTRIES) - -#define FIFO_SIZE 65536 -#define FIFO_MASK (FIFO_SIZE - 1) -#define FIFO_ENTRY_SIZE (1 << 31) - -#define FIFO_ENTRIES (virge->fifo_write_idx - virge->fifo_read_idx) -#define FIFO_FULL ((virge->fifo_write_idx - virge->fifo_read_idx) >= FIFO_SIZE) -#define FIFO_EMPTY (virge->fifo_read_idx == virge->fifo_write_idx) - -#define FIFO_TYPE 0xff000000 -#define FIFO_ADDR 0x00ffffff - #define ROM_VIRGE_325 "roms/video/s3virge/86c325.bin" #define ROM_DIAMOND_STEALTH3D_2000 "roms/video/s3virge/s3virge.bin" #define ROM_DIAMOND_STEALTH3D_3000 "roms/video/s3virge/diamondstealth3000.vbi" @@ -76,6 +70,24 @@ static int dither[4][4] = { #define ROM_DIAMOND_STEALTH3D_4000 "roms/video/s3virge/86c357.bin" #define ROM_TRIO3D2X "roms/video/s3virge/TRIO3D2X_8mbsdr.VBI" +#define RB_SIZE 256 +#define RB_MASK (RB_SIZE - 1) + +#define RB_ENTRIES (virge->s3d_write_idx - virge->s3d_read_idx) +#define RB_FULL (RB_ENTRIES == RB_SIZE) +#define RB_EMPTY (!RB_ENTRIES) + +#define FIFO_SIZE 65536 +#define FIFO_MASK (FIFO_SIZE - 1) +#define FIFO_ENTRY_SIZE (1 << 31) + +#define FIFO_ENTRIES (virge->fifo_write_idx - virge->fifo_read_idx) +#define FIFO_FULL ((virge->fifo_write_idx - virge->fifo_read_idx) >= FIFO_SIZE) +#define FIFO_EMPTY (virge->fifo_read_idx == virge->fifo_write_idx) + +#define FIFO_TYPE 0xff000000 +#define FIFO_ADDR 0x00ffffff + enum { S3_VIRGE_325, S3_DIAMOND_STEALTH3D_2000, @@ -98,58 +110,80 @@ enum { }; enum { - FIFO_INVALID = (0x00 << 24), - FIFO_WRITE_BYTE = (0x01 << 24), - FIFO_WRITE_WORD = (0x02 << 24), + FIFO_INVALID = (0x00 << 24), + FIFO_WRITE_BYTE = (0x01 << 24), + FIFO_WRITE_WORD = (0x02 << 24), FIFO_WRITE_DWORD = (0x03 << 24) }; -typedef struct -{ - uint32_t addr_type; - uint32_t val; +typedef struct { + uint32_t addr_type; + uint32_t val; } fifo_entry_t; typedef struct s3d_t { - uint32_t cmd_set; - int clip_l, clip_r, clip_t, clip_b; + uint32_t cmd_set; + int clip_l; + int clip_r; + int clip_t; + int clip_b; - uint32_t dest_base; - uint32_t dest_str; + uint32_t dest_base; + uint32_t dest_str; - uint32_t z_base; - uint32_t z_str; + uint32_t z_base; + uint32_t z_str; - uint32_t tex_base; - uint32_t tex_bdr_clr; - uint32_t tbv, tbu; - int32_t TdVdX, TdUdX; - int32_t TdVdY, TdUdY; - uint32_t tus, tvs; + uint32_t tex_base; + uint32_t tex_bdr_clr; + uint32_t tbv; + uint32_t tbu; + int32_t TdVdX; + int32_t TdUdX; + int32_t TdVdY; + int32_t TdUdY; + uint32_t tus; + uint32_t tvs; - int32_t TdZdX, TdZdY; - uint32_t tzs; + int32_t TdZdX; + int32_t TdZdY; + uint32_t tzs; - int32_t TdWdX, TdWdY; - uint32_t tws; + int32_t TdWdX; + int32_t TdWdY; + uint32_t tws; - int32_t TdDdX, TdDdY; - uint32_t tds; + int32_t TdDdX; + int32_t TdDdY; + uint32_t tds; - int16_t TdGdX, TdBdX, TdRdX, TdAdX; - int16_t TdGdY, TdBdY, TdRdY, TdAdY; - uint32_t tgs, tbs, trs, tas; + int16_t TdGdX; + int16_t TdBdX; + int16_t TdRdX; + int16_t TdAdX; + int16_t TdGdY; + int16_t TdBdY; + int16_t TdRdY; + int16_t TdAdY; + uint32_t tgs; + uint32_t tbs; + uint32_t trs; + uint32_t tas; - uint32_t TdXdY12; - uint32_t txend12; - uint32_t TdXdY01; - uint32_t txend01; - uint32_t TdXdY02; - uint32_t txs; - uint32_t tys; - int ty01, ty12, tlr; + uint32_t TdXdY12; + uint32_t txend12; + uint32_t TdXdY01; + uint32_t txend01; + uint32_t TdXdY02; + uint32_t txs; + uint32_t tys; + int ty01; + int ty12; + int tlr; - uint8_t fog_r, fog_g, fog_b; + uint8_t fog_r; + uint8_t fog_g; + uint8_t fog_b; } s3d_t; typedef struct virge_t { @@ -157,43 +191,51 @@ typedef struct virge_t { mem_mapping_t mmio_mapping; mem_mapping_t new_mmio_mapping; - rom_t bios_rom; + rom_t bios_rom; - svga_t svga; + svga_t svga; - uint8_t bank; - uint8_t ma_ext; - uint8_t reg6b, lfb_bios; + uint8_t bank; + uint8_t ma_ext; - uint8_t virge_id, virge_id_high, virge_id_low, virge_rev; + uint8_t virge_id; + uint8_t virge_id_high; + uint8_t virge_id_low; + uint8_t virge_rev; - uint8_t int_line; + uint32_t linear_base; + uint32_t linear_size; - uint32_t linear_base, linear_size; + uint8_t pci_regs[256]; + uint8_t pci_slot; - uint8_t pci_regs[256]; + int chip; - uint8_t pci_slot; - uint8_t irq_state; + int bilinear_enabled; + int dithering_enabled; + int memory_size; - int pci; - int chip; - int is_agp; + int pixel_count; + int tri_count; - int bilinear_enabled; - int dithering_enabled; - uint32_t memory_size; - uint32_t vram_mask; + thread_t * render_thread; + event_t * wake_render_thread; + event_t * wake_main_thread; + event_t * not_full_event; - uint32_t hwc_fg_col, hwc_bg_col; - int hwc_col_stack_pos; + uint32_t hwc_fg_col; + uint32_t hwc_bg_col; + int hwc_col_stack_pos; - struct - { + struct { uint32_t src_base; uint32_t dest_base; - int clip_l, clip_r, clip_t, clip_b; - int dest_str, src_str; + int clip_l; + int clip_r; + int clip_t; + int clip_b; + int dest_str; + int src_str; uint32_t mono_pat_0; uint32_t mono_pat_1; uint32_t pat_bg_clr; @@ -201,20 +243,28 @@ typedef struct virge_t { uint32_t src_bg_clr; uint32_t src_fg_clr; uint32_t cmd_set; - int r_width, r_height; - int rsrc_x, rsrc_y; - int rdest_x, rdest_y; + int r_width; + int r_height; + int rsrc_x; + int rsrc_y; + int rdest_x; + int rdest_y; - int lxend0, lxend1; + int lxend0; + int lxend1; int32_t ldx; - uint32_t lxstart, lystart; + uint32_t lxstart; + uint32_t lystart; int lycnt; int line_dir; - int src_x, src_y; - int dest_x, dest_y; - int w, h; - uint8_t rop; + int src_x; + int src_y; + int dest_x; + int dest_y; + int w; + int h; + uint8_t rop; int data_left_count; uint32_t data_left; @@ -233,14 +283,14 @@ typedef struct virge_t { uint32_t dest_l, dest_r; } s3d; - s3d_t s3d_tri; + s3d_t s3d_tri; - s3d_t s3d_buffer[RB_SIZE]; - atomic_int s3d_read_idx, s3d_write_idx; - atomic_int s3d_busy; + s3d_t s3d_buffer[RB_SIZE]; + int s3d_read_idx; + int s3d_write_idx; + int s3d_busy; - struct - { + struct { uint32_t pri_ctrl; uint32_t chroma_ctrl; uint32_t sec_ctrl; @@ -265,45 +315,64 @@ typedef struct virge_t { uint32_t sec_start; uint32_t sec_size; - int sdif; + int sdif; - int pri_x, pri_y, pri_w, pri_h; - int sec_x, sec_y, sec_w, sec_h; + int pri_x; + int pri_y; + int pri_w; + int pri_h; + int sec_x; + int sec_y; + int sec_w; + int sec_h; } streams; - uint8_t cmd_dma; - uint32_t cmd_dma_base; - uint32_t dma_ptr; - uint64_t blitter_time; + fifo_entry_t fifo[FIFO_SIZE]; + volatile int fifo_read_idx, fifo_write_idx; + + volatile int fifo_thread_run, render_thread_run; + + thread_t * fifo_thread; + event_t *wake_fifo_thread; + event_t * fifo_not_full_event; + + int virge_busy; + + uint8_t subsys_stat; + uint8_t subsys_cntl; + + int local; + + uint8_t serialport; + + uint8_t irq_state; + uint8_t advfunc_cntl; + + void *i2c, *ddc; + + int onboard; int fifo_slots_num; - fifo_entry_t fifo[FIFO_SIZE]; + uint32_t vram_mask; - atomic_int fifo_write_idx, fifo_read_idx; - atomic_int virge_busy; + uint8_t reg6b; + uint8_t lfb_bios; + uint8_t int_line; + uint8_t cmd_dma; - atomic_int fifo_thread_run, render_thread_run; + uint32_t cmd_dma_base; + uint32_t dma_ptr; - thread_t *render_thread; - event_t *wake_render_thread; - event_t *wake_main_thread; - event_t *not_full_event; - - thread_t *fifo_thread; - event_t *wake_fifo_thread; - event_t *fifo_not_full_event; - - int local; - - uint8_t subsys_stat, subsys_cntl, advfunc_cntl; - - uint8_t serialport; - - void *i2c, *ddc; - - int onboard; + int pci; + int is_agp; } virge_t; +static __inline void +wake_fifo_thread(virge_t *virge) { + /* Wake up FIFO thread if moving from idle */ + thread_set_event(virge->wake_fifo_thread); +} + static virge_t *reset_state = NULL; static video_timings_t timing_diamond_stealth3d_2000_pci = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 }; @@ -311,48 +380,45 @@ static video_timings_t timing_diamond_stealth3d_3000_pci = { .type = VIDEO_PCI, static video_timings_t timing_virge_dx_pci = { .type = VIDEO_PCI, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 }; static video_timings_t timing_virge_agp = { .type = VIDEO_AGP, .write_b = 2, .write_w = 2, .write_l = 3, .read_b = 28, .read_w = 28, .read_l = 45 }; -static void s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri); +static void queue_triangle(virge_t *virge); -static void s3_virge_recalctimings(svga_t *svga); -static void s3_virge_updatemapping(virge_t *virge); +static void s3_virge_recalctimings(svga_t *svga); +static void s3_virge_updatemapping(virge_t *virge); -static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat); +static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat); static uint8_t s3_virge_mmio_read(uint32_t addr, void *priv); -static uint16_t s3_virge_mmio_read_w(uint32_t addr, void *rivp); +static uint16_t s3_virge_mmio_read_w(uint32_t addr, void *priv); static uint32_t s3_virge_mmio_read_l(uint32_t addr, void *priv); static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv); static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv); static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv); -static void queue_triangle(virge_t *virge); -static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type); - enum { - CMD_SET_AE = 1, - CMD_SET_HC = (1 << 1), + CMD_SET_AE = 1, + CMD_SET_HC = (1 << 1), - CMD_SET_FORMAT_MASK = (7 << 2), - CMD_SET_FORMAT_8 = (0 << 2), - CMD_SET_FORMAT_16 = (1 << 2), - CMD_SET_FORMAT_24 = (2 << 2), + CMD_SET_FORMAT_MASK = (7 << 2), + CMD_SET_FORMAT_8 = (0 << 2), + CMD_SET_FORMAT_16 = (1 << 2), + CMD_SET_FORMAT_24 = (2 << 2), - CMD_SET_MS = (1 << 6), - CMD_SET_IDS = (1 << 7), - CMD_SET_MP = (1 << 8), - CMD_SET_TP = (1 << 9), + CMD_SET_MS = (1 << 6), + CMD_SET_IDS = (1 << 7), + CMD_SET_MP = (1 << 8), + CMD_SET_TP = (1 << 9), - CMD_SET_ITA_MASK = (3 << 10), - CMD_SET_ITA_BYTE = (0 << 10), - CMD_SET_ITA_WORD = (1 << 10), - CMD_SET_ITA_DWORD = (2 << 10), + CMD_SET_ITA_MASK = (3 << 10), + CMD_SET_ITA_BYTE = (0 << 10), + CMD_SET_ITA_WORD = (1 << 10), + CMD_SET_ITA_DWORD = (2 << 10), - CMD_SET_ZUP = (1 << 23), + CMD_SET_ZUP = (1 << 23), - CMD_SET_ZB_MODE = (3 << 24), + CMD_SET_ZB_MODE = (3 << 24), - CMD_SET_XP = (1 << 25), - CMD_SET_YP = (1 << 26), + CMD_SET_XP = (1 << 25), + CMD_SET_YP = (1 << 26), CMD_SET_COMMAND_MASK = (15 << 27) }; @@ -363,11 +429,11 @@ enum { #define CMD_SET_TWE (1 << 26) enum { - CMD_SET_COMMAND_BITBLT = (0 << 27), - CMD_SET_COMMAND_RECTFILL = (2 << 27), - CMD_SET_COMMAND_LINE = (3 << 27), - CMD_SET_COMMAND_POLY = (5 << 27), - CMD_SET_COMMAND_NOP = (15 << 27) + CMD_SET_COMMAND_BITBLT = (0 << 27), + CMD_SET_COMMAND_RECTFILL = (2 << 27), + CMD_SET_COMMAND_LINE = (3 << 27), + CMD_SET_COMMAND_POLY = (5 << 27), + CMD_SET_COMMAND_NOP = (15 << 27) }; #define INT_VSY (1 << 0) @@ -382,44 +448,18 @@ enum { #define SERIAL_PORT_SCR (1 << 2) #define SERIAL_PORT_SDR (1 << 3) -#ifdef ENABLE_S3_VIRGE_LOG -int s3_virge_do_log = ENABLE_S3_VIRGE_LOG; - static void -s3_virge_log(const char *fmt, ...) -{ - va_list ap; - - if (s3_virge_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -} -#else -# define s3_virge_log(fmt, ...) -#endif - -static __inline void -s3_virge_wake_fifo_thread(virge_t *virge) -{ - thread_set_event(virge->wake_fifo_thread); /*Wake up FIFO thread if moving from idle*/ -} - -static void -s3_virge_update_irqs(virge_t *virge) -{ - if ((virge->svga.crtc[0x32] & 0x10) && (virge->subsys_stat & (virge->subsys_cntl & INT_MASK))) +s3_virge_update_irqs(virge_t *virge) { + if ((virge->svga.crtc[0x32] & 0x10) && (virge->subsys_stat & virge->subsys_cntl & INT_MASK)) pci_set_irq(virge->pci_slot, PCI_INTA, &virge->irq_state); else pci_clear_irq(virge->pci_slot, PCI_INTA, &virge->irq_state); } static void -s3_virge_out(uint16_t addr, uint8_t val, void *priv) -{ +s3_virge_out(uint16_t addr, uint8_t val, void *priv) { virge_t *virge = (virge_t *) priv; - svga_t *svga = &virge->svga; + svga_t * svga = &virge->svga; uint8_t old; uint32_t cursoraddr; @@ -433,8 +473,7 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) svga_recalctimings(svga); return; } - if (svga->seqaddr == 4) /*Chain-4 - update banking*/ - { + if (svga->seqaddr == 4) { /*Chain-4 - update banking*/ if (val & 8) svga->write_bank = svga->read_bank = virge->bank << 16; else @@ -458,7 +497,9 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) return; if ((svga->crtcreg == 7) && (svga->crtc[0x11] & 0x80)) val = (svga->crtc[7] & ~0x10) | (val & 0x10); - if ((svga->crtcreg >= 0x20) && (svga->crtcreg < 0x40) && (svga->crtcreg != 0x36) && (svga->crtcreg != 0x38) && (svga->crtcreg != 0x39) && ((svga->crtc[0x38] & 0xcc) != 0x48)) + if ((svga->crtcreg >= 0x20) && (svga->crtcreg < 0x40) && + (svga->crtcreg != 0x36) && (svga->crtcreg != 0x38) && + (svga->crtcreg != 0x39) && ((svga->crtc[0x38] & 0xcc) != 0x48)) return; if ((svga->crtcreg >= 0x40) && ((svga->crtc[0x39] & 0xe0) != 0xa0)) return; @@ -466,11 +507,9 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) return; if (svga->crtcreg >= 0x80) return; - old = svga->crtc[svga->crtcreg]; - svga->crtc[svga->crtcreg] = val; - if (svga->crtcreg > 0x18) - s3_virge_log("OUTB VGA reg = %02x, val = %02x\n", svga->crtcreg, val); + old = svga->crtc[svga->crtcreg]; + svga->crtc[svga->crtcreg] = val; switch (svga->crtcreg) { case 0x31: @@ -528,7 +567,8 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) svga->hwcursor.xoff = svga->crtc[0x4e] & 0x3f; svga->hwcursor.yoff = svga->crtc[0x4f] & 0x3f; cursoraddr = (virge->memory_size == 8) ? 0x1fff : 0x0fff; - svga->hwcursor.addr = ((((svga->crtc[0x4c] << 8) | svga->crtc[0x4d]) & cursoraddr) * 1024) + (svga->hwcursor.yoff * 16); + svga->hwcursor.addr = ((((svga->crtc[0x4c] << 8) | + svga->crtc[0x4d]) & cursoraddr) * 1024) + (svga->hwcursor.yoff * 16); break; case 0x4a: @@ -552,7 +592,7 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) switch (virge->hwc_col_stack_pos) { case 0: virge->hwc_bg_col = (virge->hwc_bg_col & 0xffff00) | val; - break; + break; case 1: virge->hwc_bg_col = (virge->hwc_bg_col & 0xff00ff) | (val << 8); break; @@ -600,8 +640,8 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) svga->bpp = (virge->chip == S3_VIRGEVX) ? 24 : 32; break; default: - svga->bpp = 8; - break; + svga->bpp = 8; + break; } break; @@ -616,7 +656,8 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) if (svga->crtcreg < 0xe || svga->crtcreg > 0x10) { if ((svga->crtcreg == 0xc) || (svga->crtcreg == 0xd)) { svga->fullchange = 3; - svga->ma_latch = ((svga->crtc[0xc] << 8) | svga->crtc[0xd]) + ((svga->crtc[8] & 0x60) >> 5); + svga->ma_latch = ((svga->crtc[0xc] << 8) | svga->crtc[0xd]) + + ((svga->crtc[8] & 0x60) >> 5); if ((svga->crtc[0x67] & 0xc) != 0xc) svga->ma_latch |= (virge->ma_ext << 16); } else { @@ -634,10 +675,9 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) } static uint8_t -s3_virge_in(uint16_t addr, void *priv) -{ +s3_virge_in(uint16_t addr, void *priv) { virge_t *virge = (virge_t *) priv; - svga_t *svga = &virge->svga; + svga_t * svga = &virge->svga; uint8_t ret; if (((addr & 0xfff0) == 0x3d0 || (addr & 0xfff0) == 0x3b0) && !(svga->miscout & 1)) @@ -660,10 +700,10 @@ s3_virge_in(uint16_t addr, void *priv) ret = 0xff; break; - case 0x3D4: + case 0x3d4: ret = svga->crtcreg; break; - case 0x3D5: + case 0x3d5: switch (svga->crtcreg) { case 0x2d: ret = virge->virge_id_high; @@ -680,15 +720,15 @@ s3_virge_in(uint16_t addr, void *priv) case 0x31: ret = (svga->crtc[0x31] & 0xcf) | ((virge->ma_ext & 3) << 4); break; - case 0x33: - ret = (svga->crtc[0x33] | 0x04); - break; case 0x35: ret = (svga->crtc[0x35] & 0xf0) | (virge->bank & 0xf); break; + case 0x36: + ret = (svga->crtc[0x36] & 0xfc) | 2; + break; /*PCI bus*/ case 0x45: virge->hwc_col_stack_pos = 0; - ret = svga->crtc[0x45]; + ret = svga->crtc[0x45]; break; case 0x51: ret = (svga->crtc[0x51] & 0xf0) | ((virge->bank >> 2) & 0xc) | ((virge->ma_ext >> 2) & 3); @@ -735,13 +775,13 @@ s3_virge_in(uint16_t addr, void *priv) ret = svga_in(addr, svga); break; } + return ret; } static void -s3_virge_recalctimings(svga_t *svga) -{ - const virge_t *virge = (virge_t *) svga->priv; +s3_virge_recalctimings(svga_t *svga) { + virge_t *virge = (virge_t *) svga->priv; svga->hdisp = svga->hdisp_old; @@ -778,7 +818,7 @@ s3_virge_recalctimings(svga_t *svga) int n = svga->seqregs[0x12] & 0x1f; int r = (svga->seqregs[0x12] >> 5); - if (virge->chip == S3_VIRGEVX || virge->chip == S3_VIRGEDX) + if ((virge->chip == S3_VIRGEVX) || (virge->chip == S3_VIRGEDX)) r &= 7; else if (virge->chip >= S3_VIRGEGX2) r &= 10; @@ -812,9 +852,7 @@ s3_virge_recalctimings(svga_t *svga) video_force_resize_set_monitor(1, svga->monitor_index); } - /* ViRGE/GX2 and later does not use primary stream registers. */ - if ((svga->crtc[0x67] & 0xc) != 0xc || virge->chip >= S3_VIRGEGX2) /*VGA mode*/ - { + if ((svga->crtc[0x67] & 0xc) != 0xc) { /*VGA mode*/ svga->ma_latch |= (virge->ma_ext << 16); if (svga->crtc[0x51] & 0x30) svga->rowoffset |= (svga->crtc[0x51] & 0x30) << 4; @@ -824,47 +862,42 @@ s3_virge_recalctimings(svga_t *svga) svga->rowoffset = 256; svga->lowres = !((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10)); - if ((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10)) { - switch (svga->bpp) { - case 8: - svga->render = svga_render_8bpp_highres; - break; - case 15: - svga->render = svga_render_15bpp_highres; - if (virge->chip != S3_VIRGEVX && virge->chip < S3_VIRGEGX2) { - // svga->htotal >>= 1; - // if ((svga->crtc[0x33] & 0x20) || ((svga->crtc[0x67] & 0xc) == 0xc)) - // svga->hblank_end_val = svga->htotal - 1; - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - } - break; - case 16: - svga->render = svga_render_16bpp_highres; - if (virge->chip != S3_VIRGEVX && virge->chip < S3_VIRGEGX2) { - // svga->htotal >>= 1; - // if ((svga->crtc[0x33] & 0x20) || ((svga->crtc[0x67] & 0xc) == 0xc)) - // svga->hblank_end_val = svga->htotal - 1; - svga->hdisp >>= 1; - svga->dots_per_clock >>= 1; - } - break; - case 24: - svga->render = svga_render_24bpp_highres; - if (virge->chip != S3_VIRGEVX && virge->chip < S3_VIRGEGX2) - svga->rowoffset = (svga->rowoffset * 3) / 4; /*Hack*/ - break; - case 32: - svga->render = svga_render_32bpp_highres; - break; + if ((svga->gdcreg[5] & 0x40) && (svga->crtc[0x3a] & 0x10)) switch (svga->bpp) { + case 8: + svga->render = svga_render_8bpp_highres; + break; + case 15: + svga->render = svga_render_15bpp_highres; + if ((virge->chip != S3_VIRGEVX) && (virge->chip < S3_VIRGEGX2)) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } + break; + case 16: + svga->render = svga_render_16bpp_highres; + if ((virge->chip != S3_VIRGEVX) && (virge->chip < S3_VIRGEGX2)) { + svga->hdisp >>= 1; + svga->dots_per_clock >>= 1; + } + break; + case 24: + svga->render = svga_render_24bpp_highres; + if ((virge->chip != S3_VIRGEVX) && (virge->chip < S3_VIRGEGX2)) + svga->rowoffset = (svga->rowoffset * 3) / 4; /*Hack*/ + break; + case 32: + svga->render = svga_render_32bpp_highres; + break; default: break; - } } - svga->vram_display_mask = (!(svga->crtc[0x31] & 0x08) && (svga->crtc[0x32] & 0x40)) ? 0x3ffff : virge->vram_mask; + + svga->vram_display_mask = (!(svga->crtc[0x31] & 0x08) && + (svga->crtc[0x32] & 0x40)) ? 0x3ffff : virge->vram_mask; + svga->overlay.ena = 0; - s3_virge_log("VGA mode\n"); + if (virge->chip >= S3_VIRGEGX2 && (svga->crtc[0x67] & 0xc) == 0xc) { /* ViRGE/GX2 and later does not use primary stream registers. */ svga->overlay.x = virge->streams.sec_x; @@ -881,8 +914,7 @@ s3_virge_recalctimings(svga_t *svga) svga->rowoffset = virge->streams.pri_stride >> 3; svga->vram_display_mask = virge->vram_mask; } - } else /*Streams mode*/ - { + } else { /*Streams mode*/ if (virge->streams.buffer_ctrl & 1) svga->ma_latch = virge->streams.pri_fb1 >> 2; else @@ -892,8 +924,8 @@ s3_virge_recalctimings(svga_t *svga) if (virge->streams.pri_h < svga->dispend) svga->dispend = virge->streams.pri_h; - svga->overlay.x = virge->streams.sec_x - virge->streams.pri_x; - svga->overlay.y = virge->streams.sec_y - virge->streams.pri_y; + svga->overlay.x = virge->streams.sec_x - virge->streams.pri_x; + svga->overlay.y = virge->streams.sec_y - virge->streams.pri_y; svga->overlay.cur_ysize = virge->streams.sec_h; if (virge->streams.buffer_ctrl & 2) @@ -901,12 +933,14 @@ s3_virge_recalctimings(svga_t *svga) else svga->overlay.addr = virge->streams.sec_fb0; - svga->overlay.ena = (svga->overlay.x >= 0); + svga->overlay.ena = (svga->overlay.x >= 0); svga->overlay.v_acc = virge->streams.dda_vert_accumulator; - svga->rowoffset = virge->streams.pri_stride >> 3; + + svga->rowoffset = virge->streams.pri_stride >> 3; if (virge->chip <= S3_VIRGEDX && svga->overlay.ena) { - svga->overlay.ena = (((virge->streams.blend_ctrl >> 24) & 7) == 0b000) || (((virge->streams.blend_ctrl >> 24) & 7) == 0b101); + svga->overlay.ena = (((virge->streams.blend_ctrl >> 24) & 7) == 0b000) || + (((virge->streams.blend_ctrl >> 24) & 7) == 0b101); } else if (virge->chip == S3_VIRGEGX2 && svga->overlay.ena) { /* 0x20 = Secondary Stream enabled */ /* 0x2000 = Primary Stream enabled */ @@ -918,17 +952,9 @@ s3_virge_recalctimings(svga_t *svga) svga->render = svga_render_8bpp_highres; break; case 3: /*KRGB-16 (1.5.5.5)*/ - // svga->htotal >>= 1; - // if ((svga->crtc[0x33] & 0x20) || ((svga->crtc[0x67] & 0xc) == 0xc)) - // svga->hblank_end_val = svga->htotal - 1; - // svga->dots_per_clock >>= 1; svga->render = svga_render_15bpp_highres; break; case 5: /*RGB-16 (5.6.5)*/ - // svga->htotal >>= 1; - // if ((svga->crtc[0x33] & 0x20) || ((svga->crtc[0x67] & 0xc) == 0xc)) - // svga->hblank_end_val = svga->htotal - 1; - // svga->dots_per_clock >>= 1; svga->render = svga_render_16bpp_highres; break; case 6: /*RGB-24 (8.8.8)*/ @@ -937,9 +963,6 @@ s3_virge_recalctimings(svga_t *svga) case 7: /*XRGB-32 (X.8.8.8)*/ svga->render = svga_render_32bpp_highres; break; - - default: - break; } svga->vram_display_mask = virge->vram_mask; } @@ -976,8 +999,7 @@ s3_virge_update_buffer(virge_t *virge) } static void -s3_virge_updatemapping(virge_t *virge) -{ +s3_virge_updatemapping(virge_t *virge) { svga_t *svga = &virge->svga; if (!(virge->pci_regs[PCI_REG_COMMAND] & PCI_COMMAND_MEM)) { @@ -988,10 +1010,8 @@ s3_virge_updatemapping(virge_t *virge) return; } - s3_virge_log("Update mapping - bank %02X ", svga->gdcreg[6] & 0xc); - /*Banked framebuffer*/ - switch (svga->gdcreg[6] & 0xc) { /*VGA mapping*/ - case 0x0: /*128k at A0000*/ + switch (svga->gdcreg[6] & 0xc) { /*Banked framebuffer*/ + case 0x0: /*128k at A0000*/ mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); svga->banked_mask = 0xffff; break; @@ -1007,16 +1027,12 @@ s3_virge_updatemapping(virge_t *virge) mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); svga->banked_mask = 0x7fff; break; - - default: - break; } virge->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24); - s3_virge_log("Linear framebuffer %02X, linear base = %08x, display mask = %08x\n", svga->crtc[0x58] & 0x17, virge->linear_base, svga->vram_display_mask); if ((svga->crtc[0x58] & 0x10) || (virge->advfunc_cntl & 0x10)) { /*Linear framebuffer*/ - switch (svga->crtc[0x58] & 7) { + switch (svga->crtc[0x58] & 3) { case 0: /*64k*/ virge->linear_size = 0x10000; break; @@ -1027,7 +1043,7 @@ s3_virge_updatemapping(virge_t *virge) virge->linear_size = 0x200000; break; case 3: /*4mb on other than ViRGE/VX, 8mb on ViRGE/VX*/ - if (virge->chip == S3_VIRGEVX || virge->chip == S3_TRIO3D2X) + if ((virge->chip == S3_VIRGEVX) || (virge->chip == S3_TRIO3D2X)) virge->linear_size = 0x800000; else virge->linear_size = 0x400000; @@ -1035,17 +1051,13 @@ s3_virge_updatemapping(virge_t *virge) case 7: virge->linear_size = 0x800000; break; - - default: - break; } virge->linear_base &= ~(virge->linear_size - 1); - s3_virge_log("Linear framebuffer at %08X size %08X, mask = %08x, CRTC58 sel = %02x\n", virge->linear_base, virge->linear_size, virge->vram_mask, svga->crtc[0x58] & 7); if (virge->linear_base == 0xa0000) { mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); mem_mapping_disable(&virge->linear_mapping); } else { - if (virge->chip == S3_VIRGEVX || virge->chip == S3_TRIO3D2X) + if ((virge->chip == S3_VIRGEVX) || (virge->chip == S3_TRIO3D2X)) virge->linear_base &= 0xfe000000; else virge->linear_base &= 0xfc000000; @@ -1058,11 +1070,7 @@ s3_virge_updatemapping(virge_t *virge) svga->fb_only = 0; } - s3_virge_log("Memory mapped IO %02X\n", svga->crtc[0x53] & 0x38); - - /* Memory mapped I/O. */ - /* Old MMIO. */ - if ((svga->crtc[0x53] & 0x10) || (virge->advfunc_cntl & 0x20)) { + if ((svga->crtc[0x53] & 0x10) || (virge->advfunc_cntl & 0x20)) { /*Old MMIO*/ if (svga->crtc[0x53] & 0x20) mem_mapping_set_addr(&virge->mmio_mapping, 0xb8000, 0x8000); else @@ -1070,41 +1078,37 @@ s3_virge_updatemapping(virge_t *virge) } else mem_mapping_disable(&virge->mmio_mapping); - /* New MMIO. */ - if (svga->crtc[0x53] & 0x08) + if (svga->crtc[0x53] & 0x08) /*New MMIO*/ mem_mapping_set_addr(&virge->new_mmio_mapping, virge->linear_base + 0x1000000, 0x10000); else mem_mapping_disable(&virge->new_mmio_mapping); } static void -s3_virge_vblank_start(svga_t *svga) -{ +s3_virge_vblank_start(svga_t *svga) { virge_t *virge = (virge_t *) svga->priv; virge->subsys_stat |= INT_VSY; s3_virge_update_irqs(virge); } -static void s3_virge_wait_fifo_idle(virge_t *virge) { +static void +s3_virge_wait_fifo_idle(virge_t *virge) { while (!FIFO_EMPTY) { - s3_virge_wake_fifo_thread(virge); + wake_fifo_thread(virge); thread_wait_event(virge->fifo_not_full_event, 1); } } static uint8_t -s3_virge_mmio_read(uint32_t addr, void *priv) -{ +s3_virge_mmio_read(uint32_t addr, void *priv) { virge_t *virge = (virge_t *) priv; - uint8_t ret = 0xff; - - s3_virge_log("[%04X:%08X]: MMIO ReadB addr = %04x\n", CS, cpu_state.pc, addr & 0xffff); + uint8_t ret; switch (addr & 0xffff) { case 0x8504: if (!virge->virge_busy) - s3_virge_wake_fifo_thread(virge); + wake_fifo_thread(virge); ret = virge->subsys_stat; return ret; @@ -1114,11 +1118,8 @@ s3_virge_mmio_read(uint32_t addr, void *priv) ret |= 0x10; else ret |= 0x30; - if (!virge->virge_busy) - s3_virge_wake_fifo_thread(virge); - - s3_virge_log("Subsys status BYTE1, busy=%d, fiford=%d, fifowr=%d, ret=%x.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx, ret); + wake_fifo_thread(virge); return ret; case 0x850c: @@ -1130,55 +1131,8 @@ s3_virge_mmio_read(uint32_t addr, void *priv) ret = virge->fifo_slots_num >> 2; return ret; - case 0x83b0: - case 0x83b1: - case 0x83b2: - case 0x83b3: - case 0x83b4: - case 0x83b5: - case 0x83b6: - case 0x83b7: - case 0x83b8: - case 0x83b9: - case 0x83ba: - case 0x83bb: - case 0x83bc: - case 0x83bd: - case 0x83be: - case 0x83bf: - case 0x83c0: - case 0x83c1: - case 0x83c2: - case 0x83c3: - case 0x83c4: - case 0x83c5: - case 0x83c6: - case 0x83c7: - case 0x83c8: - case 0x83c9: - case 0x83ca: - case 0x83cb: - case 0x83cc: - case 0x83cd: - case 0x83ce: - case 0x83cf: - case 0x83d0: - case 0x83d1: - case 0x83d2: - case 0x83d3: - case 0x83d4: - case 0x83d5: - case 0x83d6: - case 0x83d7: - case 0x83d8: - case 0x83d9: - case 0x83da: - case 0x83db: - case 0x83dc: - case 0x83dd: - case 0x83de: - case 0x83df: - return s3_virge_in(addr & 0x3ff, virge); + case 0x83b0 ... 0x83df: + return s3_virge_in(addr & 0x3ff, priv); case 0x859c: return virge->cmd_dma; @@ -1191,20 +1145,14 @@ s3_virge_mmio_read(uint32_t addr, void *priv) if ((virge->serialport & SERIAL_PORT_SDW) && i2c_gpio_get_sda(virge->i2c)) ret |= SERIAL_PORT_SDR; return ret; - - default: - break; } return 0xff; } static uint16_t -s3_virge_mmio_read_w(uint32_t addr, void *priv) -{ +s3_virge_mmio_read_w(uint32_t addr, void *priv) { virge_t *virge = (virge_t *) priv; - uint16_t ret = 0xffff; - - s3_virge_log("[%04X:%08X]: MMIO ReadW addr = %04x\n", CS, cpu_state.pc, addr & 0xfffe); + uint16_t ret; switch (addr & 0xfffe) { case 0x8504: @@ -1216,7 +1164,7 @@ s3_virge_mmio_read_w(uint32_t addr, void *priv) ret |= virge->subsys_stat; if (!virge->virge_busy) - s3_virge_wake_fifo_thread(virge); + wake_fifo_thread(virge); return ret; case 0x850c: @@ -1228,17 +1176,16 @@ s3_virge_mmio_read_w(uint32_t addr, void *priv) return virge->cmd_dma; default: - return s3_virge_mmio_read(addr, virge) | (s3_virge_mmio_read(addr + 1, virge) << 8); + return s3_virge_mmio_read(addr, priv) | (s3_virge_mmio_read(addr + 1, priv) << 8); } - return 0xffff; } static uint32_t -s3_virge_mmio_read_l(uint32_t addr, void *priv) -{ +s3_virge_mmio_read_l(uint32_t addr, void *priv) { virge_t *virge = (virge_t *) priv; - uint32_t ret = 0xffffffff; + svga_t *svga = &virge->svga; + uint32_t ret = 0xffffffff; switch (addr & 0xfffc) { case 0x8180: @@ -1258,30 +1205,46 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) break; case 0x81a0: ret = virge->streams.blend_ctrl; + svga_recalctimings(svga); break; case 0x81c0: ret = virge->streams.pri_fb0; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; break; case 0x81c4: ret = virge->streams.pri_fb1; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; break; case 0x81c8: ret = virge->streams.pri_stride; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; break; case 0x81cc: ret = virge->streams.buffer_ctrl; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; break; case 0x81d0: ret = virge->streams.sec_fb0; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; break; case 0x81d4: ret = virge->streams.sec_fb1; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; break; case 0x81d8: ret = virge->streams.sec_stride; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; break; case 0x81dc: ret = virge->streams.overlay_ctrl; + svga->fullchange = changeframecount; break; case 0x81e0: ret = virge->streams.k1_vert_scale; @@ -1314,12 +1277,9 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) ret |= 0x00001000; else ret |= 0x00003000; - ret |= virge->subsys_stat; if (!virge->virge_busy) - s3_virge_wake_fifo_thread(virge); - - s3_virge_log("Subsys status DWORD, busy=%d, fiford=%d, fifowr=%d.\n", virge->virge_busy, virge->fifo_read_idx, virge->fifo_write_idx); + wake_fifo_thread(virge); break; case 0x850c: @@ -1463,569 +1423,387 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) default: ret = s3_virge_mmio_read_w(addr, priv) | (s3_virge_mmio_read_w(addr + 2, priv) << 16); - break; } - s3_virge_log("MMIO ReadL addr = %04x, val = %08x.\n", addr & 0xfffc, ret); return ret; } static void -s3_virge_mmio_fifo_write(uint32_t addr, uint8_t val, virge_t *virge) -{ - if ((addr & 0xffff) < 0x8000) - s3_virge_bitblt(virge, 8, val); - else { - switch (addr & 0xffff) { - case 0x859c: - virge->cmd_dma = val; - break; - - default: - break; - } - } -} - -static void -s3_virge_mmio_fifo_write_w(uint32_t addr, uint16_t val, virge_t *virge) -{ - if ((addr & 0xfffe) < 0x8000) { - if (virge->s3d.cmd_set & CMD_SET_MS) - s3_virge_bitblt(virge, 16, ((val >> 8) | (val << 8)) << 16); - else - s3_virge_bitblt(virge, 16, val); - } else { - if ((addr & 0xfffe) == 0x859c) - virge->cmd_dma = val; - } -} - -static void -s3_virge_mmio_fifo_write_l(uint32_t addr, uint32_t val, virge_t *virge) -{ - if ((addr & 0xfffc) < 0x8000) { - if (virge->s3d.cmd_set & CMD_SET_MS) - s3_virge_bitblt(virge, 32, ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); - else - s3_virge_bitblt(virge, 32, val); - } else { - switch (addr & 0xfffc) { - case 0x8590: - virge->cmd_dma_base = val; - break; - - case 0x8594: - virge->dma_ptr = val; - break; - - case 0x8598: - break; - - case 0x859c: - virge->cmd_dma = val; - break; - - case 0xa000: - case 0xa004: - case 0xa008: - case 0xa00c: - case 0xa010: - case 0xa014: - case 0xa018: - case 0xa01c: - case 0xa020: - case 0xa024: - case 0xa028: - case 0xa02c: - case 0xa030: - case 0xa034: - case 0xa038: - case 0xa03c: - case 0xa040: - case 0xa044: - case 0xa048: - case 0xa04c: - case 0xa050: - case 0xa054: - case 0xa058: - case 0xa05c: - case 0xa060: - case 0xa064: - case 0xa068: - case 0xa06c: - case 0xa070: - case 0xa074: - case 0xa078: - case 0xa07c: - case 0xa080: - case 0xa084: - case 0xa088: - case 0xa08c: - case 0xa090: - case 0xa094: - case 0xa098: - case 0xa09c: - case 0xa0a0: - case 0xa0a4: - case 0xa0a8: - case 0xa0ac: - case 0xa0b0: - case 0xa0b4: - case 0xa0b8: - case 0xa0bc: - case 0xa0c0: - case 0xa0c4: - case 0xa0c8: - case 0xa0cc: - case 0xa0d0: - case 0xa0d4: - case 0xa0d8: - case 0xa0dc: - case 0xa0e0: - case 0xa0e4: - case 0xa0e8: - case 0xa0ec: - case 0xa0f0: - case 0xa0f4: - case 0xa0f8: - case 0xa0fc: - case 0xa100: - case 0xa104: - case 0xa108: - case 0xa10c: - case 0xa110: - case 0xa114: - case 0xa118: - case 0xa11c: - case 0xa120: - case 0xa124: - case 0xa128: - case 0xa12c: - case 0xa130: - case 0xa134: - case 0xa138: - case 0xa13c: - case 0xa140: - case 0xa144: - case 0xa148: - case 0xa14c: - case 0xa150: - case 0xa154: - case 0xa158: - case 0xa15c: - case 0xa160: - case 0xa164: - case 0xa168: - case 0xa16c: - case 0xa170: - case 0xa174: - case 0xa178: - case 0xa17c: - case 0xa180: - case 0xa184: - case 0xa188: - case 0xa18c: - case 0xa190: - case 0xa194: - case 0xa198: - case 0xa19c: - case 0xa1a0: - case 0xa1a4: - case 0xa1a8: - case 0xa1ac: - case 0xa1b0: - case 0xa1b4: - case 0xa1b8: - case 0xa1bc: - case 0xa1c0: - case 0xa1c4: - case 0xa1c8: - case 0xa1cc: - case 0xa1d0: - case 0xa1d4: - case 0xa1d8: - case 0xa1dc: - case 0xa1e0: - case 0xa1e4: - case 0xa1e8: - case 0xa1ec: - case 0xa1f0: - case 0xa1f4: - case 0xa1f8: - case 0xa1fc: - { - int x = addr & 4; - int y = (addr >> 3) & 7; - int color; - int byte; - virge->s3d.pattern_8[y * 8 + x] = val & 0xff; - virge->s3d.pattern_8[y * 8 + x + 1] = val >> 8; - virge->s3d.pattern_8[y * 8 + x + 2] = val >> 16; - virge->s3d.pattern_8[y * 8 + x + 3] = val >> 24; - - x = (addr >> 1) & 6; - y = (addr >> 4) & 7; - virge->s3d.pattern_16[y * 8 + x] = val & 0xffff; - virge->s3d.pattern_16[y * 8 + x + 1] = val >> 16; - - addr &= 0x00ff; - for (uint8_t xx = 0; xx < 4; xx++) { - x = ((addr + xx) / 3) % 8; - y = ((addr + xx) / 24) % 8; - color = ((addr + xx) % 3) << 3; - byte = (xx << 3); - virge->s3d.pattern_24[y * 8 + x] &= ~(0xff << color); - virge->s3d.pattern_24[y * 8 + x] |= ((val >> byte) & 0xff) << color; - } - - x = (addr >> 2) & 7; - y = (addr >> 5) & 7; - virge->s3d.pattern_32[y * 8 + x] = val & 0xffffff; - } - break; - - case 0xa4d4: /*2D BitBLT SRC Base*/ - case 0xa8d4: /*2D Line SRC Base*/ - case 0xacd4: /*2D Polygon SRC Base*/ - virge->s3d.src_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); - s3_virge_log("PortWrite = %04x, SRC Base = %08x, memsize = %i\n", addr & 0xfffc, val, virge->memory_size); - break; - case 0xa4d8: /*2D BitBLT DEST Base*/ - case 0xa8d8: /*2D Line DEST Base*/ - case 0xacd8: /*2D Polygon DEST Base*/ - virge->s3d.dest_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); - s3_virge_log("PortWrite = %04x, DST Base = %08x, memsize = %i\n", addr & 0xfffc, val, virge->memory_size); - break; - case 0xa4dc: /*2D BitBLT Left/Right Clipping*/ - case 0xa8dc: /*2D Line Left/Right Clipping*/ - case 0xacdc: /*2D Polygon Left/Right Clipping*/ - virge->s3d.clip_l = (val >> 16) & 0x7ff; - virge->s3d.clip_r = val & 0x7ff; - break; - case 0xa4e0: /*2D BitBLT Top/Bottom Clipping*/ - case 0xa8e0: /*2D Line Top/Bottom Clipping*/ - case 0xace0: /*2D Polygon Top/Bottom Clipping*/ - virge->s3d.clip_t = (val >> 16) & 0x7ff; - virge->s3d.clip_b = val & 0x7ff; - break; - case 0xa4e4: /*2D BitBLT DEST/SRC Stride*/ - case 0xa8e4: /*2D Line DEST/SRC Stride*/ - case 0xace4: /*2D Polygon DEST/SRC Stride*/ - virge->s3d.dest_str = (val >> 16) & 0xff8; - virge->s3d.src_str = val & 0xff8; - break; - case 0xa4e8: /*2D BitBLT Mono Pattern 0*/ - case 0xace8: /*2D Polygon Mono Pattern 0*/ - virge->s3d.mono_pat_0 = val; - break; - case 0xa4ec: /*2D BitBLT Mono Pattern 1*/ - case 0xacec: /*2D Polygon Mono Pattern 1*/ - virge->s3d.mono_pat_1 = val; - break; - case 0xa4f0: /*2D BitBLT Mono Pattern Background*/ - case 0xacf0: /*2D Polygon Mono Pattern Background*/ - virge->s3d.pat_bg_clr = val; - break; - case 0xa4f4: /*2D BitBLT Mono Pattern Foreground*/ - case 0xa8f4: /*2D Line Mono Pattern Foreground*/ - case 0xacf4: /*2D Polygon Mono Pattern Foreground*/ - virge->s3d.pat_fg_clr = val; - break; - case 0xa4f8: /*2D BitBLT SRC Background*/ - virge->s3d.src_bg_clr = val; - break; - case 0xa4fc: /*2D BitBLT SRC Foreground*/ - virge->s3d.src_fg_clr = val; - break; - case 0xa500: /*2D BitBLT Command Set*/ - case 0xa900: /*2D Line Command Set*/ - case 0xad00: /*2D Polygon Command Set*/ - virge->s3d.cmd_set = val; - if (!(val & CMD_SET_AE)) { - s3_virge_log("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); - s3_virge_bitblt(virge, -1, 0); - } - break; - case 0xa504: /*2D BitBLT Rectangle Width/Height*/ - virge->s3d.r_width = (val >> 16) & 0x7ff; - virge->s3d.r_height = val & 0x7ff; - break; - case 0xa508: /*2D BitBLT Rectangle SRC X/Y*/ - virge->s3d.rsrc_x = (val >> 16) & 0x7ff; - virge->s3d.rsrc_y = val & 0x7ff; - break; - case 0xa50c: /*2D BitBLT Rectangle DEST X/Y*/ - virge->s3d.rdest_x = (val >> 16) & 0x7ff; - virge->s3d.rdest_y = val & 0x7ff; - if (virge->s3d.cmd_set & CMD_SET_AE) { - s3_virge_log("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); - s3_virge_bitblt(virge, -1, 0); - } - break; - case 0xa96c: /*2D Line Draw Endpoints*/ - virge->s3d.lxend0 = (val >> 16) & 0x7ff; - virge->s3d.lxend1 = val & 0x7ff; - break; - case 0xa970: /*2D Line X Delta*/ - virge->s3d.ldx = (int32_t) val; - break; - case 0xa974: /*2D Line X Start*/ - virge->s3d.lxstart = val; - break; - case 0xa978: /*2D Line Y Start*/ - virge->s3d.lystart = val & 0x7ff; - break; - case 0xa97c: /*2D Line Y Count*/ - virge->s3d.lycnt = val & 0x7ff; - virge->s3d.line_dir = val >> 31; - if (virge->s3d.cmd_set & CMD_SET_AE) { - s3_virge_log("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); - s3_virge_bitblt(virge, -1, 0); - } - break; - - case 0xad68: /*2D Polygon Right X Delta*/ - virge->s3d.prdx = val; - break; - case 0xad6c: /*2D Polygon Right X Start*/ - virge->s3d.prxstart = val; - break; - case 0xad70: /*2D Polygon Left X Delta*/ - virge->s3d.pldx = val; - break; - case 0xad74: /*2D Polygon Left X Start*/ - virge->s3d.plxstart = val; - break; - case 0xad78: /*2D Polygon Y Start*/ - virge->s3d.pystart = val & 0x7ff; - break; - case 0xad7c: /*2D Polygon Y Count*/ - virge->s3d.pycnt = val & 0x300007ff; - if (virge->s3d.cmd_set & CMD_SET_AE) { - s3_virge_log("Start blit: WriteL addr = %04x, val = %08x.\n", addr & 0xfffc, val); - s3_virge_bitblt(virge, -1, 0); - } - break; - - case 0xb0d4: - case 0xb4d4: - virge->s3d_tri.z_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); - break; - case 0xb0d8: - case 0xb4d8: - virge->s3d_tri.dest_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); - break; - case 0xb0dc: - case 0xb4dc: - virge->s3d_tri.clip_l = (val >> 16) & 0x7ff; - virge->s3d_tri.clip_r = val & 0x7ff; - break; - case 0xb0e0: - case 0xb4e0: - virge->s3d_tri.clip_t = (val >> 16) & 0x7ff; - virge->s3d_tri.clip_b = val & 0x7ff; - break; - case 0xb0e4: - case 0xb4e4: - virge->s3d_tri.dest_str = (val >> 16) & 0xff8; - virge->s3d.src_str = val & 0xff8; - break; - case 0xb0e8: - case 0xb4e8: - virge->s3d_tri.z_str = val & 0xff8; - break; - case 0xb4ec: - virge->s3d_tri.tex_base = (virge->memory_size == 8) ? (val & 0x7ffff8) : (val & 0x3ffff8); - break; - case 0xb4f0: - virge->s3d_tri.tex_bdr_clr = val & 0xffffff; - break; - case 0xb0f4: - case 0xb4f4: - virge->s3d_tri.fog_b = val & 0xff; - virge->s3d_tri.fog_g = (val >> 8) & 0xff; - virge->s3d_tri.fog_r = (val >> 16) & 0xff; - break; - case 0xb100: - case 0xb500: - virge->s3d_tri.cmd_set = val; - if (!(val & CMD_SET_AE)) - queue_triangle(virge); - break; - case 0xb504: - virge->s3d_tri.tbv = val & 0xfffff; - break; - case 0xb508: - virge->s3d_tri.tbu = val & 0xfffff; - break; - case 0xb50c: - virge->s3d_tri.TdWdX = val; - break; - case 0xb510: - virge->s3d_tri.TdWdY = val; - break; - case 0xb514: - virge->s3d_tri.tws = val; - break; - case 0xb518: - virge->s3d_tri.TdDdX = val; - break; - case 0xb51c: - virge->s3d_tri.TdVdX = val; - break; - case 0xb520: - virge->s3d_tri.TdUdX = val; - break; - case 0xb524: - virge->s3d_tri.TdDdY = val; - break; - case 0xb528: - virge->s3d_tri.TdVdY = val; - break; - case 0xb52c: - virge->s3d_tri.TdUdY = val; - break; - case 0xb530: - virge->s3d_tri.tds = val; - break; - case 0xb534: - virge->s3d_tri.tvs = val; - break; - case 0xb538: - virge->s3d_tri.tus = val; - break; - case 0xb53c: - virge->s3d_tri.TdGdX = val >> 16; - virge->s3d_tri.TdBdX = val & 0xffff; - break; - case 0xb540: - virge->s3d_tri.TdAdX = val >> 16; - virge->s3d_tri.TdRdX = val & 0xffff; - break; - case 0xb544: - virge->s3d_tri.TdGdY = val >> 16; - virge->s3d_tri.TdBdY = val & 0xffff; - break; - case 0xb548: - virge->s3d_tri.TdAdY = val >> 16; - virge->s3d_tri.TdRdY = val & 0xffff; - break; - case 0xb54c: - virge->s3d_tri.tgs = (val >> 16) & 0xffff; - virge->s3d_tri.tbs = val & 0xffff; - break; - case 0xb550: - virge->s3d_tri.tas = (val >> 16) & 0xffff; - virge->s3d_tri.trs = val & 0xffff; - break; - - case 0xb554: - virge->s3d_tri.TdZdX = val; - break; - case 0xb558: - virge->s3d_tri.TdZdY = val; - break; - case 0xb55c: - virge->s3d_tri.tzs = val; - break; - case 0xb560: - virge->s3d_tri.TdXdY12 = val; - break; - case 0xb564: - virge->s3d_tri.txend12 = val; - break; - case 0xb568: - virge->s3d_tri.TdXdY01 = val; - break; - case 0xb56c: - virge->s3d_tri.txend01 = val; - break; - case 0xb570: - virge->s3d_tri.TdXdY02 = val; - break; - case 0xb574: - virge->s3d_tri.txs = val; - break; - case 0xb578: - virge->s3d_tri.tys = val; - break; - case 0xb57c: - virge->s3d_tri.ty01 = (val >> 16) & 0x7ff; - virge->s3d_tri.ty12 = val & 0x7ff; - virge->s3d_tri.tlr = val >> 31; - if (virge->s3d_tri.cmd_set & CMD_SET_AE) - queue_triangle(virge); - break; - - default: - break; - } - } -} - -static void -s3_virge_fifo_thread(void *priv) -{ - virge_t *virge = (virge_t *)priv; +fifo_thread(void *param) { + virge_t *virge = (virge_t *)param; while (virge->fifo_thread_run) { - s3_virge_log("Thread, entries=%d.\n", FIFO_ENTRIES); thread_set_event(virge->fifo_not_full_event); - //thread_wait_event(virge->wake_fifo_thread, -1); - //thread_reset_event(virge->wake_fifo_thread); + thread_wait_event(virge->wake_fifo_thread, -1); + thread_reset_event(virge->wake_fifo_thread); virge->virge_busy = 1; - s3_virge_log("Busy.\n"); while (!FIFO_EMPTY) { - s3_virge_log("COMMAND: RD=%d, WR=%d, addr=%04x, val=%08x.\n", virge->fifo_read_idx, virge->fifo_write_idx, virge->fifo[virge->fifo_read_idx].addr_type & FIFO_ADDR, virge->fifo[virge->fifo_read_idx].val); uint64_t start_time = plat_timer_read(); uint64_t end_time; fifo_entry_t *fifo = &virge->fifo[virge->fifo_read_idx & FIFO_MASK]; uint32_t val = fifo->val; - int op_type = (((fifo->addr_type & FIFO_ADDR) & 0x1c00) >> 10) - 1; switch (fifo->addr_type & FIFO_TYPE) { case FIFO_WRITE_BYTE: - s3_virge_mmio_fifo_write(fifo->addr_type & FIFO_ADDR, - val, virge); + if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000) + s3_virge_bitblt(virge, 8, val); + else if (((fifo->addr_type & FIFO_ADDR) & 0xffff) == 0x859c) + virge->cmd_dma = val; break; case FIFO_WRITE_WORD: - s3_virge_mmio_fifo_write_w(fifo->addr_type & FIFO_ADDR, - val, virge); + if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000) { + if (virge->s3d.cmd_set & CMD_SET_MS) + s3_virge_bitblt(virge, 16, ((val >> 8) | (val << 8)) << 16); + else + s3_virge_bitblt(virge, 16, val); + } else if (((fifo->addr_type & FIFO_ADDR) & 0xfffe) == 0x859c) + virge->cmd_dma = val; break; case FIFO_WRITE_DWORD: - s3_virge_mmio_fifo_write_l(fifo->addr_type & FIFO_ADDR, - val, virge); - break; - default: + if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000) { + if (virge->s3d.cmd_set & CMD_SET_MS) + s3_virge_bitblt(virge, 32, + ((val & 0xff000000) >> 24) | ((val & 0x00ff0000) >> 8) | + ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); + else + s3_virge_bitblt(virge, 32, val); + } else { + switch ((fifo->addr_type & FIFO_ADDR) & 0xfffc) { + case 0x8590: + virge->cmd_dma_base = val; + break; + + case 0x8594: + virge->dma_ptr = val; + break; + + case 0x8598: + break; + + case 0x859c: + virge->cmd_dma = val; + break; + + case 0xa000 ... 0xa1fc: + { + int x = (fifo->addr_type & FIFO_ADDR) & 4; + int y = ((fifo->addr_type & FIFO_ADDR) >> 3) & 7; + int color; + int byte; + uint32_t addr = (fifo->addr_type & FIFO_ADDR); + virge->s3d.pattern_8[y * 8 + x] = val & 0xff; + virge->s3d.pattern_8[y * 8 + x + 1] = val >> 8; + virge->s3d.pattern_8[y * 8 + x + 2] = val >> 16; + virge->s3d.pattern_8[y * 8 + x + 3] = val >> 24; + + x = ((fifo->addr_type & FIFO_ADDR) >> 1) & 6; + y = ((fifo->addr_type & FIFO_ADDR) >> 4) & 7; + virge->s3d.pattern_16[y * 8 + x] = val & 0xffff; + virge->s3d.pattern_16[y * 8 + x + 1] = val >> 16; + + addr &= 0x00ff; + for (uint8_t xx = 0; xx < 4; xx++) { + x = ((addr + xx) / 3) % 8; + y = ((addr + xx) / 24) % 8; + color = ((addr + xx) % 3) << 3; + byte = (xx << 3); + virge->s3d.pattern_24[y * 8 + x] &= ~(0xff << color); + virge->s3d.pattern_24[y * 8 + x] |= ((val >> byte) & 0xff) << color; + } + + x = ((fifo->addr_type & FIFO_ADDR) >> 2) & 7; + y = ((fifo->addr_type & FIFO_ADDR) >> 5) & 7; + virge->s3d.pattern_32[y * 8 + x] = val & 0xffffff; + } break; + + case 0xa4d4: + case 0xa8d4: + case 0xacd4: + virge->s3d.src_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xa4d8: + case 0xa8d8: + case 0xacd8: + virge->s3d.dest_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xa4dc: + case 0xa8dc: + case 0xacdc: + virge->s3d.clip_l = (val >> 16) & 0x7ff; + virge->s3d.clip_r = val & 0x7ff; + break; + case 0xa4e0: + case 0xa8e0: + case 0xace0: + virge->s3d.clip_t = (val >> 16) & 0x7ff; + virge->s3d.clip_b = val & 0x7ff; + break; + case 0xa4e4: + case 0xa8e4: + case 0xace4: + virge->s3d.dest_str = (val >> 16) & 0xff8; + virge->s3d.src_str = val & 0xff8; + break; + case 0xa4e8: + case 0xace8: + virge->s3d.mono_pat_0 = val; + break; + case 0xa4ec: + case 0xacec: + virge->s3d.mono_pat_1 = val; + break; + case 0xa4f0: + case 0xacf0: + virge->s3d.pat_bg_clr = val; + break; + case 0xa4f4: + case 0xa8f4: + case 0xacf4: + virge->s3d.pat_fg_clr = val; + break; + case 0xa4f8: + virge->s3d.src_bg_clr = val; + break; + case 0xa4fc: + virge->s3d.src_fg_clr = val; + break; + case 0xa500: + case 0xa900: + case 0xad00: + virge->s3d.cmd_set = val; + if (!(val & CMD_SET_AE)) + s3_virge_bitblt(virge, -1, 0); + break; + case 0xa504: + virge->s3d.r_width = (val >> 16) & 0x7ff; + virge->s3d.r_height = val & 0x7ff; + break; + case 0xa508: + virge->s3d.rsrc_x = (val >> 16) & 0x7ff; + virge->s3d.rsrc_y = val & 0x7ff; + break; + case 0xa50c: + virge->s3d.rdest_x = (val >> 16) & 0x7ff; + virge->s3d.rdest_y = val & 0x7ff; + if (virge->s3d.cmd_set & CMD_SET_AE) + s3_virge_bitblt(virge, -1, 0); + break; + case 0xa96c: + virge->s3d.lxend0 = (val >> 16) & 0x7ff; + virge->s3d.lxend1 = val & 0x7ff; + break; + case 0xa970: + virge->s3d.ldx = (int32_t)val; + break; + case 0xa974: + virge->s3d.lxstart = val; + break; + case 0xa978: + virge->s3d.lystart = val & 0x7ff; + break; + case 0xa97c: + virge->s3d.lycnt = val & 0x7ff; + virge->s3d.line_dir = val >> 31; + if (virge->s3d.cmd_set & CMD_SET_AE) + s3_virge_bitblt(virge, -1, 0); + break; + + case 0xad68: + virge->s3d.prdx = val; + break; + case 0xad6c: + virge->s3d.prxstart = val; + break; + case 0xad70: + virge->s3d.pldx = val; + break; + case 0xad74: + virge->s3d.plxstart = val; + break; + case 0xad78: + virge->s3d.pystart = val & 0x7ff; + break; + case 0xad7c: + virge->s3d.pycnt = val & 0x300007ff; + if (virge->s3d.cmd_set & CMD_SET_AE) + s3_virge_bitblt(virge, -1, 0); + break; + + case 0xb0d4: + case 0xb4d4: + virge->s3d_tri.z_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xb0d8: + case 0xb4d8: + virge->s3d_tri.dest_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xb0dc: + case 0xb4dc: + virge->s3d_tri.clip_l = (val >> 16) & 0x7ff; + virge->s3d_tri.clip_r = val & 0x7ff; + break; + case 0xb0e0: + case 0xb4e0: + virge->s3d_tri.clip_t = (val >> 16) & 0x7ff; + virge->s3d_tri.clip_b = val & 0x7ff; + break; + case 0xb0e4: + case 0xb4e4: + virge->s3d_tri.dest_str = (val >> 16) & 0xff8; + virge->s3d.src_str = val & 0xff8; + break; + case 0xb0e8: + case 0xb4e8: + virge->s3d_tri.z_str = val & 0xff8; + break; + case 0xb4ec: + virge->s3d_tri.tex_base = val & 0x3ffff8; + break; + case 0xb4f0: + virge->s3d_tri.tex_bdr_clr = val & 0xffffff; + break; + case 0xb0f4: + case 0xb4f4: + virge->s3d_tri.fog_b = val & 0xff; + virge->s3d_tri.fog_g = (val >> 8) & 0xff; + virge->s3d_tri.fog_r = (val >> 16) & 0xff; + break; + case 0xb100: + case 0xb500: + virge->s3d_tri.cmd_set = val; + if (!(val & CMD_SET_AE)) + queue_triangle(virge); + break; + case 0xb504: + virge->s3d_tri.tbv = val & 0xfffff; + break; + case 0xb508: + virge->s3d_tri.tbu = val & 0xfffff; + break; + case 0xb50c: + virge->s3d_tri.TdWdX = val; + break; + case 0xb510: + virge->s3d_tri.TdWdY = val; + break; + case 0xb514: + virge->s3d_tri.tws = val; + break; + case 0xb518: + virge->s3d_tri.TdDdX = val; + break; + case 0xb51c: + virge->s3d_tri.TdVdX = val; + break; + case 0xb520: + virge->s3d_tri.TdUdX = val; + break; + case 0xb524: + virge->s3d_tri.TdDdY = val; + break; + case 0xb528: + virge->s3d_tri.TdVdY = val; + break; + case 0xb52c: + virge->s3d_tri.TdUdY = val; + break; + case 0xb530: + virge->s3d_tri.tds = val; + break; + case 0xb534: + virge->s3d_tri.tvs = val; + break; + case 0xb538: + virge->s3d_tri.tus = val; + break; + case 0xb53c: + virge->s3d_tri.TdGdX = val >> 16; + virge->s3d_tri.TdBdX = val & 0xffff; + break; + case 0xb540: + virge->s3d_tri.TdAdX = val >> 16; + virge->s3d_tri.TdRdX = val & 0xffff; + break; + case 0xb544: + virge->s3d_tri.TdGdY = val >> 16; + virge->s3d_tri.TdBdY = val & 0xffff; + break; + case 0xb548: + virge->s3d_tri.TdAdY = val >> 16; + virge->s3d_tri.TdRdY = val & 0xffff; + break; + case 0xb54c: + virge->s3d_tri.tgs = (val >> 16) & 0xffff; + virge->s3d_tri.tbs = val & 0xffff; + break; + case 0xb550: + virge->s3d_tri.tas = (val >> 16) & 0xffff; + virge->s3d_tri.trs = val & 0xffff; + break; + + case 0xb554: + virge->s3d_tri.TdZdX = val; + break; + case 0xb558: + virge->s3d_tri.TdZdY = val; + break; + case 0xb55c: + virge->s3d_tri.tzs = val; + break; + case 0xb560: + virge->s3d_tri.TdXdY12 = val; + break; + case 0xb564: + virge->s3d_tri.txend12 = val; + break; + case 0xb568: + virge->s3d_tri.TdXdY01 = val; + break; + case 0xb56c: + virge->s3d_tri.txend01 = val; + break; + case 0xb570: + virge->s3d_tri.TdXdY02 = val; + break; + case 0xb574: + virge->s3d_tri.txs = val; + break; + case 0xb578: + virge->s3d_tri.tys = val; + break; + case 0xb57c: + virge->s3d_tri.ty01 = (val >> 16) & 0x7ff; + virge->s3d_tri.ty12 = val & 0x7ff; + virge->s3d_tri.tlr = val >> 31; + if (virge->s3d_tri.cmd_set & CMD_SET_AE) + queue_triangle(virge); + break; + } + } break; } virge->fifo_read_idx++; fifo->addr_type = FIFO_INVALID; - if (op_type) { - if (FIFO_ENTRIES > 0xe000) - thread_set_event(virge->fifo_not_full_event); - } else { - thread_set_event(virge->fifo_not_full_event); - if (((fifo->addr_type & FIFO_ADDR) & 0xffff) >= 0x8000) - virge->fifo_read_idx &= FIFO_MASK; - } + if (FIFO_ENTRIES > 0xe000) + thread_set_event(virge->fifo_not_full_event); - end_time = plat_timer_read(); - virge->blitter_time += end_time - start_time; - } - virge->virge_busy = 0; - virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; - s3_virge_update_irqs(virge); + end_time = plat_timer_read(); + virge_time += end_time - start_time; + } + virge->virge_busy = 0; + virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; + s3_virge_update_irqs(virge); } } static void -s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) -{ - int op_type = ((addr & 0x1c00) >> 10) - 1; +s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) { fifo_entry_t *fifo = &virge->fifo[virge->fifo_write_idx & FIFO_MASK]; if (FIFO_FULL) { @@ -2039,373 +1817,357 @@ s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) virge->fifo_write_idx++; - if (op_type) { - if (FIFO_ENTRIES > 0xe000) - s3_virge_wake_fifo_thread(virge); - if ((FIFO_ENTRIES > 0xe000) || (FIFO_ENTRIES < 8)) - s3_virge_wake_fifo_thread(virge); - } else { - if (FIFO_ENTRIES < 16) { - s3_virge_wake_fifo_thread(virge); - s3_virge_log("FIFO ENTRIES=%d.\n", FIFO_ENTRIES); - } else { - s3_virge_log("FIFO FULL.\n"); - thread_reset_event(virge->fifo_not_full_event); - thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ - } - if (((addr & 0xffff) >= 0x8000)) { - if (virge->fifo_write_idx == FIFO_SIZE) - virge->fifo_write_idx = 1; - } - } + if (FIFO_ENTRIES > 0xe000) + wake_fifo_thread(virge); + if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8) + wake_fifo_thread(virge); } static void -s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) -{ +s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) { virge_t *virge = (virge_t *) priv; - s3_virge_log("MMIO WriteB addr = %04x, val = %02x\n", addr & 0xffff, val); - if ((addr & 0xffff) < 0x8000) + + if ((addr & 0xfffc) < 0x8000) s3_virge_queue(virge, addr, val, FIFO_WRITE_BYTE); - else { - switch (addr & 0xffff) { - case 0x83b0: - case 0x83b1: - case 0x83b2: - case 0x83b3: - case 0x83b4: - case 0x83b5: - case 0x83b6: - case 0x83b7: - case 0x83b8: - case 0x83b9: - case 0x83ba: - case 0x83bb: - case 0x83bc: - case 0x83bd: - case 0x83be: - case 0x83bf: - case 0x83c0: - case 0x83c1: - case 0x83c2: - case 0x83c3: - case 0x83c4: - case 0x83c5: - case 0x83c6: - case 0x83c7: - case 0x83c8: - case 0x83c9: - case 0x83ca: - case 0x83cb: - case 0x83cc: - case 0x83cd: - case 0x83ce: - case 0x83cf: - case 0x83d0: - case 0x83d1: - case 0x83d2: - case 0x83d3: - case 0x83d4: - case 0x83d5: - case 0x83d6: - case 0x83d7: - case 0x83d8: - case 0x83d9: - case 0x83da: - case 0x83db: - case 0x83dc: - case 0x83dd: - case 0x83de: - case 0x83df: - s3_virge_out(addr & 0x3ff, val, virge); - break; + else switch (addr & 0xffff) { + case 0x83b0 ... 0x83df: + s3_virge_out(addr & 0x3ff, val, priv); + break; - case 0xff20: - virge->serialport = val; - i2c_gpio_set(virge->i2c, !!(val & SERIAL_PORT_SCW), !!(val & SERIAL_PORT_SDW)); - break; - - default: - break; - } + case 0xff20: + virge->serialport = val; + i2c_gpio_set(virge->i2c, !!(val & SERIAL_PORT_SCW), !!(val & SERIAL_PORT_SDW)); + break; } } static void -s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv) -{ +s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv) { virge_t *virge = (virge_t *) priv; - s3_virge_log("[%04X:%08X]: MMIO WriteW addr = %04x, val = %04x\n", CS, cpu_state.pc, addr & 0xfffe, val); - if ((addr & 0xfffe) < 0x8000) + + if ((addr & 0xfffc) < 0x8000) s3_virge_queue(virge, addr, val, FIFO_WRITE_WORD); - else { - if ((addr & 0xfffe) == 0x83d4) { - s3_virge_mmio_write(addr, val, virge); - s3_virge_mmio_write(addr + 1, val >> 8, virge); - } else if ((addr & 0xfffe) == 0xff20) - s3_virge_mmio_write(addr, val, virge); + else switch (addr & 0xfffe) { + case 0x83d4: + s3_virge_mmio_write(addr, val, priv); + s3_virge_mmio_write(addr + 1, val >> 8, priv); + break; + + case 0xff20: + s3_virge_mmio_write(addr, val, priv); + break; } } static void -s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) -{ +s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { virge_t *virge = (virge_t *) priv; - svga_t *svga = &virge->svga; + svga_t * svga = &virge->svga; - s3_virge_log("[%04X:%08X]: MMIO WriteL addr = %04x, val = %04x\n", CS, cpu_state.pc, addr & 0xfffc, val); - if (((addr & 0xfffc) < 0x8000) || ((addr & 0xe000) == 0xa000)) + if ((addr & 0xfffc) < 0x8000) s3_virge_queue(virge, addr, val, FIFO_WRITE_DWORD); - else { - switch (addr & 0xfffc) { - case 0x8180: - virge->streams.pri_ctrl = val; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x8184: - virge->streams.chroma_ctrl = val; - break; - case 0x8190: - virge->streams.sec_ctrl = val; - virge->streams.dda_horiz_accumulator = val & 0xfff; - if (val & (1 << 11)) - virge->streams.dda_horiz_accumulator |= 0xfffff800; - virge->streams.sdif = (val >> 24) & 7; - break; - case 0x8194: - virge->streams.chroma_upper_bound = val; - break; - case 0x8198: - virge->streams.sec_filter = val; - virge->streams.k1_horiz_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k1_horiz_scale |= 0xfffff800; - virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; - if ((val >> 16) & (1 << 10)) - virge->streams.k2_horiz_scale |= 0xfffff800; - break; - case 0x81a0: - virge->streams.blend_ctrl = val; - svga_recalctimings(svga); - break; - case 0x81c0: - virge->streams.pri_fb0 = val & 0x7fffff; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; - break; - case 0x81c4: - virge->streams.pri_fb1 = val & 0x7fffff; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; - break; - case 0x81c8: - virge->streams.pri_stride = val & 0xfff; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; - break; - case 0x81cc: - virge->streams.buffer_ctrl = val; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; - break; - case 0x81d0: - virge->streams.sec_fb0 = val; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; - break; - case 0x81d4: - virge->streams.sec_fb1 = val; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; - break; - case 0x81d8: - virge->streams.sec_stride = val; - svga->fullchange = changeframecount; - break; - case 0x81dc: - virge->streams.overlay_ctrl = val; - break; - case 0x81e0: - virge->streams.k1_vert_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k1_vert_scale |= 0xfffff800; - break; - case 0x81e4: - virge->streams.k2_vert_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k2_vert_scale |= 0xfffff800; - break; - case 0x81e8: - virge->streams.dda_vert_accumulator = val & 0xfff; - if (val & (1 << 11)) - virge->streams.dda_vert_accumulator |= 0xfffff800; - break; - case 0x81ec: - virge->streams.fifo_ctrl = val; - break; - case 0x81f0: - virge->streams.pri_start = val; - virge->streams.pri_x = (val >> 16) & 0x7ff; - virge->streams.pri_y = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81f4: - virge->streams.pri_size = val; - virge->streams.pri_w = (val >> 16) & 0x7ff; - virge->streams.pri_h = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81f8: - virge->streams.sec_start = val; - virge->streams.sec_x = (val >> 16) & 0x7ff; - virge->streams.sec_y = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81fc: - virge->streams.sec_size = val; - virge->streams.sec_w = (val >> 16) & 0x7ff; - virge->streams.sec_h = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; + else if ((addr & 0xe000) == 0xa000) + s3_virge_queue(virge, addr, val, FIFO_WRITE_DWORD); + else switch (addr & 0xfffc) { + case 0x8180: + virge->streams.pri_ctrl = val; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x8184: + virge->streams.chroma_ctrl = val; + break; + case 0x8190: + virge->streams.sec_ctrl = val; + virge->streams.dda_horiz_accumulator = val & 0xfff; + if (val & (1 << 11)) + virge->streams.dda_horiz_accumulator |= 0xfffff800; + virge->streams.sdif = (val >> 24) & 7; + break; + case 0x8194: + virge->streams.chroma_upper_bound = val; + break; + case 0x8198: + virge->streams.sec_filter = val; + virge->streams.k1_horiz_scale = val & 0x7ff; + if (val & (1 << 10)) + virge->streams.k1_horiz_scale |= 0xfffff800; + virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; + if ((val >> 16) & (1 << 10)) + virge->streams.k2_horiz_scale |= 0xfffff800; + break; + case 0x81a0: + virge->streams.blend_ctrl = val; + break; + case 0x81c0: + virge->streams.pri_fb0 = val & 0x3fffff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81c4: + virge->streams.pri_fb1 = val & 0x3fffff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81c8: + virge->streams.pri_stride = val & 0xfff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81cc: + virge->streams.buffer_ctrl = val; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81d0: + virge->streams.sec_fb0 = val; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81d4: + virge->streams.sec_fb1 = val; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81d8: + virge->streams.sec_stride = val; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81dc: + virge->streams.overlay_ctrl = val; + break; + case 0x81e0: + virge->streams.k1_vert_scale = val & 0x7ff; + if (val & (1 << 10)) + virge->streams.k1_vert_scale |= 0xfffff800; + break; + case 0x81e4: + virge->streams.k2_vert_scale = val & 0x7ff; + if (val & (1 << 10)) + virge->streams.k2_vert_scale |= 0xfffff800; + break; + case 0x81e8: + virge->streams.dda_vert_accumulator = val & 0xfff; + if (val & (1 << 11)) + virge->streams.dda_vert_accumulator |= 0xfffff800; + break; + case 0x81ec: + virge->streams.fifo_ctrl = val; + break; + case 0x81f0: + virge->streams.pri_start = val; + virge->streams.pri_x = (val >> 16) & 0x7ff; + virge->streams.pri_y = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81f4: + virge->streams.pri_size = val; + virge->streams.pri_w = (val >> 16) & 0x7ff; + virge->streams.pri_h = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81f8: + virge->streams.sec_start = val; + virge->streams.sec_x = (val >> 16) & 0x7ff; + virge->streams.sec_y = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81fc: + virge->streams.sec_size = val; + virge->streams.sec_w = (val >> 16) & 0x7ff; + virge->streams.sec_h = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; - case 0x8504: - virge->subsys_stat &= ~(val & 0xff); - virge->subsys_cntl = (val >> 8); - s3_virge_update_irqs(virge); - break; + case 0x8504: + virge->subsys_stat &= ~(val & 0xff); + virge->subsys_cntl = (val >> 8); + s3_virge_update_irqs(virge); + break; - case 0x850c: - virge->advfunc_cntl = val & 0xff; - s3_virge_updatemapping(virge); - break; + case 0x850c: + virge->advfunc_cntl = val & 0xff; + s3_virge_updatemapping(virge); + break; - case 0xff20: - s3_virge_mmio_write(addr, val, virge); - break; - - default: - s3_virge_log("Actual WriteL=%04x.\n", addr & 0xfffc); - break; - } + case 0xff20: + s3_virge_mmio_write(addr, val, priv); + break; } } -#define READ(addr, val) \ - { \ - switch (bpp) { \ - case 0: /*8 bpp*/ \ - val = vram[addr & virge->vram_mask]; \ - break; \ - case 1: /*16 bpp*/ \ - val = *(uint16_t *) &vram[addr & virge->vram_mask]; \ - break; \ - case 2: /*24 bpp*/ \ - val = (*(uint32_t *) &vram[addr & virge->vram_mask]) & 0xffffff; \ - break; \ - } \ - } +#define READ(addr, val) \ + do { \ + switch (bpp) { \ + case 0: /*8 bpp*/ \ + val = vram[addr & svga->vram_mask]; \ + break; \ + case 1: /*16 bpp*/ \ + val = *(uint16_t *)&vram[addr & svga->vram_mask]; \ + break; \ + case 2: /*24 bpp*/ \ + val = (*(uint32_t *)&vram[addr & svga->vram_mask]) & 0xffffff; \ + break; \ + } \ + } while (0) -#define CLIP(x, y) \ - { \ - if ((virge->s3d.cmd_set & CMD_SET_HC) && (x < virge->s3d.clip_l || x > virge->s3d.clip_r || y < virge->s3d.clip_t || y > virge->s3d.clip_b)) \ - update = 0; \ - } +#define Z_READ(addr) *(uint16_t *)&vram[addr & svga->vram_mask] -#define CLIP_3D(x, y) \ - { \ - if ((s3d_tri->cmd_set & CMD_SET_HC) && (x < s3d_tri->clip_l || x > s3d_tri->clip_r || y < s3d_tri->clip_t || y > s3d_tri->clip_b)) \ - update = 0; \ - } +#define Z_WRITE(addr, val) \ + if (!(s3d_tri->cmd_set & CMD_SET_ZB_MODE)) \ + *(uint16_t *)&vram[addr & svga->vram_mask] = val -#define MIX() \ - { \ - int c; \ - for (c = 0; c < 24; c++) { \ - int d = (dest & (1 << c)) ? 1 : 0; \ - if (source & (1 << c)) \ - d |= 2; \ - if (pattern & (1 << c)) \ - d |= 4; \ - if (virge->s3d.rop & (1 << d)) \ - out |= (1 << c); \ - } \ - } +#define CLIP(x, y) \ + do { \ + if ((virge->s3d.cmd_set & CMD_SET_HC) && \ + (x < virge->s3d.clip_l || x > virge->s3d.clip_r || \ + y < virge->s3d.clip_t || y > virge->s3d.clip_b)) \ + update = 0; \ + } while (0) -#define WRITE(addr, val) \ - { \ - switch (bpp) { \ - case 0: /*8 bpp*/ \ - vram[addr & virge->vram_mask] = val; \ - svga->changedvram[(addr & virge->vram_mask) >> 12] = changeframecount; \ - break; \ - case 1: /*16 bpp*/ \ - *(uint16_t *) &vram[addr & virge->vram_mask] = val; \ - svga->changedvram[(addr & virge->vram_mask) >> 12] = changeframecount; \ - break; \ - case 2: /*24 bpp*/ \ - *(uint32_t *) &vram[addr & virge->vram_mask] = (val & 0xffffff) | (vram[(addr + 3) & virge->vram_mask] << 24); \ - svga->changedvram[(addr & virge->vram_mask) >> 12] = changeframecount; \ - break; \ - } \ - } +#define CLIP_3D(x, y) \ + do { \ + if ((s3d_tri->cmd_set & CMD_SET_HC) && (x < s3d_tri->clip_l || \ + x > s3d_tri->clip_r || y < s3d_tri->clip_t || \ + y > s3d_tri->clip_b)) \ + update = 0; \ + } while (0) + +#define Z_CLIP(Zzb, Zs) \ + do { \ + if (!(s3d_tri->cmd_set & CMD_SET_ZB_MODE)) \ + switch ((s3d_tri->cmd_set >> 20) & 7) { \ + case 0: \ + update = 0; \ + break; \ + case 1: \ + if (Zs <= Zzb) \ + update = 0; \ + else \ + Zzb = Zs; \ + break; \ + case 2: \ + if (Zs != Zzb) \ + update = 0; \ + else \ + Zzb = Zs; \ + break; \ + case 3: \ + if (Zs < Zzb) \ + update = 0; \ + else \ + Zzb = Zs; \ + break; \ + case 4: \ + if (Zs >= Zzb) \ + update = 0; \ + else \ + Zzb = Zs; \ + break; \ + case 5: \ + if (Zs == Zzb) \ + update = 0; \ + else \ + Zzb = Zs; \ + break; \ + case 6: \ + if (Zs > Zzb) \ + update = 0; \ + else \ + Zzb = Zs; \ + break; \ + case 7: \ + update = 1; \ + Zzb = Zs; \ + break; \ + } \ + } while (0) + +#define MIX() \ + do { \ + int c; \ + for (c = 0; c < 24; c++) { \ + int d = (dest & (1 << c)) ? 1 : 0; \ + if (source & (1 << c)) \ + d |= 2; \ + if (pattern & (1 << c)) \ + d |= 4; \ + if (virge->s3d.rop & (1 << d)) \ + out |= (1 << c); \ + } \ + } while (0) + +#define WRITE(addr, val) \ + do { \ + switch (bpp) { \ + case 0: /*8 bpp*/ \ + vram[addr & svga->vram_mask] = val; \ + virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = \ + changeframecount; \ + break; \ + case 1: /*16 bpp*/ \ + *(uint16_t *)&vram[addr & svga->vram_mask] = val; \ + virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = \ + changeframecount; \ + break; \ + case 2: /*24 bpp*/ \ + *(uint32_t *)&vram[addr & svga->vram_mask] = (val & 0xffffff) |\ + (vram[(addr + 3) & svga->vram_mask] << 24); \ + virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = \ + changeframecount; \ + break; \ + } \ + } while (0) static void -s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) -{ - svga_t *svga = &virge->svga; - uint8_t *vram = svga->vram; - uint32_t mono_pattern[64]; - int count_mask; - int x_inc = (virge->s3d.cmd_set & CMD_SET_XP) ? 1 : -1; - int y_inc = (virge->s3d.cmd_set & CMD_SET_YP) ? 1 : -1; - int bpp; - int x_mul; - int cpu_dat_shift; - const uint32_t *pattern_data; - uint32_t src_fg_clr; - uint32_t src_bg_clr; - uint32_t src_addr; - uint32_t dest_addr; - uint32_t source = 0; - uint32_t dest = 0; - uint32_t pattern; - uint32_t out = 0; - int update; +s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) { + svga_t *svga = &virge->svga; + uint8_t *vram = virge->svga.vram; + uint32_t mono_pattern[64]; + int count_mask; + int x_inc = (virge->s3d.cmd_set & CMD_SET_XP) ? 1 : -1; + int y_inc = (virge->s3d.cmd_set & CMD_SET_YP) ? 1 : -1; + int bpp; + int x_mul; + int cpu_dat_shift; + uint32_t *pattern_data; + uint32_t src_fg_clr; + uint32_t src_bg_clr; switch (virge->s3d.cmd_set & CMD_SET_FORMAT_MASK) { case CMD_SET_FORMAT_8: - bpp = 0; - x_mul = 1; + bpp = 0; + x_mul = 1; cpu_dat_shift = 8; - pattern_data = virge->s3d.pattern_8; - src_fg_clr = virge->s3d.src_fg_clr & 0xff; - src_bg_clr = virge->s3d.src_bg_clr & 0xff; + pattern_data = virge->s3d.pattern_8; + src_fg_clr = virge->s3d.src_fg_clr & 0xff; + src_bg_clr = virge->s3d.src_bg_clr & 0xff; break; case CMD_SET_FORMAT_16: - bpp = 1; - x_mul = 2; + bpp = 1; + x_mul = 2; cpu_dat_shift = 16; - pattern_data = virge->s3d.pattern_16; - src_fg_clr = virge->s3d.src_fg_clr & 0xffff; - src_bg_clr = virge->s3d.src_bg_clr & 0xffff; + pattern_data = virge->s3d.pattern_16; + src_fg_clr = virge->s3d.src_fg_clr & 0xffff; + src_bg_clr = virge->s3d.src_bg_clr & 0xffff; break; case CMD_SET_FORMAT_24: default: - bpp = 2; - x_mul = 3; + bpp = 2; + x_mul = 3; cpu_dat_shift = 24; - pattern_data = virge->s3d.pattern_24; - src_fg_clr = virge->s3d.src_fg_clr; - src_bg_clr = virge->s3d.src_bg_clr; + pattern_data = virge->s3d.pattern_24; + src_fg_clr = virge->s3d.src_fg_clr; + src_bg_clr = virge->s3d.src_bg_clr; break; - } - if (virge->s3d.cmd_set & CMD_SET_MP) - pattern_data = mono_pattern; + } + if (virge->s3d.cmd_set & CMD_SET_MP) + pattern_data = mono_pattern; switch (virge->s3d.cmd_set & CMD_SET_ITA_MASK) { case CMD_SET_ITA_BYTE: @@ -2420,55 +2182,51 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) break; } if (virge->s3d.cmd_set & CMD_SET_MP) { - for (uint8_t y = 0; y < 4; y++) { - for (uint8_t x = 0; x < 8; x++) { - if (virge->s3d.mono_pat_0 & (1 << (x + y * 8))) - mono_pattern[y * 8 + (7 - x)] = virge->s3d.pat_fg_clr; - else - mono_pattern[y * 8 + (7 - x)] = virge->s3d.pat_bg_clr; - if (virge->s3d.mono_pat_1 & (1 << (x + y * 8))) - mono_pattern[(y + 4) * 8 + (7 - x)] = virge->s3d.pat_fg_clr; - else - mono_pattern[(y + 4) * 8 + (7 - x)] = virge->s3d.pat_bg_clr; - } + int x; + int y; + for (y = 0; y < 4; y++) { + for (x = 0; x < 8; x++) { + if (virge->s3d.mono_pat_0 & (1 << (x + y * 8))) + mono_pattern[y * 8 + x] = virge->s3d.pat_fg_clr; + else + mono_pattern[y * 8 + x] = virge->s3d.pat_bg_clr; + if (virge->s3d.mono_pat_1 & (1 << (x + y * 8))) + mono_pattern[(y + 4) * 8 + x] = virge->s3d.pat_fg_clr; + else + mono_pattern[(y + 4) * 8 + x] = virge->s3d.pat_bg_clr; + } } } - switch (virge->s3d.cmd_set & CMD_SET_COMMAND_MASK) { + case CMD_SET_COMMAND_NOP: + break; + case CMD_SET_COMMAND_BITBLT: if (count == -1) { - virge->s3d.src_x = virge->s3d.rsrc_x; - virge->s3d.src_y = virge->s3d.rsrc_y; - virge->s3d.dest_x = virge->s3d.rdest_x; - virge->s3d.dest_y = virge->s3d.rdest_y; - virge->s3d.w = virge->s3d.r_width; - virge->s3d.h = virge->s3d.r_height; - virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff; + virge->s3d.src_x = virge->s3d.rsrc_x; + virge->s3d.src_y = virge->s3d.rsrc_y; + virge->s3d.dest_x = virge->s3d.rdest_x; + virge->s3d.dest_y = virge->s3d.rdest_y; + virge->s3d.w = virge->s3d.r_width; + virge->s3d.h = virge->s3d.r_height; + virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff; virge->s3d.data_left_count = 0; - s3_virge_log("BitBlt start src_x=%i,src_y=%i,dest_x=%i,dest_y=%i,w=%i,h=%i,rop=%02X,src_base=%x,dest_base=%x\n", - virge->s3d.src_x, - virge->s3d.src_y, - virge->s3d.dest_x, - virge->s3d.dest_y, - virge->s3d.w, - virge->s3d.h, - virge->s3d.rop, - virge->s3d.src_base, - virge->s3d.dest_base); - if (virge->s3d.cmd_set & CMD_SET_IDS) return; } - if (!virge->s3d.h) return; - while (count) { - src_addr = virge->s3d.src_base + (virge->s3d.src_x * x_mul) + (virge->s3d.src_y * virge->s3d.src_str); - dest_addr = virge->s3d.dest_base + (virge->s3d.dest_x * x_mul) + (virge->s3d.dest_y * virge->s3d.dest_str); - out = 0; - update = 1; + uint32_t src_addr = virge->s3d.src_base + (virge->s3d.src_x * x_mul) + + (virge->s3d.src_y * virge->s3d.src_str); + uint32_t dest_addr = virge->s3d.dest_base + (virge->s3d.dest_x * x_mul) + + (virge->s3d.dest_y * virge->s3d.dest_str); + uint32_t source = 0; + uint32_t dest; + uint32_t pattern; + uint32_t out = 0; + int update = 1; switch (virge->s3d.cmd_set & (CMD_SET_MS | CMD_SET_IDS)) { case 0: @@ -2486,18 +2244,18 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) count -= (cpu_dat_shift - virge->s3d.data_left_count); virge->s3d.data_left_count = 0; if (count < cpu_dat_shift) { - virge->s3d.data_left = cpu_dat; + virge->s3d.data_left = cpu_dat; virge->s3d.data_left_count = count; - count = 0; + count = 0; } } else { source = cpu_dat; cpu_dat >>= cpu_dat_shift; count -= cpu_dat_shift; if (count < cpu_dat_shift) { - virge->s3d.data_left = cpu_dat; + virge->s3d.data_left = cpu_dat; virge->s3d.data_left_count = count; - count = 0; + count = 0; } } if ((virge->s3d.cmd_set & CMD_SET_TP) && source == src_fg_clr) @@ -2510,9 +2268,6 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) cpu_dat <<= 1; count--; break; - - default: - break; } CLIP(virge->s3d.dest_x, virge->s3d.dest_y); @@ -2530,9 +2285,9 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) virge->s3d.dest_x += x_inc; virge->s3d.dest_x &= 0x7ff; if (!virge->s3d.w) { - virge->s3d.src_x = virge->s3d.rsrc_x; + virge->s3d.src_x = virge->s3d.rsrc_x; virge->s3d.dest_x = virge->s3d.rdest_x; - virge->s3d.w = virge->s3d.r_width; + virge->s3d.w = virge->s3d.r_width; virge->s3d.src_y += y_inc; virge->s3d.dest_y += y_inc; @@ -2549,9 +2304,6 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) cpu_dat <<= (count - (count & count_mask)); count &= count_mask; break; - - default: - break; } if (!virge->s3d.h) return; @@ -2563,27 +2315,23 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) case CMD_SET_COMMAND_RECTFILL: /*No source, pattern = pat_fg_clr*/ if (count == -1) { - virge->s3d.src_x = virge->s3d.rsrc_x; - virge->s3d.src_y = virge->s3d.rsrc_y; + virge->s3d.src_x = virge->s3d.rsrc_x; + virge->s3d.src_y = virge->s3d.rsrc_y; virge->s3d.dest_x = virge->s3d.rdest_x; virge->s3d.dest_y = virge->s3d.rdest_y; - virge->s3d.w = virge->s3d.r_width; - virge->s3d.h = virge->s3d.r_height; - virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff; - - s3_virge_log("RctFll start %i,%i %i,%i %02X %08x\n", virge->s3d.dest_x, - virge->s3d.dest_y, - virge->s3d.w, - virge->s3d.h, - virge->s3d.rop, virge->s3d.dest_base); + virge->s3d.w = virge->s3d.r_width; + virge->s3d.h = virge->s3d.r_height; + virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff; } while (count && virge->s3d.h) { - source = virge->s3d.pat_fg_clr; - dest_addr = virge->s3d.dest_base + (virge->s3d.dest_x * x_mul) + (virge->s3d.dest_y * virge->s3d.dest_str); - pattern = virge->s3d.pat_fg_clr; - out = 0; - update = 1; + uint32_t dest_addr = virge->s3d.dest_base + (virge->s3d.dest_x * x_mul) + + (virge->s3d.dest_y * virge->s3d.dest_str); + uint32_t source = 0; + uint32_t dest; + uint32_t pattern = virge->s3d.pat_fg_clr; + uint32_t out = 0; + int update = 1; CLIP(virge->s3d.dest_x, virge->s3d.dest_y); @@ -2600,9 +2348,9 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) virge->s3d.dest_x += x_inc; virge->s3d.dest_x &= 0x7ff; if (!virge->s3d.w) { - virge->s3d.src_x = virge->s3d.rsrc_x; + virge->s3d.src_x = virge->s3d.rsrc_x; virge->s3d.dest_x = virge->s3d.rdest_x; - virge->s3d.w = virge->s3d.r_width; + virge->s3d.w = virge->s3d.r_width; virge->s3d.src_y += y_inc; virge->s3d.dest_y += y_inc; @@ -2610,8 +2358,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) if (!virge->s3d.h) return; } else - virge->s3d.w--; - + virge->s3d.w--; count--; } break; @@ -2620,8 +2367,8 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) if (count == -1) { virge->s3d.dest_x = virge->s3d.lxstart; virge->s3d.dest_y = virge->s3d.lystart; - virge->s3d.h = virge->s3d.lycnt; - virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff; + virge->s3d.h = virge->s3d.lycnt; + virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff; } while (virge->s3d.h) { int x; @@ -2630,7 +2377,8 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) x = virge->s3d.dest_x >> 20; - if (virge->s3d.h == virge->s3d.lycnt && ((virge->s3d.line_dir && x > virge->s3d.lxend0) || (!virge->s3d.line_dir && x < virge->s3d.lxend0))) + if (virge->s3d.h == virge->s3d.lycnt && ((virge->s3d.line_dir && x > virge->s3d.lxend0) || + (!virge->s3d.line_dir && x < virge->s3d.lxend0))) x = virge->s3d.lxend0; if (virge->s3d.h == 1) @@ -2642,17 +2390,22 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) goto skip_line; do { - uint32_t dest_addr = virge->s3d.dest_base + (x * x_mul) + (virge->s3d.dest_y * virge->s3d.dest_str); - uint32_t source = 0; - uint32_t dest = 0; + uint32_t dest_addr = virge->s3d.dest_base + (x * x_mul) + + (virge->s3d.dest_y * virge->s3d.dest_str); + uint32_t source = 0; + uint32_t dest; uint32_t pattern; - uint32_t out = 0; - int update = 1; + uint32_t out = 0; + int update = 1; - if ((virge->s3d.h == virge->s3d.lycnt || !first_pixel) && ((virge->s3d.line_dir && x < virge->s3d.lxend0) || (!virge->s3d.line_dir && x > virge->s3d.lxend0))) + if ((virge->s3d.h == virge->s3d.lycnt || !first_pixel) && + ((virge->s3d.line_dir && x < virge->s3d.lxend0) || + (!virge->s3d.line_dir && x > virge->s3d.lxend0))) update = 0; - if ((virge->s3d.h == 1 || !first_pixel) && ((virge->s3d.line_dir && x > virge->s3d.lxend1) || (!virge->s3d.line_dir && x < virge->s3d.lxend1))) + if ((virge->s3d.h == 1 || !first_pixel) && + ((virge->s3d.line_dir && x > virge->s3d.lxend1) || + (!virge->s3d.line_dir && x < virge->s3d.lxend1))) update = 0; CLIP(x, virge->s3d.dest_y); @@ -2686,68 +2439,71 @@ skip_line: virge->s3d.dest_r = virge->s3d.prxstart; if (virge->s3d.pycnt & (1 << 29)) virge->s3d.dest_l = virge->s3d.plxstart; - virge->s3d.h = virge->s3d.pycnt & 0x7ff; + virge->s3d.h = virge->s3d.pycnt & 0x7ff; virge->s3d.rop = (virge->s3d.cmd_set >> 17) & 0xff; while (virge->s3d.h) { - int x = virge->s3d.dest_l >> 20; - int xend = virge->s3d.dest_r >> 20; - int y = virge->s3d.pystart & 0x7ff; - int xdir = (x < xend) ? 1 : -1; - do { - uint32_t dest_addr = virge->s3d.dest_base + (x * x_mul) + (y * virge->s3d.dest_str); - uint32_t source = 0; - uint32_t dest = 0; - uint32_t pattern; - uint32_t out = 0; - int update = 1; + int x = virge->s3d.dest_l >> 20; + int xend = virge->s3d.dest_r >> 20; + int y = virge->s3d.pystart & 0x7ff; + int xdir = (x < xend) ? 1 : -1; + do { + uint32_t dest_addr = virge->s3d.dest_base + (x * x_mul) + (y * virge->s3d.dest_str); + uint32_t source = 0; + uint32_t dest; + uint32_t pattern; + uint32_t out = 0; + int update = 1; - CLIP(x, y); + CLIP(x, y); - if (update) { - READ(dest_addr, dest); - pattern = pattern_data[(y & 7) * 8 + (x & 7)]; - MIX(); + if (update) { + READ(dest_addr, dest); + pattern = pattern_data[(y & 7) * 8 + (x & 7)]; - WRITE(dest_addr, out); - } + MIX(); - x = (x + xdir) & 0x7ff; - } while (x != (xend + xdir)); + WRITE(dest_addr, out); + } - virge->s3d.dest_l += virge->s3d.pldx; - virge->s3d.dest_r += virge->s3d.prdx; - virge->s3d.h--; - virge->s3d.pystart = (virge->s3d.pystart - 1) & 0x7ff; + x = (x + xdir) & 0x7ff; + } while (x != (xend + xdir)); + + virge->s3d.dest_l += virge->s3d.pldx; + virge->s3d.dest_r += virge->s3d.prdx; + virge->s3d.h--; + virge->s3d.pystart = (virge->s3d.pystart - 1) & 0x7ff; } break; - case CMD_SET_COMMAND_NOP: - break; - default: - break; + fatal("s3_virge_bitblt : blit command %i %08x\n", + (virge->s3d.cmd_set >> 27) & 0xf, virge->s3d.cmd_set); } } -#define RGB15_TO_24(val, r, g, b) \ - b = ((val & 0x001f) << 3) | ((val & 0x001f) >> 2); \ - g = ((val & 0x03e0) >> 2) | ((val & 0x03e0) >> 7); \ - r = ((val & 0x7c00) >> 7) | ((val & 0x7c00) >> 12); +#define RGB15_TO_24(val, r, g, b) \ + b = ((val & 0x001f) << 3) | ((val & 0x001f) >> 2); \ + g = ((val & 0x03e0) >> 2) | ((val & 0x03e0) >> 7); \ + r = ((val & 0x7c00) >> 7) | ((val & 0x7c00) >> 12); -#define RGB24_TO_24(val, r, g, b) \ - b = val & 0xff; \ - g = (val & 0xff00) >> 8; \ - r = (val & 0xff0000) >> 16 +#define RGB24_TO_24(val, r, g, b) \ + b = val & 0xff; \ + g = (val & 0xff00) >> 8; \ + r = (val & 0xff0000) >> 16 -#define RGB15(r, g, b, dest) \ - if (virge->dithering_enabled) { \ - int add = dither[_y & 3][_x & 3]; \ - int _r = (r > 248) ? 248 : r + add; \ - int _g = (g > 248) ? 248 : g + add; \ - int _b = (b > 248) ? 248 : b + add; \ - dest = ((_b >> 3) & 0x1f) | (((_g >> 3) & 0x1f) << 5) | (((_r >> 3) & 0x1f) << 10); \ - } else \ - dest = ((b >> 3) & 0x1f) | (((g >> 3) & 0x1f) << 5) | (((r >> 3) & 0x1f) << 10) +#define RGB15(r, g, b, dest) \ + if (virge->dithering_enabled) { \ + int add = dither[_y & 3][_x & 3]; \ + int _r = (r > 248) ? 248 : r + add; \ + int _g = (g > 248) ? 248 : g + add; \ + int _b = (b > 248) ? 248 : b + add; \ + dest = ((_b >> 3) & 0x1f) | \ + (((_g >> 3) & 0x1f) << 5) | \ + (((_r >> 3) & 0x1f) << 10); \ + } else \ + dest = ((b >> 3) & 0x1f) | \ + (((g >> 3) & 0x1f) << 5) | \ + (((r >> 3) & 0x1f) << 10) #define RGB24(r, g, b) ((b) | ((g) << 8) | ((r) << 16)) @@ -2756,32 +2512,50 @@ typedef struct rgba_t { } rgba_t; typedef struct s3d_state_t { - int32_t r, g, b, a, u, v, d, w; + int32_t r; + int32_t g; + int32_t b; + int32_t a; + int32_t u; + int32_t v; + int32_t d; + int32_t w; - int32_t base_r, base_g, base_b, base_a, base_u, base_v, base_d, base_w; + int32_t base_r; + int32_t base_g; + int32_t base_b; + int32_t base_a; + int32_t base_u; + int32_t base_v; + int32_t base_d; + int32_t base_w; - uint32_t base_z; + uint32_t base_z; - uint32_t tbu, tbv; + uint32_t tbu; + uint32_t tbv; - uint32_t cmd_set; - int max_d; + uint32_t cmd_set; + int max_d; uint16_t *texture[10]; - uint32_t tex_bdr_clr; + uint32_t tex_bdr_clr; - int32_t x1, x2; - int y; + int32_t x1; + int32_t x2; - rgba_t dest_rgba; + int y; + + rgba_t dest_rgba; } s3d_state_t; typedef struct s3d_texture_state_t { - int level; - int texture_shift; + int level; + int texture_shift; - int32_t u, v; + int32_t u; + int32_t v; } s3d_texture_state_t; static void (*tex_read)(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out); @@ -2795,10 +2569,10 @@ static int _x; static int _y; static void -tex_ARGB1555(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) -{ - int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); - uint16_t val = state->texture[texture_state->level][offset]; +tex_ARGB1555(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) { + int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); + uint16_t val = state->texture[texture_state->level][offset]; out->r = ((val & 0x7c00) >> 7) | ((val & 0x7000) >> 12); out->g = ((val & 0x03e0) >> 2) | ((val & 0x0380) >> 7); @@ -2807,10 +2581,10 @@ tex_ARGB1555(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out } static void -tex_ARGB1555_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) -{ - int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); - uint16_t val = state->texture[texture_state->level][offset]; +tex_ARGB1555_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) { + int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); + uint16_t val = state->texture[texture_state->level][offset]; if (((texture_state->u | texture_state->v) & 0xf8000000) == 0xf8000000) val = state->tex_bdr_clr; @@ -2822,10 +2596,10 @@ tex_ARGB1555_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba } static void -tex_ARGB4444(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) -{ - int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); - uint16_t val = state->texture[texture_state->level][offset]; +tex_ARGB4444(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) { + int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); + uint16_t val = state->texture[texture_state->level][offset]; out->r = ((val & 0x0f00) >> 4) | ((val & 0x0f00) >> 8); out->g = (val & 0x00f0) | ((val & 0x00f0) >> 4); @@ -2834,10 +2608,10 @@ tex_ARGB4444(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out } static void -tex_ARGB4444_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) -{ - int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); - uint16_t val = state->texture[texture_state->level][offset]; +tex_ARGB4444_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) { + int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); + uint16_t val = state->texture[texture_state->level][offset]; if (((texture_state->u | texture_state->v) & 0xf8000000) == 0xf8000000) val = state->tex_bdr_clr; @@ -2849,21 +2623,22 @@ tex_ARGB4444_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba } static void -tex_ARGB8888(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) -{ - int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); - uint32_t val = ((uint32_t *) state->texture[texture_state->level])[offset]; +tex_ARGB8888(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) { + int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); + uint32_t val = ((uint32_t *)state->texture[texture_state->level])[offset]; out->r = (val >> 16) & 0xff; out->g = (val >> 8) & 0xff; out->b = val & 0xff; out->a = (val >> 24) & 0xff; } + static void -tex_ARGB8888_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) -{ - int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); - uint32_t val = ((uint32_t *) state->texture[texture_state->level])[offset]; +tex_ARGB8888_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba_t *out) { + int offset = ((texture_state->u & 0x7fc0000) >> texture_state->texture_shift) + + (((texture_state->v & 0x7fc0000) >> texture_state->texture_shift) << texture_state->level); + uint32_t val = ((uint32_t *)state->texture[texture_state->level])[offset]; if (((texture_state->u | texture_state->v) & 0xf8000000) == 0xf8000000) val = state->tex_bdr_clr; @@ -2875,21 +2650,19 @@ tex_ARGB8888_nowrap(s3d_state_t *state, s3d_texture_state_t *texture_state, rgba } static void -tex_sample_normal(s3d_state_t *state) -{ +tex_sample_normal(s3d_state_t *state) { s3d_texture_state_t texture_state; - texture_state.level = state->max_d; + texture_state.level = state->max_d; texture_state.texture_shift = 18 + (9 - texture_state.level); - texture_state.u = state->u + state->tbu; - texture_state.v = state->v + state->tbv; + texture_state.u = state->u + state->tbu; + texture_state.v = state->v + state->tbv; tex_read(state, &texture_state, &state->dest_rgba); } static void -tex_sample_normal_filter(s3d_state_t *state) -{ +tex_sample_normal_filter(s3d_state_t *state) { s3d_texture_state_t texture_state; int tex_offset; rgba_t tex_samples[4]; @@ -2897,9 +2670,9 @@ tex_sample_normal_filter(s3d_state_t *state) int dv; int d[4]; - texture_state.level = state->max_d; + texture_state.level = state->max_d; texture_state.texture_shift = 18 + (9 - texture_state.level); - tex_offset = 1 << texture_state.texture_shift; + tex_offset = 1 << texture_state.texture_shift; texture_state.u = state->u + state->tbu; texture_state.v = state->v + state->tbv; @@ -2924,30 +2697,32 @@ tex_sample_normal_filter(s3d_state_t *state) d[2] = (256 - du) * dv; d[3] = du * dv; - state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; - state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; - state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; - state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; + state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; + state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; + state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; + state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; } static void -tex_sample_mipmap(s3d_state_t *state) -{ +tex_sample_mipmap(s3d_state_t *state) { s3d_texture_state_t texture_state; texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf); if (texture_state.level < 0) texture_state.level = 0; texture_state.texture_shift = 18 + (9 - texture_state.level); - texture_state.u = state->u + state->tbu; - texture_state.v = state->v + state->tbv; + texture_state.u = state->u + state->tbu; + texture_state.v = state->v + state->tbv; tex_read(state, &texture_state, &state->dest_rgba); } static void -tex_sample_mipmap_filter(s3d_state_t *state) -{ +tex_sample_mipmap_filter(s3d_state_t *state) { s3d_texture_state_t texture_state; int tex_offset; rgba_t tex_samples[4]; @@ -2959,7 +2734,7 @@ tex_sample_mipmap_filter(s3d_state_t *state) if (texture_state.level < 0) texture_state.level = 0; texture_state.texture_shift = 18 + (9 - texture_state.level); - tex_offset = 1 << texture_state.texture_shift; + tex_offset = 1 << texture_state.texture_shift; texture_state.u = state->u + state->tbu; texture_state.v = state->v + state->tbv; @@ -2984,34 +2759,36 @@ tex_sample_mipmap_filter(s3d_state_t *state) d[2] = (256 - du) * dv; d[3] = du * dv; - state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; - state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; - state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; - state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; + state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; + state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; + state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; + state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; } static void -tex_sample_persp_normal(s3d_state_t *state) -{ +tex_sample_persp_normal(s3d_state_t *state) { s3d_texture_state_t texture_state; - int32_t w = 0; + int32_t w = 0; if (state->w) - w = (int32_t) (((1ULL << 27) << 19) / (int64_t) state->w); + w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w); - texture_state.level = state->max_d; + texture_state.level = state->max_d; texture_state.texture_shift = 18 + (9 - texture_state.level); - texture_state.u = (int32_t) (((int64_t) state->u * (int64_t) w) >> (12 + state->max_d)) + state->tbu; - texture_state.v = (int32_t) (((int64_t) state->v * (int64_t) w) >> (12 + state->max_d)) + state->tbv; + texture_state.u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (12 + state->max_d)) + state->tbu; + texture_state.v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (12 + state->max_d)) + state->tbv; tex_read(state, &texture_state, &state->dest_rgba); } static void -tex_sample_persp_normal_filter(s3d_state_t *state) -{ +tex_sample_persp_normal_filter(s3d_state_t *state) { s3d_texture_state_t texture_state; - int32_t w = 0; + int32_t w = 0; int32_t u; int32_t v; int tex_offset; @@ -3021,14 +2798,14 @@ tex_sample_persp_normal_filter(s3d_state_t *state) int d[4]; if (state->w) - w = (int32_t) (((1ULL << 27) << 19) / (int64_t) state->w); + w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w); - u = (int32_t) (((int64_t) state->u * (int64_t) w) >> (12 + state->max_d)) + state->tbu; - v = (int32_t) (((int64_t) state->v * (int64_t) w) >> (12 + state->max_d)) + state->tbv; + u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (12 + state->max_d)) + state->tbu; + v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (12 + state->max_d)) + state->tbv; - texture_state.level = state->max_d; + texture_state.level = state->max_d; texture_state.texture_shift = 18 + (9 - texture_state.level); - tex_offset = 1 << texture_state.texture_shift; + tex_offset = 1 << texture_state.texture_shift; texture_state.u = u; texture_state.v = v; @@ -3053,34 +2830,36 @@ tex_sample_persp_normal_filter(s3d_state_t *state) d[2] = (256 - du) * dv; d[3] = du * dv; - state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; - state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; - state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; - state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; + state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; + state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; + state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; + state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; } static void -tex_sample_persp_normal_375(s3d_state_t *state) -{ +tex_sample_persp_normal_375(s3d_state_t *state) { s3d_texture_state_t texture_state; - int32_t w = 0; + int32_t w = 0; if (state->w) - w = (int32_t) (((1ULL << 27) << 19) / (int64_t) state->w); + w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w); - texture_state.level = state->max_d; + texture_state.level = state->max_d; texture_state.texture_shift = 18 + (9 - texture_state.level); - texture_state.u = (int32_t) (((int64_t) state->u * (int64_t) w) >> (8 + state->max_d)) + state->tbu; - texture_state.v = (int32_t) (((int64_t) state->v * (int64_t) w) >> (8 + state->max_d)) + state->tbv; + texture_state.u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (8 + state->max_d)) + state->tbu; + texture_state.v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (8 + state->max_d)) + state->tbv; tex_read(state, &texture_state, &state->dest_rgba); } static void -tex_sample_persp_normal_filter_375(s3d_state_t *state) -{ +tex_sample_persp_normal_filter_375(s3d_state_t *state) { s3d_texture_state_t texture_state; - int32_t w = 0; + int32_t w = 0; int32_t u; int32_t v; int tex_offset; @@ -3090,14 +2869,14 @@ tex_sample_persp_normal_filter_375(s3d_state_t *state) int d[4]; if (state->w) - w = (int32_t) (((1ULL << 27) << 19) / (int64_t) state->w); + w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w); - u = (int32_t) (((int64_t) state->u * (int64_t) w) >> (8 + state->max_d)) + state->tbu; - v = (int32_t) (((int64_t) state->v * (int64_t) w) >> (8 + state->max_d)) + state->tbv; + u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (8 + state->max_d)) + state->tbu; + v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (8 + state->max_d)) + state->tbv; - texture_state.level = state->max_d; + texture_state.level = state->max_d; texture_state.texture_shift = 18 + (9 - texture_state.level); - tex_offset = 1 << texture_state.texture_shift; + tex_offset = 1 << texture_state.texture_shift; texture_state.u = u; texture_state.v = v; @@ -3122,36 +2901,38 @@ tex_sample_persp_normal_filter_375(s3d_state_t *state) d[2] = (256 - du) * dv; d[3] = du * dv; - state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; - state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; - state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; - state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; + state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; + state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; + state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; + state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; } static void -tex_sample_persp_mipmap(s3d_state_t *state) -{ +tex_sample_persp_mipmap(s3d_state_t *state) { s3d_texture_state_t texture_state; - int32_t w = 0; + int32_t w = 0; if (state->w) - w = (int32_t) (((1ULL << 27) << 19) / (int64_t) state->w); + w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w); texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf); if (texture_state.level < 0) texture_state.level = 0; texture_state.texture_shift = 18 + (9 - texture_state.level); - texture_state.u = (int32_t) (((int64_t) state->u * (int64_t) w) >> (12 + state->max_d)) + state->tbu; - texture_state.v = (int32_t) (((int64_t) state->v * (int64_t) w) >> (12 + state->max_d)) + state->tbv; + texture_state.u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (12 + state->max_d)) + state->tbu; + texture_state.v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (12 + state->max_d)) + state->tbv; tex_read(state, &texture_state, &state->dest_rgba); } static void -tex_sample_persp_mipmap_filter(s3d_state_t *state) -{ +tex_sample_persp_mipmap_filter(s3d_state_t *state) { s3d_texture_state_t texture_state; - int32_t w = 0; + int32_t w = 0; int32_t u; int32_t v; int tex_offset; @@ -3161,16 +2942,16 @@ tex_sample_persp_mipmap_filter(s3d_state_t *state) int d[4]; if (state->w) - w = (int32_t) (((1ULL << 27) << 19) / (int64_t) state->w); + w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w); - u = (int32_t) (((int64_t) state->u * (int64_t) w) >> (12 + state->max_d)) + state->tbu; - v = (int32_t) (((int64_t) state->v * (int64_t) w) >> (12 + state->max_d)) + state->tbv; + u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (12 + state->max_d)) + state->tbu; + v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (12 + state->max_d)) + state->tbv; texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf); if (texture_state.level < 0) texture_state.level = 0; texture_state.texture_shift = 18 + (9 - texture_state.level); - tex_offset = 1 << texture_state.texture_shift; + tex_offset = 1 << texture_state.texture_shift; texture_state.u = u; texture_state.v = v; @@ -3195,36 +2976,38 @@ tex_sample_persp_mipmap_filter(s3d_state_t *state) d[2] = (256 - du) * dv; d[3] = du * dv; - state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; - state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; - state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; - state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; + state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; + state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; + state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; + state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; } static void -tex_sample_persp_mipmap_375(s3d_state_t *state) -{ +tex_sample_persp_mipmap_375(s3d_state_t *state) { s3d_texture_state_t texture_state; - int32_t w = 0; + int32_t w = 0; if (state->w) - w = (int32_t) (((1ULL << 27) << 19) / (int64_t) state->w); + w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w); texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf); if (texture_state.level < 0) texture_state.level = 0; texture_state.texture_shift = 18 + (9 - texture_state.level); - texture_state.u = (int32_t) (((int64_t) state->u * (int64_t) w) >> (8 + state->max_d)) + state->tbu; - texture_state.v = (int32_t) (((int64_t) state->v * (int64_t) w) >> (8 + state->max_d)) + state->tbv; + texture_state.u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (8 + state->max_d)) + state->tbu; + texture_state.v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (8 + state->max_d)) + state->tbv; tex_read(state, &texture_state, &state->dest_rgba); } static void -tex_sample_persp_mipmap_filter_375(s3d_state_t *state) -{ +tex_sample_persp_mipmap_filter_375(s3d_state_t *state) { s3d_texture_state_t texture_state; - int32_t w = 0; + int32_t w = 0; int32_t u; int32_t v; int tex_offset; @@ -3234,16 +3017,16 @@ tex_sample_persp_mipmap_filter_375(s3d_state_t *state) int d[4]; if (state->w) - w = (int32_t) (((1ULL << 27) << 19) / (int64_t) state->w); + w = (int32_t)(((1ULL << 27) << 19) / (int64_t)state->w); - u = (int32_t) (((int64_t) state->u * (int64_t) w) >> (8 + state->max_d)) + state->tbu; - v = (int32_t) (((int64_t) state->v * (int64_t) w) >> (8 + state->max_d)) + state->tbv; + u = (int32_t)(((int64_t)state->u * (int64_t)w) >> (8 + state->max_d)) + state->tbu; + v = (int32_t)(((int64_t)state->v * (int64_t)w) >> (8 + state->max_d)) + state->tbv; texture_state.level = (state->d < 0) ? state->max_d : state->max_d - ((state->d >> 27) & 0xf); if (texture_state.level < 0) texture_state.level = 0; texture_state.texture_shift = 18 + (9 - texture_state.level); - tex_offset = 1 << texture_state.texture_shift; + tex_offset = 1 << texture_state.texture_shift; texture_state.u = u; texture_state.v = v; @@ -3268,47 +3051,50 @@ tex_sample_persp_mipmap_filter_375(s3d_state_t *state) d[2] = (256 - du) * dv; d[3] = du * dv; - state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; - state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; - state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; - state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; + state->dest_rgba.r = (tex_samples[0].r * d[0] + tex_samples[1].r * d[1] + + tex_samples[2].r * d[2] + tex_samples[3].r * d[3]) >> 16; + state->dest_rgba.g = (tex_samples[0].g * d[0] + tex_samples[1].g * d[1] + + tex_samples[2].g * d[2] + tex_samples[3].g * d[3]) >> 16; + state->dest_rgba.b = (tex_samples[0].b * d[0] + tex_samples[1].b * d[1] + + tex_samples[2].b * d[2] + tex_samples[3].b * d[3]) >> 16; + state->dest_rgba.a = (tex_samples[0].a * d[0] + tex_samples[1].a * d[1] + + tex_samples[2].a * d[2] + tex_samples[3].a * d[3]) >> 16; } -#define CLAMP(x) \ - do { \ - if ((x) & ~0xff) \ - x = ((x) < 0) ? 0 : 0xff; \ +#define CLAMP(x) \ + do { \ + if ((x) & ~0xff) \ + x = ((x) < 0) ? 0 : 0xff; \ } while (0) -#define CLAMP_RGBA(r, g, b, a) \ - if ((r) & ~0xff) \ - r = ((r) < 0) ? 0 : 0xff; \ - if ((g) & ~0xff) \ - g = ((g) < 0) ? 0 : 0xff; \ - if ((b) & ~0xff) \ - b = ((b) < 0) ? 0 : 0xff; \ - if ((a) & ~0xff) \ - a = ((a) < 0) ? 0 : 0xff; +#define CLAMP_RGBA(r, g, b, a) \ + if ((r) & ~0xff) \ + r = ((r) < 0) ? 0 : 0xff; \ + if ((g) & ~0xff) \ + g = ((g) < 0) ? 0 : 0xff; \ + if ((b) & ~0xff) \ + b = ((b) < 0) ? 0 : 0xff; \ + if ((a) & ~0xff) \ + a = ((a) < 0) ? 0 : 0xff; -#define CLAMP_RGB(r, g, b) \ - do { \ - if ((r) < 0) \ - r = 0; \ - if ((r) > 0xff) \ - r = 0xff; \ - if ((g) < 0) \ - g = 0; \ - if ((g) > 0xff) \ - g = 0xff; \ - if ((b) < 0) \ - b = 0; \ - if ((b) > 0xff) \ - b = 0xff; \ +#define CLAMP_RGB(r, g, b) \ + do { \ + if ((r) < 0) \ + r = 0; \ + if ((r) > 0xff) \ + r = 0xff; \ + if ((g) < 0) \ + g = 0; \ + if ((g) > 0xff) \ + g = 0xff; \ + if ((b) < 0) \ + b = 0; \ + if ((b) > 0xff) \ + b = 0xff; \ } while (0) static void -dest_pixel_gouraud_shaded_triangle(s3d_state_t *state) -{ +dest_pixel_gouraud_shaded_triangle(s3d_state_t *state) { state->dest_rgba.r = state->r >> 7; CLAMP(state->dest_rgba.r); @@ -3323,8 +3109,7 @@ dest_pixel_gouraud_shaded_triangle(s3d_state_t *state) } static void -dest_pixel_unlit_texture_triangle(s3d_state_t *state) -{ +dest_pixel_unlit_texture_triangle(s3d_state_t *state) { tex_sample(state); if (state->cmd_set & CMD_SET_ABC_SRC) @@ -3332,8 +3117,7 @@ dest_pixel_unlit_texture_triangle(s3d_state_t *state) } static void -dest_pixel_lit_texture_decal(s3d_state_t *state) -{ +dest_pixel_lit_texture_decal(s3d_state_t *state) { tex_sample(state); if (state->cmd_set & CMD_SET_ABC_SRC) @@ -3341,8 +3125,7 @@ dest_pixel_lit_texture_decal(s3d_state_t *state) } static void -dest_pixel_lit_texture_reflection(s3d_state_t *state) -{ +dest_pixel_lit_texture_reflection(s3d_state_t *state) { tex_sample(state); state->dest_rgba.r += (state->r >> 7); @@ -3355,8 +3138,7 @@ dest_pixel_lit_texture_reflection(s3d_state_t *state) } static void -dest_pixel_lit_texture_modulate(s3d_state_t *state) -{ +dest_pixel_lit_texture_modulate(s3d_state_t *state) { int r = state->r >> 7; int g = state->g >> 7; int b = state->b >> 7; @@ -3375,39 +3157,18 @@ dest_pixel_lit_texture_modulate(s3d_state_t *state) } static void -tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int32_t dx2) -{ - svga_t *svga = &virge->svga; - uint8_t *vram = svga->vram; +tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int32_t dx2) { + svga_t *svga = &virge->svga; + uint8_t *vram = virge->svga.vram; + int x_dir = s3d_tri->tlr ? 1 : -1; + int use_z = !(s3d_tri->cmd_set & CMD_SET_ZB_MODE); + int y_count = yc; + int bpp = (s3d_tri->cmd_set >> 2) & 7; + uint32_t dest_offset; + uint32_t z_offset; - int x_dir = s3d_tri->tlr ? 1 : -1; - - int use_z = !(s3d_tri->cmd_set & CMD_SET_ZB_MODE); - - int y_count = yc; - - int bpp = (s3d_tri->cmd_set >> 2) & 7; - - uint32_t dest_offset = 0; - uint32_t z_offset = 0; - - uint32_t src_col; - int src_r = 0; - int src_g = 0; - int src_b = 0; - - int x; - int xe; - uint32_t z; - - uint32_t dest_addr; - uint32_t z_addr; - int dx; - int x_offset; - int xz_offset; - - int update; - uint16_t src_z = 0; + dest_offset = s3d_tri->dest_base + (state->y * s3d_tri->dest_str); + z_offset = s3d_tri->z_base + (state->y * s3d_tri->z_str); if (s3d_tri->cmd_set & CMD_SET_HC) { if (state->y < s3d_tri->clip_t) @@ -3427,240 +3188,194 @@ tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int state->base_a += (s3d_tri->TdAdY * diff_y); state->base_d += (s3d_tri->TdDdY * diff_y); state->base_w += (s3d_tri->TdWdY * diff_y); - state->x1 += (dx1 * diff_y); - state->x2 += (dx2 * diff_y); - state->y -= diff_y; - dest_offset -= s3d_tri->dest_str * diff_y; - z_offset -= s3d_tri->z_str; - y_count -= diff_y; + state->x1 += (dx1 * diff_y); + state->x2 += (dx2 * diff_y); + state->y -= diff_y; + dest_offset -= s3d_tri->dest_str; + z_offset -= s3d_tri->z_str; + y_count -= diff_y; } if ((state->y - y_count) < s3d_tri->clip_t) y_count = (state->y - s3d_tri->clip_t) + 1; } - dest_offset = s3d_tri->dest_base + (state->y * s3d_tri->dest_str); - z_offset = s3d_tri->z_base + (state->y * s3d_tri->z_str); + for (; y_count > 0; y_count--) { + int x = (state->x1 + ((1 << 20) - 1)) >> 20; + int xe = (state->x2 + ((1 << 20) - 1)) >> 20; + uint32_t z = (state->base_z > 0) ? (state->base_z << 1) : 0; - while (y_count > 0) { - x = (state->x1 + ((1 << 20) - 1)) >> 20; - xe = (state->x2 + ((1 << 20) - 1)) >> 20; - z = (state->base_z > 0) ? (state->base_z << 1) : 0; - if (x_dir < 0) { - x--; - xe--; + if (x_dir < 0) { + x--; + xe--; + } + + if (x != xe && ((x_dir > 0 && x < xe) || (x_dir < 0 && x > xe))) { + uint32_t dest_addr; + uint32_t z_addr; + int dx = (x_dir > 0) ? ((31 - ((state->x1 - 1) >> 15)) & 0x1f) : + (((state->x1 - 1) >> 15) & 0x1f); + int x_offset = x_dir * (bpp + 1); + int xz_offset = x_dir << 1; + + if (x_dir > 0) + dx += 1; + + state->r = state->base_r + ((s3d_tri->TdRdX * dx) >> 5); + state->g = state->base_g + ((s3d_tri->TdGdX * dx) >> 5); + state->b = state->base_b + ((s3d_tri->TdBdX * dx) >> 5); + state->a = state->base_a + ((s3d_tri->TdAdX * dx) >> 5); + state->u = state->base_u + ((s3d_tri->TdUdX * dx) >> 5); + state->v = state->base_v + ((s3d_tri->TdVdX * dx) >> 5); + state->w = state->base_w + ((s3d_tri->TdWdX * dx) >> 5); + state->d = state->base_d + ((s3d_tri->TdDdX * dx) >> 5); + z += ((s3d_tri->TdZdX * dx) >> 5); + + if (s3d_tri->cmd_set & CMD_SET_HC) { + if (x_dir > 0) { + if (x > s3d_tri->clip_r) + goto tri_skip_line; + if (xe < s3d_tri->clip_l) + goto tri_skip_line; + if (xe > s3d_tri->clip_r) + xe = s3d_tri->clip_r + 1; + if (x < s3d_tri->clip_l) { + int diff_x = s3d_tri->clip_l - x; + + z += (s3d_tri->TdZdX * diff_x); + state->u += (s3d_tri->TdUdX * diff_x); + state->v += (s3d_tri->TdVdX * diff_x); + state->r += (s3d_tri->TdRdX * diff_x); + state->g += (s3d_tri->TdGdX * diff_x); + state->b += (s3d_tri->TdBdX * diff_x); + state->a += (s3d_tri->TdAdX * diff_x); + state->d += (s3d_tri->TdDdX * diff_x); + state->w += (s3d_tri->TdWdX * diff_x); + + x = s3d_tri->clip_l; + } + } else { + if (x < s3d_tri->clip_l) + goto tri_skip_line; + if (xe > s3d_tri->clip_r) + goto tri_skip_line; + if (xe < s3d_tri->clip_l) + xe = s3d_tri->clip_l - 1; + if (x > s3d_tri->clip_r) { + int diff_x = x - s3d_tri->clip_r; + + z += (s3d_tri->TdZdX * diff_x); + state->u += (s3d_tri->TdUdX * diff_x); + state->v += (s3d_tri->TdVdX * diff_x); + state->r += (s3d_tri->TdRdX * diff_x); + state->g += (s3d_tri->TdGdX * diff_x); + state->b += (s3d_tri->TdBdX * diff_x); + state->a += (s3d_tri->TdAdX * diff_x); + state->d += (s3d_tri->TdDdX * diff_x); + state->w += (s3d_tri->TdWdX * diff_x); + + x = s3d_tri->clip_r; + } + } + } + + virge->svga.changedvram[(dest_offset & svga->vram_mask) >> 12] = changeframecount; + + dest_addr = dest_offset + (x * (bpp + 1)); + z_addr = z_offset + (x << 1); + + x &= 0xfff; + xe &= 0xfff; + + for (; x != xe; x = (x + x_dir) & 0xfff) { + int update = 1; + uint16_t src_z = 0; + + _x = x; + _y = state->y; + + if (use_z) { + src_z = Z_READ(z_addr); + Z_CLIP(src_z, z >> 16); + } + + if (update) { + uint32_t dest_col; + + dest_pixel(state); + + if (s3d_tri->cmd_set & CMD_SET_FE) { + int a = state->a >> 7; + state->dest_rgba.r = ((state->dest_rgba.r * a) + (s3d_tri->fog_r * (255 - a))) / 255; + state->dest_rgba.g = ((state->dest_rgba.g * a) + (s3d_tri->fog_g * (255 - a))) / 255; + state->dest_rgba.b = ((state->dest_rgba.b * a) + (s3d_tri->fog_b * (255 - a))) / 255; + } + + if (s3d_tri->cmd_set & CMD_SET_ABC_ENABLE) { + uint32_t src_col; + int src_r = 0; + uint32_t src_g = 0; + uint32_t src_b = 0; + + switch (bpp) { + case 0: /*8 bpp*/ + /*Not implemented yet*/ + break; + case 1: /*16 bpp*/ + src_col = *(uint16_t *)&vram[dest_addr & svga->vram_mask]; + RGB15_TO_24(src_col, src_r, src_g, src_b); + break; + case 2: /*24 bpp*/ + src_col = (*(uint32_t *)&vram[dest_addr & svga->vram_mask]) & 0xffffff; + RGB24_TO_24(src_col, src_r, src_g, src_b); + break; + } + + state->dest_rgba.r = ((state->dest_rgba.r * state->dest_rgba.a) + + (src_r * (255 - state->dest_rgba.a))) / 255; + state->dest_rgba.g = ((state->dest_rgba.g * state->dest_rgba.a) + + (src_g * (255 - state->dest_rgba.a))) / 255; + state->dest_rgba.b = ((state->dest_rgba.b * state->dest_rgba.a) + + (src_b * (255 - state->dest_rgba.a))) / 255; + } + + switch (bpp) { + case 0: /*8 bpp*/ + /*Not implemented yet*/ + break; + case 1: /*16 bpp*/ + RGB15(state->dest_rgba.r, state->dest_rgba.g, state->dest_rgba.b, dest_col); + *(uint16_t *)&vram[dest_addr] = dest_col; + break; + case 2: /*24 bpp*/ + dest_col = RGB24(state->dest_rgba.r, state->dest_rgba.g, state->dest_rgba.b); + *(uint8_t *)&vram[dest_addr] = dest_col & 0xff; + *(uint8_t *)&vram[dest_addr + 1] = (dest_col >> 8) & 0xff; + *(uint8_t *)&vram[dest_addr + 2] = (dest_col >> 16) & 0xff; + break; + } + + if (use_z && (s3d_tri->cmd_set & CMD_SET_ZUP)) + Z_WRITE(z_addr, src_z); + } + + z += s3d_tri->TdZdX; + state->u += s3d_tri->TdUdX; + state->v += s3d_tri->TdVdX; + state->r += s3d_tri->TdRdX; + state->g += s3d_tri->TdGdX; + state->b += s3d_tri->TdBdX; + state->a += s3d_tri->TdAdX; + state->d += s3d_tri->TdDdX; + state->w += s3d_tri->TdWdX; + dest_addr += x_offset; + z_addr += xz_offset; + virge->pixel_count++; + } } - - if (((x != xe) && ((x_dir > 0) && (x < xe))) || ((x_dir < 0) && (x > xe))) { - dx = (x_dir > 0) ? ((31 - ((state->x1 - 1) >> 15)) & 0x1f) : (((state->x1 - 1) >> 15) & 0x1f); - x_offset = x_dir * (bpp + 1); - xz_offset = x_dir << 1; - if (x_dir > 0) - dx += 1; - state->r = state->base_r + ((s3d_tri->TdRdX * dx) >> 5); - state->g = state->base_g + ((s3d_tri->TdGdX * dx) >> 5); - state->b = state->base_b + ((s3d_tri->TdBdX * dx) >> 5); - state->a = state->base_a + ((s3d_tri->TdAdX * dx) >> 5); - state->u = state->base_u + ((s3d_tri->TdUdX * dx) >> 5); - state->v = state->base_v + ((s3d_tri->TdVdX * dx) >> 5); - state->w = state->base_w + ((s3d_tri->TdWdX * dx) >> 5); - state->d = state->base_d + ((s3d_tri->TdDdX * dx) >> 5); - z += ((s3d_tri->TdZdX * dx) >> 5); - - if (s3d_tri->cmd_set & CMD_SET_HC) { - if (x_dir > 0) { - if (x > s3d_tri->clip_r) - goto tri_skip_line; - if (xe < s3d_tri->clip_l) - goto tri_skip_line; - if (xe > s3d_tri->clip_r) - xe = s3d_tri->clip_r + 1; - if (x < s3d_tri->clip_l) { - int diff_x = s3d_tri->clip_l - x; - - z += (s3d_tri->TdZdX * diff_x); - state->u += (s3d_tri->TdUdX * diff_x); - state->v += (s3d_tri->TdVdX * diff_x); - state->r += (s3d_tri->TdRdX * diff_x); - state->g += (s3d_tri->TdGdX * diff_x); - state->b += (s3d_tri->TdBdX * diff_x); - state->a += (s3d_tri->TdAdX * diff_x); - state->d += (s3d_tri->TdDdX * diff_x); - state->w += (s3d_tri->TdWdX * diff_x); - - x = s3d_tri->clip_l; - } - } else { - if (x < s3d_tri->clip_l) - goto tri_skip_line; - if (xe > s3d_tri->clip_r) - goto tri_skip_line; - if (xe < s3d_tri->clip_l) - xe = s3d_tri->clip_l - 1; - if (x > s3d_tri->clip_r) { - int diff_x = x - s3d_tri->clip_r; - - z += (s3d_tri->TdZdX * diff_x); - state->u += (s3d_tri->TdUdX * diff_x); - state->v += (s3d_tri->TdVdX * diff_x); - state->r += (s3d_tri->TdRdX * diff_x); - state->g += (s3d_tri->TdGdX * diff_x); - state->b += (s3d_tri->TdBdX * diff_x); - state->a += (s3d_tri->TdAdX * diff_x); - state->d += (s3d_tri->TdDdX * diff_x); - state->w += (s3d_tri->TdWdX * diff_x); - - x = s3d_tri->clip_r; - } - } - } - - svga->changedvram[(dest_offset & virge->vram_mask) >> 12] = changeframecount; - - dest_addr = dest_offset + (x * (bpp + 1)); - z_addr = z_offset + (x << 1); - - x &= 0xfff; - xe &= 0xfff; - - while (x != xe) { - update = 1; - _x = x; - _y = state->y; - - if (use_z) { - src_z = *(uint16_t *) &vram[z_addr & virge->vram_mask]; - switch ((s3d_tri->cmd_set >> 20) & 7) { - case 0: - update = 0; - break; - case 1: - if ((z >> 16) > src_z) { - src_z = (z >> 16); - } else - update = 0; - break; - case 2: - if ((z >> 16) == src_z) { - src_z = (z >> 16); - } else - update = 0; - break; - case 3: - if ((z >> 16) >= src_z) { - src_z = (z >> 16); - } else - update = 0; - break; - case 4: - if ((z >> 16) < src_z) { - src_z = (z >> 16); - } else - update = 0; - break; - case 5: - if ((z >> 16) != src_z) { - src_z = (z >> 16); - } else - update = 0; - break; - case 6: - if ((z >> 16) <= src_z) { - src_z = (z >> 16); - } else - update = 0; - break; - case 7: - src_z = (z >> 16); - break; - - default: - break; - } - } - - if (update) { - uint32_t dest_col; - - dest_pixel(state); - - if (s3d_tri->cmd_set & CMD_SET_FE) { - int a = state->a >> 7; - state->dest_rgba.r = ((state->dest_rgba.r * a) + (s3d_tri->fog_r * (255 - a))) / 255; - state->dest_rgba.g = ((state->dest_rgba.g * a) + (s3d_tri->fog_g * (255 - a))) / 255; - state->dest_rgba.b = ((state->dest_rgba.b * a) + (s3d_tri->fog_b * (255 - a))) / 255; - } - - if (s3d_tri->cmd_set & CMD_SET_ABC_ENABLE) { - switch (bpp) { - case 0: /*8 bpp*/ - /*TODO: Not implemented yet*/ - break; - case 1: /*16 bpp*/ - src_col = *(uint16_t *) &vram[dest_addr & virge->vram_mask]; - RGB15_TO_24(src_col, src_r, src_g, src_b); - break; - case 2: /*24 bpp*/ - src_col = (*(uint32_t *) &vram[dest_addr & virge->vram_mask]) & 0xffffff; - RGB24_TO_24(src_col, src_r, src_g, src_b); - break; - - default: - break; - } - - state->dest_rgba.r = ((state->dest_rgba.r * state->dest_rgba.a) + (src_r * (255 - state->dest_rgba.a))) / 255; - state->dest_rgba.g = ((state->dest_rgba.g * state->dest_rgba.a) + (src_g * (255 - state->dest_rgba.a))) / 255; - state->dest_rgba.b = ((state->dest_rgba.b * state->dest_rgba.a) + (src_b * (255 - state->dest_rgba.a))) / 255; - } - - switch (bpp) { - case 0: /*8 bpp*/ - /*TODO: Not implemented yet*/ - break; - case 1: /*16 bpp*/ - RGB15(state->dest_rgba.r, state->dest_rgba.g, state->dest_rgba.b, dest_col); - *(uint16_t *) &vram[dest_addr & virge->vram_mask] = dest_col; - svga->changedvram[(dest_addr & virge->vram_mask) >> 12] = changeframecount; - break; - case 2: /*24 bpp*/ - dest_col = RGB24(state->dest_rgba.r, state->dest_rgba.g, state->dest_rgba.b); - *(uint8_t *) &vram[dest_addr & virge->vram_mask] = dest_col & 0xff; - *(uint8_t *) &vram[(dest_addr + 1) & virge->vram_mask] = (dest_col >> 8) & 0xff; - *(uint8_t *) &vram[(dest_addr + 2) & virge->vram_mask] = (dest_col >> 16) & 0xff; - svga->changedvram[(dest_addr & virge->vram_mask) >> 12] = changeframecount; - break; - - default: - break; - } - } - - if (use_z && (s3d_tri->cmd_set & CMD_SET_ZUP)) { - *(uint16_t *) &vram[z_addr & virge->vram_mask] = src_z; - svga->changedvram[(z_addr & virge->vram_mask) >> 12] = changeframecount; - } - - z += s3d_tri->TdZdX; - state->u += s3d_tri->TdUdX; - state->v += s3d_tri->TdVdX; - state->r += s3d_tri->TdRdX; - state->g += s3d_tri->TdGdX; - state->b += s3d_tri->TdBdX; - state->a += s3d_tri->TdAdX; - state->d += s3d_tri->TdDdX; - state->w += s3d_tri->TdWdX; - dest_addr += x_offset; - z_addr += xz_offset; - - x = (x + x_dir) & 0xfff; - } - } - - y_count--; - + tri_skip_line: - state->x1 += dx1; - state->x2 += dx2; + state->x1 += dx1; + state->x2 += dx2; state->base_u += s3d_tri->TdUdY; state->base_v += s3d_tri->TdVdY; state->base_z += s3d_tri->TdZdY; @@ -3671,31 +3386,22 @@ tri_skip_line: state->base_d += s3d_tri->TdDdY; state->base_w += s3d_tri->TdWdY; state->y--; - dest_offset -= s3d_tri->dest_str; - z_offset -= s3d_tri->z_str; + dest_offset -= s3d_tri->dest_str; + z_offset -= s3d_tri->z_str; } } -static int tex_size[8] = { - 4 * 2, - 2 * 2, - 2 * 2, - 1 * 2, - 2 / 1, - 2 / 1, - 1 * 2, - 1 * 2 -}; +static int tex_size[8] = {4 * 2, 2 * 2, 2 * 2, 1 * 2, 2 / 1, 2 / 1, 1 * 2, 1 * 2}; static void -s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) -{ +s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) { s3d_state_t state; - uint32_t tex_base; + uint32_t tex_base; + int c; - uint64_t start_time = plat_timer_read(); - uint64_t end_time; + uint64_t start_time = plat_timer_read(); + uint64_t end_time; state.tbu = s3d_tri->tbu << 11; state.tbv = s3d_tri->tbv << 11; @@ -3709,18 +3415,18 @@ s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) state.base_u = s3d_tri->tus; state.base_v = s3d_tri->tvs; state.base_z = s3d_tri->tzs; - state.base_r = (int32_t) s3d_tri->trs; - state.base_g = (int32_t) s3d_tri->tgs; - state.base_b = (int32_t) s3d_tri->tbs; - state.base_a = (int32_t) s3d_tri->tas; + state.base_r = (int32_t)s3d_tri->trs; + state.base_g = (int32_t)s3d_tri->tgs; + state.base_b = (int32_t)s3d_tri->tbs; + state.base_a = (int32_t)s3d_tri->tas; state.base_d = s3d_tri->tds; state.base_w = s3d_tri->tws; tex_base = s3d_tri->tex_base; - for (int c = 9; c >= 0; c--) { - state.texture[c] = (uint16_t *) &virge->svga.vram[tex_base]; - if (c <= state.max_d) - tex_base += ((1 << (c * 2)) * tex_size[(s3d_tri->cmd_set >> 5) & 7]) / 2; + for (c = 9; c >= 0; c--) { + state.texture[c] = (uint16_t *)&virge->svga.vram[tex_base]; + if (c <= state.max_d) + tex_base += ((1 << (c * 2)) * tex_size[(s3d_tri->cmd_set >> 5) & 7]) / 2; } switch ((s3d_tri->cmd_set >> 27) & 0xf) { @@ -3740,7 +3446,6 @@ s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) dest_pixel = dest_pixel_lit_texture_decal; break; default: - s3_virge_log("bad triangle type %x\n", (s3d_tri->cmd_set >> 27) & 0xf); return; } break; @@ -3749,7 +3454,6 @@ s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) dest_pixel = dest_pixel_unlit_texture_triangle; break; default: - s3_virge_log("bad triangle type %x\n", (s3d_tri->cmd_set >> 27) & 0xf); return; } @@ -3772,34 +3476,35 @@ s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) break; case (0 | 8): case (1 | 8): - if (virge->chip == S3_VIRGEDX || virge->chip >= S3_VIRGEGX2) + if ((virge->chip == S3_VIRGEDX) || (virge->chip >= S3_VIRGEGX2)) tex_sample = tex_sample_persp_mipmap_375; else tex_sample = tex_sample_persp_mipmap; break; case (2 | 8): case (3 | 8): - if (virge->chip == S3_VIRGEDX || virge->chip >= S3_VIRGEGX2) - tex_sample = virge->bilinear_enabled ? tex_sample_persp_mipmap_filter_375 : tex_sample_persp_mipmap_375; + if ((virge->chip == S3_VIRGEDX) || (virge->chip >= S3_VIRGEGX2)) + tex_sample = virge->bilinear_enabled ? tex_sample_persp_mipmap_filter_375 : + tex_sample_persp_mipmap_375; else - tex_sample = virge->bilinear_enabled ? tex_sample_persp_mipmap_filter : tex_sample_persp_mipmap; + tex_sample = virge->bilinear_enabled ? tex_sample_persp_mipmap_filter : + tex_sample_persp_mipmap; break; case (4 | 8): case (5 | 8): - if (virge->chip == S3_VIRGEDX || virge->chip >= S3_VIRGEGX2) + if ((virge->chip == S3_VIRGEDX) || (virge->chip >= S3_VIRGEGX2)) tex_sample = tex_sample_persp_normal_375; else tex_sample = tex_sample_persp_normal; break; case (6 | 8): case (7 | 8): - if (virge->chip == S3_VIRGEDX || virge->chip >= S3_VIRGEGX2) - tex_sample = virge->bilinear_enabled ? tex_sample_persp_normal_filter_375 : tex_sample_persp_normal_375; + if ((virge->chip == S3_VIRGEDX) || (virge->chip >= S3_VIRGEGX2)) + tex_sample = virge->bilinear_enabled ? tex_sample_persp_normal_filter_375 : + tex_sample_persp_normal_375; else - tex_sample = virge->bilinear_enabled ? tex_sample_persp_normal_filter : tex_sample_persp_normal; - break; - - default: + tex_sample = virge->bilinear_enabled ? tex_sample_persp_normal_filter : + tex_sample_persp_normal; break; } @@ -3814,7 +3519,6 @@ s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) tex_read = (s3d_tri->cmd_set & CMD_SET_TWE) ? tex_ARGB1555 : tex_ARGB1555_nowrap; break; default: - s3_virge_log("bad texture type %i\n", (s3d_tri->cmd_set >> 5) & 7); tex_read = (s3d_tri->cmd_set & CMD_SET_TWE) ? tex_ARGB1555 : tex_ARGB1555_nowrap; break; } @@ -3826,15 +3530,16 @@ s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) state.x2 = s3d_tri->txend12; tri(virge, s3d_tri, &state, s3d_tri->ty12, s3d_tri->TdXdY02, s3d_tri->TdXdY12); + virge->tri_count++; + end_time = plat_timer_read(); - virge->blitter_time += end_time - start_time; + virge_time += end_time - start_time; } static void -s3_virge_render_thread(void *priv) -{ - virge_t *virge = (virge_t *) priv; +render_thread(void *param) { + virge_t *virge = (virge_t *)param; while (virge->render_thread_run) { thread_wait_event(virge->wake_render_thread, -1); @@ -3844,7 +3549,7 @@ s3_virge_render_thread(void *priv) s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx & RB_MASK]); virge->s3d_read_idx++; - if (RB_ENTRIES == RB_MASK) + if (RB_ENTRIES == (RB_SIZE - 1)) thread_set_event(virge->not_full_event); } virge->s3d_busy = 0; @@ -3854,30 +3559,27 @@ s3_virge_render_thread(void *priv) } static void -queue_triangle(virge_t *virge) -{ +queue_triangle(virge_t *virge) { if (RB_FULL) { thread_reset_event(virge->not_full_event); if (RB_FULL) thread_wait_event(virge->not_full_event, -1); /*Wait for room in ringbuffer*/ } - virge->s3d_buffer[virge->s3d_write_idx & RB_MASK] = virge->s3d_tri; virge->s3d_write_idx++; if (!virge->s3d_busy) thread_set_event(virge->wake_render_thread); /*Wake up render thread if moving from idle*/ } -static void -s3_virge_hwcursor_draw(svga_t *svga, int displine) -{ - const virge_t *virge = (virge_t *) svga->priv; - uint16_t dat[2]; - int xx; - int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff; - uint32_t fg; - uint32_t bg; - uint32_t vram_mask = virge->vram_mask; +static void s3_virge_hwcursor_draw(svga_t *svga, int displine) { + virge_t *virge = (virge_t *) svga->priv; + int x; + uint16_t dat[2] = { 0, 0 }; + int xx; + int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff; + uint32_t fg; + uint32_t bg; + uint32_t vram_mask = virge->vram_mask; if (svga->interlace && svga->hwcursor_oddeven) svga->hwcursor_latch.addr += 16; @@ -3914,13 +3616,16 @@ s3_virge_hwcursor_draw(svga_t *svga, int displine) break; } - for (uint8_t x = 0; x < 64; x += 16) { - dat[0] = (svga->vram[svga->hwcursor_latch.addr & vram_mask] << 8) | svga->vram[(svga->hwcursor_latch.addr + 1) & vram_mask]; - dat[1] = (svga->vram[(svga->hwcursor_latch.addr + 2) & vram_mask] << 8) | svga->vram[(svga->hwcursor_latch.addr + 3) & vram_mask]; + for (x = 0; x < 64; x += 16) { + dat[0] = (svga->vram[svga->hwcursor_latch.addr & vram_mask] << 8) | + svga->vram[(svga->hwcursor_latch.addr + 1) & vram_mask]; + dat[1] = (svga->vram[(svga->hwcursor_latch.addr + 2) & vram_mask] << 8) | + svga->vram[(svga->hwcursor_latch.addr + 3) & vram_mask]; + if (svga->crtc[0x55] & 0x10) { /*X11*/ for (xx = 0; xx < 16; xx++) { - if (offset >= 0) { + if (offset >= svga->hwcursor_latch.x) { if (virge->chip == S3_VIRGEGX2) dat[0] ^= 0x8000; @@ -3929,13 +3634,14 @@ s3_virge_hwcursor_draw(svga_t *svga, int displine) } offset++; + dat[0] <<= 1; dat[1] <<= 1; } } else { /*Windows*/ for (xx = 0; xx < 16; xx++) { - if (offset >= 0) { + if (offset >= svga->hwcursor_latch.x) { if (!(dat[0] & 0x8000)) buffer32->line[displine][offset + svga->x_add] = (dat[1] & 0x8000) ? fg : bg; else if (dat[1] & 0x8000) @@ -3943,101 +3649,109 @@ s3_virge_hwcursor_draw(svga_t *svga, int displine) } offset++; + dat[0] <<= 1; dat[1] <<= 1; } } + svga->hwcursor_latch.addr += 4; } + if (svga->interlace && !svga->hwcursor_oddeven) svga->hwcursor_latch.addr += 16; } -#define DECODE_YCbCr() \ - do { \ - int c; \ - \ - for (c = 0; c < 2; c++) { \ - uint8_t y1, y2; \ - int8_t Cr, Cb; \ - int dR, dG, dB; \ - \ - y1 = src[0]; \ - Cr = src[1] - 0x80; \ - y2 = src[2]; \ - Cb = src[3] - 0x80; \ - src += 4; \ - \ - dR = (359 * Cr) >> 8; \ - dG = (88 * Cb + 183 * Cr) >> 8; \ - dB = (453 * Cb) >> 8; \ - \ - r[x_write] = y1 + dR; \ - CLAMP(r[x_write]); \ - g[x_write] = y1 - dG; \ - CLAMP(g[x_write]); \ - b[x_write] = y1 + dB; \ - CLAMP(b[x_write]); \ - \ - r[x_write + 1] = y2 + dR; \ - CLAMP(r[x_write + 1]); \ - g[x_write + 1] = y2 - dG; \ - CLAMP(g[x_write + 1]); \ - b[x_write + 1] = y2 + dB; \ - CLAMP(b[x_write + 1]); \ - \ - x_write = (x_write + 2) & 7; \ - } \ +#define DECODE_YCbCr() \ + do { \ + int c; \ + \ + for (c = 0; c < 2; c++) { \ + uint8_t y1, y2; \ + int8_t Cr; \ + int8_t Cb; \ + int dR; \ + int dG; \ + int dB; \ + \ + y1 = src[0]; \ + Cr = src[1] - 0x80; \ + y2 = src[2]; \ + Cb = src[3] - 0x80; \ + src += 4; \ + \ + dR = (359 * Cr) >> 8; \ + dG = (88 * Cb + 183 * Cr) >> 8; \ + dB = (453 * Cb) >> 8; \ + \ + r[x_write] = y1 + dR; \ + CLAMP(r[x_write]); \ + g[x_write] = y1 - dG; \ + CLAMP(g[x_write]); \ + b[x_write] = y1 + dB; \ + CLAMP(b[x_write]); \ + \ + r[x_write + 1] = y2 + dR; \ + CLAMP(r[x_write + 1]); \ + g[x_write + 1] = y2 - dG; \ + CLAMP(g[x_write + 1]); \ + b[x_write + 1] = y2 + dB; \ + CLAMP(b[x_write + 1]); \ + \ + x_write = (x_write + 2) & 7; \ + } \ } while (0) /*Both YUV formats are untested*/ -#define DECODE_YUV211() \ - do { \ - uint8_t y1, y2, y3, y4; \ - int8_t U, V; \ - int dR, dG, dB; \ - \ - U = src[0] - 0x80; \ - y1 = (298 * (src[1] - 16)) >> 8; \ - y2 = (298 * (src[2] - 16)) >> 8; \ - V = src[3] - 0x80; \ - y3 = (298 * (src[4] - 16)) >> 8; \ - y4 = (298 * (src[5] - 16)) >> 8; \ - src += 6; \ - \ - dR = (309 * V) >> 8; \ - dG = (100 * U + 208 * V) >> 8; \ - dB = (516 * U) >> 8; \ - \ - r[x_write] = y1 + dR; \ - CLAMP(r[x_write]); \ - g[x_write] = y1 - dG; \ - CLAMP(g[x_write]); \ - b[x_write] = y1 + dB; \ - CLAMP(b[x_write]); \ - \ - r[x_write + 1] = y2 + dR; \ - CLAMP(r[x_write + 1]); \ - g[x_write + 1] = y2 - dG; \ - CLAMP(g[x_write + 1]); \ - b[x_write + 1] = y2 + dB; \ - CLAMP(b[x_write + 1]); \ - \ - r[x_write + 2] = y3 + dR; \ - CLAMP(r[x_write + 2]); \ - g[x_write + 2] = y3 - dG; \ - CLAMP(g[x_write + 2]); \ - b[x_write + 2] = y3 + dB; \ - CLAMP(b[x_write + 2]); \ - \ - r[x_write + 3] = y4 + dR; \ - CLAMP(r[x_write + 3]); \ - g[x_write + 3] = y4 - dG; \ - CLAMP(g[x_write + 3]); \ - b[x_write + 3] = y4 + dB; \ - CLAMP(b[x_write + 3]); \ - \ - x_write = (x_write + 4) & 7; \ +#define DECODE_YUV211() \ + do { \ + uint8_t y1, y2, y3, y4; \ + int8_t U, V; \ + int dR; \ + int dG; \ + int dB; \ + \ + U = src[0] - 0x80; \ + y1 = (298 * (src[1] - 16)) >> 8; \ + y2 = (298 * (src[2] - 16)) >> 8; \ + V = src[3] - 0x80; \ + y3 = (298 * (src[4] - 16)) >> 8; \ + y4 = (298 * (src[5] - 16)) >> 8; \ + src += 6; \ + \ + dR = (309 * V) >> 8; \ + dG = (100 * U + 208 * V) >> 8; \ + dB = (516 * U) >> 8; \ + \ + r[x_write] = y1 + dR; \ + CLAMP(r[x_write]); \ + g[x_write] = y1 - dG; \ + CLAMP(g[x_write]); \ + b[x_write] = y1 + dB; \ + CLAMP(b[x_write]); \ + \ + r[x_write + 1] = y2 + dR; \ + CLAMP(r[x_write + 1]); \ + g[x_write + 1] = y2 - dG; \ + CLAMP(g[x_write + 1]); \ + b[x_write + 1] = y2 + dB; \ + CLAMP(b[x_write + 1]); \ + \ + r[x_write + 2] = y3 + dR; \ + CLAMP(r[x_write + 2]); \ + g[x_write + 2] = y3 - dG; \ + CLAMP(g[x_write + 2]); \ + b[x_write + 2] = y3 + dB; \ + CLAMP(b[x_write + 2]); \ + \ + r[x_write + 3] = y4 + dR; \ + CLAMP(r[x_write + 3]); \ + g[x_write + 3] = y4 - dG; \ + CLAMP(g[x_write + 3]); \ + b[x_write + 3] = y4 + dB; \ + CLAMP(b[x_write + 3]); \ + \ + x_write = (x_write + 4) & 7; \ } while (0) #define DECODE_YUV422() \ @@ -4045,13 +3759,17 @@ s3_virge_hwcursor_draw(svga_t *svga, int displine) int c; \ \ for (c = 0; c < 2; c++) { \ - uint8_t y1, y2; \ - int8_t U, V; \ - int dR, dG, dB; \ + uint8_t y1; \ + uint8_t y2; \ + int8_t U; \ + int8_t V; \ + int dR; \ + int dG; \ + int dB; \ \ - U = src[0] - 0x80; \ + U = src[0] - 0x80; \ y1 = (298 * (src[1] - 16)) >> 8; \ - V = src[2] - 0x80; \ + V = src[2] - 0x80; \ y2 = (298 * (src[3] - 16)) >> 8; \ src += 4; \ \ @@ -4077,110 +3795,122 @@ s3_virge_hwcursor_draw(svga_t *svga, int displine) } \ } while (0) -#define DECODE_RGB555() \ - do { \ - int c; \ - \ - for (c = 0; c < 4; c++) { \ - uint16_t dat; \ - \ - dat = *(uint16_t *) src; \ - src += 2; \ - \ - r[x_write + c] = ((dat & 0x001f) << 3) | ((dat & 0x001f) >> 2); \ - g[x_write + c] = ((dat & 0x03e0) >> 2) | ((dat & 0x03e0) >> 7); \ - b[x_write + c] = ((dat & 0x7c00) >> 7) | ((dat & 0x7c00) >> 12); \ - } \ - x_write = (x_write + 4) & 7; \ +#define DECODE_RGB555() \ + do { \ + int c; \ + \ + for (c = 0; c < 4; c++) { \ + uint16_t dat; \ + \ + dat = *(uint16_t *)src; \ + src += 2; \ + \ + r[x_write + c] = \ + ((dat & 0x001f) << 3) | \ + ((dat & 0x001f) >> 2); \ + g[x_write + c] = \ + ((dat & 0x03e0) >> 2) | \ + ((dat & 0x03e0) >> 7); \ + b[x_write + c] = \ + ((dat & 0x7c00) >> 7) | \ + ((dat & 0x7c00) >> 12); \ + } \ + x_write = (x_write + 4) & 7; \ } while (0) -#define DECODE_RGB565() \ - do { \ - int c; \ - \ - for (c = 0; c < 4; c++) { \ - uint16_t dat; \ - \ - dat = *(uint16_t *) src; \ - src += 2; \ - \ - r[x_write + c] = ((dat & 0x001f) << 3) | ((dat & 0x001f) >> 2); \ - g[x_write + c] = ((dat & 0x07e0) >> 3) | ((dat & 0x07e0) >> 9); \ - b[x_write + c] = ((dat & 0xf800) >> 8) | ((dat & 0xf800) >> 13); \ - } \ - x_write = (x_write + 4) & 7; \ +#define DECODE_RGB565() \ + do { \ + int c; \ + \ + for (c = 0; c < 4; c++) { \ + uint16_t dat; \ + \ + dat = *(uint16_t *)src; \ + src += 2; \ + \ + r[x_write + c] = \ + ((dat & 0x001f) << 3) | \ + ((dat & 0x001f) >> 2); \ + g[x_write + c] = \ + ((dat & 0x07e0) >> 3) | \ + ((dat & 0x07e0) >> 9); \ + b[x_write + c] = \ + ((dat & 0xf800) >> 8) | \ + ((dat & 0xf800) >> 13); \ + } \ + x_write = (x_write + 4) & 7; \ } while (0) -#define DECODE_RGB888() \ - do { \ - int c; \ - \ - for (c = 0; c < 4; c++) { \ - r[x_write + c] = src[0]; \ - g[x_write + c] = src[1]; \ - b[x_write + c] = src[2]; \ - src += 3; \ - } \ - x_write = (x_write + 4) & 7; \ +#define DECODE_RGB888() \ + do { \ + int c; \ + \ + for (c = 0; c < 4; c++) { \ + r[x_write + c] = src[0]; \ + g[x_write + c] = src[1]; \ + b[x_write + c] = src[2]; \ + src += 3; \ + } \ + x_write = (x_write + 4) & 7; \ } while (0) -#define DECODE_XRGB8888() \ - do { \ - int c; \ - \ - for (c = 0; c < 4; c++) { \ - r[x_write + c] = src[0]; \ - g[x_write + c] = src[1]; \ - b[x_write + c] = src[2]; \ - src += 4; \ - } \ - x_write = (x_write + 4) & 7; \ +#define DECODE_XRGB8888() \ + do { \ + int c; \ + \ + for (c = 0; c < 4; c++) { \ + r[x_write + c] = src[0]; \ + g[x_write + c] = src[1]; \ + b[x_write + c] = src[2]; \ + src += 4; \ + } \ + x_write = (x_write + 4) & 7; \ } while (0) -#define OVERLAY_SAMPLE() \ - do { \ - switch (virge->streams.sdif) { \ - case 1: \ - DECODE_YCbCr(); \ - break; \ - case 2: \ - DECODE_YUV422(); \ - break; \ - case 3: \ - DECODE_RGB555(); \ - break; \ - case 4: \ - DECODE_YUV211(); \ - break; \ - case 5: \ - DECODE_RGB565(); \ - break; \ - case 6: \ - DECODE_RGB888(); \ - break; \ - case 7: \ - default: \ - DECODE_XRGB8888(); \ - break; \ - } \ +#define OVERLAY_SAMPLE() \ + do { \ + switch (virge->streams.sdif) { \ + case 1: \ + DECODE_YCbCr(); \ + break; \ + case 2: \ + DECODE_YUV422(); \ + break; \ + case 3: \ + DECODE_RGB555(); \ + break; \ + case 4: \ + DECODE_YUV211(); \ + break; \ + case 5: \ + DECODE_RGB565(); \ + break; \ + case 6: \ + DECODE_RGB888(); \ + break; \ + case 7: \ + default: \ + DECODE_XRGB8888(); \ + break; \ + } \ } while (0) static void -s3_virge_overlay_draw(svga_t *svga, int displine) -{ - const virge_t *virge = (virge_t *) svga->priv; - int offset = (virge->streams.sec_x - virge->streams.pri_x) + 1; - int h_acc = virge->streams.dda_horiz_accumulator; - int r[8]; - int g[8]; - int b[8]; - int x_size; - int x_read = 4; - int x_write = 4; - uint32_t *p; - uint8_t *src = &svga->vram[svga->overlay_latch.addr]; +s3_virge_overlay_draw(svga_t *svga, int displine) { + virge_t *virge = (virge_t *) svga->priv; + int offset = (virge->streams.sec_x - virge->streams.pri_x) + 1; + int h_acc = virge->streams.dda_horiz_accumulator; + int r[8]; + int g[8]; + int b[8]; + int x_size; + int x_read = 4; + int x_write = 4; + int x; + uint32_t *p; + uint8_t *src = &svga->vram[svga->overlay_latch.addr]; - p = &(buffer32->line[displine][offset + svga->x_add]); + p = &((uint32_t *)buffer32->line[displine])[offset + svga->x_add]; if ((offset + virge->streams.sec_w) > virge->streams.pri_w) x_size = (virge->streams.pri_w - virge->streams.sec_x) + 1; @@ -4189,7 +3919,7 @@ s3_virge_overlay_draw(svga_t *svga, int displine) OVERLAY_SAMPLE(); - for (int x = 0; x < x_size; x++) { + for (x = 0; x < x_size; x++) { *p++ = r[x_read] | (g[x_read] << 8) | (b[x_read] << 16); h_acc += virge->streams.k1_horiz_scale; @@ -4507,7 +4237,7 @@ static void * s3_virge_init(const device_t *info) { const char *bios_fn; - virge_t *virge = calloc(1, sizeof(virge_t)); + virge_t *virge = (virge_t *) calloc(1, sizeof(virge_t)); reset_state = calloc(1, sizeof(virge_t)); virge->bilinear_enabled = device_get_config_int("bilinear"); @@ -4742,12 +4472,12 @@ s3_virge_init(const device_t *info) virge->wake_render_thread = thread_create_event(); virge->wake_main_thread = thread_create_event(); virge->not_full_event = thread_create_event(); - virge->render_thread = thread_create(s3_virge_render_thread, virge); + virge->render_thread = thread_create(render_thread, virge); virge->fifo_thread_run = 1; virge->wake_fifo_thread = thread_create_event(); virge->fifo_not_full_event = thread_create_event(); - virge->fifo_thread = thread_create(s3_virge_fifo_thread, virge); + virge->fifo_thread = thread_create(fifo_thread, virge); virge->local = info->local; From 88741b021e8b67f0140fe4c01ac47aec93462d31 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 16 Aug 2024 05:58:24 +0200 Subject: [PATCH 323/624] S3 ViRGE: Some minor memory mask fixes. --- src/video/vid_s3_virge.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index aecd309e3..155380480 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1661,7 +1661,8 @@ fifo_thread(void *param) { virge->s3d_tri.z_str = val & 0xff8; break; case 0xb4ec: - virge->s3d_tri.tex_base = val & 0x3ffff8; + virge->s3d_tri.tex_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); break; case 0xb4f0: virge->s3d_tri.tex_bdr_clr = val & 0xffffff; @@ -1900,12 +1901,14 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { virge->streams.blend_ctrl = val; break; case 0x81c0: - virge->streams.pri_fb0 = val & 0x3fffff; + virge->streams.pri_fb0 = val & ((virge->memory_size == 8) ? + (val & 0x7fffff) : (val & 0x3fffff)); svga_recalctimings(svga); svga->fullchange = changeframecount; break; case 0x81c4: - virge->streams.pri_fb1 = val & 0x3fffff; + virge->streams.pri_fb1 = ((virge->memory_size == 8) ? + (val & 0x7fffff) : (val & 0x3fffff)); svga_recalctimings(svga); svga->fullchange = changeframecount; break; From ab71f9d3e213b3792aa40c83639ffbe4ac2739fb Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Fri, 16 Aug 2024 20:36:26 +0700 Subject: [PATCH 324/624] Added the miroCRYSTAL 3D, based on a S3 ViRGE. --- src/include/86box/video.h | 1 + src/video/vid_s3_virge.c | 26 ++++++++++++++++++++++++++ src/video/vid_table.c | 1 + 3 files changed, 28 insertions(+) diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 1037e213f..2f5a629d1 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -528,6 +528,7 @@ extern const device_t s3_trio64v2_dx_onboard_pci_device; /* S3 ViRGE */ extern const device_t s3_virge_325_pci_device; extern const device_t s3_diamond_stealth_2000_pci_device; +extern const device_t s3_mirocrystal_3d_pci_device; extern const device_t s3_diamond_stealth_3000_pci_device; extern const device_t s3_stb_velocity_3d_pci_device; extern const device_t s3_virge_375_pci_device; diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 155380480..0a6103801 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -61,6 +61,7 @@ static int dither[4][4] = { #define ROM_VIRGE_325 "roms/video/s3virge/86c325.bin" #define ROM_DIAMOND_STEALTH3D_2000 "roms/video/s3virge/s3virge.bin" +#define ROM_MIROCRYSTAL_3D "roms/video/s3virge/miro Crystal 3D 1.02.bin" #define ROM_DIAMOND_STEALTH3D_3000 "roms/video/s3virge/diamondstealth3000.vbi" #define ROM_STB_VELOCITY_3D "roms/video/s3virge/stb_velocity3d_110.BIN" #define ROM_VIRGE_DX "roms/video/s3virge/86c375_1.bin" @@ -91,6 +92,7 @@ static int dither[4][4] = { enum { S3_VIRGE_325, S3_DIAMOND_STEALTH3D_2000, + S3_MIROCRYSTAL_3D, S3_DIAMOND_STEALTH3D_3000, S3_STB_VELOCITY_3D, S3_VIRGE_DX, @@ -4259,6 +4261,9 @@ s3_virge_init(const device_t *info) case S3_DIAMOND_STEALTH3D_2000: bios_fn = ROM_DIAMOND_STEALTH3D_2000; break; + case S3_MIROCRYSTAL_3D: + bios_fn = ROM_MIROCRYSTAL_3D; + break; case S3_DIAMOND_STEALTH3D_3000: bios_fn = ROM_DIAMOND_STEALTH3D_3000; break; @@ -4353,6 +4358,7 @@ s3_virge_init(const device_t *info) switch (info->local) { case S3_VIRGE_325: case S3_DIAMOND_STEALTH3D_2000: + case S3_MIROCRYSTAL_3D: virge->fifo_slots_num = 8; virge->svga.decode_mask = (4 << 20) - 1; virge->virge_id_high = 0x56; @@ -4530,6 +4536,12 @@ s3_virge_325_available(void) return rom_present(ROM_VIRGE_325); } +static int +s3_mirocrystal_3d_available(void) +{ + return rom_present(ROM_MIROCRYSTAL_3D); +} + static int s3_virge_988_diamond_available(void) { @@ -4763,6 +4775,20 @@ const device_t s3_diamond_stealth_2000_pci_device = { .config = s3_virge_config }; +const device_t s3_diamond_stealth_2000_pci_device = { + .name = "S3 ViRGE (miroCRYSTAL 3D) PCI", + .internal_name = "mirocrystal_3d_pci", + .flags = DEVICE_PCI, + .local = S3_MIROCRYSTAL_3D, + .init = s3_virge_init, + .close = s3_virge_close, + .reset = s3_virge_reset, + { .available = s3_mirocrystal_3d_available }, + .speed_changed = s3_virge_speed_changed, + .force_redraw = s3_virge_force_redraw, + .config = s3_virge_357_config +}; + const device_t s3_diamond_stealth_3000_pci_device = { .name = "S3 ViRGE/VX (Diamond Stealth 3D 3000) PCI", .internal_name = "stealth3d_3000_pci", diff --git a/src/video/vid_table.c b/src/video/vid_table.c index 13639d05d..c4dee5719 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -174,6 +174,7 @@ video_cards[] = { { &s3_trio64v2_dx_pci_device }, { &s3_virge_325_pci_device }, { &s3_diamond_stealth_2000_pci_device }, + { &s3_mirocrystal_3d_pci_device }, { &s3_diamond_stealth_3000_pci_device }, { &s3_stb_velocity_3d_pci_device }, { &s3_virge_375_pci_device }, From 24e2c65c409e38259e3095a5d3eebfefa49ff1a5 Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Fri, 16 Aug 2024 20:44:51 +0700 Subject: [PATCH 325/624] Fixed a compile-breaking mistake --- src/video/vid_s3_virge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 0a6103801..47332324f 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -4775,7 +4775,7 @@ const device_t s3_diamond_stealth_2000_pci_device = { .config = s3_virge_config }; -const device_t s3_diamond_stealth_2000_pci_device = { +const device_t s3_mirocrystal_3d_pci_device = { .name = "S3 ViRGE (miroCRYSTAL 3D) PCI", .internal_name = "mirocrystal_3d_pci", .flags = DEVICE_PCI, From a02b4e52c3dc088fd3ff471abf065ffae37d7d6a Mon Sep 17 00:00:00 2001 From: MaxwellS04 Date: Sat, 17 Aug 2024 00:53:02 +0700 Subject: [PATCH 326/624] Fixed configuration --- src/video/vid_s3_virge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 47332324f..700722253 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -4786,7 +4786,7 @@ const device_t s3_mirocrystal_3d_pci_device = { { .available = s3_mirocrystal_3d_available }, .speed_changed = s3_virge_speed_changed, .force_redraw = s3_virge_force_redraw, - .config = s3_virge_357_config + .config = s3_virge_config }; const device_t s3_diamond_stealth_3000_pci_device = { From dba4fe373f3870f044362623907aedc15cbbcafe Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 16 Aug 2024 16:24:49 -0400 Subject: [PATCH 327/624] Add a link to the build guide to README.md --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b4b4142be..ce38632e6 100644 --- a/README.md +++ b/README.md @@ -53,10 +53,14 @@ We operate an IRC channel and a Discord server for discussing 86Box, its develop [![Visit our Discord server](https://discordapp.com/api/guilds/262614059009048590/embed.png)](https://discord.gg/QXK9XTv) Contributions ---------- +------------- We welcome all contributions to the project, as long as the [contribution guidelines](CONTRIBUTING.md) are followed. +Building +--------- +For instructions on how to build 86Box from source, see the [build guide](https://86box.readthedocs.io/en/latest/dev/buildguide.html). + Licensing --------- From 3611765e50d610f1626d4d59b063b3630a7988e0 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Fri, 16 Aug 2024 16:31:35 -0400 Subject: [PATCH 328/624] Delete 86Box-install-roms.sh --- scripts/86Box-install-roms.sh | 73 ----------------------------------- 1 file changed, 73 deletions(-) delete mode 100755 scripts/86Box-install-roms.sh diff --git a/scripts/86Box-install-roms.sh b/scripts/86Box-install-roms.sh deleted file mode 100755 index b13d93acc..000000000 --- a/scripts/86Box-install-roms.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/sh - -URL="https://github.com/86Box/roms/archive/refs/tags/v4.2.zip" -TMP_FILE="/tmp/86Box-ROMS.zip" -EXTRACT_DIR="/tmp/86Box-ROMS-extracted" -DEFAULT_TARGET_DIR="$HOME/.local/share/86Box/roms/" -TARGET_DIR=${TARGET_DIR:-$DEFAULT_TARGET_DIR} - -install_roms() { - if [ -d "$TARGET_DIR" ] && [ "$(ls -A $TARGET_DIR)" ]; then - echo "ROMS already installed in $TARGET_DIR" - echo "To (re)install, please first remove ROMS with -r parameter" - exit 1 - fi - fetch -o "$TMP_FILE" "$URL" - - if [ $? -ne 0 ]; then - echo "Failed to download the file from $URL" - exit 1 - fi - - mkdir -p "$EXTRACT_DIR" - unzip "$TMP_FILE" -d "$EXTRACT_DIR" - - if [ $? -ne 0 ]; then - echo "Failed to decompress the file" - rm "$TMP_FILE" - exit 1 - fi - - mkdir -p "$TARGET_DIR" - cd "$EXTRACT_DIR" - TOP_LEVEL_DIR=$(find . -mindepth 1 -maxdepth 1 -type d) - - if [ -d "$TOP_LEVEL_DIR" ]; then - mv "$TOP_LEVEL_DIR"/* "$TARGET_DIR" - fi - - rm -rf "$TMP_FILE" "$EXTRACT_DIR" - echo "ROMS installed successfully in $TARGET_DIR" -} - -remove_roms() { - if [ -d "$TARGET_DIR" ]; then - rm -rf "$TARGET_DIR" - echo "ROMS removed successfully from $TARGET_DIR" - else - echo "No ROMS directory found in $TARGET_DIR" - fi -} - -help() { - echo "" - echo "$0 [-h|-i|-r]" - echo " -h : this help" - echo " -i : install (this parameter can be omitted)" - echo " -r : remove the ROMS" - echo "" -} - -case "$1" in - -h) - help - ;; - -r) - remove_roms - ;; - -i|*) - install_roms - ;; -esac - -exit 0 From 366ebea651ba5cbdcf000f3c8734f47a37cee96c Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 17 Aug 2024 01:22:06 +0200 Subject: [PATCH 329/624] S3 ViRGE fixes by TC995 and switched threads on Windows builds back to Win32 threads since the C++ threads were breaking the ViRGE blitting in some cases (eg. CD Gamer on 24 bpp). --- src/CMakeLists.txt | 4 +- src/qt/win_thread.c | 179 +++++++++++++++++++++++++++++++++++++++ src/video/vid_s3_virge.c | 43 +++++++--- 3 files changed, 214 insertions(+), 12 deletions(-) create mode 100644 src/qt/win_thread.c diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0841fabdd..ad339040f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,7 +27,9 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux") add_compile_definitions(_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 _LARGEFILE64_SOURCE=1) endif() -if(CPPTHREADS) +if(WIN32) + target_sources(86Box PRIVATE qt/win_thread.c) +else() target_sources(86Box PRIVATE thread.cpp) endif() diff --git a/src/qt/win_thread.c b/src/qt/win_thread.c new file mode 100644 index 000000000..9a4f046b3 --- /dev/null +++ b/src/qt/win_thread.c @@ -0,0 +1,179 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Implement threads and mutexes for the Win32 platform. + * + * + * + * Authors: Sarah Walker, + * Fred N. van Kempen, + * + * Copyright 2008-2018 Sarah Walker. + * Copyright 2017-2018 Fred N. van Kempen. + */ +#define UNICODE +#define BITMAP WINDOWS_BITMAP +#include +#include +#include +#undef BITMAP +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/plat.h> +#include <86box/thread.h> + +typedef struct { + HANDLE handle; +} win_event_t; + +/* For compatibility with thread.h, but Win32 does not allow named threads. */ +thread_t * +thread_create_named(void (*func)(void *param), void *param, UNUSED(const char *name)) +{ + uintptr_t bt = _beginthread(func, 0, param); + return ((thread_t *) bt); +} + +int +thread_test_mutex(thread_t *arg) +{ + if (arg == NULL) + return (0); + + return (WaitForSingleObject(arg, 0) == WAIT_OBJECT_0) ? 1 : 0; +} + +int +thread_wait(thread_t *arg) +{ + if (arg == NULL) + return (0); + + if (WaitForSingleObject(arg, INFINITE)) + return (1); + + return (0); +} + +event_t * +thread_create_event(void) +{ + win_event_t *ev = malloc(sizeof(win_event_t)); + + ev->handle = CreateEvent(NULL, FALSE, FALSE, NULL); + + return ((event_t *) ev); +} + +void +thread_set_event(event_t *arg) +{ + win_event_t *ev = (win_event_t *) arg; + + if (arg == NULL) + return; + + SetEvent(ev->handle); +} + +void +thread_reset_event(event_t *arg) +{ + win_event_t *ev = (win_event_t *) arg; + + if (arg == NULL) + return; + + ResetEvent(ev->handle); +} + +int +thread_wait_event(event_t *arg, int timeout) +{ + win_event_t *ev = (win_event_t *) arg; + + if (arg == NULL) + return (0); + + if (ev->handle == NULL) + return (0); + + if (timeout == -1) + timeout = INFINITE; + + if (WaitForSingleObject(ev->handle, timeout)) + return (1); + + return (0); +} + +void +thread_destroy_event(event_t *arg) +{ + win_event_t *ev = (win_event_t *) arg; + + if (arg == NULL) + return; + + CloseHandle(ev->handle); + + free(ev); +} + +mutex_t * +thread_create_mutex(void) +{ + mutex_t *mutex = malloc(sizeof(CRITICAL_SECTION)); + + InitializeCriticalSection(mutex); + + return mutex; +} + +int +thread_wait_mutex(mutex_t *mutex) +{ + if (mutex == NULL) + return (0); + + LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex; + + EnterCriticalSection(critsec); + + return 1; +} + +int +thread_release_mutex(mutex_t *mutex) +{ + if (mutex == NULL) + return (0); + + LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex; + + LeaveCriticalSection(critsec); + + return 1; +} + +void +thread_close_mutex(mutex_t *mutex) +{ + if (mutex == NULL) + return; + + LPCRITICAL_SECTION critsec = (LPCRITICAL_SECTION) mutex; + + DeleteCriticalSection(critsec); + + free(critsec); +} diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 155380480..24f325c49 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -1804,13 +1804,34 @@ fifo_thread(void *param) { } static void -s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) { +s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) +{ fifo_entry_t *fifo = &virge->fifo[virge->fifo_write_idx & FIFO_MASK]; + int limit = 0; - if (FIFO_FULL) { - thread_reset_event(virge->fifo_not_full_event); - if (FIFO_FULL) - thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + if (type == FIFO_WRITE_DWORD) { + switch (addr & 0xfffc) { + case 0xa500: + if (val & CMD_SET_AE) + limit = 1; + break; + default: + break; + } + } + + if (limit) { + if (FIFO_ENTRIES >= 16) { + thread_reset_event(virge->fifo_not_full_event); + if (FIFO_ENTRIES >= 16) + thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } + } else { + if (FIFO_FULL) { + thread_reset_event(virge->fifo_not_full_event); + if (FIFO_FULL) + thread_wait_event(virge->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } } fifo->val = val; @@ -2190,13 +2211,13 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) { for (y = 0; y < 4; y++) { for (x = 0; x < 8; x++) { if (virge->s3d.mono_pat_0 & (1 << (x + y * 8))) - mono_pattern[y * 8 + x] = virge->s3d.pat_fg_clr; + mono_pattern[y * 8 + (7 - x)] = virge->s3d.pat_fg_clr; else - mono_pattern[y * 8 + x] = virge->s3d.pat_bg_clr; + mono_pattern[y * 8 + (7 - x)] = virge->s3d.pat_bg_clr; if (virge->s3d.mono_pat_1 & (1 << (x + y * 8))) - mono_pattern[(y + 4) * 8 + x] = virge->s3d.pat_fg_clr; + mono_pattern[(y + 4) * 8 + (7 - x)] = virge->s3d.pat_fg_clr; else - mono_pattern[(y + 4) * 8 + x] = virge->s3d.pat_bg_clr; + mono_pattern[(y + 4) * 8 + (7 - x)] = virge->s3d.pat_bg_clr; } } } @@ -3312,7 +3333,7 @@ tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int state->dest_rgba.g = ((state->dest_rgba.g * a) + (s3d_tri->fog_g * (255 - a))) / 255; state->dest_rgba.b = ((state->dest_rgba.b * a) + (s3d_tri->fog_b * (255 - a))) / 255; } - + if (s3d_tri->cmd_set & CMD_SET_ABC_ENABLE) { uint32_t src_col; int src_r = 0; @@ -3375,7 +3396,7 @@ tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int virge->pixel_count++; } } - + tri_skip_line: state->x1 += dx1; state->x2 += dx2; From dc8d237126455a293c8d2302bd732fcd83068c86 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 17 Aug 2024 19:46:29 +0200 Subject: [PATCH 330/624] S3 ViRGE: Force bit 2 of CRTC register 33h to be set when read, fixes Windows 95 GX2 lock-ups. --- src/video/vid_s3_virge.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 24f325c49..286e459e7 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -720,6 +720,9 @@ s3_virge_in(uint16_t addr, void *priv) { case 0x31: ret = (svga->crtc[0x31] & 0xcf) | ((virge->ma_ext & 3) << 4); break; + case 0x33: + ret = (svga->crtc[0x33] | 0x04); + break; case 0x35: ret = (svga->crtc[0x35] & 0xf0) | (virge->bank & 0xf); break; From d3160e21b4686e3df6e9e1c451a0691b4b3e7e5e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 18 Aug 2024 03:39:39 +0200 Subject: [PATCH 331/624] Reverted an unnecessary change in floppy/fdc.c fixes #4727. --- src/floppy/fdc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 3fd492bd2..6baef8ab8 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -1635,6 +1635,8 @@ fdc_callback(void *priv) return; } if (fdd_get_head(real_drive(fdc, fdc->drive)) == 0) { + fdc->sector = 1; + fdc->head |= 1; fdd_set_head(real_drive(fdc, fdc->drive), 1); if (!fdd_is_double_sided(real_drive(fdc, fdc->drive))) { fdc_noidam(fdc); From 04b5a99ae9269994e32163df1ab2e8d3467e43a2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 18 Aug 2024 06:34:04 +0200 Subject: [PATCH 332/624] (S)VGA render: Actually use the DAC mask, fixes #4720. --- src/video/vid_svga_render.c | 250 ++++++++++++++++++------------------ 1 file changed, 125 insertions(+), 125 deletions(-) diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index 74d9a4d0c..c05d308fa 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -178,14 +178,14 @@ svga_render_text_40(svga_t *svga) charaddr = svga->charseta + (chr * 128); if (drawcursor) { - bg = svga->pallook[svga->egapal[attr & 15]]; - fg = svga->pallook[svga->egapal[attr >> 4]]; + bg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask]; + fg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask]; } else { - fg = svga->pallook[svga->egapal[attr & 15]]; - bg = svga->pallook[svga->egapal[attr >> 4]]; + fg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask]; + bg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask]; if (attr & 0x80 && svga->attrregs[0x10] & 8) { - bg = svga->pallook[svga->egapal[(attr >> 4) & 7]]; + bg = svga->pallook[svga->egapal[(attr >> 4) & 7] & svga->dac_mask]; if (svga->blink & 16) fg = bg; } @@ -256,13 +256,13 @@ svga_render_text_80(svga_t *svga) charaddr = svga->charseta + (chr * 128); if (drawcursor) { - bg = svga->pallook[svga->egapal[attr & 15]]; - fg = svga->pallook[svga->egapal[attr >> 4]]; + bg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask]; + fg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask]; } else { - fg = svga->pallook[svga->egapal[attr & 15]]; - bg = svga->pallook[svga->egapal[attr >> 4]]; + fg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask]; + bg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask]; if (attr & 0x80 && svga->attrregs[0x10] & 8) { - bg = svga->pallook[svga->egapal[(attr >> 4) & 7]]; + bg = svga->pallook[svga->egapal[(attr >> 4) & 7] & svga->dac_mask]; if (svga->blink & 16) fg = bg; } @@ -323,13 +323,13 @@ svga_render_text_80_ksc5601(svga_t *svga) attr = svga->vram[addr + 1]; if (drawcursor) { - bg = svga->pallook[svga->egapal[attr & 15]]; - fg = svga->pallook[svga->egapal[attr >> 4]]; + bg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask]; + fg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask]; } else { - fg = svga->pallook[svga->egapal[attr & 15]]; - bg = svga->pallook[svga->egapal[attr >> 4]]; + fg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask]; + bg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask]; if (attr & 0x80 && svga->attrregs[0x10] & 8) { - bg = svga->pallook[svga->egapal[(attr >> 4) & 7]]; + bg = svga->pallook[svga->egapal[(attr >> 4) & 7] & svga->dac_mask]; if (svga->blink & 16) fg = bg; } @@ -378,13 +378,13 @@ svga_render_text_80_ksc5601(svga_t *svga) attr = svga->vram[((svga->ma << 1) + 1) & svga->vram_display_mask]; if (drawcursor) { - bg = svga->pallook[svga->egapal[attr & 15]]; - fg = svga->pallook[svga->egapal[attr >> 4]]; + bg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask]; + fg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask]; } else { - fg = svga->pallook[svga->egapal[attr & 15]]; - bg = svga->pallook[svga->egapal[attr >> 4]]; + fg = svga->pallook[svga->egapal[attr & 15] & svga->dac_mask]; + bg = svga->pallook[svga->egapal[attr >> 4] & svga->dac_mask]; if (attr & 0x80 && svga->attrregs[0x10] & 8) { - bg = svga->pallook[svga->egapal[(attr >> 4) & 7]]; + bg = svga->pallook[svga->egapal[(attr >> 4) & 7] & svga->dac_mask]; if (svga->blink & 16) fg = bg; } @@ -468,14 +468,14 @@ svga_render_2bpp_s3_lowres(svga_t *svga) else svga->ma += 4; svga->ma &= svga->vram_mask; - p[0] = p[1] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]]; - p[2] = p[3] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]]; - p[4] = p[5] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]]; - p[6] = p[7] = svga->pallook[svga->egapal[dat[0] & 3]]; - p[8] = p[9] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]]; - p[10] = p[11] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]]; - p[12] = p[13] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]]; - p[14] = p[15] = svga->pallook[svga->egapal[dat[1] & 3]]; + p[0] = p[1] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3] & svga->dac_mask]; + p[2] = p[3] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3] & svga->dac_mask]; + p[4] = p[5] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3] & svga->dac_mask]; + p[6] = p[7] = svga->pallook[svga->egapal[dat[0] & 3] & svga->dac_mask]; + p[8] = p[9] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3] & svga->dac_mask]; + p[10] = p[11] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3] & svga->dac_mask]; + p[12] = p[13] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3] & svga->dac_mask]; + p[14] = p[15] = svga->pallook[svga->egapal[dat[1] & 3] & svga->dac_mask]; p += 16; } } @@ -501,14 +501,14 @@ svga_render_2bpp_s3_lowres(svga_t *svga) svga->ma &= svga->vram_mask; - p[0] = p[1] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]]; - p[2] = p[3] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]]; - p[4] = p[5] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]]; - p[6] = p[7] = svga->pallook[svga->egapal[dat[0] & 3]]; - p[8] = p[9] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]]; - p[10] = p[11] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]]; - p[12] = p[13] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]]; - p[14] = p[15] = svga->pallook[svga->egapal[dat[1] & 3]]; + p[0] = p[1] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3] & svga->dac_mask]; + p[2] = p[3] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3] & svga->dac_mask]; + p[4] = p[5] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3] & svga->dac_mask]; + p[6] = p[7] = svga->pallook[svga->egapal[dat[0] & 3] & svga->dac_mask]; + p[8] = p[9] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3] & svga->dac_mask]; + p[10] = p[11] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3] & svga->dac_mask]; + p[12] = p[13] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3] & svga->dac_mask]; + p[14] = p[15] = svga->pallook[svga->egapal[dat[1] & 3] & svga->dac_mask]; p += 16; } @@ -566,14 +566,14 @@ svga_render_2bpp_s3_highres(svga_t *svga) else svga->ma += 4; svga->ma &= svga->vram_mask; - p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]]; - p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]]; - p[2] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]]; - p[3] = svga->pallook[svga->egapal[dat[0] & 3]]; - p[4] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]]; - p[5] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]]; - p[6] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]]; - p[7] = svga->pallook[svga->egapal[dat[1] & 3]]; + p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3] & svga->dac_mask]; + p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3] & svga->dac_mask]; + p[2] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3] & svga->dac_mask]; + p[3] = svga->pallook[svga->egapal[dat[0] & 3] & svga->dac_mask]; + p[4] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3] & svga->dac_mask]; + p[5] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3] & svga->dac_mask]; + p[6] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3] & svga->dac_mask]; + p[7] = svga->pallook[svga->egapal[dat[1] & 3] & svga->dac_mask]; p += 8; } } @@ -599,14 +599,14 @@ svga_render_2bpp_s3_highres(svga_t *svga) svga->ma &= svga->vram_mask; - p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3]]; - p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3]]; - p[2] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3]]; - p[3] = svga->pallook[svga->egapal[dat[0] & 3]]; - p[4] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3]]; - p[5] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3]]; - p[6] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3]]; - p[7] = svga->pallook[svga->egapal[dat[1] & 3]]; + p[0] = svga->pallook[svga->egapal[(dat[0] >> 6) & 3] & svga->dac_mask]; + p[1] = svga->pallook[svga->egapal[(dat[0] >> 4) & 3] & svga->dac_mask]; + p[2] = svga->pallook[svga->egapal[(dat[0] >> 2) & 3] & svga->dac_mask]; + p[3] = svga->pallook[svga->egapal[dat[0] & 3] & svga->dac_mask]; + p[4] = svga->pallook[svga->egapal[(dat[1] >> 6) & 3] & svga->dac_mask]; + p[5] = svga->pallook[svga->egapal[(dat[1] >> 4) & 3] & svga->dac_mask]; + p[6] = svga->pallook[svga->egapal[(dat[1] >> 2) & 3] & svga->dac_mask]; + p[7] = svga->pallook[svga->egapal[dat[1] & 3] & svga->dac_mask]; p += 8; } @@ -652,17 +652,17 @@ svga_render_2bpp_headland_highres(svga_t *svga) svga->ma &= svga->vram_mask; dat = edatlookup[edat[0] >> 6][edat[1] >> 6] | (edatlookup[edat[2] >> 6][edat[3] >> 6] << 2); - p[0] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; - p[1] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; + p[0] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask] & svga->dac_mask]; + p[1] = svga->pallook[svga->egapal[dat & svga->plane_mask] & svga->dac_mask]; dat = edatlookup[(edat[0] >> 4) & 3][(edat[1] >> 4) & 3] | (edatlookup[(edat[2] >> 4) & 3][(edat[3] >> 4) & 3] << 2); - p[2] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; - p[3] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; + p[2] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask] & svga->dac_mask]; + p[3] = svga->pallook[svga->egapal[dat & svga->plane_mask] & svga->dac_mask]; dat = edatlookup[(edat[0] >> 2) & 3][(edat[1] >> 2) & 3] | (edatlookup[(edat[2] >> 2) & 3][(edat[3] >> 2) & 3] << 2); - p[4] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; - p[5] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; + p[4] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask] & svga->dac_mask]; + p[5] = svga->pallook[svga->egapal[dat & svga->plane_mask] & svga->dac_mask]; dat = edatlookup[edat[0] & 3][edat[1] & 3] | (edatlookup[edat[2] & 3][edat[3] & 3] << 2); - p[6] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask]]; - p[7] = svga->pallook[svga->egapal[dat & svga->plane_mask]]; + p[6] = svga->pallook[svga->egapal[(dat >> 4) & svga->plane_mask] & svga->dac_mask]; + p[7] = svga->pallook[svga->egapal[dat & svga->plane_mask] & svga->dac_mask]; p += 8; } @@ -868,8 +868,8 @@ svga_render_indexed_gfx(svga_t *svga, bool highres, bool combine8bits) } } else if (combine8bits) { if (svga->packed_4bpp) { - uint32_t p0 = svga->map8[c0]; - uint32_t p1 = svga->map8[c1]; + uint32_t p0 = svga->map8[c0 & svga->dac_mask]; + uint32_t p1 = svga->map8[c1 & svga->dac_mask]; const int outoffs = i << dwshift; for (int subx = 0; subx < dotwidth; subx++) p[outoffs + subx] = p0; @@ -877,14 +877,14 @@ svga_render_indexed_gfx(svga_t *svga, bool highres, bool combine8bits) p[outoffs + subx + dotwidth] = p1; } else { uint32_t ccombined = (c0 << 4) | c1; - uint32_t p0 = svga->map8[ccombined]; + uint32_t p0 = svga->map8[ccombined & svga->dac_mask]; const int outoffs = (i >> 1) << dwshift; for (int subx = 0; subx < dotwidth; subx++) p[outoffs + subx] = p0; } } else { - uint32_t p0 = svga->pallook[svga->egapal[c0]]; - uint32_t p1 = svga->pallook[svga->egapal[c1]]; + uint32_t p0 = svga->pallook[svga->egapal[c0] & svga->dac_mask]; + uint32_t p1 = svga->pallook[svga->egapal[c1] & svga->dac_mask]; const int outoffs = i << dwshift; for (int subx = 0; subx < dotwidth; subx++) p[outoffs + subx] = p0; @@ -934,16 +934,16 @@ svga_render_8bpp_clone_highres(svga_t *svga) for (x = 0; x <= (svga->hdisp /* + svga->scrollcache*/); x += 8) { dat = *(uint32_t *) (&svga->vram[svga->ma & svga->vram_display_mask]); - p[0] = svga->map8[dat & 0xff]; - p[1] = svga->map8[(dat >> 8) & 0xff]; - p[2] = svga->map8[(dat >> 16) & 0xff]; - p[3] = svga->map8[(dat >> 24) & 0xff]; + p[0] = svga->map8[dat & svga->dac_mask & 0xff]; + p[1] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[2] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[3] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; dat = *(uint32_t *) (&svga->vram[(svga->ma + 4) & svga->vram_display_mask]); - p[4] = svga->map8[dat & 0xff]; - p[5] = svga->map8[(dat >> 8) & 0xff]; - p[6] = svga->map8[(dat >> 16) & 0xff]; - p[7] = svga->map8[(dat >> 24) & 0xff]; + p[4] = svga->map8[dat & svga->dac_mask & 0xff]; + p[5] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[6] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[7] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; svga->ma += 8; p += 8; @@ -963,16 +963,16 @@ svga_render_8bpp_clone_highres(svga_t *svga) if (!svga->remap_required) { for (x = 0; x <= (svga->hdisp /* + svga->scrollcache*/); x += 8) { dat = *(uint32_t *) (&svga->vram[svga->ma & svga->vram_display_mask]); - p[0] = svga->map8[dat & 0xff]; - p[1] = svga->map8[(dat >> 8) & 0xff]; - p[2] = svga->map8[(dat >> 16) & 0xff]; - p[3] = svga->map8[(dat >> 24) & 0xff]; + p[0] = svga->map8[dat & svga->dac_mask & 0xff]; + p[1] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[2] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[3] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; dat = *(uint32_t *) (&svga->vram[(svga->ma + 4) & svga->vram_display_mask]); - p[4] = svga->map8[dat & 0xff]; - p[5] = svga->map8[(dat >> 8) & 0xff]; - p[6] = svga->map8[(dat >> 16) & 0xff]; - p[7] = svga->map8[(dat >> 24) & 0xff]; + p[4] = svga->map8[dat & svga->dac_mask & 0xff]; + p[5] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[6] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[7] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; svga->ma += 8; p += 8; @@ -981,10 +981,10 @@ svga_render_8bpp_clone_highres(svga_t *svga) for (x = 0; x <= (svga->hdisp /* + svga->scrollcache*/); x += 4) { addr = svga->remap_func(svga, svga->ma); dat = *(uint32_t *) (&svga->vram[addr & svga->vram_display_mask]); - p[0] = svga->map8[dat & 0xff]; - p[1] = svga->map8[(dat >> 8) & 0xff]; - p[2] = svga->map8[(dat >> 16) & 0xff]; - p[3] = svga->map8[(dat >> 24) & 0xff]; + p[0] = svga->map8[dat & svga->dac_mask & 0xff]; + p[1] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[2] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[3] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; svga->ma += 4; p += 4; @@ -1043,10 +1043,10 @@ svga_render_8bpp_lowres(svga_t *svga) if (!svga->remap_required) { for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += 8) { dat = *(uint32_t *) (&svga->vram[svga->ma & svga->vram_display_mask]); - p[0] = p[1] = svga->map8[dat & 0xff]; - p[2] = p[3] = svga->map8[(dat >> 8) & 0xff]; - p[4] = p[5] = svga->map8[(dat >> 16) & 0xff]; - p[6] = p[7] = svga->map8[(dat >> 24) & 0xff]; + p[0] = p[1] = svga->map8[dat & svga->dac_mask & 0xff]; + p[2] = p[3] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[4] = p[5] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[6] = p[7] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; svga->ma += 4; p += 8; @@ -1055,10 +1055,10 @@ svga_render_8bpp_lowres(svga_t *svga) for (x = 0; x <= (svga->hdisp + svga->scrollcache); x += 8) { addr = svga->remap_func(svga, svga->ma); dat = *(uint32_t *) (&svga->vram[addr & svga->vram_display_mask]); - p[0] = p[1] = svga->map8[dat & 0xff]; - p[2] = p[3] = svga->map8[(dat >> 8) & 0xff]; - p[4] = p[5] = svga->map8[(dat >> 16) & 0xff]; - p[6] = p[7] = svga->map8[(dat >> 24) & 0xff]; + p[0] = p[1] = svga->map8[dat & svga->dac_mask & 0xff]; + p[2] = p[3] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[4] = p[5] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[6] = p[7] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; svga->ma += 4; p += 8; @@ -1091,16 +1091,16 @@ svga_render_8bpp_highres(svga_t *svga) for (x = 0; x <= (svga->hdisp /* + svga->scrollcache*/); x += 8) { dat = *(uint32_t *) (&svga->vram[svga->ma & svga->vram_display_mask]); - p[0] = svga->map8[dat & 0xff]; - p[1] = svga->map8[(dat >> 8) & 0xff]; - p[2] = svga->map8[(dat >> 16) & 0xff]; - p[3] = svga->map8[(dat >> 24) & 0xff]; + p[0] = svga->map8[dat & svga->dac_mask & 0xff]; + p[1] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[2] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[3] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; dat = *(uint32_t *) (&svga->vram[(svga->ma + 4) & svga->vram_display_mask]); - p[4] = svga->map8[dat & 0xff]; - p[5] = svga->map8[(dat >> 8) & 0xff]; - p[6] = svga->map8[(dat >> 16) & 0xff]; - p[7] = svga->map8[(dat >> 24) & 0xff]; + p[4] = svga->map8[dat & svga->dac_mask & 0xff]; + p[5] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[6] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[7] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; svga->ma += 8; p += 8; @@ -1120,16 +1120,16 @@ svga_render_8bpp_highres(svga_t *svga) if (!svga->remap_required) { for (x = 0; x <= (svga->hdisp /* + svga->scrollcache*/); x += 8) { dat = *(uint32_t *) (&svga->vram[svga->ma & svga->vram_display_mask]); - p[0] = svga->map8[dat & 0xff]; - p[1] = svga->map8[(dat >> 8) & 0xff]; - p[2] = svga->map8[(dat >> 16) & 0xff]; - p[3] = svga->map8[(dat >> 24) & 0xff]; + p[0] = svga->map8[dat & svga->dac_mask & 0xff]; + p[1] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[2] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[3] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; dat = *(uint32_t *) (&svga->vram[(svga->ma + 4) & svga->vram_display_mask]); - p[4] = svga->map8[dat & 0xff]; - p[5] = svga->map8[(dat >> 8) & 0xff]; - p[6] = svga->map8[(dat >> 16) & 0xff]; - p[7] = svga->map8[(dat >> 24) & 0xff]; + p[4] = svga->map8[dat & svga->dac_mask & 0xff]; + p[5] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[6] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[7] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; svga->ma += 8; p += 8; @@ -1138,10 +1138,10 @@ svga_render_8bpp_highres(svga_t *svga) for (x = 0; x <= (svga->hdisp /* + svga->scrollcache*/); x += 4) { addr = svga->remap_func(svga, svga->ma); dat = *(uint32_t *) (&svga->vram[addr & svga->vram_display_mask]); - p[0] = svga->map8[dat & 0xff]; - p[1] = svga->map8[(dat >> 8) & 0xff]; - p[2] = svga->map8[(dat >> 16) & 0xff]; - p[3] = svga->map8[(dat >> 24) & 0xff]; + p[0] = svga->map8[dat & svga->dac_mask & 0xff]; + p[1] = svga->map8[(dat >> 8) & svga->dac_mask & 0xff]; + p[2] = svga->map8[(dat >> 16) & svga->dac_mask & 0xff]; + p[3] = svga->map8[(dat >> 24) & svga->dac_mask & 0xff]; svga->ma += 4; p += 4; @@ -1173,19 +1173,19 @@ svga_render_8bpp_tseng_lowres(svga_t *svga) dat = *(uint32_t *) (&svga->vram[svga->ma & svga->vram_display_mask]); if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[0] = p[1] = svga->map8[dat & 0xff]; + p[0] = p[1] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[2] = p[3] = svga->map8[dat & 0xff]; + p[2] = p[3] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[4] = p[5] = svga->map8[dat & 0xff]; + p[4] = p[5] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[6] = p[7] = svga->map8[dat & 0xff]; + p[6] = p[7] = svga->map8[dat & svga->dac_mask & 0xff]; svga->ma += 4; p += 8; @@ -1214,36 +1214,36 @@ svga_render_8bpp_tseng_highres(svga_t *svga) dat = *(uint32_t *) (&svga->vram[svga->ma & svga->vram_display_mask]); if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[0] = svga->map8[dat & 0xff]; + p[0] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[1] = svga->map8[dat & 0xff]; + p[1] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[2] = svga->map8[dat & 0xff]; + p[2] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[3] = svga->map8[dat & 0xff]; + p[3] = svga->map8[dat & svga->dac_mask & 0xff]; dat = *(uint32_t *) (&svga->vram[(svga->ma + 4) & svga->vram_display_mask]); if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[4] = svga->map8[dat & 0xff]; + p[4] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[5] = svga->map8[dat & 0xff]; + p[5] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[6] = svga->map8[dat & 0xff]; + p[6] = svga->map8[dat & svga->dac_mask & 0xff]; dat >>= 8; if (svga->attrregs[0x10] & 0x80) dat = (dat & ~0xf0) | ((svga->attrregs[0x14] & 0x0f) << 4); - p[7] = svga->map8[dat & 0xff]; + p[7] = svga->map8[dat & svga->dac_mask & 0xff]; svga->ma += 8; p += 8; From 882aabf95d198b3df2fc781aa0b1f6b5b38b9f91 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 18 Aug 2024 20:35:47 +0200 Subject: [PATCH 333/624] Diamond S3 86c911: Use the correct clock chip, fixes #4730. --- src/video/vid_s3.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index d2b5a87fe..8a9bedf02 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -9930,8 +9930,14 @@ s3_init(const device_t *info) s3->width = 1024; svga->ramdac = device_add(&sc11483_ramdac_device); - svga->clock_gen = device_add(&av9194_device); - svga->getclock = av9194_getclock; + if (s3->card_type == S3_ORCHID_86C911) { + svga->clock_gen = device_add(&av9194_device); + svga->getclock = av9194_getclock; + } else { + /* DCS2824-0 = Diamond ICD2061A-compatible. */ + svga->clock_gen = device_add(&icd2061_device); + svga->getclock = icd2061_getclock; + } break; case S3_AMI_86C924: From aebaabb6b8e78beedd3b8210113183a9141fde98 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 20 Aug 2024 15:45:56 +0200 Subject: [PATCH 334/624] ViRGE changes of the day (August 20th, 2024) 1. ROM updated to 1.03. 2. Re-apply more fixes that were missed during the restructuring to be on par with PCem's speed. 3. Implemented Command DMA bus mastering required by Diamond Stealth 3D specific drivers (especially the GX2-based 4000). 4. Some indentation fixes. --- src/video/vid_s3_virge.c | 1079 ++++++++++++++++++++------------------ 1 file changed, 561 insertions(+), 518 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 286e459e7..d0831ff4a 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -67,7 +67,7 @@ static int dither[4][4] = { #define ROM_DIAMOND_STEALTH3D_2000PRO "roms/video/s3virge/virgedxdiamond.vbi" #define ROM_VIRGE_GX "roms/video/s3virge/86c375_4.bin" #define ROM_VIRGE_GX2 "roms/video/s3virge/flagpoint.VBI" -#define ROM_DIAMOND_STEALTH3D_4000 "roms/video/s3virge/86c357.bin" +#define ROM_DIAMOND_STEALTH3D_4000 "roms/video/s3virge/DS3D4K v1.03 Brightness bug fix.bin" #define ROM_TRIO3D2X "roms/video/s3virge/TRIO3D2X_8mbsdr.VBI" #define RB_SIZE 256 @@ -286,9 +286,9 @@ typedef struct virge_t { s3d_t s3d_tri; s3d_t s3d_buffer[RB_SIZE]; - int s3d_read_idx; - int s3d_write_idx; - int s3d_busy; + atomic_int s3d_read_idx; + atomic_int s3d_write_idx; + atomic_int s3d_busy; struct { uint32_t pri_ctrl; @@ -328,15 +328,14 @@ typedef struct virge_t { } streams; fifo_entry_t fifo[FIFO_SIZE]; - volatile int fifo_read_idx, fifo_write_idx; - - volatile int fifo_thread_run, render_thread_run; + atomic_int fifo_read_idx, fifo_write_idx; + atomic_int fifo_thread_run, render_thread_run; thread_t * fifo_thread; event_t *wake_fifo_thread; event_t * fifo_not_full_event; - int virge_busy; + atomic_int virge_busy; uint8_t subsys_stat; uint8_t subsys_cntl; @@ -361,7 +360,16 @@ typedef struct virge_t { uint8_t cmd_dma; uint32_t cmd_dma_base; - uint32_t dma_ptr; + uint32_t cmd_dma_buf_size; + uint32_t cmd_dma_buf_size_mask; + uint32_t cmd_base_addr; + uint32_t cmd_dma_write_ptr_reg; + uint32_t cmd_dma_write_ptr_update; + uint32_t cmd_dma_read_ptr_reg; + uint32_t dma_val; + uint32_t dma_dbl_words; + uint32_t dma_mmio_addr; + uint32_t dma_data_type; int pci; int is_agp; @@ -394,6 +402,8 @@ static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv); static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv); static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv); +static void s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type); + enum { CMD_SET_AE = 1, CMD_SET_HC = (1 << 1), @@ -440,6 +450,8 @@ enum { #define INT_S3D_DONE (1 << 1) #define INT_FIFO_OVF (1 << 2) #define INT_FIFO_EMP (1 << 3) +#define INT_HOST_DONE (1 << 4) +#define INT_CMD_DONE (1 << 5) #define INT_3DF_EMP (1 << 6) #define INT_MASK 0xff @@ -726,9 +738,6 @@ s3_virge_in(uint16_t addr, void *priv) { case 0x35: ret = (svga->crtc[0x35] & 0xf0) | (virge->bank & 0xf); break; - case 0x36: - ret = (svga->crtc[0x36] & 0xfc) | 2; - break; /*PCI bus*/ case 0x45: virge->hwc_col_stack_pos = 0; ret = svga->crtc[0x45]; @@ -783,7 +792,8 @@ s3_virge_in(uint16_t addr, void *priv) { } static void -s3_virge_recalctimings(svga_t *svga) { +s3_virge_recalctimings(svga_t *svga) +{ virge_t *virge = (virge_t *) svga->priv; svga->hdisp = svga->hdisp_old; @@ -855,7 +865,7 @@ s3_virge_recalctimings(svga_t *svga) { video_force_resize_set_monitor(1, svga->monitor_index); } - if ((svga->crtc[0x67] & 0xc) != 0xc) { /*VGA mode*/ + if (((svga->crtc[0x67] & 0xc) != 0xc) || (virge->chip >= S3_VIRGEGX2)) { /*VGA mode*/ svga->ma_latch |= (virge->ma_ext << 16); if (svga->crtc[0x51] & 0x30) svga->rowoffset |= (svga->crtc[0x51] & 0x30) << 4; @@ -892,8 +902,8 @@ s3_virge_recalctimings(svga_t *svga) { svga->render = svga_render_32bpp_highres; break; - default: - break; + default: + break; } svga->vram_display_mask = (!(svga->crtc[0x31] & 0x08) && @@ -1035,7 +1045,7 @@ s3_virge_updatemapping(virge_t *virge) { virge->linear_base = (svga->crtc[0x5a] << 16) | (svga->crtc[0x59] << 24); if ((svga->crtc[0x58] & 0x10) || (virge->advfunc_cntl & 0x10)) { /*Linear framebuffer*/ - switch (svga->crtc[0x58] & 3) { + switch (svga->crtc[0x58] & 7) { case 0: /*64k*/ virge->linear_size = 0x10000; break; @@ -1104,7 +1114,8 @@ s3_virge_wait_fifo_idle(virge_t *virge) { } static uint8_t -s3_virge_mmio_read(uint32_t addr, void *priv) { +s3_virge_mmio_read(uint32_t addr, void *priv) +{ virge_t *virge = (virge_t *) priv; uint8_t ret; @@ -1121,6 +1132,7 @@ s3_virge_mmio_read(uint32_t addr, void *priv) { ret |= 0x10; else ret |= 0x30; + if (!virge->virge_busy) wake_fifo_thread(virge); return ret; @@ -1153,7 +1165,8 @@ s3_virge_mmio_read(uint32_t addr, void *priv) { } static uint16_t -s3_virge_mmio_read_w(uint32_t addr, void *priv) { +s3_virge_mmio_read_w(uint32_t addr, void *priv) +{ virge_t *virge = (virge_t *) priv; uint16_t ret; @@ -1187,7 +1200,6 @@ s3_virge_mmio_read_w(uint32_t addr, void *priv) { static uint32_t s3_virge_mmio_read_l(uint32_t addr, void *priv) { virge_t *virge = (virge_t *) priv; - svga_t *svga = &virge->svga; uint32_t ret = 0xffffffff; switch (addr & 0xfffc) { @@ -1208,46 +1220,30 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) { break; case 0x81a0: ret = virge->streams.blend_ctrl; - svga_recalctimings(svga); break; case 0x81c0: ret = virge->streams.pri_fb0; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; break; case 0x81c4: ret = virge->streams.pri_fb1; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; break; case 0x81c8: ret = virge->streams.pri_stride; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; break; case 0x81cc: ret = virge->streams.buffer_ctrl; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; break; case 0x81d0: ret = virge->streams.sec_fb0; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; break; case 0x81d4: ret = virge->streams.sec_fb1; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; break; case 0x81d8: ret = virge->streams.sec_stride; - s3_virge_update_buffer(virge); - svga->fullchange = changeframecount; break; case 0x81dc: ret = virge->streams.overlay_ctrl; - svga->fullchange = changeframecount; break; case 0x81e0: ret = virge->streams.k1_vert_scale; @@ -1280,6 +1276,7 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) { ret |= 0x00001000; else ret |= 0x00003000; + ret |= virge->subsys_stat; if (!virge->virge_busy) wake_fifo_thread(virge); @@ -1294,12 +1291,15 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) { ret = virge->cmd_dma_base; break; case 0x8594: + ret = virge->cmd_dma_write_ptr_reg; break; case 0x8598: - ret = virge->dma_ptr; + ret = virge->cmd_dma_read_ptr_reg; + if (ret > virge->cmd_dma_write_ptr_reg) + ret = virge->cmd_dma_write_ptr_reg; break; case 0x859c: - ret = virge->cmd_dma; + ret = 0; /*To prevent DMA overflows.*/ break; case 0xa4d4: @@ -1426,13 +1426,322 @@ s3_virge_mmio_read_l(uint32_t addr, void *priv) { default: ret = s3_virge_mmio_read_w(addr, priv) | (s3_virge_mmio_read_w(addr + 2, priv) << 16); + break; } + //pclog("MMIO ReadL=%04x, ret=%08x.\n", addr & 0xfffc, ret); return ret; } static void -fifo_thread(void *param) { +s3_virge_mmio_write_fifo_l(virge_t *virge, uint32_t addr, uint32_t val) +{ + switch (addr) { + case 0xa000 ... 0xa1fc: + { + int x = addr & 4; + int y = (addr >> 3) & 7; + int color; + int byte; + uint32_t newaddr = addr; + virge->s3d.pattern_8[y * 8 + x] = val & 0xff; + virge->s3d.pattern_8[y * 8 + x + 1] = val >> 8; + virge->s3d.pattern_8[y * 8 + x + 2] = val >> 16; + virge->s3d.pattern_8[y * 8 + x + 3] = val >> 24; + + x = (addr >> 1) & 6; + y = (addr >> 4) & 7; + virge->s3d.pattern_16[y * 8 + x] = val & 0xffff; + virge->s3d.pattern_16[y * 8 + x + 1] = val >> 16; + + newaddr &= 0x00ff; + for (uint8_t xx = 0; xx < 4; xx++) { + x = ((newaddr + xx) / 3) % 8; + y = ((newaddr + xx) / 24) % 8; + color = ((newaddr + xx) % 3) << 3; + byte = (xx << 3); + virge->s3d.pattern_24[y * 8 + x] &= ~(0xff << color); + virge->s3d.pattern_24[y * 8 + x] |= ((val >> byte) & 0xff) << color; + } + + x = (addr >> 2) & 7; + y = (addr >> 5) & 7; + virge->s3d.pattern_32[y * 8 + x] = val & 0xffffff; + } break; + + case 0xa4d4: + case 0xa8d4: + case 0xacd4: + virge->s3d.src_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xa4d8: + case 0xa8d8: + case 0xacd8: + virge->s3d.dest_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xa4dc: + case 0xa8dc: + case 0xacdc: + virge->s3d.clip_l = (val >> 16) & 0x7ff; + virge->s3d.clip_r = val & 0x7ff; + break; + case 0xa4e0: + case 0xa8e0: + case 0xace0: + virge->s3d.clip_t = (val >> 16) & 0x7ff; + virge->s3d.clip_b = val & 0x7ff; + break; + case 0xa4e4: + case 0xa8e4: + case 0xace4: + virge->s3d.dest_str = (val >> 16) & 0xff8; + virge->s3d.src_str = val & 0xff8; + break; + case 0xa4e8: + case 0xace8: + virge->s3d.mono_pat_0 = val; + break; + case 0xa4ec: + case 0xacec: + virge->s3d.mono_pat_1 = val; + break; + case 0xa4f0: + case 0xacf0: + virge->s3d.pat_bg_clr = val; + break; + case 0xa4f4: + case 0xa8f4: + case 0xacf4: + virge->s3d.pat_fg_clr = val; + break; + case 0xa4f8: + virge->s3d.src_bg_clr = val; + break; + case 0xa4fc: + virge->s3d.src_fg_clr = val; + break; + case 0xa500: + case 0xa900: + case 0xad00: + virge->s3d.cmd_set = val; + if (!(val & CMD_SET_AE)) + s3_virge_bitblt(virge, -1, 0); + break; + case 0xa504: + virge->s3d.r_width = (val >> 16) & 0x7ff; + virge->s3d.r_height = val & 0x7ff; + break; + case 0xa508: + virge->s3d.rsrc_x = (val >> 16) & 0x7ff; + virge->s3d.rsrc_y = val & 0x7ff; + break; + case 0xa50c: + virge->s3d.rdest_x = (val >> 16) & 0x7ff; + virge->s3d.rdest_y = val & 0x7ff; + if (virge->s3d.cmd_set & CMD_SET_AE) + s3_virge_bitblt(virge, -1, 0); + break; + case 0xa96c: + virge->s3d.lxend0 = (val >> 16) & 0x7ff; + virge->s3d.lxend1 = val & 0x7ff; + break; + case 0xa970: + virge->s3d.ldx = (int32_t)val; + break; + case 0xa974: + virge->s3d.lxstart = val; + break; + case 0xa978: + virge->s3d.lystart = val & 0x7ff; + break; + case 0xa97c: + virge->s3d.lycnt = val & 0x7ff; + virge->s3d.line_dir = val >> 31; + if (virge->s3d.cmd_set & CMD_SET_AE) + s3_virge_bitblt(virge, -1, 0); + break; + + case 0xad68: + virge->s3d.prdx = val; + break; + case 0xad6c: + virge->s3d.prxstart = val; + break; + case 0xad70: + virge->s3d.pldx = val; + break; + case 0xad74: + virge->s3d.plxstart = val; + break; + case 0xad78: + virge->s3d.pystart = val & 0x7ff; + break; + case 0xad7c: + virge->s3d.pycnt = val & 0x300007ff; + if (virge->s3d.cmd_set & CMD_SET_AE) + s3_virge_bitblt(virge, -1, 0); + break; + + case 0xb0d4: + case 0xb4d4: + virge->s3d_tri.z_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xb0d8: + case 0xb4d8: + virge->s3d_tri.dest_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xb0dc: + case 0xb4dc: + virge->s3d_tri.clip_l = (val >> 16) & 0x7ff; + virge->s3d_tri.clip_r = val & 0x7ff; + break; + case 0xb0e0: + case 0xb4e0: + virge->s3d_tri.clip_t = (val >> 16) & 0x7ff; + virge->s3d_tri.clip_b = val & 0x7ff; + break; + case 0xb0e4: + case 0xb4e4: + virge->s3d_tri.dest_str = (val >> 16) & 0xff8; + virge->s3d.src_str = val & 0xff8; + break; + case 0xb0e8: + case 0xb4e8: + virge->s3d_tri.z_str = val & 0xff8; + break; + case 0xb4ec: + virge->s3d_tri.tex_base = val & ((virge->memory_size == 8) ? + (val & 0x7ffff8) : (val & 0x3ffff8)); + break; + case 0xb4f0: + virge->s3d_tri.tex_bdr_clr = val & 0xffffff; + break; + case 0xb0f4: + case 0xb4f4: + virge->s3d_tri.fog_b = val & 0xff; + virge->s3d_tri.fog_g = (val >> 8) & 0xff; + virge->s3d_tri.fog_r = (val >> 16) & 0xff; + break; + case 0xb100: + case 0xb500: + virge->s3d_tri.cmd_set = val; + if (!(val & CMD_SET_AE)) + queue_triangle(virge); + break; + case 0xb504: + virge->s3d_tri.tbv = val & 0xfffff; + break; + case 0xb508: + virge->s3d_tri.tbu = val & 0xfffff; + break; + case 0xb50c: + virge->s3d_tri.TdWdX = val; + break; + case 0xb510: + virge->s3d_tri.TdWdY = val; + break; + case 0xb514: + virge->s3d_tri.tws = val; + break; + case 0xb518: + virge->s3d_tri.TdDdX = val; + break; + case 0xb51c: + virge->s3d_tri.TdVdX = val; + break; + case 0xb520: + virge->s3d_tri.TdUdX = val; + break; + case 0xb524: + virge->s3d_tri.TdDdY = val; + break; + case 0xb528: + virge->s3d_tri.TdVdY = val; + break; + case 0xb52c: + virge->s3d_tri.TdUdY = val; + break; + case 0xb530: + virge->s3d_tri.tds = val; + break; + case 0xb534: + virge->s3d_tri.tvs = val; + break; + case 0xb538: + virge->s3d_tri.tus = val; + break; + case 0xb53c: + virge->s3d_tri.TdGdX = val >> 16; + virge->s3d_tri.TdBdX = val & 0xffff; + break; + case 0xb540: + virge->s3d_tri.TdAdX = val >> 16; + virge->s3d_tri.TdRdX = val & 0xffff; + break; + case 0xb544: + virge->s3d_tri.TdGdY = val >> 16; + virge->s3d_tri.TdBdY = val & 0xffff; + break; + case 0xb548: + virge->s3d_tri.TdAdY = val >> 16; + virge->s3d_tri.TdRdY = val & 0xffff; + break; + case 0xb54c: + virge->s3d_tri.tgs = (val >> 16) & 0xffff; + virge->s3d_tri.tbs = val & 0xffff; + break; + case 0xb550: + virge->s3d_tri.tas = (val >> 16) & 0xffff; + virge->s3d_tri.trs = val & 0xffff; + break; + + case 0xb554: + virge->s3d_tri.TdZdX = val; + break; + case 0xb558: + virge->s3d_tri.TdZdY = val; + break; + case 0xb55c: + virge->s3d_tri.tzs = val; + break; + case 0xb560: + virge->s3d_tri.TdXdY12 = val; + break; + case 0xb564: + virge->s3d_tri.txend12 = val; + break; + case 0xb568: + virge->s3d_tri.TdXdY01 = val; + break; + case 0xb56c: + virge->s3d_tri.txend01 = val; + break; + case 0xb570: + virge->s3d_tri.TdXdY02 = val; + break; + case 0xb574: + virge->s3d_tri.txs = val; + break; + case 0xb578: + virge->s3d_tri.tys = val; + break; + case 0xb57c: + virge->s3d_tri.ty01 = (val >> 16) & 0x7ff; + virge->s3d_tri.ty12 = val & 0x7ff; + virge->s3d_tri.tlr = val >> 31; + if (virge->s3d_tri.cmd_set & CMD_SET_AE) + queue_triangle(virge); + break; + } +} + +static void +fifo_thread(void *param) +{ virge_t *virge = (virge_t *)param; while (virge->fifo_thread_run) { @@ -1448,19 +1757,16 @@ fifo_thread(void *param) { switch (fifo->addr_type & FIFO_TYPE) { case FIFO_WRITE_BYTE: - if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000) + if (((fifo->addr_type & FIFO_ADDR) & 0xffff) < 0x8000) s3_virge_bitblt(virge, 8, val); - else if (((fifo->addr_type & FIFO_ADDR) & 0xffff) == 0x859c) - virge->cmd_dma = val; break; case FIFO_WRITE_WORD: - if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000) { + if (((fifo->addr_type & FIFO_ADDR) & 0xfffe) < 0x8000) { if (virge->s3d.cmd_set & CMD_SET_MS) s3_virge_bitblt(virge, 16, ((val >> 8) | (val << 8)) << 16); else - s3_virge_bitblt(virge, 16, val); - } else if (((fifo->addr_type & FIFO_ADDR) & 0xfffe) == 0x859c) - virge->cmd_dma = val; + s3_virge_bitblt(virge, 16, val); + } break; case FIFO_WRITE_DWORD: if (((fifo->addr_type & FIFO_ADDR) & 0xfffc) < 0x8000) { @@ -1470,324 +1776,8 @@ fifo_thread(void *param) { ((val & 0x0000ff00) << 8) | ((val & 0x000000ff) << 24)); else s3_virge_bitblt(virge, 32, val); - } else { - switch ((fifo->addr_type & FIFO_ADDR) & 0xfffc) { - case 0x8590: - virge->cmd_dma_base = val; - break; - - case 0x8594: - virge->dma_ptr = val; - break; - - case 0x8598: - break; - - case 0x859c: - virge->cmd_dma = val; - break; - - case 0xa000 ... 0xa1fc: - { - int x = (fifo->addr_type & FIFO_ADDR) & 4; - int y = ((fifo->addr_type & FIFO_ADDR) >> 3) & 7; - int color; - int byte; - uint32_t addr = (fifo->addr_type & FIFO_ADDR); - virge->s3d.pattern_8[y * 8 + x] = val & 0xff; - virge->s3d.pattern_8[y * 8 + x + 1] = val >> 8; - virge->s3d.pattern_8[y * 8 + x + 2] = val >> 16; - virge->s3d.pattern_8[y * 8 + x + 3] = val >> 24; - - x = ((fifo->addr_type & FIFO_ADDR) >> 1) & 6; - y = ((fifo->addr_type & FIFO_ADDR) >> 4) & 7; - virge->s3d.pattern_16[y * 8 + x] = val & 0xffff; - virge->s3d.pattern_16[y * 8 + x + 1] = val >> 16; - - addr &= 0x00ff; - for (uint8_t xx = 0; xx < 4; xx++) { - x = ((addr + xx) / 3) % 8; - y = ((addr + xx) / 24) % 8; - color = ((addr + xx) % 3) << 3; - byte = (xx << 3); - virge->s3d.pattern_24[y * 8 + x] &= ~(0xff << color); - virge->s3d.pattern_24[y * 8 + x] |= ((val >> byte) & 0xff) << color; - } - - x = ((fifo->addr_type & FIFO_ADDR) >> 2) & 7; - y = ((fifo->addr_type & FIFO_ADDR) >> 5) & 7; - virge->s3d.pattern_32[y * 8 + x] = val & 0xffffff; - } break; - - case 0xa4d4: - case 0xa8d4: - case 0xacd4: - virge->s3d.src_base = val & ((virge->memory_size == 8) ? - (val & 0x7ffff8) : (val & 0x3ffff8)); - break; - case 0xa4d8: - case 0xa8d8: - case 0xacd8: - virge->s3d.dest_base = val & ((virge->memory_size == 8) ? - (val & 0x7ffff8) : (val & 0x3ffff8)); - break; - case 0xa4dc: - case 0xa8dc: - case 0xacdc: - virge->s3d.clip_l = (val >> 16) & 0x7ff; - virge->s3d.clip_r = val & 0x7ff; - break; - case 0xa4e0: - case 0xa8e0: - case 0xace0: - virge->s3d.clip_t = (val >> 16) & 0x7ff; - virge->s3d.clip_b = val & 0x7ff; - break; - case 0xa4e4: - case 0xa8e4: - case 0xace4: - virge->s3d.dest_str = (val >> 16) & 0xff8; - virge->s3d.src_str = val & 0xff8; - break; - case 0xa4e8: - case 0xace8: - virge->s3d.mono_pat_0 = val; - break; - case 0xa4ec: - case 0xacec: - virge->s3d.mono_pat_1 = val; - break; - case 0xa4f0: - case 0xacf0: - virge->s3d.pat_bg_clr = val; - break; - case 0xa4f4: - case 0xa8f4: - case 0xacf4: - virge->s3d.pat_fg_clr = val; - break; - case 0xa4f8: - virge->s3d.src_bg_clr = val; - break; - case 0xa4fc: - virge->s3d.src_fg_clr = val; - break; - case 0xa500: - case 0xa900: - case 0xad00: - virge->s3d.cmd_set = val; - if (!(val & CMD_SET_AE)) - s3_virge_bitblt(virge, -1, 0); - break; - case 0xa504: - virge->s3d.r_width = (val >> 16) & 0x7ff; - virge->s3d.r_height = val & 0x7ff; - break; - case 0xa508: - virge->s3d.rsrc_x = (val >> 16) & 0x7ff; - virge->s3d.rsrc_y = val & 0x7ff; - break; - case 0xa50c: - virge->s3d.rdest_x = (val >> 16) & 0x7ff; - virge->s3d.rdest_y = val & 0x7ff; - if (virge->s3d.cmd_set & CMD_SET_AE) - s3_virge_bitblt(virge, -1, 0); - break; - case 0xa96c: - virge->s3d.lxend0 = (val >> 16) & 0x7ff; - virge->s3d.lxend1 = val & 0x7ff; - break; - case 0xa970: - virge->s3d.ldx = (int32_t)val; - break; - case 0xa974: - virge->s3d.lxstart = val; - break; - case 0xa978: - virge->s3d.lystart = val & 0x7ff; - break; - case 0xa97c: - virge->s3d.lycnt = val & 0x7ff; - virge->s3d.line_dir = val >> 31; - if (virge->s3d.cmd_set & CMD_SET_AE) - s3_virge_bitblt(virge, -1, 0); - break; - - case 0xad68: - virge->s3d.prdx = val; - break; - case 0xad6c: - virge->s3d.prxstart = val; - break; - case 0xad70: - virge->s3d.pldx = val; - break; - case 0xad74: - virge->s3d.plxstart = val; - break; - case 0xad78: - virge->s3d.pystart = val & 0x7ff; - break; - case 0xad7c: - virge->s3d.pycnt = val & 0x300007ff; - if (virge->s3d.cmd_set & CMD_SET_AE) - s3_virge_bitblt(virge, -1, 0); - break; - - case 0xb0d4: - case 0xb4d4: - virge->s3d_tri.z_base = val & ((virge->memory_size == 8) ? - (val & 0x7ffff8) : (val & 0x3ffff8)); - break; - case 0xb0d8: - case 0xb4d8: - virge->s3d_tri.dest_base = val & ((virge->memory_size == 8) ? - (val & 0x7ffff8) : (val & 0x3ffff8)); - break; - case 0xb0dc: - case 0xb4dc: - virge->s3d_tri.clip_l = (val >> 16) & 0x7ff; - virge->s3d_tri.clip_r = val & 0x7ff; - break; - case 0xb0e0: - case 0xb4e0: - virge->s3d_tri.clip_t = (val >> 16) & 0x7ff; - virge->s3d_tri.clip_b = val & 0x7ff; - break; - case 0xb0e4: - case 0xb4e4: - virge->s3d_tri.dest_str = (val >> 16) & 0xff8; - virge->s3d.src_str = val & 0xff8; - break; - case 0xb0e8: - case 0xb4e8: - virge->s3d_tri.z_str = val & 0xff8; - break; - case 0xb4ec: - virge->s3d_tri.tex_base = val & ((virge->memory_size == 8) ? - (val & 0x7ffff8) : (val & 0x3ffff8)); - break; - case 0xb4f0: - virge->s3d_tri.tex_bdr_clr = val & 0xffffff; - break; - case 0xb0f4: - case 0xb4f4: - virge->s3d_tri.fog_b = val & 0xff; - virge->s3d_tri.fog_g = (val >> 8) & 0xff; - virge->s3d_tri.fog_r = (val >> 16) & 0xff; - break; - case 0xb100: - case 0xb500: - virge->s3d_tri.cmd_set = val; - if (!(val & CMD_SET_AE)) - queue_triangle(virge); - break; - case 0xb504: - virge->s3d_tri.tbv = val & 0xfffff; - break; - case 0xb508: - virge->s3d_tri.tbu = val & 0xfffff; - break; - case 0xb50c: - virge->s3d_tri.TdWdX = val; - break; - case 0xb510: - virge->s3d_tri.TdWdY = val; - break; - case 0xb514: - virge->s3d_tri.tws = val; - break; - case 0xb518: - virge->s3d_tri.TdDdX = val; - break; - case 0xb51c: - virge->s3d_tri.TdVdX = val; - break; - case 0xb520: - virge->s3d_tri.TdUdX = val; - break; - case 0xb524: - virge->s3d_tri.TdDdY = val; - break; - case 0xb528: - virge->s3d_tri.TdVdY = val; - break; - case 0xb52c: - virge->s3d_tri.TdUdY = val; - break; - case 0xb530: - virge->s3d_tri.tds = val; - break; - case 0xb534: - virge->s3d_tri.tvs = val; - break; - case 0xb538: - virge->s3d_tri.tus = val; - break; - case 0xb53c: - virge->s3d_tri.TdGdX = val >> 16; - virge->s3d_tri.TdBdX = val & 0xffff; - break; - case 0xb540: - virge->s3d_tri.TdAdX = val >> 16; - virge->s3d_tri.TdRdX = val & 0xffff; - break; - case 0xb544: - virge->s3d_tri.TdGdY = val >> 16; - virge->s3d_tri.TdBdY = val & 0xffff; - break; - case 0xb548: - virge->s3d_tri.TdAdY = val >> 16; - virge->s3d_tri.TdRdY = val & 0xffff; - break; - case 0xb54c: - virge->s3d_tri.tgs = (val >> 16) & 0xffff; - virge->s3d_tri.tbs = val & 0xffff; - break; - case 0xb550: - virge->s3d_tri.tas = (val >> 16) & 0xffff; - virge->s3d_tri.trs = val & 0xffff; - break; - - case 0xb554: - virge->s3d_tri.TdZdX = val; - break; - case 0xb558: - virge->s3d_tri.TdZdY = val; - break; - case 0xb55c: - virge->s3d_tri.tzs = val; - break; - case 0xb560: - virge->s3d_tri.TdXdY12 = val; - break; - case 0xb564: - virge->s3d_tri.txend12 = val; - break; - case 0xb568: - virge->s3d_tri.TdXdY01 = val; - break; - case 0xb56c: - virge->s3d_tri.txend01 = val; - break; - case 0xb570: - virge->s3d_tri.TdXdY02 = val; - break; - case 0xb574: - virge->s3d_tri.txs = val; - break; - case 0xb578: - virge->s3d_tri.tys = val; - break; - case 0xb57c: - virge->s3d_tri.ty01 = (val >> 16) & 0x7ff; - virge->s3d_tri.ty12 = val & 0x7ff; - virge->s3d_tri.tlr = val >> 31; - if (virge->s3d_tri.cmd_set & CMD_SET_AE) - queue_triangle(virge); - break; - } - } + } else + s3_virge_mmio_write_fifo_l(virge, (fifo->addr_type & FIFO_ADDR) & 0xfffc, val); break; } @@ -1802,6 +1792,9 @@ fifo_thread(void *param) { } virge->virge_busy = 0; virge->subsys_stat |= INT_FIFO_EMP | INT_3DF_EMP; + if (virge->cmd_dma) + virge->subsys_stat |= INT_HOST_DONE | INT_CMD_DONE; + s3_virge_update_irqs(virge); } } @@ -1852,7 +1845,7 @@ static void s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) { virge_t *virge = (virge_t *) priv; - if ((addr & 0xfffc) < 0x8000) + if ((addr & 0xffff) < 0x8000) s3_virge_queue(virge, addr, val, FIFO_WRITE_BYTE); else switch (addr & 0xffff) { case 0x83b0 ... 0x83df: @@ -1870,9 +1863,10 @@ static void s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv) { virge_t *virge = (virge_t *) priv; - if ((addr & 0xfffc) < 0x8000) + if ((addr & 0xfffe) < 0x8000) s3_virge_queue(virge, addr, val, FIFO_WRITE_WORD); else switch (addr & 0xfffe) { + default: case 0x83d4: s3_virge_mmio_write(addr, val, priv); s3_virge_mmio_write(addr + 1, val >> 8, priv); @@ -1887,144 +1881,192 @@ s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv) { static void s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { virge_t *virge = (virge_t *) priv; - svga_t * svga = &virge->svga; + svga_t *svga = &virge->svga; if ((addr & 0xfffc) < 0x8000) s3_virge_queue(virge, addr, val, FIFO_WRITE_DWORD); else if ((addr & 0xe000) == 0xa000) s3_virge_queue(virge, addr, val, FIFO_WRITE_DWORD); - else switch (addr & 0xfffc) { - case 0x8180: - virge->streams.pri_ctrl = val; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x8184: - virge->streams.chroma_ctrl = val; - break; - case 0x8190: - virge->streams.sec_ctrl = val; - virge->streams.dda_horiz_accumulator = val & 0xfff; - if (val & (1 << 11)) - virge->streams.dda_horiz_accumulator |= 0xfffff800; - virge->streams.sdif = (val >> 24) & 7; - break; - case 0x8194: - virge->streams.chroma_upper_bound = val; - break; - case 0x8198: - virge->streams.sec_filter = val; - virge->streams.k1_horiz_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k1_horiz_scale |= 0xfffff800; - virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; - if ((val >> 16) & (1 << 10)) - virge->streams.k2_horiz_scale |= 0xfffff800; - break; - case 0x81a0: - virge->streams.blend_ctrl = val; - break; - case 0x81c0: - virge->streams.pri_fb0 = val & ((virge->memory_size == 8) ? - (val & 0x7fffff) : (val & 0x3fffff)); - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81c4: - virge->streams.pri_fb1 = ((virge->memory_size == 8) ? - (val & 0x7fffff) : (val & 0x3fffff)); - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81c8: - virge->streams.pri_stride = val & 0xfff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81cc: - virge->streams.buffer_ctrl = val; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81d0: - virge->streams.sec_fb0 = val; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81d4: - virge->streams.sec_fb1 = val; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81d8: - virge->streams.sec_stride = val; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81dc: - virge->streams.overlay_ctrl = val; - break; - case 0x81e0: - virge->streams.k1_vert_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k1_vert_scale |= 0xfffff800; - break; - case 0x81e4: - virge->streams.k2_vert_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k2_vert_scale |= 0xfffff800; - break; - case 0x81e8: - virge->streams.dda_vert_accumulator = val & 0xfff; - if (val & (1 << 11)) - virge->streams.dda_vert_accumulator |= 0xfffff800; - break; - case 0x81ec: - virge->streams.fifo_ctrl = val; - break; - case 0x81f0: - virge->streams.pri_start = val; - virge->streams.pri_x = (val >> 16) & 0x7ff; - virge->streams.pri_y = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81f4: - virge->streams.pri_size = val; - virge->streams.pri_w = (val >> 16) & 0x7ff; - virge->streams.pri_h = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81f8: - virge->streams.sec_start = val; - virge->streams.sec_x = (val >> 16) & 0x7ff; - virge->streams.sec_y = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; - case 0x81fc: - virge->streams.sec_size = val; - virge->streams.sec_w = (val >> 16) & 0x7ff; - virge->streams.sec_h = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = changeframecount; - break; + else { + switch (addr & 0xfffc) { + case 0x8180: + virge->streams.pri_ctrl = val; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x8184: + virge->streams.chroma_ctrl = val; + break; + case 0x8190: + virge->streams.sec_ctrl = val; + virge->streams.dda_horiz_accumulator = val & 0xfff; + if (val & (1 << 11)) + virge->streams.dda_horiz_accumulator |= 0xfffff800; + virge->streams.sdif = (val >> 24) & 7; + break; + case 0x8194: + virge->streams.chroma_upper_bound = val; + break; + case 0x8198: + virge->streams.sec_filter = val; + virge->streams.k1_horiz_scale = val & 0x7ff; + if (val & (1 << 10)) + virge->streams.k1_horiz_scale |= 0xfffff800; + virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; + if ((val >> 16) & (1 << 10)) + virge->streams.k2_horiz_scale |= 0xfffff800; + break; + case 0x81a0: + virge->streams.blend_ctrl = val; + break; + case 0x81c0: + virge->streams.pri_fb0 = val & ((virge->memory_size == 8) ? + (val & 0x7fffff) : (val & 0x3fffff)); + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; + break; + case 0x81c4: + virge->streams.pri_fb1 = ((virge->memory_size == 8) ? + (val & 0x7fffff) : (val & 0x3fffff)); + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; + break; + case 0x81c8: + virge->streams.pri_stride = val & 0xfff; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; + break; + case 0x81cc: + virge->streams.buffer_ctrl = val; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; + break; + case 0x81d0: + virge->streams.sec_fb0 = val; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; + break; + case 0x81d4: + virge->streams.sec_fb1 = val; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; + break; + case 0x81d8: + virge->streams.sec_stride = val; + s3_virge_update_buffer(virge); + svga->fullchange = changeframecount; + break; + case 0x81dc: + virge->streams.overlay_ctrl = val; + break; + case 0x81e0: + virge->streams.k1_vert_scale = val & 0x7ff; + if (val & (1 << 10)) + virge->streams.k1_vert_scale |= 0xfffff800; + break; + case 0x81e4: + virge->streams.k2_vert_scale = val & 0x7ff; + if (val & (1 << 10)) + virge->streams.k2_vert_scale |= 0xfffff800; + break; + case 0x81e8: + virge->streams.dda_vert_accumulator = val & 0xfff; + if (val & (1 << 11)) + virge->streams.dda_vert_accumulator |= 0xfffff800; + break; + case 0x81ec: + virge->streams.fifo_ctrl = val; + break; + case 0x81f0: + virge->streams.pri_start = val; + virge->streams.pri_x = (val >> 16) & 0x7ff; + virge->streams.pri_y = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81f4: + virge->streams.pri_size = val; + virge->streams.pri_w = (val >> 16) & 0x7ff; + virge->streams.pri_h = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81f8: + virge->streams.sec_start = val; + virge->streams.sec_x = (val >> 16) & 0x7ff; + virge->streams.sec_y = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; + case 0x81fc: + virge->streams.sec_size = val; + virge->streams.sec_w = (val >> 16) & 0x7ff; + virge->streams.sec_h = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = changeframecount; + break; - case 0x8504: - virge->subsys_stat &= ~(val & 0xff); - virge->subsys_cntl = (val >> 8); - s3_virge_update_irqs(virge); - break; + case 0x8504: + virge->subsys_stat &= ~(val & 0xff); + virge->subsys_cntl = (val >> 8); + s3_virge_update_irqs(virge); + break; - case 0x850c: - virge->advfunc_cntl = val & 0xff; - s3_virge_updatemapping(virge); - break; + case 0x850c: + virge->advfunc_cntl = val & 0xff; + s3_virge_updatemapping(virge); + break; - case 0xff20: - s3_virge_mmio_write(addr, val, priv); - break; + case 0x8590: + virge->cmd_dma_base = val; + virge->cmd_dma_buf_size = (val & 2) ? 0x10000 : 0x1000; + virge->cmd_dma_buf_size_mask = virge->cmd_dma_buf_size - 1; + virge->cmd_base_addr = (val & 2) ? (val & 0xffff0000) : (val & 0xfffff000); + break; + + case 0x8594: + virge->cmd_dma_write_ptr_update = val & (1 << 16); + if (virge->cmd_dma_write_ptr_update) { + virge->cmd_dma_write_ptr_reg = (virge->cmd_dma_buf_size == 0x10000) ? (val & 0xffff) : (val & 0xfff); + virge->dma_dbl_words = 0; + virge->dma_data_type = 0; + virge->dma_val = 0; + if (virge->cmd_dma) { + while (virge->cmd_dma_read_ptr_reg != virge->cmd_dma_write_ptr_reg) { + virge->cmd_dma_write_ptr_update = 0; + dma_bm_read(virge->cmd_base_addr + virge->cmd_dma_read_ptr_reg, (uint8_t *)&virge->dma_val, 4, 4); + if (!virge->dma_dbl_words) { + virge->dma_dbl_words = (virge->dma_val & 0xffff); + virge->dma_data_type = !!(virge->dma_val & (1 << 31)); + if (virge->dma_data_type) + virge->dma_mmio_addr = 0; + else + virge->dma_mmio_addr = ((virge->dma_val >> 16) << 2) & 0xfffc; + } else { + s3_virge_mmio_write_l(virge->dma_mmio_addr, virge->dma_val, virge); + virge->dma_dbl_words--; + virge->dma_mmio_addr = (virge->dma_mmio_addr + 4) & 0xfffc; + } + virge->cmd_dma_read_ptr_reg = (virge->cmd_dma_read_ptr_reg + 4) & (virge->cmd_dma_buf_size_mask - 3); + } + } + } + break; + + case 0x8598: + virge->cmd_dma_read_ptr_reg = (virge->cmd_dma_buf_size == 0x10000) ? (val & 0xffff) : (val & 0xfff); + break; + + case 0x859c: + virge->cmd_dma = val & 1; + virge->cmd_dma_write_ptr_reg = 0; + virge->cmd_dma_read_ptr_reg = 0; + break; + + case 0xff20: + s3_virge_mmio_write(addr, val, priv); + break; + } } } @@ -2032,22 +2074,22 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { do { \ switch (bpp) { \ case 0: /*8 bpp*/ \ - val = vram[addr & svga->vram_mask]; \ + val = vram[addr & virge->vram_mask]; \ break; \ case 1: /*16 bpp*/ \ - val = *(uint16_t *)&vram[addr & svga->vram_mask]; \ + val = *(uint16_t *)&vram[addr & virge->vram_mask]; \ break; \ case 2: /*24 bpp*/ \ - val = (*(uint32_t *)&vram[addr & svga->vram_mask]) & 0xffffff; \ + val = (*(uint32_t *)&vram[addr & virge->vram_mask]) & 0xffffff; \ break; \ } \ } while (0) -#define Z_READ(addr) *(uint16_t *)&vram[addr & svga->vram_mask] +#define Z_READ(addr) *(uint16_t *)&vram[addr & virge->vram_mask] #define Z_WRITE(addr, val) \ if (!(s3d_tri->cmd_set & CMD_SET_ZB_MODE)) \ - *(uint16_t *)&vram[addr & svga->vram_mask] = val + *(uint16_t *)&vram[addr & virge->vram_mask] = val #define CLIP(x, y) \ do { \ @@ -2062,7 +2104,7 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { if ((s3d_tri->cmd_set & CMD_SET_HC) && (x < s3d_tri->clip_l || \ x > s3d_tri->clip_r || y < s3d_tri->clip_t || \ y > s3d_tri->clip_b)) \ - update = 0; \ + update = 0; \ } while (0) #define Z_CLIP(Zzb, Zs) \ @@ -2133,19 +2175,19 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { do { \ switch (bpp) { \ case 0: /*8 bpp*/ \ - vram[addr & svga->vram_mask] = val; \ - virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = \ + vram[addr & virge->vram_mask] = val; \ + virge->svga.changedvram[(addr & virge->vram_mask) >> 12] = \ changeframecount; \ break; \ case 1: /*16 bpp*/ \ - *(uint16_t *)&vram[addr & svga->vram_mask] = val; \ - virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = \ + *(uint16_t *)&vram[addr & virge->vram_mask] = val; \ + virge->svga.changedvram[(addr & virge->vram_mask) >> 12] = \ changeframecount; \ break; \ case 2: /*24 bpp*/ \ - *(uint32_t *)&vram[addr & svga->vram_mask] = (val & 0xffffff) |\ - (vram[(addr + 3) & svga->vram_mask] << 24); \ - virge->svga.changedvram[(addr & svga->vram_mask) >> 12] = \ + *(uint32_t *)&vram[addr & virge->vram_mask] = (val & 0xffffff) |\ + (vram[(addr + 3) & virge->vram_mask] << 24); \ + virge->svga.changedvram[(addr & virge->vram_mask) >> 12] = \ changeframecount; \ break; \ } \ @@ -2153,7 +2195,6 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { static void s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) { - svga_t *svga = &virge->svga; uint8_t *vram = virge->svga.vram; uint32_t mono_pattern[64]; int count_mask; @@ -3185,7 +3226,6 @@ dest_pixel_lit_texture_modulate(s3d_state_t *state) { static void tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int32_t dx2) { - svga_t *svga = &virge->svga; uint8_t *vram = virge->svga.vram; int x_dir = s3d_tri->tlr ? 1 : -1; int use_z = !(s3d_tri->cmd_set & CMD_SET_ZB_MODE); @@ -3305,7 +3345,7 @@ tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int } } - virge->svga.changedvram[(dest_offset & svga->vram_mask) >> 12] = changeframecount; + virge->svga.changedvram[(dest_offset & virge->vram_mask) >> 12] = changeframecount; dest_addr = dest_offset + (x * (bpp + 1)); z_addr = z_offset + (x << 1); @@ -3343,16 +3383,17 @@ tri(virge_t *virge, s3d_t *s3d_tri, s3d_state_t *state, int yc, int32_t dx1, int uint32_t src_g = 0; uint32_t src_b = 0; + switch (bpp) { case 0: /*8 bpp*/ /*Not implemented yet*/ break; case 1: /*16 bpp*/ - src_col = *(uint16_t *)&vram[dest_addr & svga->vram_mask]; + src_col = *(uint16_t *)&vram[dest_addr & virge->vram_mask]; RGB15_TO_24(src_col, src_r, src_g, src_b); break; case 2: /*24 bpp*/ - src_col = (*(uint32_t *)&vram[dest_addr & svga->vram_mask]) & 0xffffff; + src_col = (*(uint32_t *)&vram[dest_addr & virge->vram_mask]) & 0xffffff; RGB24_TO_24(src_col, src_r, src_g, src_b); break; } @@ -3565,7 +3606,8 @@ s3_virge_triangle(virge_t *virge, s3d_t *s3d_tri) { } static void -render_thread(void *param) { +render_thread(void *param) +{ virge_t *virge = (virge_t *)param; while (virge->render_thread_run) { @@ -3576,7 +3618,7 @@ render_thread(void *param) { s3_virge_triangle(virge, &virge->s3d_buffer[virge->s3d_read_idx & RB_MASK]); virge->s3d_read_idx++; - if (RB_ENTRIES == (RB_SIZE - 1)) + if (RB_ENTRIES == RB_MASK) thread_set_event(virge->not_full_event); } virge->s3d_busy = 0; @@ -3586,7 +3628,8 @@ render_thread(void *param) { } static void -queue_triangle(virge_t *virge) { +queue_triangle(virge_t *virge) +{ if (RB_FULL) { thread_reset_event(virge->not_full_event); if (RB_FULL) @@ -4361,7 +4404,7 @@ s3_virge_init(const device_t *info) io_sethandler(0x03c0, 0x0020, s3_virge_in, NULL, NULL, s3_virge_out, NULL, NULL, virge); - virge->pci_regs[PCI_REG_COMMAND] = 3; + virge->pci_regs[PCI_REG_COMMAND] = 7; virge->pci_regs[0x05] = 0; virge->pci_regs[0x06] = 0; virge->pci_regs[0x07] = 2; From 71ff5c8c6326957dfadb3e1d51fb80501dc12670 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 21 Aug 2024 01:33:54 +0200 Subject: [PATCH 335/624] ViRGE: Fixed some warnings that only appear when compiling a debug binary. --- src/video/vid_s3_virge.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index d0831ff4a..5d91d164e 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -2291,7 +2291,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) { uint32_t dest_addr = virge->s3d.dest_base + (virge->s3d.dest_x * x_mul) + (virge->s3d.dest_y * virge->s3d.dest_str); uint32_t source = 0; - uint32_t dest; + uint32_t dest = 0; uint32_t pattern; uint32_t out = 0; int update = 1; @@ -2396,7 +2396,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) { uint32_t dest_addr = virge->s3d.dest_base + (virge->s3d.dest_x * x_mul) + (virge->s3d.dest_y * virge->s3d.dest_str); uint32_t source = 0; - uint32_t dest; + uint32_t dest = 0; uint32_t pattern = virge->s3d.pat_fg_clr; uint32_t out = 0; int update = 1; @@ -2461,7 +2461,7 @@ s3_virge_bitblt(virge_t *virge, int count, uint32_t cpu_dat) { uint32_t dest_addr = virge->s3d.dest_base + (x * x_mul) + (virge->s3d.dest_y * virge->s3d.dest_str); uint32_t source = 0; - uint32_t dest; + uint32_t dest = 0; uint32_t pattern; uint32_t out = 0; int update = 1; @@ -2517,7 +2517,7 @@ skip_line: do { uint32_t dest_addr = virge->s3d.dest_base + (x * x_mul) + (y * virge->s3d.dest_str); uint32_t source = 0; - uint32_t dest; + uint32_t dest = 0; uint32_t pattern; uint32_t out = 0; int update = 1; From 91a34a2b19b52c908e65f8bea01ee3ec838e6a26 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 21 Aug 2024 01:34:40 +0200 Subject: [PATCH 336/624] PCjr: Correctly mask the pallette lookups to only the lower 4 bits in the remaining modes as well. --- src/machine/m_pcjr.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 9ac4ff631..e569dc674 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -443,16 +443,16 @@ vid_poll(void *priv) pcjr->ma++; buffer32->line[l][ef_x] = buffer32->line[l][ef_x + 1] = buffer32->line[l + 1][ef_x] = buffer32->line[l + 1][ef_x + 1] = - pcjr->array[((dat >> 12) & pcjr->array[1]) + 16] + 16; + pcjr->array[((dat >> 12) & pcjr->array[1] & 0x0f) + 16] + 16; buffer32->line[l][ef_x + 2] = buffer32->line[l][ef_x + 3] = buffer32->line[l + 1][ef_x + 2] = buffer32->line[l + 1][ef_x + 3] = - pcjr->array[((dat >> 8) & pcjr->array[1]) + 16] + 16; + pcjr->array[((dat >> 8) & pcjr->array[1] & 0x0f) + 16] + 16; buffer32->line[l][ef_x + 4] = buffer32->line[l][ef_x + 5] = buffer32->line[l + 1][ef_x + 4] = buffer32->line[l + 1][ef_x + 5] = - pcjr->array[((dat >> 4) & pcjr->array[1]) + 16] + 16; + pcjr->array[((dat >> 4) & pcjr->array[1] & 0x0f) + 16] + 16; buffer32->line[l][ef_x + 6] = buffer32->line[l][ef_x + 7] = buffer32->line[l + 1][ef_x + 6] = buffer32->line[l + 1][ef_x + 7] = - pcjr->array[(dat & pcjr->array[1]) + 16] + 16; + pcjr->array[(dat & pcjr->array[1] & 0x0f) + 16] + 16; } break; case 0x12: /*160x200x16*/ @@ -493,7 +493,7 @@ vid_poll(void *priv) chr = (dat >> 7) & 1; chr |= ((dat >> 14) & 2); buffer32->line[l][ef_x + c] = buffer32->line[l + 1][ef_x + c] = - pcjr->array[(chr & pcjr->array[1]) + 16] + 16; + pcjr->array[(chr & pcjr->array[1] & 0x0f) + 16] + 16; dat <<= 1; } } @@ -505,13 +505,13 @@ vid_poll(void *priv) attr = pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron); if (pcjr->array[3] & 4) { - cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16; - cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1]) + 16] + 16; + cols[1] = pcjr->array[((attr & 15) & pcjr->array[1] & 0x0f) + 16] + 16; + cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1] & 0x0f) + 16] + 16; if ((pcjr->blink & 16) && (attr & 0x80) && !drawcursor) cols[1] = cols[0]; } else { - cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16; - cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16] + 16; + cols[1] = pcjr->array[((attr & 15) & pcjr->array[1] & 0x0f) + 16] + 16; + cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1] & 0x0f) + 16] + 16; } if (pcjr->sc & 8) for (uint8_t c = 0; c < 8; c++) @@ -537,13 +537,13 @@ vid_poll(void *priv) attr = pcjr->vram[((pcjr->ma << 1) & mask) + offset + 1]; drawcursor = ((pcjr->ma == ca) && pcjr->con && pcjr->cursoron); if (pcjr->array[3] & 4) { - cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16; - cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1]) + 16] + 16; + cols[1] = pcjr->array[((attr & 15) & pcjr->array[1] & 0x0f) + 16] + 16; + cols[0] = pcjr->array[(((attr >> 4) & 7) & pcjr->array[1] & 0x0f) + 16] + 16; if ((pcjr->blink & 16) && (attr & 0x80) && !drawcursor) cols[1] = cols[0]; } else { - cols[1] = pcjr->array[((attr & 15) & pcjr->array[1]) + 16] + 16; - cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1]) + 16] + 16; + cols[1] = pcjr->array[((attr & 15) & pcjr->array[1] & 0x0f) + 16] + 16; + cols[0] = pcjr->array[((attr >> 4) & pcjr->array[1] & 0x0f) + 16] + 16; } pcjr->ma++; if (pcjr->sc & 8) From e858a4344caabc28a6f2b68d3908d20720fa5480 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 21 Aug 2024 02:11:41 +0200 Subject: [PATCH 337/624] PCjr cartridges: Also reset the CPU on image eject. --- src/device/cartridge.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/device/cartridge.c b/src/device/cartridge.c index edabd3ed0..a40c29c9b 100644 --- a/src/device/cartridge.c +++ b/src/device/cartridge.c @@ -169,6 +169,7 @@ cart_close(int drive) cart_image_close(drive); cart_fns[drive][0] = 0; ui_sb_update_icon_state(SB_CARTRIDGE | drive, 1); + resetx86(); } void From 98eed0b85d08f5fe154a9fbb009d0f1dc89269cf Mon Sep 17 00:00:00 2001 From: "Joakim L. Gilje" Date: Wed, 21 Aug 2024 08:50:48 +0200 Subject: [PATCH 338/624] qt_private_headers are needed for both qt5 and qt6 --- src/qt/CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index 171e0a77c..b3e01c1b9 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -408,7 +408,7 @@ if (UNIX AND NOT APPLE AND NOT HAIKU) target_compile_definitions(ui PRIVATE XKBCOMMON_X11) target_link_libraries(ui PRIVATE X11::xcb PUBLIC PkgConfig::XKBCOMMON_X11) target_sources(ui PRIVATE xkbcommon_x11_keyboard.cpp) - set(QT5_PRIVATE_HEADERS ON) + set(QT_PRIVATE_HEADERS ON) endif() endif() endif() @@ -430,13 +430,13 @@ if (UNIX AND NOT APPLE AND NOT HAIKU) target_sources(ui PRIVATE xkbcommon_wl_keyboard.cpp) endif() target_compile_definitions(ui PRIVATE WAYLAND) - set(QT5_PRIVATE_HEADERS ON) + set(QT_PRIVATE_HEADERS ON) endif() endif() endif() # Add private headers for Qt5 if required. - if (NOT USE_QT6 AND DEFINED QT5_PRIVATE_HEADERS) + if (DEFINED QT_PRIVATE_HEADERS) find_package(Qt${QT_MAJOR}Gui) if (Qt${QT_MAJOR}Gui_FOUND) include_directories(${Qt${QT_MAJOR}Gui_PRIVATE_INCLUDE_DIRS}) From 66902d67fb603fc7ad83cb121c992511881bf2af Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 21 Aug 2024 22:45:18 +0200 Subject: [PATCH 339/624] Mach64 changes of the day (August 21st, 2024) Re-thread the video chip family again but with fixes to avoid desyncs and some cleanups. --- src/video/vid_ati_mach64.c | 229 ++++++++++++++++++++++--------------- 1 file changed, 135 insertions(+), 94 deletions(-) diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index 04d497f28..cda2c65b6 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -248,12 +248,12 @@ typedef struct mach64_t { fifo_entry_t fifo[FIFO_SIZE]; atomic_int fifo_read_idx; atomic_int fifo_write_idx; + atomic_int blitter_busy; thread_t *fifo_thread; event_t *wake_fifo_thread; event_t *fifo_not_full_event; - int blitter_busy; uint64_t blitter_time; uint64_t status_time; @@ -649,9 +649,8 @@ mach64_updatemapping(mach64_t *mach64) static void mach64_update_irqs(mach64_t *mach64) { - if (!mach64->pci) { + if (!mach64->pci) return; - } if ((mach64->crtc_int_cntl & 0xaa0024) & ((mach64->crtc_int_cntl << 1) & 0xaa0024)) pci_set_irq(mach64->pci_slot, PCI_INTA, &mach64->irq_state); @@ -659,7 +658,6 @@ mach64_update_irqs(mach64_t *mach64) pci_clear_irq(mach64->pci_slot, PCI_INTA, &mach64->irq_state); } -#if 0 static __inline void wake_fifo_thread(mach64_t *mach64) { @@ -674,7 +672,6 @@ mach64_wait_fifo_idle(mach64_t *mach64) thread_wait_event(mach64->fifo_not_full_event, 1); } } -#endif #define READ8(addr, var) \ switch ((addr) &3) { \ @@ -1174,7 +1171,6 @@ mach64_accel_write_fifo_l(mach64_t *mach64, uint32_t addr, uint32_t val) } } -#if 0 static void fifo_thread(void *param) { @@ -1222,11 +1218,53 @@ static void mach64_queue(mach64_t *mach64, uint32_t addr, uint32_t val, uint32_t type) { fifo_entry_t *fifo = &mach64->fifo[mach64->fifo_write_idx & FIFO_MASK]; + int limit = 0; - if (FIFO_FULL) { - thread_reset_event(mach64->fifo_not_full_event); + switch (type) { + case FIFO_WRITE_BYTE: + switch (addr & 0x3ff) { + case 0x11b: + limit = 1; + break; + default: + break; + } + break; + case FIFO_WRITE_WORD: + switch (addr & 0x3fe) { + case 0x11a: + limit = 1; + break; + default: + break; + } + break; + case FIFO_WRITE_DWORD: + switch (addr & 0x3fc) { + case 0x118: + limit = 1; + break; + default: + break; + } + break; + default: + break; + } + + if (limit) { + if (FIFO_ENTRIES >= 16) { + thread_reset_event(mach64->fifo_not_full_event); + if (FIFO_ENTRIES >= 16) { + thread_wait_event(mach64->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } + } + } else { if (FIFO_FULL) { - thread_wait_event(mach64->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + thread_reset_event(mach64->fifo_not_full_event); + if (FIFO_FULL) { + thread_wait_event(mach64->fifo_not_full_event, -1); /*Wait for room in ringbuffer*/ + } } } @@ -1238,7 +1276,6 @@ mach64_queue(mach64_t *mach64, uint32_t addr, uint32_t val, uint32_t type) if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8) wake_fifo_thread(mach64); } -#endif void mach64_start_fill(mach64_t *mach64) @@ -2538,26 +2575,26 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x101: case 0x102: case 0x103: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_off_pitch); break; case 0x104: case 0x105: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_y_x); break; case 0x108: case 0x109: case 0x11c: case 0x11d: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr + 2, mach64->dst_y_x); break; case 0x10c: case 0x10d: case 0x10e: case 0x10f: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_y_x); break; case 0x110: @@ -2572,7 +2609,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x11b: case 0x11e: case 0x11f: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_height_width); break; @@ -2580,28 +2617,28 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x121: case 0x122: case 0x123: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_bres_lnth); break; case 0x124: case 0x125: case 0x126: case 0x127: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_bres_err); break; case 0x128: case 0x129: case 0x12a: case 0x12b: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_bres_inc); break; case 0x12c: case 0x12d: case 0x12e: case 0x12f: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_bres_dec); break; @@ -2609,7 +2646,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x131: case 0x132: case 0x133: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_cntl); break; @@ -2617,75 +2654,75 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x181: case 0x182: case 0x183: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_off_pitch); break; case 0x184: case 0x185: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_y_x); break; case 0x188: case 0x189: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr + 2, mach64->src_y_x); break; case 0x18c: case 0x18d: case 0x18e: case 0x18f: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_y_x); break; case 0x190: case 0x191: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr + 2, mach64->src_height1_width1); break; case 0x194: case 0x195: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_height1_width1); break; case 0x198: case 0x199: case 0x19a: case 0x19b: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_height1_width1); break; case 0x19c: case 0x19d: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_y_x_start); break; case 0x1a0: case 0x1a1: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr + 2, mach64->src_y_x_start); break; case 0x1a4: case 0x1a5: case 0x1a6: case 0x1a7: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_y_x_start); break; case 0x1a8: case 0x1a9: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr + 2, mach64->src_height2_width2); break; case 0x1ac: case 0x1ad: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_height2_width2); break; case 0x1b0: case 0x1b1: case 0x1b2: case 0x1b3: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_height2_width2); break; @@ -2693,7 +2730,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x1b5: case 0x1b6: case 0x1b7: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->src_cntl); break; @@ -2701,7 +2738,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x241: case 0x242: case 0x243: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->host_cntl); break; @@ -2709,14 +2746,14 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x281: case 0x282: case 0x283: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->pat_reg0); break; case 0x284: case 0x285: case 0x286: case 0x287: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->pat_reg1); break; @@ -2724,7 +2761,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x289: case 0x28a: case 0x28b: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->pat_cntl); break; @@ -2732,7 +2769,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x2a1: case 0x2a8: case 0x2a9: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->sc_left_right); break; case 0x2a4: @@ -2741,7 +2778,7 @@ mach64_ext_readb(uint32_t addr, void *priv) fallthrough; case 0x2aa: case 0x2ab: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->sc_left_right); break; @@ -2749,7 +2786,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x2ad: case 0x2b4: case 0x2b5: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->sc_top_bottom); break; case 0x2b0: @@ -2758,7 +2795,7 @@ mach64_ext_readb(uint32_t addr, void *priv) fallthrough; case 0x2b6: case 0x2b7: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->sc_top_bottom); break; @@ -2766,14 +2803,14 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x2c1: case 0x2c2: case 0x2c3: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dp_bkgd_clr); break; case 0x2c4: case 0x2c5: case 0x2c6: case 0x2c7: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dp_frgd_clr); break; @@ -2781,7 +2818,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x2c9: case 0x2ca: case 0x2cb: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->write_mask); break; @@ -2789,7 +2826,7 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x2cd: case 0x2ce: case 0x2cf: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->chain_mask); break; @@ -2797,21 +2834,21 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x2d1: case 0x2d2: case 0x2d3: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dp_pix_width); break; case 0x2d4: case 0x2d5: case 0x2d6: case 0x2d7: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dp_mix); break; case 0x2d8: case 0x2d9: case 0x2da: case 0x2db: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dp_src); break; @@ -2819,53 +2856,61 @@ mach64_ext_readb(uint32_t addr, void *priv) case 0x301: case 0x302: case 0x303: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->clr_cmp_clr); break; case 0x304: case 0x305: case 0x306: case 0x307: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->clr_cmp_mask); break; case 0x308: case 0x309: case 0x30a: case 0x30b: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->clr_cmp_cntl); break; case 0x310: case 0x311: + if (!mach64->blitter_busy) + wake_fifo_thread(mach64); + ret = 0; + if (FIFO_FULL) + ret = 0xff; break; case 0x320: case 0x321: case 0x322: case 0x323: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->context_mask); break; case 0x330: case 0x331: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr, mach64->dst_cntl); break; case 0x332: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr - 2, mach64->src_cntl); break; case 0x333: - //mach64_wait_fifo_idle(mach64); + mach64_wait_fifo_idle(mach64); READ8(addr - 3, mach64->pat_cntl); break; case 0x338: - ret = 0; + if (!mach64->blitter_busy) + wake_fifo_thread(mach64); + + ret = FIFO_EMPTY ? 0 : 1; break; default: @@ -2884,7 +2929,7 @@ mach64_ext_readw(uint32_t addr, void *priv) uint16_t ret; if (!(addr & 0x400)) { - mach64_log("nmach64_ext_readw: addr=%04x\n", addr); + mach64_log("mach64_ext_readw: addr=%04x\n", addr); ret = 0xffff; } else switch (addr & 0x3ff) { @@ -3048,9 +3093,9 @@ mach64_ext_writeb(uint32_t addr, uint8_t val, void *priv) break; } - mach64_log("nmach64_ext_writeb: addr=%04x val=%02x\n", addr, val); + mach64_log("mach64_ext_writeb: addr=%04x val=%02x\n", addr, val); } else if (addr & 0x300) { - mach64_accel_write_fifo(mach64, addr & 0x3ff, val); + mach64_queue(mach64, addr & 0x3ff, val, FIFO_WRITE_BYTE); } else { switch (addr & 0x3ff) { case 0x00: @@ -3293,14 +3338,11 @@ mach64_ext_writew(uint32_t addr, uint16_t val, void *priv) mach64_ext_writeb(addr, val, priv); mach64_ext_writeb(addr + 1, val >> 8, priv); } else if (addr & 0x300) { - mach64_accel_write_fifo_w(mach64, addr & 0x3fe, val); - } else - switch (addr & 0x3fe) { - default: - mach64_ext_writeb(addr, val, priv); - mach64_ext_writeb(addr + 1, val >> 8, priv); - break; - } + mach64_queue(mach64, addr & 0x3fe, val, FIFO_WRITE_WORD); + } else { + mach64_ext_writeb(addr, val, priv); + mach64_ext_writeb(addr + 1, val >> 8, priv); + } } void mach64_ext_writel(uint32_t addr, uint32_t val, void *priv) @@ -3314,14 +3356,11 @@ mach64_ext_writel(uint32_t addr, uint32_t val, void *priv) mach64_ext_writew(addr, val, priv); mach64_ext_writew(addr + 2, val >> 16, priv); } else if (addr & 0x300) { - mach64_accel_write_fifo_l(mach64, addr & 0x3fc, val); - } else - switch (addr & 0x3fc) { - default: - mach64_ext_writew(addr, val, priv); - mach64_ext_writew(addr + 2, val >> 16, priv); - break; - } + mach64_queue(mach64, addr & 0x3fc, val, FIFO_WRITE_DWORD); + } else { + mach64_ext_writew(addr, val, priv); + mach64_ext_writew(addr + 2, val >> 16, priv); + } } uint8_t @@ -3527,12 +3566,10 @@ uint16_t mach64_ext_inw(uint16_t port, void *priv) { uint16_t ret; - switch (port) { - default: - ret = mach64_ext_inb(port, priv); - ret |= (mach64_ext_inb(port + 1, priv) << 8); - break; - } + + ret = mach64_ext_inb(port, priv); + ret |= (mach64_ext_inb(port + 1, priv) << 8); + mach64_log("mach64_ext_inw : port %04X ret %04X\n", port, ret); return ret; } @@ -3540,6 +3577,7 @@ uint32_t mach64_ext_inl(uint16_t port, void *priv) { uint32_t ret; + switch (port) { case 0x56ec: ret = mach64_ext_readl(0x400 | 0xb4, priv); @@ -3737,23 +3775,15 @@ void mach64_ext_outw(uint16_t port, uint16_t val, void *priv) { mach64_log("mach64_ext_outw : port %04X val %04X\n", port, val); - switch (port) { - default: - mach64_ext_outb(port, val, priv); - mach64_ext_outb(port + 1, val >> 8, priv); - break; - } + mach64_ext_outb(port, val, priv); + mach64_ext_outb(port + 1, val >> 8, priv); } void mach64_ext_outl(uint16_t port, uint32_t val, void *priv) { mach64_log("mach64_ext_outl : port %04X val %08X\n", port, val); - switch (port) { - default: - mach64_ext_outw(port, val, priv); - mach64_ext_outw(port + 2, val >> 16, priv); - break; - } + mach64_ext_outw(port, val, priv); + mach64_ext_outw(port + 2, val >> 16, priv); } static uint8_t @@ -4546,6 +4576,11 @@ mach64_common_init(const device_t *info) mach64->dst_cntl = 3; + mach64->thread_run = 1; + mach64->wake_fifo_thread = thread_create_event(); + mach64->fifo_not_full_event = thread_create_event(); + mach64->fifo_thread = thread_create(fifo_thread, mach64); + mach64->i2c = i2c_gpio_init("ddc_ati_mach64"); mach64->ddc = ddc_init(i2c_gpio_get_bus(mach64->i2c)); @@ -4640,6 +4675,12 @@ mach64_close(void *priv) { mach64_t *mach64 = (mach64_t *) priv; + mach64->thread_run = 0; + thread_set_event(mach64->wake_fifo_thread); + thread_wait(mach64->fifo_thread); + thread_destroy_event(mach64->fifo_not_full_event); + thread_destroy_event(mach64->wake_fifo_thread); + svga_close(&mach64->svga); ddc_close(mach64->ddc); From 39a6a681a2e24d0df83ac0fe36028ad33f7d993a Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 21 Aug 2024 22:48:02 +0200 Subject: [PATCH 340/624] Update indentation. --- src/video/vid_ati_mach64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index cda2c65b6..d54c09f56 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -1225,7 +1225,7 @@ mach64_queue(mach64_t *mach64, uint32_t addr, uint32_t val, uint32_t type) switch (addr & 0x3ff) { case 0x11b: limit = 1; - break; + break; default: break; } From f9e457f3e80cf2eac6032b234eac13f68c028155 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 22 Aug 2024 04:59:51 +0200 Subject: [PATCH 341/624] Give the AP440FX the original ViRGE instead, fixes #4740. --- src/include/86box/video.h | 1 + src/machine/m_at_socket8.c | 4 ++-- src/machine/machine_table.c | 2 +- src/video/vid_s3_virge.c | 20 +++++++++++++++++--- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/include/86box/video.h b/src/include/86box/video.h index 1037e213f..aee8c4b4d 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -527,6 +527,7 @@ extern const device_t s3_trio64v2_dx_onboard_pci_device; /* S3 ViRGE */ extern const device_t s3_virge_325_pci_device; +extern const device_t s3_virge_325_onboard_pci_device; extern const device_t s3_diamond_stealth_2000_pci_device; extern const device_t s3_diamond_stealth_3000_pci_device; extern const device_t s3_stb_velocity_3d_pci_device; diff --git a/src/machine/m_at_socket8.c b/src/machine/m_at_socket8.c index 8c2688c1a..e6f78f6a2 100644 --- a/src/machine/m_at_socket8.c +++ b/src/machine/m_at_socket8.c @@ -324,10 +324,10 @@ machine_at_ap440fx_init(const machine_t *model) device_add(&intel_flash_bxt_ami_device); if (sound_card_current[0] == SOUND_INTERNAL) - device_add(&cs4236b_device); + device_add(machine_get_snd_device(machine)); if (gfxcard[0] == VID_INTERNAL) - device_add(&s3_virge_375_onboard_pci_device); + device_add(machine_get_vid_device(machine)); return ret; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 9e1ee2205..b482951ef 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13758,7 +13758,7 @@ const machine_t machines[] = { .device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = &s3_virge_375_onboard_pci_device, + .vid_device = &s3_virge_325_onboard_pci_device, .snd_device = &cs4236b_device, .net_device = NULL }, diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 5d91d164e..4bcbaea9e 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -4306,7 +4306,7 @@ s3_virge_reset(void *priv) static void * s3_virge_init(const device_t *info) { - const char *bios_fn; + const char *bios_fn = NULL; virge_t *virge = (virge_t *) calloc(1, sizeof(virge_t)); reset_state = calloc(1, sizeof(virge_t)); @@ -4319,7 +4319,7 @@ s3_virge_init(const device_t *info) virge->onboard = !!(info->local & 0x100); - switch (info->local) { + if (!virge->onboard) switch (info->local) { case S3_VIRGE_325: bios_fn = ROM_VIRGE_325; break; @@ -4333,7 +4333,7 @@ s3_virge_init(const device_t *info) bios_fn = ROM_STB_VELOCITY_3D; break; case S3_VIRGE_DX: - bios_fn = virge->onboard ? NULL : ROM_VIRGE_DX; + bios_fn = ROM_VIRGE_DX; break; case S3_DIAMOND_STEALTH3D_2000PRO: bios_fn = ROM_DIAMOND_STEALTH3D_2000PRO; @@ -4816,6 +4816,20 @@ const device_t s3_virge_325_pci_device = { .config = s3_virge_config }; +const device_t s3_virge_325_onboard_pci_device = { + .name = "S3 ViRGE (325) On-Board PCI", + .internal_name = "virge325_onboard_pci", + .flags = DEVICE_PCI, + .local = S3_VIRGE_325 | 0x100, + .init = s3_virge_init, + .close = s3_virge_close, + .reset = s3_virge_reset, + { .available = NULL }, + .speed_changed = s3_virge_speed_changed, + .force_redraw = s3_virge_force_redraw, + .config = s3_virge_config +}; + const device_t s3_diamond_stealth_2000_pci_device = { .name = "S3 ViRGE (Diamond Stealth 3D 2000) PCI", .internal_name = "stealth3d_2000_pci", From a7cff718920c56782e805a9b097b2d60136e5962 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 22 Aug 2024 13:16:29 -0300 Subject: [PATCH 342/624] OPTi 5x7: Fix out of bounds on register read --- src/chipset/opti5x7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chipset/opti5x7.c b/src/chipset/opti5x7.c index 64adacde4..b31996c85 100644 --- a/src/chipset/opti5x7.c +++ b/src/chipset/opti5x7.c @@ -158,7 +158,7 @@ opti5x7_read(uint16_t addr, void *priv) { const opti5x7_t *dev = (opti5x7_t *) priv; - return (addr == 0x24) ? dev->regs[dev->idx] : 0xff; + return ((addr == 0x24) && (dev->idx < sizeof(dev->regs))) ? dev->regs[dev->idx] : 0xff; } static void From 8d88d187b29f4365ba31529eff1baa7361a54276 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 22 Aug 2024 14:21:36 -0300 Subject: [PATCH 343/624] gdbstub: Work around Win32 threading behavior --- src/gdbstub.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gdbstub.c b/src/gdbstub.c index 900f40dab..2f60a3d16 100644 --- a/src/gdbstub.c +++ b/src/gdbstub.c @@ -1513,6 +1513,7 @@ gdbstub_client_thread(void *priv) case '$': /* packet start */ /* Wait for any existing packets to be processed. */ thread_wait_event(client->processed_event, -1); + thread_set_event(client->processed_event); client->packet_pos = 0; break; @@ -1539,6 +1540,7 @@ gdbstub_client_thread(void *priv) default: /* Wait for any existing packets to be processed, just in case. */ thread_wait_event(client->processed_event, -1); + thread_set_event(client->processed_event); if (client->packet_pos < (sizeof(client->packet) - 1)) { /* Append byte to the packet. */ From d697d9bca1c6385e44b8bd12769864e1e3da22cb Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 22 Aug 2024 14:50:10 -0300 Subject: [PATCH 344/624] OPTi 5x7: Fix another out of bounds on register write --- src/chipset/opti5x7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/chipset/opti5x7.c b/src/chipset/opti5x7.c index b31996c85..494fdee64 100644 --- a/src/chipset/opti5x7.c +++ b/src/chipset/opti5x7.c @@ -35,7 +35,7 @@ typedef struct opti5x7_t { uint8_t idx; uint8_t is_pci; - uint8_t regs[16]; + uint8_t regs[18]; } opti5x7_t; #ifdef ENABLE_OPTI5X7_LOG From 3b47f0590c24abece872965b6f555856cf3fa035 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 22 Aug 2024 15:45:32 -0300 Subject: [PATCH 345/624] gdbstub: Fix another Win32 threading deadlock --- src/gdbstub.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/gdbstub.c b/src/gdbstub.c index 2f60a3d16..42e1fc46d 100644 --- a/src/gdbstub.c +++ b/src/gdbstub.c @@ -1531,6 +1531,7 @@ gdbstub_client_thread(void *priv) case 0x03: /* break */ /* Wait for any existing packets to be processed. */ thread_wait_event(client->processed_event, -1); + thread_set_event(client->processed_event); /* Break immediately. */ gdbstub_log("GDB Stub: Break requested\n"); From 7a965efd907455e8a00924f176b678a8de656e1c Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 23 Aug 2024 06:21:27 +0200 Subject: [PATCH 346/624] Tandy and CGA: Implement the VSync interrupt, fixes Ghostbusters freezing. --- src/machine/m_tandy.c | 2 ++ src/video/vid_cga.c | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index d51209123..56982b3bd 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -27,6 +27,7 @@ #include <86box/86box.h> #include <86box/timer.h> #include <86box/io.h> +#include <86box/pic.h> #include <86box/pit.h> #include <86box/nmi.h> #include <86box/mem.h> @@ -1215,6 +1216,7 @@ vid_poll(void *priv) vid->dispon = 0; vid->displine = 0; vid->vsynctime = 16; + picint(1 << 5); if (vid->crtc[7]) { if (vid->mode & 1) x = (vid->crtc[1] << 3) + 16; diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 2ea07c346..8306edd56 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -28,6 +28,7 @@ #include "cpu.h" #include <86box/io.h> #include <86box/timer.h> +#include <86box/pic.h> #include <86box/pit.h> #include <86box/mem.h> #include <86box/rom.h> @@ -607,6 +608,7 @@ cga_poll(void *priv) cga->cgadispon = 0; cga->displine = 0; cga->vsynctime = 16; + picint(1 << 5); if (cga->crtc[7]) { if (cga->cgamode & 1) x = (cga->crtc[1] << 3) + 16; From 1a961db422bd386535e45ccf172e1cd3d1febb1d Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 23 Aug 2024 07:09:35 +0200 Subject: [PATCH 347/624] CGA: Revert the VSync interrupt since the real CGA did not have that. --- src/video/vid_cga.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 8306edd56..2ea07c346 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -28,7 +28,6 @@ #include "cpu.h" #include <86box/io.h> #include <86box/timer.h> -#include <86box/pic.h> #include <86box/pit.h> #include <86box/mem.h> #include <86box/rom.h> @@ -608,7 +607,6 @@ cga_poll(void *priv) cga->cgadispon = 0; cga->displine = 0; cga->vsynctime = 16; - picint(1 << 5); if (cga->crtc[7]) { if (cga->cgamode & 1) x = (cga->crtc[1] << 3) + 16; From 0d43babac83a9a4e185e17a4880bb33d1d349aec Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 23 Aug 2024 07:14:43 +0200 Subject: [PATCH 348/624] Tandy: Slow down horizontal sync in low resolution modes. --- src/machine/m_tandy.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 56982b3bd..2a7ef2275 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -718,8 +718,13 @@ recalc_timings(tandy_t *dev) double _dispofftime; double disptime; - disptime = vid->crtc[0] + 1; - _dispontime = vid->crtc[1]; + if (vid->mode & 1) { + disptime = vid->crtc[0] + 1; + _dispontime = vid->crtc[1]; + } else { + disptime = (vid->crtc[0] + 1) << 1; + _dispontime = vid->crtc[1] << 1; + } _dispofftime = disptime - _dispontime; _dispontime *= CGACONST; @@ -795,7 +800,10 @@ vid_out(uint16_t addr, uint8_t val, void *priv) break; case 0x03d8: + old = vid->mode; vid->mode = val; + if ((old ^ val) & 0x01) + recalc_timings(dev); if (!dev->is_sl2) update_cga16_color(vid->mode); break; From 2604789e7976140d25e65088bd763938394ad351 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 23 Aug 2024 16:12:37 -0300 Subject: [PATCH 349/624] Fix PCI slots on the ATC6310BXII, fixes #4186 --- src/machine/m_at_slot1.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index a870d4c59..415998364 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -408,11 +408,10 @@ machine_at_atc6310bxii_init(const machine_t *model) pci_init(PCI_CONFIG_TYPE_1); pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); - pci_register_slot(0x0A, PCI_CARD_NORMAL, 1, 2, 3, 4); - pci_register_slot(0x0B, PCI_CARD_NORMAL, 2, 3, 4, 1); - pci_register_slot(0x0C, PCI_CARD_NORMAL, 3, 4, 1, 2); - pci_register_slot(0x0D, PCI_CARD_NORMAL, 4, 1, 2, 3); - pci_register_slot(0x0E, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x08, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x09, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x0A, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 4, 1, 2, 3); pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); device_add(&i440bx_device); device_add(&slc90e66_device); From cdd01eceea9fa63f779187c87b16580c86ab9156 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 24 Aug 2024 04:24:06 +0200 Subject: [PATCH 350/624] QT: Restore RichardG's hard reset workaround. --- src/include/86box/86box.h | 1 + src/qt/qt_main.cpp | 9 +++++++++ src/qt/qt_mainwindow.cpp | 3 +-- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index c91b8d406..7d5709d30 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -153,6 +153,7 @@ extern int enable_discord; /* (C) enable Discord integration */ extern int other_ide_present; /* IDE controllers from non-IDE cards are present */ extern int other_scsi_present; /* SCSI controllers from non-SCSI cards are present */ +extern int hard_reset_pending; extern int fixed_size_x; extern int fixed_size_y; extern int do_auto_pause; /* (C) Auto-pause the emulator on focus loss */ diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index c39007864..a50c53820 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -138,8 +138,17 @@ main_thread_fn() } } else { /* Just so we dont overload the host OS. */ + + /* Trigger a hard reset if one is pending. */ + if (hard_reset_pending) { + hard_reset_pending = 0; + pc_reset_hard_close(); + pc_reset_hard_init(); + } + if (dopause) ack_pause(); + std::this_thread::sleep_for(std::chrono::milliseconds(1)); } } diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 32720c48b..57efc7ce7 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -946,10 +946,9 @@ MainWindow::on_actionSettings_triggered() default: break; case QDialog::Accepted: - pc_reset_hard_close(); settings.save(); config_changed = 2; - pc_reset_hard_init(); + pc_reset_hard(); break; case QDialog::Rejected: break; From 39869c5a7bb755d376b88d87833c4c9f5adce6d5 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 24 Aug 2024 04:49:32 +0200 Subject: [PATCH 351/624] PCjr: Allow disabling the application of overscan deltas when overscan is disabled, allows to fix the misalignment on ScubaVenture. --- src/machine/m_pcjr.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index e569dc674..88f9da2e3 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -96,6 +96,7 @@ typedef struct pcjr_t { int firstline; int lastline; int composite; + int apply_hd; /* Keyboard Controller stuff. */ int latched; @@ -727,9 +728,12 @@ vid_poll(void *priv) if (enable_overscan) { video_blit_memtoscreen(0, pcjr->firstline << 1, xsize, actual_ys + 32); - } else { + } else if (pcjr->apply_hd) { video_blit_memtoscreen(ho_s / 2, (pcjr->firstline << 1) + 16, xsize, actual_ys); + } else { + video_blit_memtoscreen(ho_d, (pcjr->firstline << 1) + 16, + xsize, actual_ys); } } @@ -951,6 +955,13 @@ static const device_config_t pcjr_config[] = { { .description = "" } } }, + { + .name = "apply_hd", + .description = "Apply overscan deltas", + .type = CONFIG_BINARY, + .default_string = "", + .default_int = 1 + }, { .name = "", .description = "", .type = CONFIG_END } // clang-format on }; @@ -990,6 +1001,7 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr->memctrl &= ~0x24; display_type = machine_get_config_int("display_type"); pcjr->composite = (display_type != PCJR_RGB); + pcjr->apply_hd = machine_get_config_int("display_type"); overscan_x = 256; overscan_y = 32; From 15b7001a6a4b5cd964ee8e9fe3521917c8736528 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 24 Aug 2024 06:00:33 +0200 Subject: [PATCH 352/624] More PCjr fixes. --- src/machine/m_pcjr.c | 547 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 529 insertions(+), 18 deletions(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 88f9da2e3..789481047 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -108,6 +108,525 @@ typedef struct pcjr_t { pc_timer_t send_delay_timer; } pcjr_t; +/*PCjr keyboard has no escape scancodes, and no scancodes beyond 54 + Map right alt to 54h (FN) */ +const scancode scancode_pcjr[512] = { + // clang-format off + { .mk = { 0 }, .brk = { 0 } }, /* 000 */ + { .mk = { 0x01, 0 }, .brk = { 0x81, 0 } }, /* 001 */ + { .mk = { 0x02, 0 }, .brk = { 0x82, 0 } }, /* 002 */ + { .mk = { 0x03, 0 }, .brk = { 0x83, 0 } }, /* 003 */ + { .mk = { 0x04, 0 }, .brk = { 0x84, 0 } }, /* 004 */ + { .mk = { 0x05, 0 }, .brk = { 0x85, 0 } }, /* 005 */ + { .mk = { 0x06, 0 }, .brk = { 0x86, 0 } }, /* 006 */ + { .mk = { 0x07, 0 }, .brk = { 0x87, 0 } }, /* 007 */ + { .mk = { 0x08, 0 }, .brk = { 0x88, 0 } }, /* 008 */ + { .mk = { 0x09, 0 }, .brk = { 0x89, 0 } }, /* 009 */ + { .mk = { 0x0a, 0 }, .brk = { 0x8a, 0 } }, /* 00a */ + { .mk = { 0x0b, 0 }, .brk = { 0x8b, 0 } }, /* 00b */ + { .mk = { 0x0c, 0 }, .brk = { 0x8c, 0 } }, /* 00c */ + { .mk = { 0x0d, 0 }, .brk = { 0x8d, 0 } }, /* 00d */ + { .mk = { 0x0e, 0 }, .brk = { 0x8e, 0 } }, /* 00e */ + { .mk = { 0x0f, 0 }, .brk = { 0x8f, 0 } }, /* 00f */ + { .mk = { 0x10, 0 }, .brk = { 0x90, 0 } }, /* 010 */ + { .mk = { 0x11, 0 }, .brk = { 0x91, 0 } }, /* 011 */ + { .mk = { 0x12, 0 }, .brk = { 0x92, 0 } }, /* 012 */ + { .mk = { 0x13, 0 }, .brk = { 0x93, 0 } }, /* 013 */ + { .mk = { 0x14, 0 }, .brk = { 0x94, 0 } }, /* 014 */ + { .mk = { 0x15, 0 }, .brk = { 0x95, 0 } }, /* 015 */ + { .mk = { 0x16, 0 }, .brk = { 0x96, 0 } }, /* 016 */ + { .mk = { 0x17, 0 }, .brk = { 0x97, 0 } }, /* 017 */ + { .mk = { 0x18, 0 }, .brk = { 0x98, 0 } }, /* 018 */ + { .mk = { 0x19, 0 }, .brk = { 0x99, 0 } }, /* 019 */ + { .mk = { 0x1a, 0 }, .brk = { 0x9a, 0 } }, /* 01a */ + { .mk = { 0x1b, 0 }, .brk = { 0x9b, 0 } }, /* 01b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 01c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 01d */ + { .mk = { 0x1e, 0 }, .brk = { 0x9e, 0 } }, /* 01e */ + { .mk = { 0x1f, 0 }, .brk = { 0x9f, 0 } }, /* 01f */ + { .mk = { 0x20, 0 }, .brk = { 0xa0, 0 } }, /* 020 */ + { .mk = { 0x21, 0 }, .brk = { 0xa1, 0 } }, /* 021 */ + { .mk = { 0x22, 0 }, .brk = { 0xa2, 0 } }, /* 022 */ + { .mk = { 0x23, 0 }, .brk = { 0xa3, 0 } }, /* 023 */ + { .mk = { 0x24, 0 }, .brk = { 0xa4, 0 } }, /* 024 */ + { .mk = { 0x25, 0 }, .brk = { 0xa5, 0 } }, /* 025 */ + { .mk = { 0x26, 0 }, .brk = { 0xa6, 0 } }, /* 026 */ + { .mk = { 0x27, 0 }, .brk = { 0xa7, 0 } }, /* 027 */ + { .mk = { 0x28, 0 }, .brk = { 0xa8, 0 } }, /* 028 */ + { .mk = { 0x29, 0 }, .brk = { 0xa9, 0 } }, /* 029 */ + { .mk = { 0x2a, 0 }, .brk = { 0xaa, 0 } }, /* 02a */ + { .mk = { 0x2b, 0 }, .brk = { 0xab, 0 } }, /* 02b */ + { .mk = { 0x2c, 0 }, .brk = { 0xac, 0 } }, /* 02c */ + { .mk = { 0x2d, 0 }, .brk = { 0xad, 0 } }, /* 02d */ + { .mk = { 0x2e, 0 }, .brk = { 0xae, 0 } }, /* 02e */ + { .mk = { 0x2f, 0 }, .brk = { 0xaf, 0 } }, /* 02f */ + { .mk = { 0x30, 0 }, .brk = { 0xb0, 0 } }, /* 030 */ + { .mk = { 0x31, 0 }, .brk = { 0xb1, 0 } }, /* 031 */ + { .mk = { 0x32, 0 }, .brk = { 0xb2, 0 } }, /* 032 */ + { .mk = { 0x33, 0 }, .brk = { 0xb3, 0 } }, /* 033 */ + { .mk = { 0x34, 0 }, .brk = { 0xb4, 0 } }, /* 034 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 035 */ + { .mk = { 0x36, 0 }, .brk = { 0xb6, 0 } }, /* 036 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 037 */ + { .mk = { 0x38, 0 }, .brk = { 0xb8, 0 } }, /* 038 */ + { .mk = { 0x39, 0 }, .brk = { 0xb9, 0 } }, /* 039 */ + { .mk = { 0x3a, 0 }, .brk = { 0xba, 0 } }, /* 03a */ + { .mk = { 0x3b, 0 }, .brk = { 0xbb, 0 } }, /* 03b */ + { .mk = { 0x3c, 0 }, .brk = { 0xbc, 0 } }, /* 03c */ + { .mk = { 0x3d, 0 }, .brk = { 0xbd, 0 } }, /* 03d */ + { .mk = { 0x3e, 0 }, .brk = { 0xbe, 0 } }, /* 03e */ + { .mk = { 0x3f, 0 }, .brk = { 0xbf, 0 } }, /* 03f */ + { .mk = { 0x40, 0 }, .brk = { 0xc0, 0 } }, /* 040 */ + { .mk = { 0x41, 0 }, .brk = { 0xc1, 0 } }, /* 041 */ + { .mk = { 0x42, 0 }, .brk = { 0xc2, 0 } }, /* 042 */ + { .mk = { 0x43, 0 }, .brk = { 0xc3, 0 } }, /* 043 */ + { .mk = { 0x44, 0 }, .brk = { 0xc4, 0 } }, /* 044 */ + { .mk = { 0x45, 0 }, .brk = { 0xc5, 0 } }, /* 045 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 046 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 047 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 048 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 049 */ + { .mk = { 0x4a, 0 }, .brk = { 0xca, 0 } }, /* 04a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 04b */ + { .mk = { 0x4c, 0 }, .brk = { 0xcc, 0 } }, /* 04c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 04d */ + { .mk = { 0x4e, 0 }, .brk = { 0xce, 0 } }, /* 04e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 04f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 050 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 051 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 052 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 053 */ + { .mk = { 0 }, .brk = { 0 } }, /* 054 */ + { .mk = { 0 }, .brk = { 0 } }, /* 055 */ + { .mk = { 0x55, 0 }, .brk = { 0xd5, 0 } }, /* 056 */ + { .mk = { 0 }, .brk = { 0 } }, /* 057 */ + { .mk = { 0 }, .brk = { 0 } }, /* 058 */ + { .mk = { 0 }, .brk = { 0 } }, /* 059 */ + { .mk = { 0 }, .brk = { 0 } }, /* 05a */ + { .mk = { 0 }, .brk = { 0 } }, /* 05b */ + { .mk = { 0 }, .brk = { 0 } }, /* 05c */ + { .mk = { 0 }, .brk = { 0 } }, /* 05d */ + { .mk = { 0 }, .brk = { 0 } }, /* 05e */ + { .mk = { 0 }, .brk = { 0 } }, /* 05f */ + { .mk = { 0 }, .brk = { 0 } }, /* 060 */ + { .mk = { 0 }, .brk = { 0 } }, /* 061 */ + { .mk = { 0 }, .brk = { 0 } }, /* 062 */ + { .mk = { 0 }, .brk = { 0 } }, /* 063 */ + { .mk = { 0 }, .brk = { 0 } }, /* 064 */ + { .mk = { 0 }, .brk = { 0 } }, /* 065 */ + { .mk = { 0 }, .brk = { 0 } }, /* 066 */ + { .mk = { 0 }, .brk = { 0 } }, /* 067 */ + { .mk = { 0 }, .brk = { 0 } }, /* 068 */ + { .mk = { 0 }, .brk = { 0 } }, /* 069 */ + { .mk = { 0 }, .brk = { 0 } }, /* 06a */ + { .mk = { 0 }, .brk = { 0 } }, /* 06b */ + { .mk = { 0 }, .brk = { 0 } }, /* 06c */ + { .mk = { 0 }, .brk = { 0 } }, /* 06d */ + { .mk = { 0 }, .brk = { 0 } }, /* 06e */ + { .mk = { 0 }, .brk = { 0 } }, /* 06f */ + { .mk = { 0 }, .brk = { 0 } }, /* 070 */ + { .mk = { 0 }, .brk = { 0 } }, /* 071 */ + { .mk = { 0 }, .brk = { 0 } }, /* 072 */ + { .mk = { 0 }, .brk = { 0 } }, /* 073 */ + { .mk = { 0 }, .brk = { 0 } }, /* 074 */ + { .mk = { 0 }, .brk = { 0 } }, /* 075 */ + { .mk = { 0 }, .brk = { 0 } }, /* 076 */ + { .mk = { 0 }, .brk = { 0 } }, /* 077 */ + { .mk = { 0 }, .brk = { 0 } }, /* 078 */ + { .mk = { 0 }, .brk = { 0 } }, /* 079 */ + { .mk = { 0 }, .brk = { 0 } }, /* 07a */ + { .mk = { 0 }, .brk = { 0 } }, /* 07b */ + { .mk = { 0 }, .brk = { 0 } }, /* 07c */ + { .mk = { 0 }, .brk = { 0 } }, /* 07d */ + { .mk = { 0 }, .brk = { 0 } }, /* 07e */ + { .mk = { 0 }, .brk = { 0 } }, /* 07f */ + { .mk = { 0 }, .brk = { 0 } }, /* 080 */ + { .mk = { 0 }, .brk = { 0 } }, /* 081 */ + { .mk = { 0 }, .brk = { 0 } }, /* 082 */ + { .mk = { 0 }, .brk = { 0 } }, /* 083 */ + { .mk = { 0 }, .brk = { 0 } }, /* 084 */ + { .mk = { 0 }, .brk = { 0 } }, /* 085 */ + { .mk = { 0 }, .brk = { 0 } }, /* 086 */ + { .mk = { 0 }, .brk = { 0 } }, /* 087 */ + { .mk = { 0 }, .brk = { 0 } }, /* 088 */ + { .mk = { 0 }, .brk = { 0 } }, /* 089 */ + { .mk = { 0 }, .brk = { 0 } }, /* 08a */ + { .mk = { 0 }, .brk = { 0 } }, /* 08b */ + { .mk = { 0 }, .brk = { 0 } }, /* 08c */ + { .mk = { 0 }, .brk = { 0 } }, /* 08d */ + { .mk = { 0 }, .brk = { 0 } }, /* 08e */ + { .mk = { 0 }, .brk = { 0 } }, /* 08f */ + { .mk = { 0 }, .brk = { 0 } }, /* 090 */ + { .mk = { 0 }, .brk = { 0 } }, /* 091 */ + { .mk = { 0 }, .brk = { 0 } }, /* 092 */ + { .mk = { 0 }, .brk = { 0 } }, /* 093 */ + { .mk = { 0 }, .brk = { 0 } }, /* 094 */ + { .mk = { 0 }, .brk = { 0 } }, /* 095 */ + { .mk = { 0 }, .brk = { 0 } }, /* 096 */ + { .mk = { 0 }, .brk = { 0 } }, /* 097 */ + { .mk = { 0 }, .brk = { 0 } }, /* 098 */ + { .mk = { 0 }, .brk = { 0 } }, /* 099 */ + { .mk = { 0 }, .brk = { 0 } }, /* 09a */ + { .mk = { 0 }, .brk = { 0 } }, /* 09b */ + { .mk = { 0 }, .brk = { 0 } }, /* 09c */ + { .mk = { 0 }, .brk = { 0 } }, /* 09d */ + { .mk = { 0 }, .brk = { 0 } }, /* 09e */ + { .mk = { 0 }, .brk = { 0 } }, /* 09f */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 0af */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0be */ + { .mk = { 0 }, .brk = { 0 } }, /* 0bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 0cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0da */ + { .mk = { 0 }, .brk = { 0 } }, /* 0db */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0de */ + { .mk = { 0 }, .brk = { 0 } }, /* 0df */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 0eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 0fe */ + { .mk = { 0 }, .brk = { 0 } }, /* 0ff */ + { .mk = { 0 }, .brk = { 0 } }, /* 100 */ + { .mk = { 0 }, .brk = { 0 } }, /* 101 */ + { .mk = { 0 }, .brk = { 0 } }, /* 102 */ + { .mk = { 0 }, .brk = { 0 } }, /* 103 */ + { .mk = { 0 }, .brk = { 0 } }, /* 104 */ + { .mk = { 0 }, .brk = { 0 } }, /* 105 */ + { .mk = { 0 }, .brk = { 0 } }, /* 106 */ + { .mk = { 0 }, .brk = { 0 } }, /* 107 */ + { .mk = { 0 }, .brk = { 0 } }, /* 108 */ + { .mk = { 0 }, .brk = { 0 } }, /* 109 */ + { .mk = { 0 }, .brk = { 0 } }, /* 10a */ + { .mk = { 0 }, .brk = { 0 } }, /* 10b */ + { .mk = { 0 }, .brk = { 0 } }, /* 10c */ + { .mk = { 0 }, .brk = { 0 } }, /* 10d */ + { .mk = { 0 }, .brk = { 0 } }, /* 10e */ + { .mk = { 0 }, .brk = { 0 } }, /* 10f */ + { .mk = { 0 }, .brk = { 0 } }, /* 110 */ + { .mk = { 0 }, .brk = { 0 } }, /* 111 */ + { .mk = { 0 }, .brk = { 0 } }, /* 112 */ + { .mk = { 0 }, .brk = { 0 } }, /* 113 */ + { .mk = { 0 }, .brk = { 0 } }, /* 114 */ + { .mk = { 0 }, .brk = { 0 } }, /* 115 */ + { .mk = { 0 }, .brk = { 0 } }, /* 116 */ + { .mk = { 0 }, .brk = { 0 } }, /* 117 */ + { .mk = { 0 }, .brk = { 0 } }, /* 118 */ + { .mk = { 0 }, .brk = { 0 } }, /* 119 */ + { .mk = { 0 }, .brk = { 0 } }, /* 11a */ + { .mk = { 0 }, .brk = { 0 } }, /* 11b */ + { .mk = { 0x1c, 0 }, .brk = { 0x9c, 0 } }, /* 11c */ + { .mk = { 0x1d, 0 }, .brk = { 0x9d, 0 } }, /* 11d */ + { .mk = { 0 }, .brk = { 0 } }, /* 11e */ + { .mk = { 0 }, .brk = { 0 } }, /* 11f */ + { .mk = { 0 }, .brk = { 0 } }, /* 120 */ + { .mk = { 0 }, .brk = { 0 } }, /* 121 */ + { .mk = { 0 }, .brk = { 0 } }, /* 122 */ + { .mk = { 0 }, .brk = { 0 } }, /* 123 */ + { .mk = { 0 }, .brk = { 0 } }, /* 124 */ + { .mk = { 0 }, .brk = { 0 } }, /* 125 */ + { .mk = { 0 }, .brk = { 0 } }, /* 126 */ + { .mk = { 0 }, .brk = { 0 } }, /* 127 */ + { .mk = { 0 }, .brk = { 0 } }, /* 128 */ + { .mk = { 0 }, .brk = { 0 } }, /* 129 */ + { .mk = { 0 }, .brk = { 0 } }, /* 12a */ + { .mk = { 0 }, .brk = { 0 } }, /* 12b */ + { .mk = { 0 }, .brk = { 0 } }, /* 12c */ + { .mk = { 0 }, .brk = { 0 } }, /* 12d */ + { .mk = { 0 }, .brk = { 0 } }, /* 12e */ + { .mk = { 0 }, .brk = { 0 } }, /* 12f */ + { .mk = { 0 }, .brk = { 0 } }, /* 130 */ + { .mk = { 0 }, .brk = { 0 } }, /* 131 */ + { .mk = { 0 }, .brk = { 0 } }, /* 132 */ + { .mk = { 0 }, .brk = { 0 } }, /* 133 */ + { .mk = { 0 }, .brk = { 0 } }, /* 134 */ + { .mk = { 0x35, 0 }, .brk = { 0xb5, 0 } }, /* 135 */ + { .mk = { 0 }, .brk = { 0 } }, /* 136 */ + { .mk = { 0x37, 0 }, .brk = { 0xb7, 0 } }, /* 137 */ + { .mk = { 0x54, 0 }, .brk = { 0xd4, 0 } }, /* 138 */ + { .mk = { 0 }, .brk = { 0 } }, /* 139 */ + { .mk = { 0 }, .brk = { 0 } }, /* 13a */ + { .mk = { 0 }, .brk = { 0 } }, /* 13b */ + { .mk = { 0 }, .brk = { 0 } }, /* 13c */ + { .mk = { 0 }, .brk = { 0 } }, /* 13d */ + { .mk = { 0 }, .brk = { 0 } }, /* 13e */ + { .mk = { 0 }, .brk = { 0 } }, /* 13f */ + { .mk = { 0 }, .brk = { 0 } }, /* 140 */ + { .mk = { 0 }, .brk = { 0 } }, /* 141 */ + { .mk = { 0 }, .brk = { 0 } }, /* 142 */ + { .mk = { 0 }, .brk = { 0 } }, /* 143 */ + { .mk = { 0 }, .brk = { 0 } }, /* 144 */ + { .mk = { 0 }, .brk = { 0 } }, /* 145 */ + { .mk = { 0x46, 0 }, .brk = { 0xc6, 0 } }, /* 146 */ + { .mk = { 0x47, 0 }, .brk = { 0xc7, 0 } }, /* 147 */ + { .mk = { 0x48, 0 }, .brk = { 0xc8, 0 } }, /* 148 */ + { .mk = { 0x49, 0 }, .brk = { 0xc9, 0 } }, /* 149 */ + { .mk = { 0 }, .brk = { 0 } }, /* 14a */ + { .mk = { 0x4b, 0 }, .brk = { 0xcb, 0 } }, /* 14b */ + { .mk = { 0 }, .brk = { 0 } }, /* 14c */ + { .mk = { 0x4d, 0 }, .brk = { 0xcd, 0 } }, /* 14d */ + { .mk = { 0 }, .brk = { 0 } }, /* 14e */ + { .mk = { 0x4f, 0 }, .brk = { 0xcf, 0 } }, /* 14f */ + { .mk = { 0x50, 0 }, .brk = { 0xd0, 0 } }, /* 150 */ + { .mk = { 0x51, 0 }, .brk = { 0xd1, 0 } }, /* 151 */ + { .mk = { 0x52, 0 }, .brk = { 0xd2, 0 } }, /* 152 */ + { .mk = { 0x53, 0 }, .brk = { 0xd3, 0 } }, /* 153 */ + { .mk = { 0 }, .brk = { 0 } }, /* 154 */ + { .mk = { 0 }, .brk = { 0 } }, /* 155 */ + { .mk = { 0 }, .brk = { 0 } }, /* 156 */ + { .mk = { 0 }, .brk = { 0 } }, /* 157 */ + { .mk = { 0 }, .brk = { 0 } }, /* 158 */ + { .mk = { 0 }, .brk = { 0 } }, /* 159 */ + { .mk = { 0 }, .brk = { 0 } }, /* 15a */ + { .mk = { 0 }, .brk = { 0 } }, /* 15b */ + { .mk = { 0 }, .brk = { 0 } }, /* 15c */ + { .mk = { 0 }, .brk = { 0 } }, /* 15d */ + { .mk = { 0 }, .brk = { 0 } }, /* 15e */ + { .mk = { 0 }, .brk = { 0 } }, /* 15f */ + { .mk = { 0 }, .brk = { 0 } }, /* 160 */ + { .mk = { 0 }, .brk = { 0 } }, /* 161 */ + { .mk = { 0 }, .brk = { 0 } }, /* 162 */ + { .mk = { 0 }, .brk = { 0 } }, /* 163 */ + { .mk = { 0 }, .brk = { 0 } }, /* 164 */ + { .mk = { 0 }, .brk = { 0 } }, /* 165 */ + { .mk = { 0 }, .brk = { 0 } }, /* 166 */ + { .mk = { 0 }, .brk = { 0 } }, /* 167 */ + { .mk = { 0 }, .brk = { 0 } }, /* 168 */ + { .mk = { 0 }, .brk = { 0 } }, /* 169 */ + { .mk = { 0 }, .brk = { 0 } }, /* 16a */ + { .mk = { 0 }, .brk = { 0 } }, /* 16b */ + { .mk = { 0 }, .brk = { 0 } }, /* 16c */ + { .mk = { 0 }, .brk = { 0 } }, /* 16d */ + { .mk = { 0 }, .brk = { 0 } }, /* 16e */ + { .mk = { 0 }, .brk = { 0 } }, /* 16f */ + { .mk = { 0 }, .brk = { 0 } }, /* 170 */ + { .mk = { 0 }, .brk = { 0 } }, /* 171 */ + { .mk = { 0 }, .brk = { 0 } }, /* 172 */ + { .mk = { 0 }, .brk = { 0 } }, /* 173 */ + { .mk = { 0 }, .brk = { 0 } }, /* 174 */ + { .mk = { 0 }, .brk = { 0 } }, /* 175 */ + { .mk = { 0 }, .brk = { 0 } }, /* 176 */ + { .mk = { 0 }, .brk = { 0 } }, /* 177 */ + { .mk = { 0 }, .brk = { 0 } }, /* 178 */ + { .mk = { 0 }, .brk = { 0 } }, /* 179 */ + { .mk = { 0 }, .brk = { 0 } }, /* 17a */ + { .mk = { 0 }, .brk = { 0 } }, /* 17b */ + { .mk = { 0 }, .brk = { 0 } }, /* 17c */ + { .mk = { 0 }, .brk = { 0 } }, /* 17d */ + { .mk = { 0 }, .brk = { 0 } }, /* 17e */ + { .mk = { 0 }, .brk = { 0 } }, /* 17f */ + { .mk = { 0 }, .brk = { 0 } }, /* 180 */ + { .mk = { 0 }, .brk = { 0 } }, /* 181 */ + { .mk = { 0 }, .brk = { 0 } }, /* 182 */ + { .mk = { 0 }, .brk = { 0 } }, /* 183 */ + { .mk = { 0 }, .brk = { 0 } }, /* 184 */ + { .mk = { 0 }, .brk = { 0 } }, /* 185 */ + { .mk = { 0 }, .brk = { 0 } }, /* 186 */ + { .mk = { 0 }, .brk = { 0 } }, /* 187 */ + { .mk = { 0 }, .brk = { 0 } }, /* 188 */ + { .mk = { 0 }, .brk = { 0 } }, /* 189 */ + { .mk = { 0 }, .brk = { 0 } }, /* 18a */ + { .mk = { 0 }, .brk = { 0 } }, /* 18b */ + { .mk = { 0 }, .brk = { 0 } }, /* 18c */ + { .mk = { 0 }, .brk = { 0 } }, /* 18d */ + { .mk = { 0 }, .brk = { 0 } }, /* 18e */ + { .mk = { 0 }, .brk = { 0 } }, /* 18f */ + { .mk = { 0 }, .brk = { 0 } }, /* 190 */ + { .mk = { 0 }, .brk = { 0 } }, /* 191 */ + { .mk = { 0 }, .brk = { 0 } }, /* 192 */ + { .mk = { 0 }, .brk = { 0 } }, /* 193 */ + { .mk = { 0 }, .brk = { 0 } }, /* 194 */ + { .mk = { 0 }, .brk = { 0 } }, /* 195 */ + { .mk = { 0 }, .brk = { 0 } }, /* 196 */ + { .mk = { 0 }, .brk = { 0 } }, /* 197 */ + { .mk = { 0 }, .brk = { 0 } }, /* 198 */ + { .mk = { 0 }, .brk = { 0 } }, /* 199 */ + { .mk = { 0 }, .brk = { 0 } }, /* 19a */ + { .mk = { 0 }, .brk = { 0 } }, /* 19b */ + { .mk = { 0 }, .brk = { 0 } }, /* 19c */ + { .mk = { 0 }, .brk = { 0 } }, /* 19d */ + { .mk = { 0 }, .brk = { 0 } }, /* 19e */ + { .mk = { 0 }, .brk = { 0 } }, /* 19f */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1a9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1aa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ab */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ac */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ad */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ae */ + { .mk = { 0 }, .brk = { 0 } }, /* 1af */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1b9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ba */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1be */ + { .mk = { 0 }, .brk = { 0 } }, /* 1bf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1c9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ca */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ce */ + { .mk = { 0 }, .brk = { 0 } }, /* 1cf */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1d9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1da */ + { .mk = { 0 }, .brk = { 0 } }, /* 1db */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1dd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1de */ + { .mk = { 0 }, .brk = { 0 } }, /* 1df */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1e9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ea */ + { .mk = { 0 }, .brk = { 0 } }, /* 1eb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ec */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ed */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ee */ + { .mk = { 0 }, .brk = { 0 } }, /* 1ef */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f0 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f1 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f2 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f3 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f4 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f5 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f6 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f7 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f8 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1f9 */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fa */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fb */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fc */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fd */ + { .mk = { 0 }, .brk = { 0 } }, /* 1fe */ + { .mk = { 0 }, .brk = { 0 } } /* 1ff */ + // clang-format on +}; + static video_timings_t timing_dram = { VIDEO_BUS, 0, 0, 0, 0, 0, 0 }; /*No additional waitstates*/ static uint8_t crtcmask[32] = { @@ -302,7 +821,7 @@ vid_get_h_overscan_delta(pcjr_t *pcjr) coef = 8; break; case 0x12: /*160x200x16*/ - def = 0x2b; + def = 0x2c; /* I'm going to assume a datasheet erratum here. */ coef = 16; break; case 0x03: /*640x200x4*/ @@ -342,20 +861,12 @@ vid_get_h_overscan_delta(pcjr_t *pcjr) static void vid_blit_h_overscan(pcjr_t *pcjr) { - int cols; + int cols = (pcjr->array[2] & 0xf) + 16;; + int y0 = pcjr->firstline << 1; + int y = (pcjr->lastline << 1) + 16; + int ho_s = vid_get_h_overscan_size(pcjr); int i; int x; - int y = (pcjr->lastline << 1) + 16; - int ho_s = vid_get_h_overscan_size(pcjr); - - if (pcjr->dispon) - cols = (pcjr->array[2] & 0xf) + 16; - else { - if (pcjr->array[3] & 4) - cols = (pcjr->array[2] & 0xf) + 16; - else - cols = pcjr->array[0 + 16] + 16; - } if (pcjr->array[0] & 1) x = (pcjr->crtc[1] << 3) + ho_s; @@ -363,14 +874,14 @@ vid_blit_h_overscan(pcjr_t *pcjr) x = (pcjr->crtc[1] << 4) + ho_s; for (i = 0; i < 16; i++) { - hline(buffer32, 0, i, x, cols); + hline(buffer32, 0, y0 + i, x, cols); hline(buffer32, 0, y + i, x, cols); if (pcjr->composite) { - Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[i]); + Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[y0 + i]); Composite_Process(pcjr->array[0], 0, x >> 2, buffer32->line[y + i]); } else { - video_process_8(x, i); + video_process_8(x, y0 + i); video_process_8(x, y + i); } } @@ -1001,7 +1512,7 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr->memctrl &= ~0x24; display_type = machine_get_config_int("display_type"); pcjr->composite = (display_type != PCJR_RGB); - pcjr->apply_hd = machine_get_config_int("display_type"); + pcjr->apply_hd = machine_get_config_int("apply_hd"); overscan_x = 256; overscan_y = 32; @@ -1032,7 +1543,7 @@ machine_pcjr_init(UNUSED(const machine_t *model)) io_sethandler(0x00a0, 8, kbd_read, NULL, NULL, kbd_write, NULL, NULL, pcjr); timer_add(&pcjr->send_delay_timer, kbd_poll, pcjr, 1); - keyboard_set_table(scancode_xt); + keyboard_set_table(scancode_pcjr); keyboard_send = kbd_adddata_ex; /* Technically it's the SN76496N, but the SN76489 is identical to the SN76496N. */ From f81541c8f61815f80af8ad5f2f11cc7e72b55aa8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 24 Aug 2024 06:19:14 +0200 Subject: [PATCH 353/624] WD1004 family: Fix IRQ 2 flag readout. --- src/disk/hdc_st506_xt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index f3ac48a36..ab4b10b78 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -1702,7 +1702,7 @@ st506_init(const device_t *info) dev->base = device_get_config_hex16("base"); dev->irq = device_get_config_int("irq"); if (dev->irq == 2) - dev->switches |= 0x40; + dev->switches |= 0x80; dev->bios_addr = device_get_config_hex20("bios_addr"); break; @@ -1732,7 +1732,7 @@ st506_init(const device_t *info) dev->base = device_get_config_hex16("base"); dev->irq = device_get_config_int("irq"); if (dev->irq == 2) - dev->switches |= 0x40; + dev->switches |= 0x80; dev->bios_addr = device_get_config_hex20("bios_addr"); break; @@ -1747,7 +1747,7 @@ st506_init(const device_t *info) dev->base = device_get_config_hex16("base"); dev->irq = device_get_config_int("irq"); if (dev->irq == 2) - dev->switches |= 0x40; + dev->switches |= 0x80; dev->bios_addr = device_get_config_hex20("bios_addr"); break; From 9da2cef53d03d566713919fb42b1ce20015b3925 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 24 Aug 2024 06:24:35 +0200 Subject: [PATCH 354/624] Also apply the IRQ 2 fix to the WD1002 family. --- src/disk/hdc_st506_xt.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index ab4b10b78..47e6f045a 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -1683,7 +1683,7 @@ st506_init(const device_t *info) dev->base = device_get_config_hex16("base"); dev->irq = device_get_config_int("irq"); if (dev->irq == 2) - dev->switches |= 0x40; + dev->switches |= 0x80; dev->bios_addr = device_get_config_hex20("bios_addr"); break; @@ -1717,7 +1717,7 @@ st506_init(const device_t *info) dev->base = device_get_config_hex16("base"); dev->irq = device_get_config_int("irq"); if (dev->irq == 2) - dev->switches |= 0x40; + dev->switches |= 0x80; dev->bios_addr = device_get_config_hex20("bios_addr"); break; From 3e1991390f4853b343631ee8c040c14cfdab7e4b Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 24 Aug 2024 23:55:51 +0200 Subject: [PATCH 355/624] Sound Blaster DSP: Fix readout in reset state on the AZTech DSP, fixes #4747. --- src/sound/snd_sb_dsp.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index 2513d36f6..7b010c77b 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -1959,7 +1959,9 @@ sb_read(uint16_t a, void *priv) else ret = 0x7f; } - } else + } else if (IS_AZTECH(dsp)) + ret = 0x00; + else ret = 0xff; break; case 0xE: /* Read data ready */ From da5757f802ef9d87f29f1089fff2967e806d9ffa Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 25 Aug 2024 23:05:13 +0200 Subject: [PATCH 356/624] Minor but important changes to minivhd's dynamic/diff vhd handling 1. Changed the first seek_end in create_block to seek_set. 2. Avoid expansion overflow through a check if the block offset is below the total sectors. --- src/disk/minivhd/minivhd_io.c | 65 +++++++++++++++++++---------------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/disk/minivhd/minivhd_io.c b/src/disk/minivhd/minivhd_io.c index 2912cf5b2..2a430f8a4 100644 --- a/src/disk/minivhd/minivhd_io.c +++ b/src/disk/minivhd/minivhd_io.c @@ -37,6 +37,7 @@ #ifndef _FILE_OFFSET_BITS # define _FILE_OFFSET_BITS 64 #endif +#include #include #include #include @@ -45,6 +46,10 @@ #include #include "minivhd.h" #include "internal.h" +#define HAVE_STDARG_H + +#include "cpu.h" +#include <86box/86box.h> /* * The following bit array macros adapted from: @@ -158,7 +163,7 @@ create_block(MVHDMeta *vhdm, int blk) uint8_t footer[MVHD_FOOTER_SIZE] = { 0 }; /* Seek to where the footer SHOULD be */ - mvhd_fseeko64(vhdm->f, -MVHD_FOOTER_SIZE, SEEK_END); + mvhd_fseeko64(vhdm->f, -MVHD_FOOTER_SIZE, SEEK_SET); (void) !fread(footer, sizeof footer, 1, vhdm->f); mvhd_fseeko64(vhdm->f, -MVHD_FOOTER_SIZE, SEEK_END); @@ -334,36 +339,38 @@ mvhd_sparse_diff_write(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *i int sib = 0; ls = offset + transfer_sectors; - for (s = offset; s < ls; s++) { - blk = s / vhdm->sect_per_block; - sib = s % vhdm->sect_per_block; - if (vhdm->bitmap.curr_block != blk && prev_blk >= 0) { - /* Write the sector bitmap for the previous block, before we replace it. */ - write_curr_sect_bitmap(vhdm); - } - - if (vhdm->block_offset[blk] == MVHD_SPARSE_BLK) { - /* "read" the sector bitmap first, before creating a new block, as the bitmap will be - zero either way */ - read_sect_bitmap(vhdm, blk); - create_block(vhdm, blk); - } - - if (blk != prev_blk) { - if (vhdm->bitmap.curr_block != blk) { - read_sect_bitmap(vhdm, blk); - mvhd_fseeko64(vhdm->f, (uint64_t)sib * MVHD_SECTOR_SIZE, SEEK_CUR); - } else { - addr = (((int64_t) vhdm->block_offset[blk]) + vhdm->bitmap.sector_count + sib) * - MVHD_SECTOR_SIZE; - mvhd_fseeko64(vhdm->f, addr, SEEK_SET); + if (offset < total_sectors) { + for (s = offset; s < ls; s++) { + blk = s / vhdm->sect_per_block; + sib = s % vhdm->sect_per_block; + if (vhdm->bitmap.curr_block != blk && prev_blk >= 0) { + /* Write the sector bitmap for the previous block, before we replace it. */ + write_curr_sect_bitmap(vhdm); } - prev_blk = blk; - } - fwrite(buff, MVHD_SECTOR_SIZE, 1, vhdm->f); - VHD_SETBIT(vhdm->bitmap.curr_bitmap, sib); - buff += MVHD_SECTOR_SIZE; + if (vhdm->block_offset[blk] == MVHD_SPARSE_BLK) { + /* "read" the sector bitmap first, before creating a new block, as the bitmap will be + zero either way */ + read_sect_bitmap(vhdm, blk); + create_block(vhdm, blk); + } + + if (blk != prev_blk) { + if (vhdm->bitmap.curr_block != blk) { + read_sect_bitmap(vhdm, blk); + mvhd_fseeko64(vhdm->f, (uint64_t)sib * MVHD_SECTOR_SIZE, SEEK_CUR); + } else { + addr = (((int64_t) vhdm->block_offset[blk]) + vhdm->bitmap.sector_count + sib) * + MVHD_SECTOR_SIZE; + mvhd_fseeko64(vhdm->f, addr, SEEK_SET); + } + prev_blk = blk; + } + + fwrite(buff, MVHD_SECTOR_SIZE, 1, vhdm->f); + VHD_SETBIT(vhdm->bitmap.curr_bitmap, sib); + buff += MVHD_SECTOR_SIZE; + } } /* And write the sector bitmap for the last block we visited to disk */ From 8c98dcf5e8bd66da6c9af4a65de6bca439141cce Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 25 Aug 2024 23:26:20 +0200 Subject: [PATCH 357/624] Remove the first change. --- src/disk/minivhd/minivhd_io.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/disk/minivhd/minivhd_io.c b/src/disk/minivhd/minivhd_io.c index 2a430f8a4..ffc6aba44 100644 --- a/src/disk/minivhd/minivhd_io.c +++ b/src/disk/minivhd/minivhd_io.c @@ -163,7 +163,7 @@ create_block(MVHDMeta *vhdm, int blk) uint8_t footer[MVHD_FOOTER_SIZE] = { 0 }; /* Seek to where the footer SHOULD be */ - mvhd_fseeko64(vhdm->f, -MVHD_FOOTER_SIZE, SEEK_SET); + mvhd_fseeko64(vhdm->f, -MVHD_FOOTER_SIZE, SEEK_END); (void) !fread(footer, sizeof footer, 1, vhdm->f); mvhd_fseeko64(vhdm->f, -MVHD_FOOTER_SIZE, SEEK_END); From d72d00042b4b559fc860096099e034bbc1394630 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 26 Aug 2024 00:42:34 +0200 Subject: [PATCH 358/624] Honor the composite mode of the PCjr and Tandy 1000 And actually fix the way it's activated. --- src/machine/m_pcjr.c | 49 +++++++++++++++++++++++++++---------------- src/machine/m_tandy.c | 14 ++++++++++--- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 789481047..16020826d 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -1438,6 +1438,34 @@ speed_changed(void *priv) recalc_timings(pcjr); } +static void +pcjr_vid_init(pcjr_t *pcjr) +{ + int display_type; + + video_inform(VIDEO_FLAG_TYPE_CGA, &timing_dram); + + pcjr->memctrl = -1; + if (mem_size < 128) + pcjr->memctrl &= ~0x24; + + display_type = device_get_config_int("display_type"); + pcjr->composite = (display_type != PCJR_RGB); + pcjr->apply_hd = device_get_config_int("apply_hd"); + overscan_x = 256; + overscan_y = 32; + + mem_mapping_add(&pcjr->mapping, 0xb8000, 0x08000, + vid_read, NULL, NULL, + vid_write, NULL, NULL, NULL, 0, pcjr); + io_sethandler(0x03d0, 16, + vid_in, NULL, NULL, vid_out, NULL, NULL, pcjr); + timer_add(&pcjr->timer, vid_poll, pcjr, 1); + + cga_palette = 0; + cgapal_rebuild(); +} + void pit_irq0_timer_pcjr(int new_out, int old_out, UNUSED(void *priv)) { @@ -1494,7 +1522,6 @@ const device_t pcjr_device = { int machine_pcjr_init(UNUSED(const machine_t *model)) { - int display_type; pcjr_t *pcjr; int ret; @@ -1507,14 +1534,6 @@ machine_pcjr_init(UNUSED(const machine_t *model)) pcjr = malloc(sizeof(pcjr_t)); memset(pcjr, 0x00, sizeof(pcjr_t)); - pcjr->memctrl = -1; - if (mem_size < 128) - pcjr->memctrl &= ~0x24; - display_type = machine_get_config_int("display_type"); - pcjr->composite = (display_type != PCJR_RGB); - pcjr->apply_hd = machine_get_config_int("apply_hd"); - overscan_x = 256; - overscan_y = 32; pic_init_pcjr(); pit_common_init(0, pit_irq0_timer_pcjr, NULL); @@ -1524,16 +1543,10 @@ machine_pcjr_init(UNUSED(const machine_t *model)) /* Initialize the video controller. */ video_reset(gfxcard[0]); loadfont("roms/video/mda/mda.rom", 0); - mem_mapping_add(&pcjr->mapping, 0xb8000, 0x08000, - vid_read, NULL, NULL, - vid_write, NULL, NULL, NULL, 0, pcjr); - io_sethandler(0x03d0, 16, - vid_in, NULL, NULL, vid_out, NULL, NULL, pcjr); - timer_add(&pcjr->timer, vid_poll, pcjr, 1); - video_inform(VIDEO_FLAG_TYPE_CGA, &timing_dram); + device_context(&pcjr_device); + pcjr_vid_init(pcjr); + device_context_restore(); device_add_ex(&pcjr_device, pcjr); - cga_palette = 0; - cgapal_rebuild(); /* Initialize the keyboard. */ keyboard_scan = 1; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 2a7ef2275..6c478b37a 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -1328,11 +1328,10 @@ vid_init(tandy_t *dev) vid = malloc(sizeof(t1kvid_t)); memset(vid, 0x00, sizeof(t1kvid_t)); vid->memctrl = -1; - dev->vid = vid; video_inform(VIDEO_FLAG_TYPE_CGA, &timing_dram); - display_type = machine_get_config_int("display_type"); + display_type = device_get_config_int("display_type"); vid->composite = (display_type != TANDY_RGB); cga_comp_init(1); @@ -1345,11 +1344,14 @@ vid_init(tandy_t *dev) io_sethandler(0x0065, 1, vid_in, NULL, NULL, vid_out, NULL, NULL, dev); } else vid->b8000_mask = 0x3fff; + timer_add(&vid->timer, vid_poll, dev, 1); mem_mapping_add(&vid->mapping, 0xb8000, 0x08000, vid_read, NULL, NULL, vid_write, NULL, NULL, NULL, 0, dev); io_sethandler(0x03d0, 16, vid_in, NULL, NULL, vid_out, NULL, NULL, dev); + + dev->vid = vid; } const device_config_t vid_config[] = { @@ -1771,7 +1773,9 @@ machine_tandy1k_init(const machine_t *model, int type) keyboard_set_table(scancode_tandy); io_sethandler(0x00a0, 1, tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev); + device_context(&vid_device); vid_init(dev); + device_context_restore(); device_add_ex(&vid_device, dev); device_add((type == TYPE_TANDY1000SX) ? &ncr8496_device : &sn76489_device); break; @@ -1781,8 +1785,10 @@ machine_tandy1k_init(const machine_t *model, int type) keyboard_set_table(scancode_tandy); io_sethandler(0x00a0, 1, tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev); + device_context(&vid_device_hx); vid_init(dev); - device_add_ex(&vid_device, dev); + device_context_restore(); + device_add_ex(&vid_device_hx, dev); device_add(&ncr8496_device); device_add(&eep_1000hx_device); break; @@ -1792,7 +1798,9 @@ machine_tandy1k_init(const machine_t *model, int type) init_rom(dev); io_sethandler(0xffe8, 8, tandy_read, NULL, NULL, tandy_write, NULL, NULL, dev); + device_context(&vid_device_sl); vid_init(dev); + device_context_restore(); device_add_ex(&vid_device_sl, dev); device_add(&pssj_device); device_add(&eep_1000sl2_device); From 97f861b0ba32286d5dc95a0a11c7c4f3c88daade Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 25 Aug 2024 19:08:30 -0400 Subject: [PATCH 359/624] Split off AMD K5 from K6 --- src/cpu/cpu.c | 75 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 178a17e95..d6d8a9ca8 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1536,6 +1536,55 @@ cpu_set(void) #ifdef USE_AMD_K5 case CPU_K5: case CPU_5K86: +#ifdef USE_DYNAREC + x86_setopcodes(ops_386, ops_pentiummmx_0f, dynarec_ops_386, dynarec_ops_pentiummmx_0f); +#else + x86_setopcodes(ops_386, ops_pentiummmx_0f); +#endif /* USE_DYNAREC */ + + timing_rr = 1; /* register dest - register src */ + timing_rm = 2; /* register dest - memory src */ + timing_mr = 3; /* memory dest - register src */ + timing_mm = 3; + timing_rml = 2; /* register dest - memory src long */ + timing_mrl = 3; /* memory dest - register src long */ + timing_mml = 3; + timing_bt = 0; /* branch taken */ + timing_bnt = 1; /* branch not taken */ + + timing_int = 6; + timing_int_rm = 11; + timing_int_v86 = 54; + timing_int_pm = 25; + timing_int_pm_outer = 42; + timing_iret_rm = 7; + timing_iret_v86 = 27; /* unknown */ + timing_iret_pm = 10; + timing_iret_pm_outer = 27; + timing_call_rm = 4; + timing_call_pm = 4; + timing_call_pm_gate = 22; + timing_call_pm_gate_inner = 44; + timing_retf_rm = 4; + timing_retf_pm = 4; + timing_retf_pm_outer = 23; + timing_jmp_rm = 3; + timing_jmp_pm = 3; + timing_jmp_pm_gate = 18; + + timing_misaligned = 3; + + cpu_features = CPU_FEATURE_RDTSC | CPU_FEATURE_MSR | CPU_FEATURE_CR4 | CPU_FEATURE_VME | CPU_FEATURE_MMX; + cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE; +#if 0 + cpu_CR4_mask |= CR4_PGE; +#endif + +#ifdef USE_DYNAREC + codegen_timing_set(&codegen_timing_k5); +#endif /* USE_DYNAREC */ + break; + #endif /* USE_AMD_K5 */ case CPU_K6: case CPU_K6_2: @@ -1546,27 +1595,13 @@ cpu_set(void) #ifdef USE_DYNAREC if (cpu_s->cpu_type >= CPU_K6_2) x86_setopcodes(ops_386, ops_k62_0f, dynarec_ops_386, dynarec_ops_k62_0f); -# ifdef USE_AMD_K5 - else if (cpu_s->cpu_type == CPU_K6) - x86_setopcodes(ops_386, ops_k6_0f, dynarec_ops_386, dynarec_ops_k6_0f); - else - x86_setopcodes(ops_386, ops_pentiummmx_0f, dynarec_ops_386, dynarec_ops_pentiummmx_0f); -# else else x86_setopcodes(ops_386, ops_k6_0f, dynarec_ops_386, dynarec_ops_k6_0f); -# endif /* USE_AMD_K5 */ #else if (cpu_s->cpu_type >= CPU_K6_2) x86_setopcodes(ops_386, ops_k62_0f); -# ifdef USE_AMD_K5 - else if (cpu_s->cpu_type == CPU_K6) - x86_setopcodes(ops_386, ops_k6_0f); - else - x86_setopcodes(ops_386, ops_pentiummmx_0f); -# else else x86_setopcodes(ops_386, ops_k6_0f); -# endif /* USE_AMD_K5 */ #endif /* USE_DYNAREC */ if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P)) { @@ -1613,23 +1648,11 @@ cpu_set(void) cpu_features |= CPU_FEATURE_3DNOW; if ((cpu_s->cpu_type == CPU_K6_2P) || (cpu_s->cpu_type == CPU_K6_3P)) cpu_features |= CPU_FEATURE_3DNOWE; -#ifdef USE_AMD_K5 - cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE; - if (cpu_s->cpu_type >= CPU_K6) { - cpu_CR4_mask |= (CR4_VME | CR4_PVI | CR4_PSE); - if (cpu_s->cpu_type <= CPU_K6) - cpu_CR4_mask |= CR4_PCE; - else if (cpu_s->cpu_type >= CPU_K6_2C) - cpu_CR4_mask |= CR4_PGE; - } else - cpu_CR4_mask |= CR4_PGE; -#else cpu_CR4_mask = CR4_VME | CR4_PVI | CR4_TSD | CR4_DE | CR4_PSE | CR4_MCE; if (cpu_s->cpu_type == CPU_K6) cpu_CR4_mask |= CR4_PCE; else if (cpu_s->cpu_type >= CPU_K6_2C) cpu_CR4_mask |= CR4_PGE; -#endif /* USE_AMD_K5 */ #ifdef USE_DYNAREC codegen_timing_set(&codegen_timing_k6); From 025798c832dae75c325221ddf531f8abdccb08d0 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sun, 25 Aug 2024 20:20:21 -0400 Subject: [PATCH 360/624] PGE for K5 --- src/cpu/cpu.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index d6d8a9ca8..172a5543c 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -1575,10 +1575,7 @@ cpu_set(void) timing_misaligned = 3; cpu_features = CPU_FEATURE_RDTSC | CPU_FEATURE_MSR | CPU_FEATURE_CR4 | CPU_FEATURE_VME | CPU_FEATURE_MMX; - cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE; -#if 0 - cpu_CR4_mask |= CR4_PGE; -#endif + cpu_CR4_mask = CR4_TSD | CR4_DE | CR4_MCE | CR4_PGE; #ifdef USE_DYNAREC codegen_timing_set(&codegen_timing_k5); From ba859d7351218ee2bbb247e723260740e65f8a9b Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 26 Aug 2024 04:36:23 +0200 Subject: [PATCH 361/624] S3: Fixed CRTC to PCI BAR mapping, fixes #4745. --- src/video/vid_s3.c | 51 +++++++++++++++------------------------- src/video/vid_s3_virge.c | 2 +- 2 files changed, 20 insertions(+), 33 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 8a9bedf02..cb5d2e41e 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -9219,18 +9219,19 @@ s3_pci_read(UNUSED(int func), int addr, void *priv) return s3->pci_regs[PCI_REG_COMMAND] | 0x80; /*Respond to IO and memory accesses*/ else return s3->pci_regs[PCI_REG_COMMAND]; /*Respond to IO and memory accesses*/ - break; + break; case 0x07: return (s3->chip == S3_TRIO64V2) ? (s3->pci_regs[0x07] & 0x36) : (1 << 1); /*Medium DEVSEL timing*/ - case 0x08: switch (s3->chip) { /*Revision ID*/ - case S3_TRIO64V: - return 0x40; - case S3_TRIO64V2: - return 0x16; /*Confirmed on an onboard 64V2/DX*/ - default: - return 0x00; + case 0x08: + switch (s3->chip) { /*Revision ID*/ + case S3_TRIO64V: + return 0x40; + case S3_TRIO64V2: + return 0x16; /*Confirmed on an onboard 64V2/DX*/ + default: + return 0x00; } break; case 0x09: @@ -9252,24 +9253,11 @@ s3_pci_read(UNUSED(int func), int addr, void *priv) case 0x0d: return (s3->chip == S3_TRIO64V2) ? (s3->pci_regs[0x0d] & 0xf8) : 0x00; - case 0x10: - return 0x00; /*Linear frame buffer address*/ - case 0x11: - return 0x00; case 0x12: - if (svga->crtc[0x53] & 0x08) - return 0x00; - else - return (svga->crtc[0x5a] & 0x80); - break; + return (s3->chip >= S3_TRIO64V) ? 0x00 : (svga->crtc[0x5a] & 0x80); case 0x13: - if (svga->crtc[0x53] & 0x08) { - return (s3->chip >= S3_TRIO64V) ? (svga->crtc[0x59] & 0xfc) : (svga->crtc[0x59] & 0xfe); - } else { - return svga->crtc[0x59]; - } - break; + return (s3->chip >= S3_TRIO64V) ? (svga->crtc[0x59] & 0xfc) : svga->crtc[0x59]; case 0x30: return s3->has_bios ? (s3->pci_regs[0x30] & 0x01) : 0x00; /*BIOS ROM address*/ @@ -9323,13 +9311,16 @@ s3_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) s3_io_set(s3); else s3_io_remove(s3); - s3->pci_regs[PCI_REG_COMMAND] = (val & 0x23); + if (s3->chip >= S3_TRIO64V) + s3->pci_regs[PCI_REG_COMMAND] = (val & 0x27); + else + s3->pci_regs[PCI_REG_COMMAND] = (val & 0x23); s3_updatemapping(s3); break; case 0x07: if (s3->chip == S3_TRIO64V2) { - s3->pci_regs[0x07] = val & 0x3e; + s3->pci_regs[0x07] &= ~(val & 0x30); return; } break; @@ -9342,18 +9333,14 @@ s3_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) break; case 0x12: - if (!(svga->crtc[0x53] & 0x08)) { - svga->crtc[0x5a] = (svga->crtc[0x5a] & 0x7f) | (val & 0x80); + if (s3->chip < S3_TRIO64V) { + svga->crtc[0x5a] = val & 0x80; s3_updatemapping(s3); } break; case 0x13: - if (svga->crtc[0x53] & 0x08) { - svga->crtc[0x59] = (s3->chip >= S3_TRIO64V) ? (val & 0xfc) : (val & 0xfe); - } else { - svga->crtc[0x59] = val; - } + svga->crtc[0x59] = (s3->chip >= S3_TRIO64V) ? (val & 0xfc) : val; s3_updatemapping(s3); break; diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 4bcbaea9e..8c9a1e008 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -4203,7 +4203,7 @@ s3_virge_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) s3_virge_updatemapping(virge); return; case 0x07: - virge->pci_regs[0x07] = val & 0x3e; + virge->pci_regs[0x07] &= ~(val & 0x30); return; case 0x0d: virge->pci_regs[0x0d] = val & 0xf8; From 52e80587fd3b779c2e3594717256298109cf0edb Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 25 Aug 2024 23:41:54 -0300 Subject: [PATCH 362/624] Revert A-Trend ATC6310BXII/ATC7020BXII name change References: * https://web.archive.org/web/20010606125848/http://www.atrend.com.tw/english/product.htm * https://web.archive.org/web/20010405101351/http://www.atrend.com.tw/english/product/mainboard/ATC6310BXII.htm * https://web.archive.org/web/20020404115114/http://www.atrend.com.tw/english/product/mainboard/atc7020bxii.htm --- src/machine/machine_table.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index b482951ef..c0c0e9085 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -14678,7 +14678,7 @@ const machine_t machines[] = { /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ { - .name = "[SMSC VictoryBX-66] A-Trend ATC-6310BXII", + .name = "[SMSC VictoryBX-66] A-Trend ATC6310BXII", .internal_name = "atc6310bxii", .type = MACHINE_TYPE_SLOT1, .chipset = MACHINE_CHIPSET_SMSC_VICTORYBX_66, @@ -15397,7 +15397,7 @@ const machine_t machines[] = { /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ { - .name = "[SMSC VictoryBX-66] A-Trend ATC-7020BXII", + .name = "[SMSC VictoryBX-66] A-Trend ATC7020BXII", .internal_name = "atc7020bxii", .type = MACHINE_TYPE_SOCKET370, .chipset = MACHINE_CHIPSET_SMSC_VICTORYBX_66, From 7683721870be92f0e3a55b192a2d632c39bfc19b Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 26 Aug 2024 08:00:21 +0200 Subject: [PATCH 363/624] Apply Randrianasulu's fix to thread.cpp, fixes building in Termux, closes #4753. --- src/thread.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/thread.cpp b/src/thread.cpp index f2a0ceaf0..78a7b109d 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -5,12 +5,16 @@ #include <86box/plat.h> #include <86box/thread.h> +#if !defined(__unix__) + struct event_cpp11_t { std::condition_variable cond; std::mutex mutex; bool state = false; }; +#endif + extern "C" { thread_t * From f9b80f1a103685971aba4f8eab8568c9b1a0e56a Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 26 Aug 2024 17:12:25 +0200 Subject: [PATCH 364/624] Renamed the event struct, should properly fix building thread.cpp on termux without breaking other OS'es. --- src/thread.cpp | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/thread.cpp b/src/thread.cpp index 78a7b109d..079b80a3e 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -5,16 +5,12 @@ #include <86box/plat.h> #include <86box/thread.h> -#if !defined(__unix__) - -struct event_cpp11_t { +struct event_cpp11_ex_t { std::condition_variable cond; std::mutex mutex; bool state = false; }; -#endif - extern "C" { thread_t * @@ -86,14 +82,14 @@ thread_close_mutex(mutex_t *_mutex) event_t * thread_create_event() { - auto ev = new event_cpp11_t; + auto ev = new event_cpp11_ex_t; return ev; } int thread_wait_event(event_t *handle, int timeout) { - auto event = reinterpret_cast(handle); + auto event = reinterpret_cast(handle); auto lock = std::unique_lock(event->mutex); if (timeout < 0) { @@ -116,7 +112,7 @@ thread_wait_event(event_t *handle, int timeout) void thread_set_event(event_t *handle) { - auto event = reinterpret_cast(handle); + auto event = reinterpret_cast(handle); { auto lock = std::unique_lock(event->mutex); event->state = true; @@ -127,7 +123,7 @@ thread_set_event(event_t *handle) void thread_reset_event(event_t *handle) { - auto event = reinterpret_cast(handle); + auto event = reinterpret_cast(handle); auto lock = std::unique_lock(event->mutex); event->state = false; } @@ -135,7 +131,7 @@ thread_reset_event(event_t *handle) void thread_destroy_event(event_t *handle) { - auto event = reinterpret_cast(handle); + auto event = reinterpret_cast(handle); delete event; } } From 7c7cc921eeccab556ca580c5c7b59ee40eaec99e Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 27 Aug 2024 02:34:59 +0200 Subject: [PATCH 365/624] Non-808x interpreters: fetch the next instruction after a CR0 paging bit toggle with the old CR0 paging bit value, fixes SCO Unix. --- src/cpu/386.c | 8 ++++++++ src/cpu/386_dynarec.c | 8 ++++++++ src/cpu/cpu.c | 1 + src/cpu/cpu.h | 1 + src/cpu/x86.c | 3 ++- src/cpu/x86_ops_mov_ctrl.h | 30 ++++++++++++++++++++++++++---- src/cpu/x86_ops_mov_ctrl_2386.h | 22 ++++++++++++++++++---- src/cpu/x86_ops_pmode.h | 21 +++++++++++++++------ 8 files changed, 79 insertions(+), 15 deletions(-) diff --git a/src/cpu/386.c b/src/cpu/386.c index 3524e0d1e..50ed4fddb 100644 --- a/src/cpu/386.c +++ b/src/cpu/386.c @@ -304,6 +304,14 @@ exec386_2386(int32_t cycs) cpu_state.pc &= 0xffff; #endif + if (cpu_flush_pending == 1) + cpu_flush_pending++; + else if (cpu_flush_pending == 2) { + cpu_flush_pending = 0; + cr0 ^= 0x80000000; + flushmmucache(); + } + if (cpu_end_block_after_ins) cpu_end_block_after_ins--; diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c index d8a33a624..bf8b31600 100644 --- a/src/cpu/386_dynarec.c +++ b/src/cpu/386_dynarec.c @@ -933,6 +933,14 @@ exec386(int32_t cycs) x386_dynarec_log("[%04X:%08X] ABRT\n", CS, cpu_state.pc); #endif + if (cpu_flush_pending == 1) + cpu_flush_pending++; + else if (cpu_flush_pending == 2) { + cpu_flush_pending = 0; + cr0 ^= 0x80000000; + flushmmucache(); + } + #ifndef USE_NEW_DYNAREC if (!use32) cpu_state.pc &= 0xffff; diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 172a5543c..bbada4958 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -182,6 +182,7 @@ int cpu_rom_prefetch_cycles; int cpu_waitstates; int cpu_cache_int_enabled; int cpu_cache_ext_enabled; +int cpu_flush_pending; int cpu_isa_speed; int cpu_pci_speed; int cpu_isa_pci_div; diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 9b154cd0d..cdb4e54b6 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -616,6 +616,7 @@ extern int cpu_prefetch_width; extern int cpu_mem_prefetch_cycles; extern int cpu_rom_prefetch_cycles; extern int cpu_waitstates; +extern int cpu_flush_pending; extern int cpu_cache_int_enabled; extern int cpu_cache_ext_enabled; extern int cpu_isa_speed; diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 4bf381ee4..d70f8f61c 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -277,7 +277,7 @@ reset_common(int hard) cr0 = 0; if (is386 && !is486 && (fpu_type == FPU_387)) cr0 |= 0x10; - cpu_cache_int_enabled = 0; + cpu_cache_int_enabled = 0; cpu_update_waitstates(); cr4 = 0; cpu_state.eflags = 0; @@ -325,6 +325,7 @@ reset_common(int hard) if (hard) codegen_reset(); #endif + cpu_flush_pending = 0; if (!hard) flushmmucache(); x86_was_reset = 1; diff --git a/src/cpu/x86_ops_mov_ctrl.h b/src/cpu/x86_ops_mov_ctrl.h index bcfed831b..f6fcda983 100644 --- a/src/cpu/x86_ops_mov_ctrl.h +++ b/src/cpu/x86_ops_mov_ctrl.h @@ -9,6 +9,8 @@ opMOV_r_CRx_a16(uint32_t fetchdat) switch (cpu_reg) { case 0: cpu_state.regs[cpu_rm].l = cr0; + if (cpu_flush_pending) + cpu_state.regs[cpu_rm].l ^= 0x80000000; if (is486 || isibm486) cpu_state.regs[cpu_rm].l |= 0x10; /*ET hardwired on 486*/ else { @@ -49,6 +51,8 @@ opMOV_r_CRx_a32(uint32_t fetchdat) switch (cpu_reg) { case 0: cpu_state.regs[cpu_rm].l = cr0; + if (cpu_flush_pending) + cpu_state.regs[cpu_rm].l ^= 0x80000000; if (is486 || isibm486) cpu_state.regs[cpu_rm].l |= 0x10; /*ET hardwired on 486*/ else { @@ -180,12 +184,21 @@ opMOV_CRx_r_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); switch (cpu_reg) { case 0: - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000001) + if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) flushmmucache(); + else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { + if (is_p6 && !cpu_use_dynarec) + flushmmucache(); + else + cpu_flush_pending = 1; + } /* Make sure CPL = 0 when switching from real mode to protected mode. */ if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01)) cpu_state.seg_cs.access &= 0x9f; - cr0 = cpu_state.regs[cpu_rm].l; + if (!is_p6 && !cpu_use_dynarec && ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000)) + cr0 = (cr0 & 0x80000000) | (cpu_state.regs[cpu_rm].l & 0x7fffffff); + else + cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; if (!(cr0 & 0x80000000)) @@ -237,12 +250,21 @@ opMOV_CRx_r_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); switch (cpu_reg) { case 0: - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000001) + if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) flushmmucache(); + else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { + if (is_p6 && !cpu_use_dynarec) + flushmmucache(); + else + cpu_flush_pending = 1; + } /* Make sure CPL = 0 when switching from real mode to protected mode. */ if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01)) cpu_state.seg_cs.access &= 0x9f; - cr0 = cpu_state.regs[cpu_rm].l; + if (!is_p6 && !cpu_use_dynarec && ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000)) + cr0 = (cr0 & 0x80000000) | (cpu_state.regs[cpu_rm].l & 0x7fffffff); + else + cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; if (!(cr0 & 0x80000000)) diff --git a/src/cpu/x86_ops_mov_ctrl_2386.h b/src/cpu/x86_ops_mov_ctrl_2386.h index cae6c9957..6b6db8c94 100644 --- a/src/cpu/x86_ops_mov_ctrl_2386.h +++ b/src/cpu/x86_ops_mov_ctrl_2386.h @@ -9,6 +9,8 @@ opMOV_r_CRx_a16(uint32_t fetchdat) switch (cpu_reg) { case 0: cpu_state.regs[cpu_rm].l = cr0; + if (cpu_flush_pending) + cpu_state.regs[cpu_rm].l ^= 0x80000000; if (is486 || isibm486) cpu_state.regs[cpu_rm].l |= 0x10; /*ET hardwired on 486*/ else { @@ -49,6 +51,8 @@ opMOV_r_CRx_a32(uint32_t fetchdat) switch (cpu_reg) { case 0: cpu_state.regs[cpu_rm].l = cr0; + if (cpu_flush_pending) + cpu_state.regs[cpu_rm].l ^= 0x80000000; if (is486 || isibm486) cpu_state.regs[cpu_rm].l |= 0x10; /*ET hardwired on 486*/ else { @@ -176,12 +180,17 @@ opMOV_CRx_r_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); switch (cpu_reg) { case 0: - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000001) + if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) flushmmucache(); + else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) + cpu_flush_pending = 1; /* Make sure CPL = 0 when switching from real mode to protected mode. */ if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01)) cpu_state.seg_cs.access &= 0x9f; - cr0 = cpu_state.regs[cpu_rm].l; + if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) + cr0 = (cr0 & 0x80000000) | (cpu_state.regs[cpu_rm].l & 0x7fffffff); + else + cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; if (!(cr0 & 0x80000000)) @@ -233,12 +242,17 @@ opMOV_CRx_r_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); switch (cpu_reg) { case 0: - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000001) + if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) flushmmucache(); + else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) + cpu_flush_pending = 1; /* Make sure CPL = 0 when switching from real mode to protected mode. */ if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01)) cpu_state.seg_cs.access &= 0x9f; - cr0 = cpu_state.regs[cpu_rm].l; + if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) + cr0 = (cr0 & 0x80000000) | (cpu_state.regs[cpu_rm].l & 0x7fffffff); + else + cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; if (!(cr0 & 0x80000000)) diff --git a/src/cpu/x86_ops_pmode.h b/src/cpu/x86_ops_pmode.h index 4f32b0e37..b68aaffbd 100644 --- a/src/cpu/x86_ops_pmode.h +++ b/src/cpu/x86_ops_pmode.h @@ -431,12 +431,21 @@ op0F01_common(uint32_t fetchdat, int is32, int is286, int ea32) if (cpu_mod != 3) SEG_CHECK_WRITE(cpu_state.ea_seg); if (is386 && is32 && (cpu_mod == 3)) { - if (is486 || isibm486) - seteaw(cr0); - else if (is386 && !cpu_16bitbus) - seteaw(cr0 | /* 0x7FFFFF00 */ 0x7FFFFFE0); - else - seteaw(cr0 | 0x7FFFFFF0); + if (cpu_flush_pending) { + if (is486 || isibm486) + seteaw(cr0 ^ 0x80000000); + else if (is386 && !cpu_16bitbus) + seteaw((cr0 ^ 0x80000000) | /* 0x7FFFFF00 */ 0x7FFFFFE0); + else + seteaw((cr0 ^ 0x80000000) | 0x7FFFFFF0); + } else { + if (is486 || isibm486) + seteaw(cr0); + else if (is386 && !cpu_16bitbus) + seteaw(cr0 | /* 0x7FFFFF00 */ 0x7FFFFFE0); + else + seteaw(cr0 | 0x7FFFFFF0); + } } else { if (is486 || isibm486) seteaw(msw); From 208b213aacacb0dd1172619b660c88d45c33bac1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 27 Aug 2024 03:02:42 +0200 Subject: [PATCH 366/624] Media history: Fixed the handling of relative paths. --- src/qt/qt_mediahistorymanager.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index 672ccfa8d..50c16f70a 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -26,6 +26,7 @@ extern "C" { #include <86box/timer.h> #include <86box/cdrom.h> #include <86box/fdd.h> +#include <86box/path.h> } namespace ui { @@ -275,9 +276,6 @@ MediaHistoryManager::pathAdjustSingle(QString checked_path) if (file_info.filePath().isEmpty() || current_usr_path.isEmpty() || file_info.isRelative()) { return checked_path; } - if (file_info.filePath().startsWith(current_usr_path)) { - checked_path = file_info.filePath().remove(current_usr_path); - } return checked_path; } @@ -304,10 +302,25 @@ MediaHistoryManager::removeMissingImages(device_index_list_t &device_history) if (file_info.filePath().isEmpty()) { continue; } - // For this check, explicitly prepend `usr_path` to relative paths to account for $CWD platform variances - QFileInfo absolute_path = file_info.isRelative() ? QFileInfo(getUsrPath().append(file_info.filePath())) : file_info; - if ((file_info.filePath().left(8) != "ioctl://") && !absolute_path.exists()) { - qWarning("Image file %s does not exist - removing from history", qPrintable(file_info.filePath())); + + char *p = checked_path.toUtf8().data(); + char temp[1024] = { 0 }; + + if (path_abs(p)) { + if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) + fatal("removeMissingImages(): strlen(p) > 2047\n"); + else + snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s", p); + } else + snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path, + path_get_slash(usr_path), p); + path_normalize(temp); + + QString qstr = QString::fromUtf8(temp); + QFileInfo new_fi(qstr); + + if ((new_fi.filePath().left(8) != "ioctl://") && !new_fi.exists()) { + qWarning("Image file %s does not exist - removing from history", qPrintable(new_fi.filePath())); checked_path = ""; } } From c0037eaa2f7bc5601154eead401459f2a308a48f Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 27 Aug 2024 03:15:54 +0200 Subject: [PATCH 367/624] Media history implementation for the remaining devices: Part 1. --- src/include/86box/cartridge.h | 3 ++ src/include/86box/cassette.h | 3 ++ src/qt/qt_mediahistorymanager.cpp | 51 +++++++++++++++++++++++++------ src/qt/qt_mediahistorymanager.hpp | 7 ++++- 4 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/include/86box/cartridge.h b/src/include/86box/cartridge.h index 2fa0a9358..2ea7ec734 100644 --- a/src/include/86box/cartridge.h +++ b/src/include/86box/cartridge.h @@ -21,7 +21,10 @@ extern "C" { #endif +#define CART_IMAGE_HISTORY 4 + extern char cart_fns[2][512]; +extern char *cart_image_history[2][CART_IMAGE_HISTORY]; extern void cart_load(int drive, char *fn); extern void cart_close(int drive); diff --git a/src/include/86box/cassette.h b/src/include/86box/cassette.h index 3706ca632..bb0899e24 100644 --- a/src/include/86box/cassette.h +++ b/src/include/86box/cassette.h @@ -153,10 +153,13 @@ void pc_cas_print_state(const pc_cassette_t *cas); void pc_cas_clock(pc_cassette_t *cas, unsigned long cnt); void pc_cas_advance(pc_cassette_t *cas); +#define CASSETTE_IMAGE_HISTORY 4 + extern pc_cassette_t *cassette; extern char cassette_fname[512]; extern char cassette_mode[512]; +extern char * cassette_image_history[CASSETTE_IMAGE_HISTORY]; extern unsigned long cassette_pos; extern unsigned long cassette_srate; extern int cassette_enable; diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index 50c16f70a..52b93fc11 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -24,8 +24,12 @@ extern "C" { #include <86box/timer.h> -#include <86box/cdrom.h> +#include <86box/cassette.h> +#include <86box/cartridge.h> #include <86box/fdd.h> +#include <86box/cdrom.h> +#include <86box/zip.h> +#include <86box/mo.h> #include <86box/path.h> } @@ -101,7 +105,14 @@ MediaHistoryManager::getImageForSlot(int index, int slot, ui::MediaType type) int MediaHistoryManager::maxDevicesSupported(ui::MediaType type) { - return type == ui::MediaType::Cassette ? 1 : 4; + switch (type) { + default: + return 4; + case ui::MediaType::Cassette: + return 1; + case ui::MediaType::Cartridge: + return 2; + } } void @@ -164,14 +175,26 @@ MediaHistoryManager::initialDeduplication() for (int device_index = 0; device_index < maxDevicesSupported(device_type); device_index++) { device_index_list_t device_history = getHistoryListForDeviceIndex(device_index, device_type); switch (device_type) { - case ui::MediaType::Optical: - current_image = cdrom[device_index].image_path; + default: + continue; + break; + case ui::MediaType::Cassette: + current_image = cassette_fname; + break; + case ui::MediaType::Cartridge: + current_image = cart_fns[device_index]; break; case ui::MediaType::Floppy: current_image = floppyfns[device_index]; break; - default: - continue; + case ui::MediaType::Optical: + current_image = cdrom[device_index].image_path; + break; + case ui::MediaType::Zip: + current_image = zip[device_index].image_path; + break; + case ui::MediaType::Mo: + current_image = mo[device_index].image_path; break; } deduplicateList(device_history, QVector(1, current_image)); @@ -191,12 +214,20 @@ char ** MediaHistoryManager::getEmuHistoryVarForType(ui::MediaType type, int index) { switch (type) { - case ui::MediaType::Optical: - return &cdrom[index].image_history[0]; - case ui::MediaType::Floppy: - return &fdd_image_history[index][0]; default: return nullptr; + case ui::MediaType::Cassette: + return &cassette_image_history[0]; + case ui::MediaType::Cartridge: + return &cart_image_history[index][0]; + case ui::MediaType::Floppy: + return &fdd_image_history[index][0]; + case ui::MediaType::Optical: + return &cdrom[index].image_history[0]; + case ui::MediaType::Zip: + return &zip[index].image_history[0]; + case ui::MediaType::Mo: + return &mo[index].image_history[0]; } } diff --git a/src/qt/qt_mediahistorymanager.hpp b/src/qt/qt_mediahistorymanager.hpp index 4eae46f9c..191ae9e7b 100644 --- a/src/qt/qt_mediahistorymanager.hpp +++ b/src/qt/qt_mediahistorymanager.hpp @@ -47,7 +47,8 @@ enum class MediaType { Optical, Zip, Mo, - Cassette + Cassette, + Cartridge }; // This macro allows us to do a reverse lookup of the enum with `QMetaEnum` Q_ENUM_NS(MediaType) @@ -61,6 +62,10 @@ typedef QHash master_list_t; static const MediaType AllSupportedMediaHistoryTypes[] = { MediaType::Optical, MediaType::Floppy, + MediaType::Zip, + MediaType::Mo, + MediaType::Cassette, + MediaType::Cartridge, }; class MediaHistoryManager { From cd3f29f6226836367379735a069fb6ba35020ef9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 27 Aug 2024 03:29:37 +0200 Subject: [PATCH 368/624] Part 2. --- src/config.c | 101 +++++++++++++++++++++++++++++++++++++---- src/device/cartridge.c | 1 + src/device/cassette.c | 1 + 3 files changed, 95 insertions(+), 8 deletions(-) diff --git a/src/config.c b/src/config.c index 2c0781028..e35123dbf 100644 --- a/src/config.c +++ b/src/config.c @@ -861,16 +861,46 @@ load_storage_controllers(void) cassette_enable = !!ini_section_get_int(cat, "cassette_enabled", 0); else cassette_enable = 0; + p = ini_section_get_string(cat, "cassette_file", ""); - if (strlen(p) > 511) - fatal("load_storage_controllers(): strlen(p) > 511\n"); - else - strncpy(cassette_fname, p, 511); + + if (!strcmp(p, usr_path)) + p[0] = 0x00; + + if (p[0] != 0x00) { + if (path_abs(p)) { + if (strlen(p) > 511) + fatal("load_storage_controllers(): strlen(p) > 511 (cassette_fname)\n); + else + strncpy(cassette_fname, p, 511); + } else + path_append_filename(cassette_fname, usr_path, p); + path_normalize(cassette_fname); + } + p = ini_section_get_string(cat, "cassette_mode", ""); if (strlen(p) > 511) fatal("load_storage_controllers(): strlen(p) > 511\n"); else strncpy(cassette_mode, p, 511); + + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + cassette_image_history[i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char)); + sprintf(temp, "cassette_image_history_%02i", i + 1); + p = ini_section_get_string(cat, temp, NULL); + if (p) { + if (path_abs(p)) { + if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) + fatal("load_storage_controllers(): strlen(p) > 2047 " + "(cassette_image_history[%i])\n", i); + else + snprintf(cassette_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s", p); + } else + snprintf(csasette_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path, + path_get_slash(usr_path), p); + path_normalize(cassette_image_history[c][i]); + } + } cassette_pos = ini_section_get_int(cat, "cassette_position", 0); cassette_srate = ini_section_get_int(cat, "cassette_srate", 44100); cassette_append = !!ini_section_get_int(cat, "cassette_append", 0); @@ -894,6 +924,24 @@ load_storage_controllers(void) path_append_filename(cart_fns[c], usr_path, p); path_normalize(cart_fns[c]); } + + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + cart_image_history[c][i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char)); + sprintf(temp, "cart_%02i_image_history_%02i", c + 1, i + 1); + p = ini_section_get_string(cat, temp, NULL); + if (p) { + if (path_abs(p)) { + if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) + fatal("load_storage_controllers(): strlen(p) > 2047 " + "(cart_image_history[%i][%i])\n", c, i); + else + snprintf(cart_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s", p); + } else + snprintf(cart_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path, + path_get_slash(usr_path), p); + path_normalize(cart_image_history[c][i]); + } + } } lba_enhancer_enabled = !!ini_section_get_int(cat, "lba_enhancer_enabled", 0); @@ -2330,14 +2378,32 @@ save_storage_controllers(void) if (strlen(cassette_fname) == 0) ini_section_delete_var(cat, "cassette_file"); - else - ini_section_set_string(cat, "cassette_file", cassette_fname); + else { + path_normalize(cassette_fname); + if (!strnicmp(cassette_fname, usr_path, strlen(usr_path))) + ini_section_set_string(cat, "cassette_file", &cassette_fname[strlen(usr_path)]); + else + ini_section_set_string(cat, "cassette_file", cassette_fname); + } if (strlen(cassette_mode) == 0) ini_section_delete_var(cat, "cassette_mode"); else ini_section_set_string(cat, "cassette_mode", cassette_mode); + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + sprintf(temp, "cassette_image_history_%02i", i + 1); + if ((cassette_image_history[i] == 0) || strlen(cassette_image_history[i]) == 0) + ini_section_delete_var(cat, temp); + else { + path_normalize(cassette_image_history[i]); + if (!strnicmp(cassette_image_history[i], usr_path, strlen(usr_path))) + ini_section_set_string(cat, temp, &cassette_image_history[i][strlen(usr_path)]); + else + ini_section_set_string(cat, temp, cassette_image_history[i]); + } + } + if (cassette_pos == 0) ini_section_delete_var(cat, "cassette_position"); else @@ -2365,10 +2431,29 @@ save_storage_controllers(void) for (c = 0; c < 2; c++) { sprintf(temp, "cartridge_%02i_fn", c + 1); + if (strlen(cart_fns[c]) == 0) ini_section_delete_var(cat, temp); - else - ini_section_set_string(cat, temp, cart_fns[c]); + else { + path_normalize(cart_fns[c]); + if (!strnicmp(cart_fns[c], usr_path, strlen(usr_path))) + ini_section_set_string(cat, temp, &cart_fns[c][strlen(usr_path)]); + else + ini_section_set_string(cat, temp, cart_fns[c]); + } + + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + sprintf(temp, "cartridge_%02i_image_history_%02i", c + 1, i + 1); + if ((cart_image_history[c][i] == 0) || strlen(cart_image_history[c][i]) == 0) + ini_section_delete_var(cat, temp); + else { + path_normalize(cart_image_history[c][i]); + if (!strnicmp(cart_image_history[c][i], usr_path, strlen(usr_path))) + ini_section_set_string(cat, temp, &cart_image_history[c][i][strlen(usr_path)]); + else + ini_section_set_string(cat, temp, cart_image_history[c][i]); + } + } } if (lba_enhancer_enabled == 0) diff --git a/src/device/cartridge.c b/src/device/cartridge.c index a40c29c9b..52f36a4ca 100644 --- a/src/device/cartridge.c +++ b/src/device/cartridge.c @@ -35,6 +35,7 @@ typedef struct cart_t { } cart_t; char cart_fns[2][512]; +char *cart_image_history[2][CART_IMAGE_HISTORY]; static cart_t carts[2]; diff --git a/src/device/cassette.c b/src/device/cassette.c index 1d0b88531..a239c6393 100644 --- a/src/device/cassette.c +++ b/src/device/cassette.c @@ -45,6 +45,7 @@ pc_cassette_t *cassette; char cassette_fname[512]; char cassette_mode[512]; +char * cassette_image_history[CASSETTE_IMAGE_HISTORY]; unsigned long cassette_pos; unsigned long cassette_srate; int cassette_enable; From 26cc61fdba41c7f8b9b0a1d687134dddcc170b10 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 27 Aug 2024 05:09:35 +0200 Subject: [PATCH 369/624] Part 3. --- src/config.c | 10 +-- src/qt/qt_mediahistorymanager.cpp | 10 ++- src/qt/qt_mediahistorymanager.hpp | 2 +- src/qt/qt_mediamenu.cpp | 140 +++++++++++++++++++++++++++--- src/qt/qt_mediamenu.hpp | 14 ++- 5 files changed, 149 insertions(+), 27 deletions(-) diff --git a/src/config.c b/src/config.c index e35123dbf..0153e20e8 100644 --- a/src/config.c +++ b/src/config.c @@ -870,7 +870,7 @@ load_storage_controllers(void) if (p[0] != 0x00) { if (path_abs(p)) { if (strlen(p) > 511) - fatal("load_storage_controllers(): strlen(p) > 511 (cassette_fname)\n); + fatal("load_storage_controllers(): strlen(p) > 511 (cassette_fname)\n"); else strncpy(cassette_fname, p, 511); } else @@ -894,11 +894,11 @@ load_storage_controllers(void) fatal("load_storage_controllers(): strlen(p) > 2047 " "(cassette_image_history[%i])\n", i); else - snprintf(cassette_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s", p); + snprintf(cassette_image_history[i], (MAX_IMAGE_PATH_LEN - 1), "%s", p); } else - snprintf(csasette_image_history[c][i], (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path, + snprintf(cassette_image_history[i], (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path, path_get_slash(usr_path), p); - path_normalize(cassette_image_history[c][i]); + path_normalize(cassette_image_history[i]); } } cassette_pos = ini_section_get_int(cat, "cassette_position", 0); @@ -927,7 +927,7 @@ load_storage_controllers(void) for (int i = 0; i < MAX_PREV_IMAGES; i++) { cart_image_history[c][i] = (char *) calloc((MAX_IMAGE_PATH_LEN + 1) << 1, sizeof(char)); - sprintf(temp, "cart_%02i_image_history_%02i", c + 1, i + 1); + sprintf(temp, "cartridge_%02i_image_history_%02i", c + 1, i + 1); p = ini_section_get_string(cat, temp, NULL); if (p) { if (path_abs(p)) { diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index 52b93fc11..9886c205b 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -24,10 +24,12 @@ extern "C" { #include <86box/timer.h> +#include <86box/device.h> #include <86box/cassette.h> #include <86box/cartridge.h> #include <86box/fdd.h> #include <86box/cdrom.h> +#include <86box/scsi_device.h> #include <86box/zip.h> #include <86box/mo.h> #include <86box/path.h> @@ -191,10 +193,10 @@ MediaHistoryManager::initialDeduplication() current_image = cdrom[device_index].image_path; break; case ui::MediaType::Zip: - current_image = zip[device_index].image_path; + current_image = zip_drives[device_index].image_path; break; case ui::MediaType::Mo: - current_image = mo[device_index].image_path; + current_image = mo_drives[device_index].image_path; break; } deduplicateList(device_history, QVector(1, current_image)); @@ -225,9 +227,9 @@ MediaHistoryManager::getEmuHistoryVarForType(ui::MediaType type, int index) case ui::MediaType::Optical: return &cdrom[index].image_history[0]; case ui::MediaType::Zip: - return &zip[index].image_history[0]; + return &zip_drives[index].image_history[0]; case ui::MediaType::Mo: - return &mo[index].image_history[0]; + return &mo_drives[index].image_history[0]; } } diff --git a/src/qt/qt_mediahistorymanager.hpp b/src/qt/qt_mediahistorymanager.hpp index 191ae9e7b..29ada8e2a 100644 --- a/src/qt/qt_mediahistorymanager.hpp +++ b/src/qt/qt_mediahistorymanager.hpp @@ -65,7 +65,7 @@ static const MediaType AllSupportedMediaHistoryTypes[] = { MediaType::Zip, MediaType::Mo, MediaType::Cassette, - MediaType::Cartridge, + MediaType::Cartridge }; class MediaHistoryManager { diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index c80d9d17f..d9db79db0 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -91,6 +91,11 @@ MediaMenu::refresh(QMenu *parentMenu) cassetteMenu->addAction(tr("&Existing image..."), [this]() { cassetteSelectImage(false); }); cassetteMenu->addAction(tr("Existing image (&Write-protected)..."), [this]() { cassetteSelectImage(true); }); 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->addSeparator(); cassetteRecordPos = cassetteMenu->children().count(); cassetteMenu->addAction(tr("&Record"), [this] { pc_cas_set_mode(cassette, 1); cassetteUpdateMenu(); })->setCheckable(true); cassettePlayPos = cassetteMenu->children().count(); @@ -111,6 +116,11 @@ MediaMenu::refresh(QMenu *parentMenu) auto *menu = parentMenu->addMenu(""); menu->addAction(tr("&Image..."), [this, i]() { cartridgeSelectImage(i); }); 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->addSeparator(); cartridgeEjectPos = menu->children().count(); menu->addAction(tr("E&ject"), [this, i]() { cartridgeEject(i); }); cartridgeMenus[i] = menu; @@ -179,10 +189,13 @@ MediaMenu::refresh(QMenu *parentMenu) menu->addAction(tr("&Existing image..."), [this, i]() { zipSelectImage(i, false); }); menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { zipSelectImage(i, true); }); 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->addSeparator(); zipEjectPos = menu->children().count(); menu->addAction(tr("E&ject"), [this, i]() { zipEject(i); }); - zipReloadPos = menu->children().count(); - menu->addAction(tr("&Reload previous image"), [this, i]() { zipReload(i); }); zipMenus[i] = menu; zipUpdateMenu(i); }); @@ -195,10 +208,13 @@ MediaMenu::refresh(QMenu *parentMenu) menu->addAction(tr("&Existing image..."), [this, i]() { moSelectImage(i, false); }); menu->addAction(tr("Existing image (&Write-protected)..."), [this, i]() { moSelectImage(i, true); }); 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->addSeparator(); moEjectPos = menu->children().count(); menu->addAction(tr("E&ject"), [this, i]() { moEject(i); }); - moReloadPos = menu->children().count(); - menu->addAction(tr("&Reload previous image"), [this, i]() { moReload(i); }); moMenus[i] = menu; moUpdateMenu(i); }); @@ -243,9 +259,19 @@ MediaMenu::cassetteSelectImage(bool wp) cassetteMount(filename, wp); } +void +MediaMenu::cassetteMenuSelect(int slot) +{ + QString filename = mhm.getImageForSlot(0, slot, ui::MediaType::Cassette); + cassetteMount(filename.toUtf8().constData(), 0); + cassetteUpdateMenu(); + ui_sb_update_tip(SB_CASSETTE); +} + void MediaMenu::cassetteMount(const QString &filename, bool wp) { + auto previous_image = QFileInfo(cassette_fname); pc_cas_set_fname(cassette, nullptr); memset(cassette_fname, 0, sizeof(cassette_fname)); cassette_ui_writeprot = wp ? 1 : 0; @@ -257,6 +283,7 @@ MediaMenu::cassetteMount(const QString &filename, bool wp) } ui_sb_update_icon_state(SB_CASSETTE, filename.isEmpty() ? 1 : 0); + mhm.addImageToHistory(0, ui::MediaType::Cassette, previous_image.filePath(), filename); cassetteUpdateMenu(); ui_sb_update_tip(SB_CASSETTE); config_save(); @@ -265,6 +292,7 @@ MediaMenu::cassetteMount(const QString &filename, bool wp) void MediaMenu::cassetteEject() { + mhm.addImageToHistory(0, ui::MediaType::Cassette, cassette_fname, QString()); pc_cas_set_fname(cassette, nullptr); memset(cassette_fname, 0, sizeof(cassette_fname)); ui_sb_update_icon_state(SB_CASSETTE, 1); @@ -297,16 +325,22 @@ MediaMenu::cassetteUpdateMenu() cassetteMenu->setTitle(QString::asprintf(tr("Cassette: %s").toUtf8().constData(), (name.isEmpty() ? tr("(empty)") : name).toUtf8().constData())); + + for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { + updateImageHistory(0, slot, ui::MediaType::Cassette); + } } void MediaMenu::cartridgeMount(int i, const QString &filename) { + auto previous_image = QFileInfo(cart_fns[i]); cart_close(i); QByteArray filenameBytes = filename.toUtf8(); cart_load(i, filenameBytes.data()); ui_sb_update_icon_state(SB_CARTRIDGE | i, filename.isEmpty() ? 1 : 0); + mhm.addImageToHistory(i, ui::MediaType::Cartridge, previous_image.filePath(), filename); cartridgeUpdateMenu(i); ui_sb_update_tip(SB_CARTRIDGE | i); config_save(); @@ -327,9 +361,19 @@ MediaMenu::cartridgeSelectImage(int i) cartridgeMount(i, filename); } +void +MediaMenu::cartridgeMenuSelect(int index, int slot) +{ + QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Cartridge); + cartridgeMount(index, filename.toUtf8().constData()); + cartridgeUpdateMenu(index); + ui_sb_update_tip(SB_CARTRIDGE | index); +} + void MediaMenu::cartridgeEject(int i) { + mhm.addImageToHistory(i, ui::MediaType::Cartridge, cart_fns[i], QString()); cart_close(i); ui_sb_update_icon_state(SB_CARTRIDGE | i, 1); cartridgeUpdateMenu(i); @@ -347,6 +391,10 @@ MediaMenu::cartridgeUpdateMenu(int i) 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())); + + for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) { + updateImageHistory(i, slot, ui::MediaType::Cartridge); + } } void @@ -580,6 +628,36 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) QString menu_item_name; switch (type) { + default: + menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData(); + return; + case ui::MediaType::Cassette: + if (!MachineStatus::hasCassette()) + return; + menu = cassetteMenu; + 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(); + break; + case ui::MediaType::Cartridge: + if (!machine_has_cartridge(machine)) + return; + menu = cartridgeMenus[index]; + 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(); + break; + case ui::MediaType::Floppy: + if (!floppyMenus.contains(index)) + return; + menu = floppyMenus[index]; + 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(); + break; case ui::MediaType::Optical: if (!cdromMenus.contains(index)) return; @@ -600,18 +678,24 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type) } imageHistoryUpdatePos->setIcon(menu_icon); break; - case ui::MediaType::Floppy: - if (!floppyMenus.contains(index)) + case ui::MediaType::Zip: + if (!zipMenus.contains(index)) return; - menu = floppyMenus[index]; + menu = zipMenus[index]; children = menu->children(); - imageHistoryUpdatePos = dynamic_cast(children[floppyImageHistoryPos[slot]]); + imageHistoryUpdatePos = dynamic_cast(children[zipImageHistoryPos[slot]]); fi.setFile(fn); menu_item_name = fi.fileName().isEmpty() ? tr("previous image").toUtf8().constData() : fi.fileName().toUtf8().constData(); break; - default: + case ui::MediaType::Mo: + if (!moMenus.contains(index)) + return; + menu = moMenus[index]; + 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(); - return; + break; } imageHistoryUpdatePos->setText(QString::asprintf(tr("%s").toUtf8().constData(), menu_item_name.toUtf8().constData())); @@ -727,6 +811,7 @@ MediaMenu::zipMount(int i, const QString &filename, bool wp) zip_load(dev, filenameBytes.data()); zip_insert(dev); } + mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].prev_image_path, zip_drives[i].image_path); ui_sb_update_icon_state(SB_ZIP | i, filename.isEmpty() ? 1 : 0); zipUpdateMenu(i); @@ -740,6 +825,7 @@ MediaMenu::zipEject(int i) { const auto dev = static_cast(zip_drives[i].priv); + mhm.addImageToHistory(i, ui::MediaType::Zip, zip_drives[i].image_path, QString()); zip_disk_close(dev); zip_drives[i].image_path[0] = 0; if (zip_drives[i].bus_type) { @@ -754,7 +840,7 @@ MediaMenu::zipEject(int i) } void -MediaMenu::zipReload(int i) +MediaMenu::zipReloadPrev(int i) { const auto dev = static_cast(zip_drives[i].priv); @@ -771,6 +857,15 @@ MediaMenu::zipReload(int i) config_save(); } +void +MediaMenu::zipReload(int index, int slot) +{ + const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Zip); + zipMount(index, filename, false); + zipUpdateMenu(index); + ui_sb_update_tip(SB_ZIP | index); +} + void MediaMenu::zipUpdateMenu(int i) { @@ -800,6 +895,9 @@ MediaMenu::zipUpdateMenu(int i) // 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())); + + for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) + updateImageHistory(i, slot, ui::MediaType::Zip); } void @@ -844,6 +942,7 @@ MediaMenu::moMount(int i, const QString &filename, bool wp) mo_load(dev, filenameBytes.data()); mo_insert(dev); } + mhm.addImageToHistory(i, ui::MediaType::Mo, mo_drives[i].prev_image_path, mo_drives[i].image_path); ui_sb_update_icon_state(SB_MO | i, filename.isEmpty() ? 1 : 0); moUpdateMenu(i); @@ -857,6 +956,7 @@ MediaMenu::moEject(int i) { const auto dev = static_cast(mo_drives[i].priv); + mhm.addImageToHistory(i, ui::MediaType::Mo, mo_drives[i].image_path, QString()); mo_disk_close(dev); mo_drives[i].image_path[0] = 0; if (mo_drives[i].bus_type) { @@ -871,7 +971,7 @@ MediaMenu::moEject(int i) } void -MediaMenu::moReload(int i) +MediaMenu::moReloadPrev(int i) { mo_t *dev = (mo_t *) mo_drives[i].priv; @@ -888,6 +988,15 @@ MediaMenu::moReload(int i) config_save(); } +void +MediaMenu::moReload(int index, int slot) +{ + const QString filename = mhm.getImageForSlot(index, slot, ui::MediaType::Mo); + moMount(index, filename, false); + moUpdateMenu(index); + ui_sb_update_tip(SB_MO | index); +} + void MediaMenu::moUpdateMenu(int i) { @@ -916,6 +1025,9 @@ MediaMenu::moUpdateMenu(int i) } 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())); + + for (int slot = 0; slot < MAX_PREV_IMAGES; slot++) + updateImageHistory(i, slot, ui::MediaType::Mo); } void @@ -1043,7 +1155,7 @@ zip_mount(uint8_t id, char *fn, uint8_t wp) void zip_reload(uint8_t id) { - MediaMenu::ptr->zipReload(id); + MediaMenu::ptr->zipReloadPrev(id); } void @@ -1061,6 +1173,6 @@ mo_mount(uint8_t id, char *fn, uint8_t wp) void mo_reload(uint8_t id) { - MediaMenu::ptr->moReload(id); + MediaMenu::ptr->moReloadPrev(id); } } diff --git a/src/qt/qt_mediamenu.hpp b/src/qt/qt_mediamenu.hpp index 725ce92b3..aec2f553f 100644 --- a/src/qt/qt_mediamenu.hpp +++ b/src/qt/qt_mediamenu.hpp @@ -24,12 +24,14 @@ public: void cassetteNewImage(); void cassetteSelectImage(bool wp); void cassetteMount(const QString &filename, bool wp); + void cassetteMenuSelect(int slot); void cassetteEject(); void cassetteUpdateMenu(); void cartridgeSelectImage(int i); void cartridgeMount(int i, const QString &filename); void cartridgeEject(int i); + void cartridgeMenuSelect(int index, int slot); void cartridgeUpdateMenu(int i); void floppyNewImage(int i); @@ -53,14 +55,16 @@ public: void zipSelectImage(int i, bool wp); void zipMount(int i, const QString &filename, bool wp); void zipEject(int i); - void zipReload(int i); + void zipReloadPrev(int i); + void zipReload(int index, int slot); void zipUpdateMenu(int i); void moNewImage(int i); void moSelectImage(int i, bool wp); void moMount(int i, const QString &filename, bool wp); void moEject(int i); - void moReload(int i); + void moReloadPrev(int i); + void moReload(int index, int slot); void moUpdateMenu(int i); void nicConnect(int i); @@ -94,24 +98,28 @@ private: int cassetteRewindPos; int cassetteFastFwdPos; int cassetteEjectPos; + int cassetteImageHistoryPos[MAX_PREV_IMAGES]; int cartridgeEjectPos; + int cartridgeImageHistoryPos[MAX_PREV_IMAGES]; int floppyExportPos; int floppyEjectPos; + int floppyImageHistoryPos[MAX_PREV_IMAGES]; int cdromMutePos; int cdromReloadPos; int cdromImagePos; int cdromDirPos; int cdromImageHistoryPos[MAX_PREV_IMAGES]; - int floppyImageHistoryPos[MAX_PREV_IMAGES]; int zipEjectPos; int zipReloadPos; + int zipImageHistoryPos[MAX_PREV_IMAGES]; int moEjectPos; int moReloadPos; + int moImageHistoryPos[MAX_PREV_IMAGES]; int netDisconnPos; From 01267965ca1694862834da7cf5c125512bb70d5c Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 27 Aug 2024 05:13:18 +0200 Subject: [PATCH 370/624] DEC Tulip: Fixed BIOS disabling. --- src/network/net_tulip.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_tulip.c b/src/network/net_tulip.c index 060e11fba..ca43b0844 100644 --- a/src/network/net_tulip.c +++ b/src/network/net_tulip.c @@ -1638,7 +1638,7 @@ nic_init(const device_t *info) s->pci_conf[0x04] = 7; /* Enable our BIOS space in PCI, if needed. */ - if (s->bios_addr > 0) { + if (s->has_bios) { rom_init(&s->bios_rom, ROM_PATH_DEC21140, s->bios_addr, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); tulip_pci_bar[2].addr = 0xffff0000; } else From 690b9707391d8170ab7844b728b8c6ba517aba14 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 27 Aug 2024 16:36:32 +0200 Subject: [PATCH 371/624] Fixed a condition in write to CR0. --- src/cpu/x86_ops_mov_ctrl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cpu/x86_ops_mov_ctrl.h b/src/cpu/x86_ops_mov_ctrl.h index f6fcda983..c8ac9ab63 100644 --- a/src/cpu/x86_ops_mov_ctrl.h +++ b/src/cpu/x86_ops_mov_ctrl.h @@ -187,7 +187,7 @@ opMOV_CRx_r_a16(uint32_t fetchdat) if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) flushmmucache(); else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { - if (is_p6 && !cpu_use_dynarec) + if (is_p6 || cpu_use_dynarec) flushmmucache(); else cpu_flush_pending = 1; @@ -253,7 +253,7 @@ opMOV_CRx_r_a32(uint32_t fetchdat) if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) flushmmucache(); else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { - if (is_p6 && !cpu_use_dynarec) + if (is_p6 || cpu_use_dynarec) flushmmucache(); else cpu_flush_pending = 1; From d76ded5fbdf8dd4e650d11ef54fe478cefb96982 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 27 Aug 2024 15:10:32 -0300 Subject: [PATCH 372/624] Jenkins: Workaround for MacPorts wget dependency failing to build on Intel targets MacPorts issue referenced: https://trac.macports.org/ticket/69406 --- .ci/build.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.ci/build.sh b/.ci/build.sh index a53ea0671..ca77d7b83 100755 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -535,6 +535,14 @@ then sudo sed -i -e 's/-no-feature-vulkan/-feature-vulkan/g' "$qt5_portfile" sudo sed -i -e 's/configure.env-append MAKE=/configure.env-append VULKAN_SDK=${prefix} MAKE=/g' "$qt5_portfile" fi + + # Patch wget to remove libproxy support, as it depends on shared-mime-info which + # fails to build for a 10.14 target, which we have to do despite wget only being + # a host dependency. MacPorts issue 69406 strongly implies this will not be fixed. + wget_portfile="$macports/var/macports/sources/rsync.macports.org/macports/release/tarballs/ports/net/wget/Portfile" + sudo sed -i -e 's/--enable-libproxy/--disable-libproxy/g' "$wget_portfile" + sudo sed -i -e 's/port:libproxy//g' "$wget_portfile" + while : do # Attempt to install dependencies. From 47ee1c4ead68d9da607e6e3c8d30cd705a8badbe Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 27 Aug 2024 22:17:52 +0200 Subject: [PATCH 373/624] Some fixes to the Streams engine of the ViRGE/Trio3D Make sure the ViRGE GX2 and up (including the Trio3D/2X) use the secondary stream only per what was found in the past. --- src/video/vid_s3_virge.c | 259 +++++++++++++++++++++------------------ 1 file changed, 141 insertions(+), 118 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 66682b440..3719d2591 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -867,7 +867,7 @@ s3_virge_recalctimings(svga_t *svga) video_force_resize_set_monitor(1, svga->monitor_index); } - if (((svga->crtc[0x67] & 0xc) != 0xc) || (virge->chip >= S3_VIRGEGX2)) { /*VGA mode*/ + if ((svga->crtc[0x67] & 0xc) != 0xc) { /*VGA mode*/ svga->ma_latch |= (virge->ma_ext << 16); if (svga->crtc[0x51] & 0x30) svga->rowoffset |= (svga->crtc[0x51] & 0x30) << 4; @@ -898,7 +898,7 @@ s3_virge_recalctimings(svga_t *svga) case 24: svga->render = svga_render_24bpp_highres; if ((virge->chip != S3_VIRGEVX) && (virge->chip < S3_VIRGEGX2)) - svga->rowoffset = (svga->rowoffset * 3) / 4; /*Hack*/ + svga->rowoffset = (svga->rowoffset * 3) >> 2; /*Hack*/ break; case 32: svga->render = svga_render_32bpp_highres; @@ -910,37 +910,32 @@ s3_virge_recalctimings(svga_t *svga) svga->vram_display_mask = (!(svga->crtc[0x31] & 0x08) && (svga->crtc[0x32] & 0x40)) ? 0x3ffff : virge->vram_mask; - - svga->overlay.ena = 0; - - if (virge->chip >= S3_VIRGEGX2 && (svga->crtc[0x67] & 0xc) == 0xc) { - /* ViRGE/GX2 and later does not use primary stream registers. */ - svga->overlay.x = virge->streams.sec_x; - svga->overlay.y = virge->streams.sec_y; - svga->overlay.cur_ysize = virge->streams.sec_h; - - if (virge->streams.buffer_ctrl & 2) - svga->overlay.addr = virge->streams.sec_fb1; - else - svga->overlay.addr = virge->streams.sec_fb0; - - svga->overlay.ena = (svga->overlay.x >= 0) && !!(virge->streams.blend_ctrl & 0x20); - svga->overlay.v_acc = virge->streams.dda_vert_accumulator; - svga->rowoffset = virge->streams.pri_stride >> 3; - svga->vram_display_mask = virge->vram_mask; - } } else { /*Streams mode*/ - if (virge->streams.buffer_ctrl & 1) - svga->ma_latch = virge->streams.pri_fb1 >> 2; - else - svga->ma_latch = virge->streams.pri_fb0 >> 2; + if (virge->chip < S3_VIRGEGX2) { + if (virge->streams.buffer_ctrl & 1) + svga->ma_latch = virge->streams.pri_fb1 >> 2; + else + svga->ma_latch = virge->streams.pri_fb0 >> 2; - svga->hdisp = virge->streams.pri_w + 1; - if (virge->streams.pri_h < svga->dispend) - svga->dispend = virge->streams.pri_h; + svga->hdisp = virge->streams.pri_w + 1; + if (virge->streams.pri_h < svga->dispend) + svga->dispend = virge->streams.pri_h; + + svga->overlay.x = virge->streams.sec_x - virge->streams.pri_x; + svga->overlay.y = virge->streams.sec_y - virge->streams.pri_y; + } else { + svga->ma_latch |= (virge->ma_ext << 16); + if (svga->crtc[0x51] & 0x30) + svga->rowoffset |= (svga->crtc[0x51] & 0x30) << 4; + else if (svga->crtc[0x43] & 0x04) + svga->rowoffset |= 0x100; + if (!svga->rowoffset) + svga->rowoffset = 256; + + svga->overlay.x = virge->streams.sec_x; + svga->overlay.y = virge->streams.sec_y; + } - svga->overlay.x = virge->streams.sec_x - virge->streams.pri_x; - svga->overlay.y = virge->streams.sec_y - virge->streams.pri_y; svga->overlay.cur_ysize = virge->streams.sec_h; if (virge->streams.buffer_ctrl & 2) @@ -949,35 +944,60 @@ s3_virge_recalctimings(svga_t *svga) svga->overlay.addr = virge->streams.sec_fb0; svga->overlay.ena = (svga->overlay.x >= 0); + svga->overlay.h_acc = virge->streams.dda_horiz_accumulator; svga->overlay.v_acc = virge->streams.dda_vert_accumulator; - svga->rowoffset = virge->streams.pri_stride >> 3; + if (virge->chip < S3_VIRGEGX2) + svga->rowoffset = virge->streams.pri_stride >> 3; if (virge->chip <= S3_VIRGEDX && svga->overlay.ena) { svga->overlay.ena = (((virge->streams.blend_ctrl >> 24) & 7) == 0b000) || (((virge->streams.blend_ctrl >> 24) & 7) == 0b101); - } else if (virge->chip == S3_VIRGEGX2 && svga->overlay.ena) { + } else if (virge->chip >= S3_VIRGEGX2 && svga->overlay.ena) { /* 0x20 = Secondary Stream enabled */ /* 0x2000 = Primary Stream enabled */ svga->overlay.ena = !!(virge->streams.blend_ctrl & 0x20); } - switch ((virge->streams.pri_ctrl >> 24) & 0x7) { - case 0: /*RGB-8 (CLUT)*/ - svga->render = svga_render_8bpp_highres; - break; - case 3: /*KRGB-16 (1.5.5.5)*/ - svga->render = svga_render_15bpp_highres; - break; - case 5: /*RGB-16 (5.6.5)*/ - svga->render = svga_render_16bpp_highres; - break; - case 6: /*RGB-24 (8.8.8)*/ - svga->render = svga_render_24bpp_highres; - break; - case 7: /*XRGB-32 (X.8.8.8)*/ - svga->render = svga_render_32bpp_highres; - break; + if (virge->chip >= S3_VIRGEGX2) { + switch (svga->bpp) { + case 8: + svga->render = svga_render_8bpp_highres; + break; + case 15: + svga->render = svga_render_15bpp_highres; + break; + case 16: + svga->render = svga_render_16bpp_highres; + break; + case 24: + svga->render = svga_render_24bpp_highres; + break; + case 32: + svga->render = svga_render_32bpp_highres; + break; + + default: + break; + } + } else { + switch ((virge->streams.pri_ctrl >> 24) & 0x7) { + case 0: /*RGB-8 (CLUT)*/ + svga->render = svga_render_8bpp_highres; + break; + case 3: /*KRGB-16 (1.5.5.5)*/ + svga->render = svga_render_15bpp_highres; + break; + case 5: /*RGB-16 (5.6.5)*/ + svga->render = svga_render_16bpp_highres; + break; + case 6: /*RGB-24 (8.8.8)*/ + svga->render = svga_render_24bpp_highres; + break; + case 7: /*XRGB-32 (X.8.8.8)*/ + svga->render = svga_render_32bpp_highres; + break; + } } svga->vram_display_mask = virge->vram_mask; } @@ -990,29 +1010,6 @@ s3_virge_recalctimings(svga_t *svga) svga->render = svga_render_2bpp_s3_highres; } -static void -s3_virge_update_buffer(virge_t *virge) -{ - svga_t *svga = &virge->svga; - - if ((svga->crtc[0x67] & 0xc) != 0xc) - return; - - if (virge->chip < S3_VIRGEGX2) { - if (virge->streams.buffer_ctrl & 1) - svga->ma_latch = virge->streams.pri_fb1 >> 2; - else - svga->ma_latch = virge->streams.pri_fb0 >> 2; - } - - if (virge->streams.buffer_ctrl & 2) - svga->overlay.addr = virge->streams.sec_fb1; - else - svga->overlay.addr = virge->streams.sec_fb0; - - svga->rowoffset = virge->streams.pri_stride >> 3; -} - static void s3_virge_updatemapping(virge_t *virge) { svga_t *svga = &virge->svga; @@ -1844,39 +1841,46 @@ s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type) } static void -s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) { +s3_virge_mmio_write(uint32_t addr, uint8_t val, void *priv) +{ virge_t *virge = (virge_t *) priv; if ((addr & 0xffff) < 0x8000) s3_virge_queue(virge, addr, val, FIFO_WRITE_BYTE); - else switch (addr & 0xffff) { - case 0x83b0 ... 0x83df: - s3_virge_out(addr & 0x3ff, val, priv); - break; + else { + switch (addr & 0xffff) { + default: + case 0x83b0 ... 0x83df: + s3_virge_out(addr & 0x3ff, val, priv); + break; - case 0xff20: - virge->serialport = val; - i2c_gpio_set(virge->i2c, !!(val & SERIAL_PORT_SCW), !!(val & SERIAL_PORT_SDW)); - break; + case 0xff20: + virge->serialport = val; + i2c_gpio_set(virge->i2c, !!(val & SERIAL_PORT_SCW), !!(val & SERIAL_PORT_SDW)); + break; + } } } static void -s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv) { +s3_virge_mmio_write_w(uint32_t addr, uint16_t val, void *priv) +{ virge_t *virge = (virge_t *) priv; if ((addr & 0xfffe) < 0x8000) s3_virge_queue(virge, addr, val, FIFO_WRITE_WORD); - else switch (addr & 0xfffe) { - default: - case 0x83d4: - s3_virge_mmio_write(addr, val, priv); - s3_virge_mmio_write(addr + 1, val >> 8, priv); - break; + else { + switch (addr & 0xfffe) { + default: + case 0x83d4: + s3_virge_mmio_write(addr, val, priv); + s3_virge_mmio_write(addr + 1, val >> 8, priv); + break; - case 0xff20: - s3_virge_mmio_write(addr, val, priv); - break; + case 0xff20: + s3_virge_mmio_write(addr, val, priv); + break; + } } } @@ -1902,8 +1906,9 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { case 0x8190: virge->streams.sec_ctrl = val; virge->streams.dda_horiz_accumulator = val & 0xfff; - if (val & (1 << 11)) - virge->streams.dda_horiz_accumulator |= 0xfffff800; + if (val & 0x1000) + virge->streams.dda_horiz_accumulator |= ~0xfff; + virge->streams.sdif = (val >> 24) & 7; break; case 0x8194: @@ -1912,50 +1917,56 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { case 0x8198: virge->streams.sec_filter = val; virge->streams.k1_horiz_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k1_horiz_scale |= 0xfffff800; + if (val & 0x800) + virge->streams.k1_horiz_scale |= ~0x7ff; + virge->streams.k2_horiz_scale = (val >> 16) & 0x7ff; - if ((val >> 16) & (1 << 10)) - virge->streams.k2_horiz_scale |= 0xfffff800; + if ((val >> 16) & 0x800) + virge->streams.k2_horiz_scale |= ~0x7ff; + + svga_recalctimings(svga); + svga->fullchange = changeframecount; break; case 0x81a0: virge->streams.blend_ctrl = val; + svga_recalctimings(svga); + svga->fullchange = changeframecount; break; case 0x81c0: virge->streams.pri_fb0 = val & ((virge->memory_size == 8) ? (val & 0x7fffff) : (val & 0x3fffff)); - s3_virge_update_buffer(virge); + svga_recalctimings(svga); svga->fullchange = changeframecount; break; case 0x81c4: virge->streams.pri_fb1 = ((virge->memory_size == 8) ? (val & 0x7fffff) : (val & 0x3fffff)); - s3_virge_update_buffer(virge); + svga_recalctimings(svga); svga->fullchange = changeframecount; break; case 0x81c8: virge->streams.pri_stride = val & 0xfff; - s3_virge_update_buffer(virge); + svga_recalctimings(svga); svga->fullchange = changeframecount; break; case 0x81cc: virge->streams.buffer_ctrl = val; - s3_virge_update_buffer(virge); + svga_recalctimings(svga); svga->fullchange = changeframecount; break; case 0x81d0: virge->streams.sec_fb0 = val; - s3_virge_update_buffer(virge); + svga_recalctimings(svga); svga->fullchange = changeframecount; break; case 0x81d4: virge->streams.sec_fb1 = val; - s3_virge_update_buffer(virge); + svga_recalctimings(svga); svga->fullchange = changeframecount; break; case 0x81d8: virge->streams.sec_stride = val; - s3_virge_update_buffer(virge); + svga_recalctimings(svga); svga->fullchange = changeframecount; break; case 0x81dc: @@ -1963,18 +1974,21 @@ s3_virge_mmio_write_l(uint32_t addr, uint32_t val, void *priv) { break; case 0x81e0: virge->streams.k1_vert_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k1_vert_scale |= 0xfffff800; + if (val & 0x800) + virge->streams.k1_vert_scale |= ~0x7ff; break; case 0x81e4: virge->streams.k2_vert_scale = val & 0x7ff; - if (val & (1 << 10)) - virge->streams.k2_vert_scale |= 0xfffff800; + if (val & 0x800) + virge->streams.k2_vert_scale |= ~0x7ff; break; case 0x81e8: virge->streams.dda_vert_accumulator = val & 0xfff; - if (val & (1 << 11)) - virge->streams.dda_vert_accumulator |= 0xfffff800; + if (val & 0x1000) + virge->streams.dda_vert_accumulator |= ~0xfff; + + svga_recalctimings(svga); + svga->fullchange = changeframecount; break; case 0x81ec: virge->streams.fifo_ctrl = val; @@ -3968,10 +3982,10 @@ static void s3_virge_hwcursor_draw(svga_t *svga, int displine) { } while (0) static void -s3_virge_overlay_draw(svga_t *svga, int displine) { +s3_virge_overlay_draw(svga_t *svga, int displine) +{ virge_t *virge = (virge_t *) svga->priv; - int offset = (virge->streams.sec_x - virge->streams.pri_x) + 1; - int h_acc = virge->streams.dda_horiz_accumulator; + int offset; int r[8]; int g[8]; int b[8]; @@ -3982,11 +3996,19 @@ s3_virge_overlay_draw(svga_t *svga, int displine) { uint32_t *p; uint8_t *src = &svga->vram[svga->overlay_latch.addr]; + if (virge->chip < S3_VIRGEGX2) + offset = (virge->streams.sec_x - virge->streams.pri_x) + 1; + else + offset = virge->streams.sec_x + 1; + p = &((uint32_t *)buffer32->line[displine])[offset + svga->x_add]; - if ((offset + virge->streams.sec_w) > virge->streams.pri_w) - x_size = (virge->streams.pri_w - virge->streams.sec_x) + 1; - else + if (virge->chip < S3_VIRGEGX2) { + if ((offset + virge->streams.sec_w) > virge->streams.pri_w) + x_size = (virge->streams.pri_w - virge->streams.sec_x) + 1; + else + x_size = virge->streams.sec_w + 1; + } else x_size = virge->streams.sec_w + 1; OVERLAY_SAMPLE(); @@ -3994,13 +4016,14 @@ s3_virge_overlay_draw(svga_t *svga, int displine) { for (x = 0; x < x_size; x++) { *p++ = r[x_read] | (g[x_read] << 8) | (b[x_read] << 16); - h_acc += virge->streams.k1_horiz_scale; - if (h_acc >= 0) { + svga->overlay_latch.h_acc += virge->streams.k1_horiz_scale; + if (svga->overlay_latch.h_acc >= 0) { if ((x_read ^ (x_read + 1)) & ~3) OVERLAY_SAMPLE(); + x_read = (x_read + 1) & 7; - h_acc += (virge->streams.k2_horiz_scale - virge->streams.k1_horiz_scale); + svga->overlay_latch.h_acc += (virge->streams.k2_horiz_scale - virge->streams.k1_horiz_scale); } } From cf2a074dc0f1949e107c8f5b235000ef7309b01f Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 27 Aug 2024 15:07:22 +0500 Subject: [PATCH 374/624] Fix SDL UI failing to build when C++11 threads are disabled --- CMakeLists.txt | 3 ++- src/CMakeLists.txt | 4 +--- src/qt/CMakeLists.txt | 4 ++++ src/thread.cpp | 12 ++++++------ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2d5a9dc1e..2766d4921 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,7 +131,6 @@ option(RTMIDI "RtMidi" option(FLUIDSYNTH "FluidSynth" ON) option(MUNT "MUNT" ON) option(VNC "VNC renderer" OFF) -option(CPPTHREADS "C++11 threads" ON) option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF) option(MINITRACE "Enable Chrome tracing using the modified minitrace library" OFF) option(GDBSTUB "Enable GDB stub server for debugging" OFF) @@ -141,8 +140,10 @@ option(DEBUGREGS486 "Enable debug register opeartion on 486+ CPUs" if(WIN32) set(QT ON) + option(CPPTHREADS "C++11 threads" OFF) else() option(QT "Qt GUI" ON) + option(CPPTHREADS "C++11 threads" ON) endif() # Development branch features diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ad339040f..0841fabdd 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -27,9 +27,7 @@ if(CMAKE_SYSTEM_NAME MATCHES "Linux") add_compile_definitions(_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 _LARGEFILE64_SOURCE=1) endif() -if(WIN32) - target_sources(86Box PRIVATE qt/win_thread.c) -else() +if(CPPTHREADS) target_sources(86Box PRIVATE thread.cpp) endif() diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index b3e01c1b9..cf9420a4d 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -227,6 +227,10 @@ if(WIN32 AND NOT MINGW) target_sources(plat PRIVATE win_opendir.c) endif() +if(WIN32 AND NOT CPPTHREADS) + target_sources(plat PRIVATE win_thread.c) +endif() + if(WIN32) target_sources(plat PRIVATE win_serial_passthrough.c win_netsocket.c) else() diff --git a/src/thread.cpp b/src/thread.cpp index 079b80a3e..f2a0ceaf0 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -5,7 +5,7 @@ #include <86box/plat.h> #include <86box/thread.h> -struct event_cpp11_ex_t { +struct event_cpp11_t { std::condition_variable cond; std::mutex mutex; bool state = false; @@ -82,14 +82,14 @@ thread_close_mutex(mutex_t *_mutex) event_t * thread_create_event() { - auto ev = new event_cpp11_ex_t; + auto ev = new event_cpp11_t; return ev; } int thread_wait_event(event_t *handle, int timeout) { - auto event = reinterpret_cast(handle); + auto event = reinterpret_cast(handle); auto lock = std::unique_lock(event->mutex); if (timeout < 0) { @@ -112,7 +112,7 @@ thread_wait_event(event_t *handle, int timeout) void thread_set_event(event_t *handle) { - auto event = reinterpret_cast(handle); + auto event = reinterpret_cast(handle); { auto lock = std::unique_lock(event->mutex); event->state = true; @@ -123,7 +123,7 @@ thread_set_event(event_t *handle) void thread_reset_event(event_t *handle) { - auto event = reinterpret_cast(handle); + auto event = reinterpret_cast(handle); auto lock = std::unique_lock(event->mutex); event->state = false; } @@ -131,7 +131,7 @@ thread_reset_event(event_t *handle) void thread_destroy_event(event_t *handle) { - auto event = reinterpret_cast(handle); + auto event = reinterpret_cast(handle); delete event; } } From 818c268f7529919f1775b9e06dc8693375c6c862 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 28 Aug 2024 20:21:47 +0200 Subject: [PATCH 375/624] S3 Vision x68: Fix PCI BAR to CRTC registers 59h/5Ah mask. --- src/video/vid_s3.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index cb5d2e41e..3f64d3b3a 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -9254,10 +9254,12 @@ s3_pci_read(UNUSED(int func), int addr, void *priv) return (s3->chip == S3_TRIO64V2) ? (s3->pci_regs[0x0d] & 0xf8) : 0x00; case 0x12: - return (s3->chip >= S3_TRIO64V) ? 0x00 : (svga->crtc[0x5a] & 0x80); + return ((s3->chip == S3_VISION868) || (s3->chip == S3_VISION968) || (s3->chip >= S3_TRIO64V)) ? 0x00 : + (svga->crtc[0x5a] & 0x80); case 0x13: - return (s3->chip >= S3_TRIO64V) ? (svga->crtc[0x59] & 0xfc) : svga->crtc[0x59]; + return ((s3->chip == S3_VISION868) || (s3->chip == S3_VISION968) || (s3->chip >= S3_TRIO64V)) ? + (svga->crtc[0x59] & 0xfc) : svga->crtc[0x59]; case 0x30: return s3->has_bios ? (s3->pci_regs[0x30] & 0x01) : 0x00; /*BIOS ROM address*/ From dd5c5f4a07d808728534cec2ed6b3552f24f4680 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 29 Aug 2024 00:51:28 +0200 Subject: [PATCH 376/624] More ViRGE fixes (August 29th, 2024) Apparently the extended sequencer registers (>= 0x20) are required to have sane values on the STREAMS engine on GX2 and probably other chips in the ViRGE range. --- src/video/vid_s3_virge.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/video/vid_s3_virge.c b/src/video/vid_s3_virge.c index 3719d2591..fea538864 100644 --- a/src/video/vid_s3_virge.c +++ b/src/video/vid_s3_virge.c @@ -471,7 +471,8 @@ s3_virge_update_irqs(virge_t *virge) { } static void -s3_virge_out(uint16_t addr, uint8_t val, void *priv) { +s3_virge_out(uint16_t addr, uint8_t val, void *priv) +{ virge_t *virge = (virge_t *) priv; svga_t * svga = &virge->svga; uint8_t old; @@ -483,7 +484,7 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) { switch (addr) { case 0x3c5: if (svga->seqaddr >= 0x10) { - svga->seqregs[svga->seqaddr & 0x1f] = val; + svga->seqregs[svga->seqaddr] = val; svga_recalctimings(svga); return; } @@ -519,8 +520,6 @@ s3_virge_out(uint16_t addr, uint8_t val, void *priv) { return; if ((svga->crtcreg == 0x36) && (svga->crtc[0x39] != 0xa5)) return; - if (svga->crtcreg >= 0x80) - return; old = svga->crtc[svga->crtcreg]; svga->crtc[svga->crtcreg] = val; @@ -707,7 +706,7 @@ s3_virge_in(uint16_t addr, void *priv) { case 0x3c5: if (svga->seqaddr >= 8) - ret = svga->seqregs[svga->seqaddr & 0x1f]; + ret = svga->seqregs[svga->seqaddr]; else if (svga->seqaddr <= 4) ret = svga_in(addr, svga); else From f19a5447be48435f4c952be5f96724a031b7ef52 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 29 Aug 2024 01:26:32 +0200 Subject: [PATCH 377/624] Improved the SCO Xenix fix, fixes OS/2 booting, fixes #4762. --- src/cpu/386_dynarec.c | 3 +-- src/cpu/x86_ops_mov_ctrl.h | 18 ++++++++---------- src/cpu/x86_ops_mov_ctrl_2386.h | 18 ++++++++---------- src/cpu/x86_ops_pmode.h | 21 ++++++--------------- src/include/86box/mem.h | 1 + src/mem/mem.c | 13 +++++++++++++ 6 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c index bf8b31600..590d6f5c7 100644 --- a/src/cpu/386_dynarec.c +++ b/src/cpu/386_dynarec.c @@ -937,8 +937,7 @@ exec386(int32_t cycs) cpu_flush_pending++; else if (cpu_flush_pending == 2) { cpu_flush_pending = 0; - cr0 ^= 0x80000000; - flushmmucache(); + flushmmucache_pc(); } #ifndef USE_NEW_DYNAREC diff --git a/src/cpu/x86_ops_mov_ctrl.h b/src/cpu/x86_ops_mov_ctrl.h index c8ac9ab63..f4241feb1 100644 --- a/src/cpu/x86_ops_mov_ctrl.h +++ b/src/cpu/x86_ops_mov_ctrl.h @@ -189,16 +189,15 @@ opMOV_CRx_r_a16(uint32_t fetchdat) else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { if (is_p6 || cpu_use_dynarec) flushmmucache(); - else + else { + flushmmucache_nopc(); cpu_flush_pending = 1; + } } /* Make sure CPL = 0 when switching from real mode to protected mode. */ if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01)) cpu_state.seg_cs.access &= 0x9f; - if (!is_p6 && !cpu_use_dynarec && ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000)) - cr0 = (cr0 & 0x80000000) | (cpu_state.regs[cpu_rm].l & 0x7fffffff); - else - cr0 = cpu_state.regs[cpu_rm].l; + cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; if (!(cr0 & 0x80000000)) @@ -255,16 +254,15 @@ opMOV_CRx_r_a32(uint32_t fetchdat) else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { if (is_p6 || cpu_use_dynarec) flushmmucache(); - else + else { + flushmmucache_nopc(); cpu_flush_pending = 1; + } } /* Make sure CPL = 0 when switching from real mode to protected mode. */ if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01)) cpu_state.seg_cs.access &= 0x9f; - if (!is_p6 && !cpu_use_dynarec && ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000)) - cr0 = (cr0 & 0x80000000) | (cpu_state.regs[cpu_rm].l & 0x7fffffff); - else - cr0 = cpu_state.regs[cpu_rm].l; + cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; if (!(cr0 & 0x80000000)) diff --git a/src/cpu/x86_ops_mov_ctrl_2386.h b/src/cpu/x86_ops_mov_ctrl_2386.h index 6b6db8c94..03a18caa7 100644 --- a/src/cpu/x86_ops_mov_ctrl_2386.h +++ b/src/cpu/x86_ops_mov_ctrl_2386.h @@ -182,15 +182,14 @@ opMOV_CRx_r_a16(uint32_t fetchdat) case 0: if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) flushmmucache(); - else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) + else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { + flushmmucache_nopc(); cpu_flush_pending = 1; + } /* Make sure CPL = 0 when switching from real mode to protected mode. */ if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01)) cpu_state.seg_cs.access &= 0x9f; - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) - cr0 = (cr0 & 0x80000000) | (cpu_state.regs[cpu_rm].l & 0x7fffffff); - else - cr0 = cpu_state.regs[cpu_rm].l; + cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; if (!(cr0 & 0x80000000)) @@ -244,15 +243,14 @@ opMOV_CRx_r_a32(uint32_t fetchdat) case 0: if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) flushmmucache(); - else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) + else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { + flushmmucache_nopc(); cpu_flush_pending = 1; + } /* Make sure CPL = 0 when switching from real mode to protected mode. */ if ((cpu_state.regs[cpu_rm].l & 0x01) && !(cr0 & 0x01)) cpu_state.seg_cs.access &= 0x9f; - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) - cr0 = (cr0 & 0x80000000) | (cpu_state.regs[cpu_rm].l & 0x7fffffff); - else - cr0 = cpu_state.regs[cpu_rm].l; + cr0 = cpu_state.regs[cpu_rm].l; if (cpu_16bitbus) cr0 |= 0x10; if (!(cr0 & 0x80000000)) diff --git a/src/cpu/x86_ops_pmode.h b/src/cpu/x86_ops_pmode.h index b68aaffbd..4f32b0e37 100644 --- a/src/cpu/x86_ops_pmode.h +++ b/src/cpu/x86_ops_pmode.h @@ -431,21 +431,12 @@ op0F01_common(uint32_t fetchdat, int is32, int is286, int ea32) if (cpu_mod != 3) SEG_CHECK_WRITE(cpu_state.ea_seg); if (is386 && is32 && (cpu_mod == 3)) { - if (cpu_flush_pending) { - if (is486 || isibm486) - seteaw(cr0 ^ 0x80000000); - else if (is386 && !cpu_16bitbus) - seteaw((cr0 ^ 0x80000000) | /* 0x7FFFFF00 */ 0x7FFFFFE0); - else - seteaw((cr0 ^ 0x80000000) | 0x7FFFFFF0); - } else { - if (is486 || isibm486) - seteaw(cr0); - else if (is386 && !cpu_16bitbus) - seteaw(cr0 | /* 0x7FFFFF00 */ 0x7FFFFFE0); - else - seteaw(cr0 | 0x7FFFFFF0); - } + if (is486 || isibm486) + seteaw(cr0); + else if (is386 && !cpu_16bitbus) + seteaw(cr0 | /* 0x7FFFFF00 */ 0x7FFFFFE0); + else + seteaw(cr0 | 0x7FFFFFF0); } else { if (is486 || isibm486) seteaw(msw); diff --git a/src/include/86box/mem.h b/src/include/86box/mem.h index 3c0e0aee0..ad89e4b4f 100644 --- a/src/include/86box/mem.h +++ b/src/include/86box/mem.h @@ -446,6 +446,7 @@ extern void mem_flush_write_page(uint32_t addr, uint32_t virt); extern void mem_reset_page_blocks(void); extern void flushmmucache(void); +extern void flushmmucache_pc(void); extern void flushmmucache_nopc(void); extern void mem_debug_check_addr(uint32_t addr, int write); diff --git a/src/mem/mem.c b/src/mem/mem.c index ae6e4ae00..0b038d640 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -225,6 +225,19 @@ flushmmucache(void) #endif } +void +flushmmucache_pc(void) +{ + mmuflush++; + + pccache = (uint32_t) 0xffffffff; + pccache2 = (uint8_t *) 0xffffffff; + +#ifdef USE_DYNAREC + codegen_flush(); +#endif +} + void flushmmucache_nopc(void) { From d594f33cad81a41a69331a123c3d3edfe2649703 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 29 Aug 2024 01:31:09 +0200 Subject: [PATCH 378/624] Fix a minor bug in cpu/386.c. --- src/cpu/386.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cpu/386.c b/src/cpu/386.c index 50ed4fddb..8b612604d 100644 --- a/src/cpu/386.c +++ b/src/cpu/386.c @@ -308,8 +308,7 @@ exec386_2386(int32_t cycs) cpu_flush_pending++; else if (cpu_flush_pending == 2) { cpu_flush_pending = 0; - cr0 ^= 0x80000000; - flushmmucache(); + flushmmucache_pc(); } if (cpu_end_block_after_ins) From fb3b46f648a8dc37543784b66e3c5b6dfc996f6b Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 29 Aug 2024 01:57:22 +0200 Subject: [PATCH 379/624] Unbroke SCO Xenix on the 286/386 interpreter, this will do until the prefetch queue is finally implemented. --- src/cpu/386_common.h | 59 ++++++++++++++++++++++++++++++++++++---- src/cpu/cpu.c | 1 + src/cpu/cpu.h | 1 + src/cpu/x86.c | 1 + src/mem/mmu_2386.c | 65 +++++++++++++++++++++++++++----------------- 5 files changed, 97 insertions(+), 30 deletions(-) diff --git a/src/cpu/386_common.h b/src/cpu/386_common.h index 8ca89181c..ec40612ee 100644 --- a/src/cpu/386_common.h +++ b/src/cpu/386_common.h @@ -458,6 +458,7 @@ fastreadw_fetch(uint32_t a) { uint16_t ret; + cpu_old_paging = (cpu_flush_pending == 2); if ((a & 0xFFF) > 0xFFE) { ret = fastreadb(a); if (!cpu_state.abrt && (opcode_length[ret & 0xff] > 1)) @@ -469,6 +470,7 @@ fastreadw_fetch(uint32_t a) ret = readmemwl_2386(a); read_type = 4; } + cpu_old_paging = 0; return ret; } @@ -486,7 +488,9 @@ fastreadl_fetch(uint32_t a) ret = 0; else { read_type = 1; + cpu_old_paging = (cpu_flush_pending == 2); ret = readmemll_2386(a); + cpu_old_paging = 0; read_type = 4; } @@ -563,35 +567,52 @@ fastreadl_fetch(uint32_t a) } #endif +#ifdef OPS_286_386 static __inline uint8_t getbyte(void) { + uint8_t ret; cpu_state.pc++; - return fastreadb(cs + (cpu_state.pc - 1)); + cpu_old_paging = (cpu_flush_pending == 2); + ret = fastreadb(cs + (cpu_state.pc - 1)); + cpu_old_paging = 0; + return ret; + } static __inline uint16_t getword(void) { + uint16_t ret; cpu_state.pc += 2; - return fastreadw(cs + (cpu_state.pc - 2)); + cpu_old_paging = (cpu_flush_pending == 2); + ret = fastreadw(cs + (cpu_state.pc - 2)); + cpu_old_paging = 0; + return ret; } static __inline uint32_t getlong(void) { + uint32_t ret; cpu_state.pc += 4; - return fastreadl(cs + (cpu_state.pc - 4)); + cpu_old_paging = (cpu_flush_pending == 2); + ret = fastreadl(cs + (cpu_state.pc - 4)); + cpu_old_paging = 0; + return ret; } static __inline uint64_t getquad(void) { + uint64_t ret; cpu_state.pc += 8; - return fastreadl(cs + (cpu_state.pc - 8)) | ((uint64_t) fastreadl(cs + (cpu_state.pc - 4)) << 32); + cpu_old_paging = (cpu_flush_pending == 2); + ret = fastreadl(cs + (cpu_state.pc - 8)) | ((uint64_t) fastreadl(cs + (cpu_state.pc - 4)) << 32); + cpu_old_paging = 0; + return ret; } -#ifdef OPS_286_386 static __inline uint8_t geteab(void) { @@ -678,6 +699,34 @@ seteaq(uint64_t v) # define seteaw_mem(v) writememwl_2386(easeg + cpu_state.eaaddr, v); # define seteal_mem(v) writememll_2386(easeg + cpu_state.eaaddr, v); #else +static __inline uint8_t +getbyte(void) +{ + cpu_state.pc++; + return fastreadb(cs + (cpu_state.pc - 1)); +} + +static __inline uint16_t +getword(void) +{ + cpu_state.pc += 2; + return fastreadw(cs + (cpu_state.pc - 2)); +} + +static __inline uint32_t +getlong(void) +{ + cpu_state.pc += 4; + return fastreadl(cs + (cpu_state.pc - 4)); +} + +static __inline uint64_t +getquad(void) +{ + cpu_state.pc += 8; + return fastreadl(cs + (cpu_state.pc - 8)) | ((uint64_t) fastreadl(cs + (cpu_state.pc - 4)) << 32); +} + static __inline uint8_t geteab(void) { diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index bbada4958..438e12d5c 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -183,6 +183,7 @@ int cpu_waitstates; int cpu_cache_int_enabled; int cpu_cache_ext_enabled; int cpu_flush_pending; +int cpu_old_paging; int cpu_isa_speed; int cpu_pci_speed; int cpu_isa_pci_div; diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index cdb4e54b6..d96d7951d 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -617,6 +617,7 @@ extern int cpu_mem_prefetch_cycles; extern int cpu_rom_prefetch_cycles; extern int cpu_waitstates; extern int cpu_flush_pending; +extern int cpu_old_paging; extern int cpu_cache_int_enabled; extern int cpu_cache_ext_enabled; extern int cpu_isa_speed; diff --git a/src/cpu/x86.c b/src/cpu/x86.c index d70f8f61c..5eb16b98f 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -326,6 +326,7 @@ reset_common(int hard) codegen_reset(); #endif cpu_flush_pending = 0; + cpu_old_paging = 0; if (!hard) flushmmucache(); x86_was_reset = 1; diff --git a/src/mem/mmu_2386.c b/src/mem/mmu_2386.c index abc34ff96..43bdd4602 100644 --- a/src/mem/mmu_2386.c +++ b/src/mem/mmu_2386.c @@ -278,6 +278,7 @@ readmembl_2386(uint32_t addr) { mem_mapping_t *map; uint64_t a; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_READ, 1); @@ -287,7 +288,7 @@ readmembl_2386(uint32_t addr) high_page = 0; - if (cr0 >> 31) { + if (temp_cr0 >> 31) { a = mmutranslate_read_2386(addr); addr64 = (uint32_t) a; @@ -308,6 +309,7 @@ writemembl_2386(uint32_t addr, uint8_t val) { mem_mapping_t *map; uint64_t a; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; mem_debug_check_addr(addr, 2); GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_WRITE, 1); @@ -317,7 +319,7 @@ writemembl_2386(uint32_t addr, uint8_t val) high_page = 0; - if (cr0 >> 31) { + if (temp_cr0 >> 31) { a = mmutranslate_write_2386(addr); addr64 = (uint32_t) a; @@ -336,12 +338,13 @@ uint8_t readmembl_no_mmut_2386(uint32_t addr, uint32_t a64) { mem_mapping_t *map; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_READ, 1); mem_logical_addr = addr; - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return 0xff; @@ -361,12 +364,13 @@ void writemembl_no_mmut_2386(uint32_t addr, uint32_t a64, uint8_t val) { mem_mapping_t *map; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_WRITE, 1); mem_logical_addr = addr; - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return; @@ -384,6 +388,7 @@ readmemwl_2386(uint32_t addr) { mem_mapping_t *map; uint64_t a; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; addr64a[0] = addr; addr64a[1] = addr + 1; @@ -399,7 +404,7 @@ readmemwl_2386(uint32_t addr) if (!cpu_cyrix_alignment || (addr & 7) == 7) cycles -= timing_misaligned; if ((addr & 0xfff) > 0xffe) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { for (uint8_t i = 0; i < 2; i++) { a = mmutranslate_read_2386(addr + i); addr64a[i] = (uint32_t) a; @@ -414,7 +419,7 @@ readmemwl_2386(uint32_t addr) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { a = mmutranslate_read_2386(addr); addr64a[0] = (uint32_t) a; @@ -442,6 +447,7 @@ writememwl_2386(uint32_t addr, uint16_t val) { mem_mapping_t *map; uint64_t a; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; addr64a[0] = addr; addr64a[1] = addr + 1; @@ -457,7 +463,7 @@ writememwl_2386(uint32_t addr, uint16_t val) if (!cpu_cyrix_alignment || (addr & 7) == 7) cycles -= timing_misaligned; if ((addr & 0xfff) > 0xffe) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { for (uint8_t i = 0; i < 2; i++) { /* Do not translate a page that has a valid lookup, as that is by definition valid and the whole purpose of the lookup is to avoid repeat identical translations. */ @@ -479,7 +485,7 @@ writememwl_2386(uint32_t addr, uint16_t val) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { a = mmutranslate_write_2386(addr); addr64a[0] = (uint32_t) a; @@ -508,6 +514,7 @@ uint16_t readmemwl_no_mmut_2386(uint32_t addr, uint32_t *a64) { mem_mapping_t *map; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_READ, 2); @@ -517,7 +524,7 @@ readmemwl_no_mmut_2386(uint32_t addr, uint32_t *a64) if (!cpu_cyrix_alignment || (addr & 7) == 7) cycles -= timing_misaligned; if ((addr & 0xfff) > 0xffe) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return 0xffff; } @@ -527,7 +534,7 @@ readmemwl_no_mmut_2386(uint32_t addr, uint32_t *a64) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return 0xffff; @@ -552,6 +559,7 @@ void writememwl_no_mmut_2386(uint32_t addr, uint32_t *a64, uint16_t val) { mem_mapping_t *map; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_WRITE, 2); @@ -561,7 +569,7 @@ writememwl_no_mmut_2386(uint32_t addr, uint32_t *a64, uint16_t val) if (!cpu_cyrix_alignment || (addr & 7) == 7) cycles -= timing_misaligned; if ((addr & 0xfff) > 0xffe) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return; } @@ -572,7 +580,7 @@ writememwl_no_mmut_2386(uint32_t addr, uint32_t *a64, uint16_t val) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return; @@ -600,6 +608,7 @@ readmemll_2386(uint32_t addr) mem_mapping_t *map; int i; uint64_t a = 0x0000000000000000ULL; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; for (i = 0; i < 4; i++) { addr64a[i] = (uint64_t) (addr + i); @@ -615,7 +624,7 @@ readmemll_2386(uint32_t addr) if ((addr & 3) && (!cpu_cyrix_alignment || (addr & 7) > 4)) cycles -= timing_misaligned; if ((addr & 0xfff) > 0xffc) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { for (i = 0; i < 4; i++) { if (i == 0) { a = mmutranslate_read_2386(addr + i); @@ -644,7 +653,7 @@ readmemll_2386(uint32_t addr) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { a = mmutranslate_read_2386(addr); addr64a[0] = (uint32_t) a; @@ -674,6 +683,7 @@ writememll_2386(uint32_t addr, uint32_t val) mem_mapping_t *map; int i; uint64_t a = 0x0000000000000000ULL; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; for (i = 0; i < 4; i++) { addr64a[i] = (uint64_t) (addr + i); @@ -689,7 +699,7 @@ writememll_2386(uint32_t addr, uint32_t val) if ((addr & 3) && (!cpu_cyrix_alignment || (addr & 7) > 4)) cycles -= timing_misaligned; if ((addr & 0xfff) > 0xffc) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { for (i = 0; i < 4; i++) { /* Do not translate a page that has a valid lookup, as that is by definition valid and the whole purpose of the lookup is to avoid repeat identical translations. */ @@ -723,7 +733,7 @@ writememll_2386(uint32_t addr, uint32_t val) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { a = mmutranslate_write_2386(addr); addr64a[0] = (uint32_t) a; @@ -758,6 +768,7 @@ uint32_t readmemll_no_mmut_2386(uint32_t addr, uint32_t *a64) { mem_mapping_t *map; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_READ, 4); @@ -767,7 +778,7 @@ readmemll_no_mmut_2386(uint32_t addr, uint32_t *a64) if ((addr & 3) && (!cpu_cyrix_alignment || (addr & 7) > 4)) cycles -= timing_misaligned; if ((addr & 0xfff) > 0xffc) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return 0xffffffff; } @@ -777,7 +788,7 @@ readmemll_no_mmut_2386(uint32_t addr, uint32_t *a64) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return 0xffffffff; @@ -804,6 +815,7 @@ void writememll_no_mmut_2386(uint32_t addr, uint32_t *a64, uint32_t val) { mem_mapping_t *map; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; GDBSTUB_MEM_ACCESS(addr, GDBSTUB_MEM_WRITE, 4); @@ -813,7 +825,7 @@ writememll_no_mmut_2386(uint32_t addr, uint32_t *a64, uint32_t val) if ((addr & 3) && (!cpu_cyrix_alignment || (addr & 7) > 4)) cycles -= timing_misaligned; if ((addr & 0xfff) > 0xffc) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return; } @@ -824,7 +836,7 @@ writememll_no_mmut_2386(uint32_t addr, uint32_t *a64, uint32_t val) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { if (cpu_state.abrt || high_page) return; @@ -858,6 +870,7 @@ readmemql_2386(uint32_t addr) mem_mapping_t *map; int i; uint64_t a = 0x0000000000000000ULL; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; for (i = 0; i < 8; i++) { addr64a[i] = (uint64_t) (addr + i); @@ -872,7 +885,7 @@ readmemql_2386(uint32_t addr) if (addr & 7) { cycles -= timing_misaligned; if ((addr & 0xfff) > 0xff8) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { for (i = 0; i < 8; i++) { if (i == 0) { a = mmutranslate_read_2386(addr + i); @@ -901,7 +914,7 @@ readmemql_2386(uint32_t addr) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { a = mmutranslate_read_2386(addr); addr64a[0] = (uint32_t) a; @@ -924,6 +937,7 @@ writememql_2386(uint32_t addr, uint64_t val) mem_mapping_t *map; int i; uint64_t a = 0x0000000000000000ULL; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; for (i = 0; i < 8; i++) { addr64a[i] = (uint64_t) (addr + i); @@ -938,7 +952,7 @@ writememql_2386(uint32_t addr, uint64_t val) if (addr & 7) { cycles -= timing_misaligned; if ((addr & 0xfff) > 0xff8) { - if (cr0 >> 31) { + if (temp_cr0 >> 31) { for (i = 0; i < 8; i++) { /* Do not translate a page that has a valid lookup, as that is by definition valid and the whole purpose of the lookup is to avoid repeat identical translations. */ @@ -972,7 +986,7 @@ writememql_2386(uint32_t addr, uint64_t val) } } - if (cr0 >> 31) { + if (temp_cr0 >> 31) { addr64a[0] = mmutranslate_write_2386(addr); if (addr64a[0] > 0xffffffffULL) return; @@ -1013,13 +1027,14 @@ do_mmutranslate_2386(uint32_t addr, uint32_t *a64, int num, int write) int i; uint32_t last_addr = addr + (num - 1); uint64_t a = 0x0000000000000000ULL; + uint32_t temp_cr0 = cpu_old_paging ? (cr0 ^ 0x80000000) : cr0; mem_debug_check_addr(addr, write ? 2 : read_type); for (i = 0; i < num; i++) a64[i] = (uint64_t) addr; - if (!(cr0 >> 31)) + if (!(temp_cr0 >> 31)) return; for (i = 0; i < num; i++) { From d5b0fd18aa6fc342317937959a2d8add9c2b162e Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 29 Aug 2024 05:52:12 +0200 Subject: [PATCH 380/624] CD-ROM disc changes without eject now insert one simulated empty drive state, fixes #4768. --- src/scsi/scsi_cdrom.c | 79 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 3 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index be9809e08..529f2b4d2 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1546,7 +1546,7 @@ scsi_cdrom_insert(void *priv) if (!dev) return; - dev->unit_attention = 1; + dev->unit_attention = 0x11; /* Turn off the medium changed status. */ dev->drv->cd_status &= ~CD_STATUS_MEDIUM_CHANGED; scsi_cdrom_log("CD-ROM %i: Media insert\n", dev->id); @@ -1598,6 +1598,13 @@ scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) ready = (dev->drv->cd_status != CD_STATUS_EMPTY) || (ext_medium_changed == -1); + /* Transition, pretend we're not ready for one check so that + Windows XP can recognize a medium change. */ + if (dev->unit_attention & 0x10) { + ready = 0; + goto skip_ua_check; + } + skip_ready_check: /* If the drive is not ready, there is no reason to keep the UNIT ATTENTION condition present, as we only use it to mark @@ -1624,6 +1631,7 @@ skip_ready_check: } } +skip_ua_check: /* Unless the command is REQUEST SENSE, clear the sense. This will *NOT* the UNIT ATTENTION condition if it's set. */ if (cdb[0] != GPCMD_REQUEST_SENSE) @@ -1711,7 +1719,8 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt buffer[2] = SENSE_ILLEGAL_REQUEST; buffer[12] = ASC_AUDIO_PLAY_OPERATION; buffer[13] = (dev->drv->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED; - } else if (dev->unit_attention && (scsi_cdrom_sense_key == 0)) { + } else if (dev->unit_attention && !(dev->unit_attention & 0x10) && + ((scsi_cdrom_sense_key == 0) || (scsi_cdrom_sense_key == 2))) { buffer[2] = SENSE_UNIT_ATTENTION; buffer[12] = ASC_MEDIUM_MAY_HAVE_CHANGED; buffer[13] = 0; @@ -1719,6 +1728,9 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt scsi_cdrom_log("CD-ROM %i: Reporting sense: %02X %02X %02X\n", dev->id, buffer[2], buffer[12], buffer[13]); + if (dev->unit_attention & 0x10) + dev->unit_attention &= 0x0f; + if (buffer[2] == SENSE_UNIT_ATTENTION) { /* If the last remaining sense is unit attention, clear that condition. */ @@ -2338,7 +2350,9 @@ begin: max_len = (cdb[7] << 8) | cdb[8]; /* only feature 0 is supported */ - if ((cdb[2] != 0) || (cdb[3] > 2)) { + if ((feature > 3) && (feature != 0x010) && + (feature != 0x1d) && (feature != 0x01e) && + (feature != 0x01f) && (feature != 0x103)) { scsi_cdrom_invalid_field(dev); scsi_cdrom_buf_free(dev); return; @@ -2413,6 +2427,65 @@ begin: alloc_length += 8; b += 8; } + if ((feature == 3) || ((cdb[1] & 3) < 2)) { + b[1] = 2; + b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */ + b[3] = 4; + + b[4] = 0x1d; + + alloc_length += 8; + b += 8; + } + if ((feature == 0x10) || ((cdb[1] & 3) < 2)) { + b[1] = 0x10; + b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */ + b[3] = 8; + + b[6] = 8; + b[9] = 0x10; + + alloc_length += 12; + b += 12; + } + if ((feature == 0x1d) || ((cdb[1] & 3) < 2)) { + b[1] = 0x1d; + b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */ + b[3] = 0; + + alloc_length += 4; + b += 4; + } + if ((feature == 0x1e) || ((cdb[1] & 3) < 2)) { + b[1] = 0x1e; + b[2] = (2 << 2) | 0x02 | 0x01; /* persistent and current */ + b[3] = 4; + + b[4] = 0; + + alloc_length += 8; + b += 8; + } + if ((feature == 0x1f) || ((cdb[1] & 3) < 2)) { + b[1] = 0x1f; + b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */ + b[3] = 0; + + alloc_length += 4; + b += 4; + } + if ((feature == 0x103) || ((cdb[1] & 3) < 2)) { + b[0] = 1; + b[1] = 3; + b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */ + b[3] = 0; + + b[4] = 7; + b[6] = 1; + + alloc_length += 8; + b += 8; + } dev->buffer[0] = ((alloc_length - 4) >> 24) & 0xff; dev->buffer[1] = ((alloc_length - 4) >> 16) & 0xff; From dd2bbf3cd36be513aa49c4e6589015118243c13b Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 29 Aug 2024 20:47:44 +0200 Subject: [PATCH 381/624] CD-ROM: Make sure the initial unit attention condition is not treated as an inserted empty drive phase. --- src/scsi/scsi_cdrom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 529f2b4d2..2645659c7 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1600,7 +1600,7 @@ scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) /* Transition, pretend we're not ready for one check so that Windows XP can recognize a medium change. */ - if (dev->unit_attention & 0x10) { + if ((dev->unit_attention & 0xf0) == 0x10) { ready = 0; goto skip_ua_check; } @@ -1719,7 +1719,7 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt buffer[2] = SENSE_ILLEGAL_REQUEST; buffer[12] = ASC_AUDIO_PLAY_OPERATION; buffer[13] = (dev->drv->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED; - } else if (dev->unit_attention && !(dev->unit_attention & 0x10) && + } else if (dev->unit_attention && ((dev->unit_attention & 0xf0) != 0x10) && ((scsi_cdrom_sense_key == 0) || (scsi_cdrom_sense_key == 2))) { buffer[2] = SENSE_UNIT_ATTENTION; buffer[12] = ASC_MEDIUM_MAY_HAVE_CHANGED; @@ -1728,7 +1728,7 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt scsi_cdrom_log("CD-ROM %i: Reporting sense: %02X %02X %02X\n", dev->id, buffer[2], buffer[12], buffer[13]); - if (dev->unit_attention & 0x10) + if ((dev->unit_attention & 0xf0) == 0x10) dev->unit_attention &= 0x0f; if (buffer[2] == SENSE_UNIT_ATTENTION) { From 252c3034af521c618d321a39f4ea55e053abaf43 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 00:57:18 +0200 Subject: [PATCH 382/624] Reworked the unit attention workaround, fixes #4770. --- src/scsi/scsi_cdrom.c | 96 ++++++++++++++++++++++--------------------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 2645659c7..e9abdd0d1 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1182,7 +1182,7 @@ scsi_cdrom_cmd_error(scsi_cdrom_t *dev) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); dev->tf->error = ((scsi_cdrom_sense_key & 0xf) << 4) | ABRT_ERR; - if (dev->unit_attention) + if (dev->unit_attention > 2) dev->tf->error |= MCR_ERR; dev->tf->status = READY_STAT | ERR_STAT; dev->tf->phase = 3; @@ -1199,7 +1199,7 @@ scsi_cdrom_unit_attention(scsi_cdrom_t *dev) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); dev->tf->error = (SENSE_UNIT_ATTENTION << 4) | ABRT_ERR; - if (dev->unit_attention) + if (dev->unit_attention > 2) dev->tf->error |= MCR_ERR; dev->tf->status = READY_STAT | ERR_STAT; dev->tf->phase = 3; @@ -1546,12 +1546,40 @@ scsi_cdrom_insert(void *priv) if (!dev) return; - dev->unit_attention = 0x11; + dev->unit_attention = 1; /* Turn off the medium changed status. */ dev->drv->cd_status &= ~CD_STATUS_MEDIUM_CHANGED; scsi_cdrom_log("CD-ROM %i: Media insert\n", dev->id); } +static int +scsi_command_check_ready(scsi_cdrom_t *dev, uint8_t *cdb) +{ + int ret = 0; + + if (scsi_cdrom_command_flags[cdb[0]] & CHECK_READY) { + /*Note by TC1995: Some vendor commands from X vendor don't really check for ready status + but they do on Y vendor. Quite confusing I know.*/ + if (scsi_cdrom_command_flags[cdb[0]] & SCSI_ONLY) switch (dev->drv->type) { + default: + ret = 1; + break; + case CDROM_TYPE_DEC_RRD45_0436: + case CDROM_TYPE_SONY_CDU541_10i: + case CDROM_TYPE_SONY_CDU561_18k: + case CDROM_TYPE_SONY_CDU76S_100: + case CDROM_TYPE_TEXEL_DMXX24_100: + if (cdb[0] == 0xC0) + break; + ret = 1; + break; + } else + ret = 1; + } + + return ret; +} + static int scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) { @@ -1598,23 +1626,24 @@ scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) ready = (dev->drv->cd_status != CD_STATUS_EMPTY) || (ext_medium_changed == -1); - /* Transition, pretend we're not ready for one check so that - Windows XP can recognize a medium change. */ - if ((dev->unit_attention & 0xf0) == 0x10) { - ready = 0; - goto skip_ua_check; - } - skip_ready_check: /* If the drive is not ready, there is no reason to keep the UNIT ATTENTION condition present, as we only use it to mark disc changes. */ - if (!ready && dev->unit_attention) + if (!ready && (dev->unit_attention > 2)) dev->unit_attention = 0; /* If the UNIT ATTENTION condition is set and the command does not allow execution under it, error out and report the condition. */ - if (dev->unit_attention == 1) { + if ((dev->unit_attention > 0) && (dev->unit_attention < 3)) { + dev->media_status = MEC_MEDIA_REMOVAL; + if (scsi_command_check_ready(dev, cdb)) { + dev->unit_attention++; + scsi_cdrom_log("CD-ROM %i: Simulated not ready phase (%02X)\n", dev->id, cdb[0]); + scsi_cdrom_not_ready(dev); + return 0; + } + } else if (dev->unit_attention == 3) { /* Only increment the unit attention phase if the command can not pass through it. */ if (!(scsi_cdrom_command_flags[cdb[0]] & ALLOW_UA)) { /* scsi_cdrom_log("CD-ROM %i: Unit attention now 2\n", dev->id); */ @@ -1624,53 +1653,31 @@ skip_ready_check: scsi_cdrom_unit_attention(dev); return 0; } - } else if (dev->unit_attention == 2) { + } else if (dev->unit_attention == 4) { if (cdb[0] != GPCMD_REQUEST_SENSE) { /* scsi_cdrom_log("CD-ROM %i: Unit attention now 0\n", dev->id); */ dev->unit_attention = 0; } } -skip_ua_check: /* Unless the command is REQUEST SENSE, clear the sense. This will *NOT* the UNIT ATTENTION condition if it's set. */ if (cdb[0] != GPCMD_REQUEST_SENSE) scsi_cdrom_sense_clear(dev, cdb[0]); /* Next it's time for NOT READY. */ - if (!ready) + if (!ready || ((dev->unit_attention > 0) && (dev->unit_attention < 3))) dev->media_status = MEC_MEDIA_REMOVAL; else - dev->media_status = (dev->unit_attention) ? MEC_NEW_MEDIA : MEC_NO_CHANGE; + dev->media_status = (dev->unit_attention > 2) ? MEC_NEW_MEDIA : MEC_NO_CHANGE; - if ((scsi_cdrom_command_flags[cdb[0]] & CHECK_READY) && !ready) { - if (scsi_cdrom_command_flags[cdb[0]] & SCSI_ONLY) { /*Note by TC1995: Some vendor commands from X vendor don't really check for ready status - but they do on Y vendor. Quite confusing I know.*/ - switch (dev->drv->type) { - case CDROM_TYPE_DEC_RRD45_0436: - case CDROM_TYPE_SONY_CDU541_10i: - case CDROM_TYPE_SONY_CDU561_18k: - case CDROM_TYPE_SONY_CDU76S_100: - case CDROM_TYPE_TEXEL_DMXX24_100: - if (cdb[0] == 0xC0) - break; - scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); - scsi_cdrom_not_ready(dev); - return 0; - default: - scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); - scsi_cdrom_not_ready(dev); - return 0; - } - } else { - scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); - scsi_cdrom_not_ready(dev); - return 0; - } + if (!ready && scsi_command_check_ready(dev, cdb)) { + scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); + scsi_cdrom_not_ready(dev); + return 0; } scsi_cdrom_log("CD-ROM %i: Continuing with command %02X\n", dev->id, cdb[0]); - return 1; } @@ -1719,7 +1726,7 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt buffer[2] = SENSE_ILLEGAL_REQUEST; buffer[12] = ASC_AUDIO_PLAY_OPERATION; buffer[13] = (dev->drv->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED; - } else if (dev->unit_attention && ((dev->unit_attention & 0xf0) != 0x10) && + } else if ((dev->unit_attention > 2) && ((scsi_cdrom_sense_key == 0) || (scsi_cdrom_sense_key == 2))) { buffer[2] = SENSE_UNIT_ATTENTION; buffer[12] = ASC_MEDIUM_MAY_HAVE_CHANGED; @@ -1728,9 +1735,6 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt scsi_cdrom_log("CD-ROM %i: Reporting sense: %02X %02X %02X\n", dev->id, buffer[2], buffer[12], buffer[13]); - if ((dev->unit_attention & 0xf0) == 0x10) - dev->unit_attention &= 0x0f; - if (buffer[2] == SENSE_UNIT_ATTENTION) { /* If the last remaining sense is unit attention, clear that condition. */ @@ -1746,7 +1750,7 @@ scsi_cdrom_request_sense_for_scsi(scsi_common_t *sc, uint8_t *buffer, uint8_t al if (dev->drv->cd_status & CD_STATUS_MEDIUM_CHANGED) scsi_cdrom_insert((void *) dev); - if ((dev->drv->cd_status == CD_STATUS_EMPTY) && dev->unit_attention) { + if ((dev->drv->cd_status == CD_STATUS_EMPTY) && (dev->unit_attention > 2)) { /* If the drive is not ready, there is no reason to keep the UNIT ATTENTION condition present, as we only use it to mark disc changes. */ From 3c209818ae0a0388b466c4e1966558c0ce302cda Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 05:18:34 +0200 Subject: [PATCH 383/624] P6: Fix the restoration of the A20 state when exiting SMM, fixes #4771. --- src/cpu/386_common.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index 1d130cd8a..87d1008cc 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -1016,9 +1016,14 @@ smram_restore_state_p6(uint32_t *saved_state) cpu_state.seg_gs.ar_high = (saved_state[SMRAM_FIELD_P6_GS_SELECTOR_AR] >> 24) & 0xff; smm_seg_load(&cpu_state.seg_gs); - mem_a20_alt = 0x00; - mem_a20_key = saved_state[SMRAM_FIELD_P6_A20M] ? 0x00 : 0x02; - mem_a20_recalc(); + rammask = cpu_16bitbus ? 0xFFFFFF : 0xFFFFFFFF; + if (is6117) + rammask |= 0x3000000; + + if (saved_state[SMRAM_FIEL_P6_A20M] & 0x01) + rammask &= ~0xffefffff; + + flushmmucache(); if (SMM_REVISION_ID & SMM_SMBASE_RELOCATION) smbase = saved_state[SMRAM_FIELD_P6_SMBASE_OFFSET]; From db946015734df06f47f659088b7dada17ae22516 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 05:22:33 +0200 Subject: [PATCH 384/624] Voodoo 3/Banshee: Implement XRGB8888 LFB format, fixes POD. --- src/include/86box/vid_voodoo_regs.h | 1 + src/video/vid_voodoo_fb.c | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/include/86box/vid_voodoo_regs.h b/src/include/86box/vid_voodoo_regs.h index f05029a8d..379219d35 100644 --- a/src/include/86box/vid_voodoo_regs.h +++ b/src/include/86box/vid_voodoo_regs.h @@ -341,6 +341,7 @@ enum { LFB_FORMAT_RGB565 = 0, LFB_FORMAT_RGB555 = 1, LFB_FORMAT_ARGB1555 = 2, + LFB_FORMAT_XRGB8888 = 4, LFB_FORMAT_ARGB8888 = 5, LFB_FORMAT_DEPTH = 15, LFB_FORMAT_MASK = 15 diff --git a/src/video/vid_voodoo_fb.c b/src/video/vid_voodoo_fb.c index 94394e115..5156cfdad 100644 --- a/src/video/vid_voodoo_fb.c +++ b/src/video/vid_voodoo_fb.c @@ -364,6 +364,15 @@ voodoo_fb_writel(uint32_t addr, uint32_t val, void *priv) addr >>= 1; break; + case LFB_FORMAT_XRGB8888: + colour_data[0].b = val & 0xff; + colour_data[0].g = (val >> 8) & 0xff; + colour_data[0].r = (val >> 16) & 0xff; + alpha_data[0] = 0xff; + write_mask = LFB_WRITE_COLOUR; + addr >>= 1; + break; + case LFB_FORMAT_DEPTH: depth_data[0] = val; depth_data[1] = val >> 16; From 54ab778d4a5130b64db323524a43560172973f48 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 05:32:26 +0200 Subject: [PATCH 385/624] Fixed a compile-breaking typo in cpu/386_common.c. --- src/cpu/386_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index 87d1008cc..ea9cc1126 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -1020,7 +1020,7 @@ smram_restore_state_p6(uint32_t *saved_state) if (is6117) rammask |= 0x3000000; - if (saved_state[SMRAM_FIEL_P6_A20M] & 0x01) + if (saved_state[SMRAM_FIELD_P6_A20M] & 0x01) rammask &= ~0xffefffff; flushmmucache(); From fe4ad0d4e16b50610821a295eba2f5b801ba685c Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 06:01:52 +0200 Subject: [PATCH 386/624] S3: Make sure to absolutely restore everything to the original state on reset, even the contents of vram and changedvram, fixes #4768. --- src/video/vid_s3.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 3f64d3b3a..6fe5f1ad6 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -9441,12 +9441,18 @@ s3_disable_handlers(s3_t *s3) { s3_io_remove(s3); + mem_mapping_set_addr(&s3->linear_mapping, 0, 0); mem_mapping_disable(&s3->linear_mapping); + mem_mapping_set_addr(&s3->mmio_mapping, 0, 0); mem_mapping_disable(&s3->mmio_mapping); + mem_mapping_set_addr(&s3->new_mmio_mapping, 0, 0); mem_mapping_disable(&s3->new_mmio_mapping); + mem_mapping_set_addr(&s3->svga.mapping, 0xa0000, 0x20000); mem_mapping_disable(&s3->svga.mapping); - if (s3->pci) + if (s3->pci) { + mem_mapping_set_addr(&s3->bios_rom.mapping, 0xc0000, 0x8000); mem_mapping_disable(&s3->bios_rom.mapping); + } /* Save all the mappings and the timers because they are part of linked lists. */ reset_state->linear_mapping = s3->linear_mapping; @@ -9457,6 +9463,11 @@ s3_disable_handlers(s3_t *s3) reset_state->svga.timer = s3->svga.timer; reset_state->svga.timer8514 = s3->svga.timer8514; + + memset(s3->svga.vram, 0x00, s3->svga.vram_max + 8); + memset(s3->svga.changedvram, 0x00, (s3->svga.vram_max >> 12) + 1); + + pci_clear_irq(s3->pci_slot, PCI_INTA, &s3->irq_state); } static void @@ -9471,6 +9482,7 @@ s3_reset(void *priv) reset_state->pci_slot = s3->pci_slot; *s3 = *reset_state; + s3_io_set(s3); } } From 91cf90c63a07cec0abff3ce3b1cc19a8f6ed180a Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 07:52:55 +0200 Subject: [PATCH 387/624] Olivetti M19's video adapter has control register on port 3DBh instead of 3DEh, fixes #4739. --- src/include/86box/vid_ogc.h | 1 + src/machine/m_xt_olivetti.c | 2 ++ src/video/vid_ogc.c | 13 +++++++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/include/86box/vid_ogc.h b/src/include/86box/vid_ogc.h index 839769e69..efafb180e 100644 --- a/src/include/86box/vid_ogc.h +++ b/src/include/86box/vid_ogc.h @@ -23,6 +23,7 @@ typedef struct ogc_t { cga_t cga; + uint16_t ctrl_addr; /* unused in OGC, required for M19 video card structure idiom */ uint8_t ctrl_3dd; uint8_t ctrl_3de; diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index b13db6bf9..817b0d0cc 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -2038,6 +2038,8 @@ m19_vid_init(m19_vid_t *vid) vid->ogc.mono_display = 0; else vid->ogc.mono_display = 1; + + vid->ogc.ctrl_addr = 0x3db; /* OGC emulation part end */ /* Plantronics emulation part begin*/ diff --git a/src/video/vid_ogc.c b/src/video/vid_ogc.c index c3073898d..9ac94169c 100644 --- a/src/video/vid_ogc.c +++ b/src/video/vid_ogc.c @@ -97,11 +97,14 @@ ogc_out(uint16_t addr, uint8_t val, void *priv) cga_out(addr, val, &ogc->cga); break; + case 0x3db: case 0x3de: - /* set control register */ - ogc->ctrl_3de = val; - /* select 1st or 2nd 16k vram block to be used */ - ogc->base = (val & 0x08) ? 0x4000 : 0; + if (addr == ogc->ctrl_addr) { + /* set control register */ + ogc->ctrl_3de = val; + /* select 1st or 2nd 16k vram block to be used */ + ogc->base = (val & 0x08) ? 0x4000 : 0; + } break; default: @@ -622,6 +625,8 @@ ogc_init(UNUSED(const device_t *info)) else ogc->mono_display = 1; + ogc->ctrl_addr = 0x3de; + return ogc; } From 1d9603fa7ebeea5fe6bf76d622b635158244ff4d Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 17:44:47 +0200 Subject: [PATCH 388/624] Fixed a very stupid mistake made in cpu/386_common.c last night, fixes #4773. --- src/cpu/386_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpu/386_common.c b/src/cpu/386_common.c index ea9cc1126..dcbe3608c 100644 --- a/src/cpu/386_common.c +++ b/src/cpu/386_common.c @@ -1021,7 +1021,7 @@ smram_restore_state_p6(uint32_t *saved_state) rammask |= 0x3000000; if (saved_state[SMRAM_FIELD_P6_A20M] & 0x01) - rammask &= ~0xffefffff; + rammask &= 0xffefffff; flushmmucache(); From 6a5e9cdabab9d73828901b75522c37a92bb22604 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 19:35:24 +0200 Subject: [PATCH 389/624] Fixed the S3 reset fix, fixes Windows 98 stuck on black screen on the S3 Trio64 on some machines. --- src/video/vid_s3.c | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 6fe5f1ad6..27d4f023e 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -9441,18 +9441,12 @@ s3_disable_handlers(s3_t *s3) { s3_io_remove(s3); - mem_mapping_set_addr(&s3->linear_mapping, 0, 0); mem_mapping_disable(&s3->linear_mapping); - mem_mapping_set_addr(&s3->mmio_mapping, 0, 0); mem_mapping_disable(&s3->mmio_mapping); - mem_mapping_set_addr(&s3->new_mmio_mapping, 0, 0); mem_mapping_disable(&s3->new_mmio_mapping); - mem_mapping_set_addr(&s3->svga.mapping, 0xa0000, 0x20000); mem_mapping_disable(&s3->svga.mapping); - if (s3->pci) { - mem_mapping_set_addr(&s3->bios_rom.mapping, 0xc0000, 0x8000); + if (s3->pci) mem_mapping_disable(&s3->bios_rom.mapping); - } /* Save all the mappings and the timers because they are part of linked lists. */ reset_state->linear_mapping = s3->linear_mapping; @@ -9466,8 +9460,6 @@ s3_disable_handlers(s3_t *s3) memset(s3->svga.vram, 0x00, s3->svga.vram_max + 8); memset(s3->svga.changedvram, 0x00, (s3->svga.vram_max >> 12) + 1); - - pci_clear_irq(s3->pci_slot, PCI_INTA, &s3->irq_state); } static void @@ -9482,7 +9474,6 @@ s3_reset(void *priv) reset_state->pci_slot = s3->pci_slot; *s3 = *reset_state; - s3_io_set(s3); } } From 5fdd6263a23e5c14b0c3a00ce2baa2a28bc47060 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 19:47:22 +0200 Subject: [PATCH 390/624] FDC37x93x: Always return 0xFF on GPIO reads, allow the code in chipset/intel_piix.c to take over instead, fixes CPU speed readout on the HP Vectra VL 5 Series 4. --- src/sio/sio_fdc37c93x.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sio/sio_fdc37c93x.c b/src/sio/sio_fdc37c93x.c index 949c59552..a0152c34a 100644 --- a/src/sio/sio_fdc37c93x.c +++ b/src/sio/sio_fdc37c93x.c @@ -32,6 +32,7 @@ #include <86box/fdd.h> #include <86box/fdc.h> #include <86box/keyboard.h> +#include <86box/machine.h> #include <86box/nvr.h> #include <86box/apm.h> #include <86box/acpi.h> @@ -131,7 +132,8 @@ fdc37c93x_gpio_read(uint16_t port, void *priv) const fdc37c93x_t *dev = (fdc37c93x_t *) priv; uint8_t ret = 0xff; - ret = dev->gpio_regs[port & 1]; + if (strcmp(machine_get_internal_name(), "vectra54")) + ret = dev->gpio_regs[port & 1]; return ret; } From e03ba4cd996072b89fd7e143ad5b4d566a6c0ad4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 19:53:43 +0200 Subject: [PATCH 391/624] Reversed the 486 filtering changes for those two OPTi 495 machines. --- src/cpu/cpu_table.c | 18 +++++++++--------- src/machine/machine_table.c | 16 ++++++++-------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/cpu/cpu_table.c b/src/cpu/cpu_table.c index 120cc6a1e..5326c9d14 100644 --- a/src/cpu/cpu_table.c +++ b/src/cpu/cpu_table.c @@ -2508,7 +2508,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 75000000, .multi = 3.0, - .voltage = 3300, + .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0x480, .cyrix_id = 0x0000, @@ -2525,7 +2525,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 100000000, .multi = 3.0, - .voltage = 3300, + .voltage = 5000, .edx_reset = 0x483, .cpuid_model = 0x483, .cyrix_id = 0x0000, @@ -3066,7 +3066,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 133333333, .multi = 4.0, - .voltage = 3450, + .voltage = 5000, .edx_reset = 0x4e0, .cpuid_model = 0x4e0, .cyrix_id = 0, @@ -3083,7 +3083,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 150000000, .multi = 3.0, - .voltage = 3450, + .voltage = 5000, .edx_reset = 0x482, .cpuid_model = 0x482, .cyrix_id = 0, @@ -3100,7 +3100,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 160000000, .multi = 4.0, - .voltage = 3450, + .voltage = 5000, .edx_reset = 0x4e0, .cpuid_model = 0x4e0, .cyrix_id = 0, @@ -3332,7 +3332,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 80000000, .multi = 2.0, - .voltage = 3450, + .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x002f, @@ -3349,7 +3349,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 100000000, .multi = 3.0, - .voltage = 3450, + .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x002f, @@ -3366,7 +3366,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 120000000, .multi = 3.0, - .voltage = 3450, + .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x002f, @@ -3383,7 +3383,7 @@ const cpu_family_t cpu_families[] = { .fpus = fpus_internal, .rspeed = 133333333, .multi = 4.0, - .voltage = 3450, + .voltage = 5000, .edx_reset = 0x480, .cpuid_model = 0, .cyrix_id = 0x002f, diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c0c0e9085..942c97541 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -5484,10 +5484,10 @@ const machine_t machines[] = { .cpu = { .package = CPU_PKG_386DX | CPU_PKG_SOCKET1, .block = CPU_BLOCK_NONE, - .min_bus = 25000000, - .max_bus = 66666667, - .min_voltage = 5000, - .max_voltage = 5000, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, .min_multi = 0, .max_multi = 0 }, @@ -5524,10 +5524,10 @@ const machine_t machines[] = { .cpu = { .package = CPU_PKG_386DX | CPU_PKG_SOCKET1, .block = CPU_BLOCK_NONE, - .min_bus = 25000000, - .max_bus = 66666667, - .min_voltage = 5000, - .max_voltage = 5000, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, .min_multi = 0, .max_multi = 0 }, From 2207367bddb37679efd2e71cd285ffb99a57c0bb Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 30 Aug 2024 23:20:22 +0200 Subject: [PATCH 392/624] Fixed the segmentation fault on mouse movement when the serial mouse is attached to a disabled serial port. --- src/device/serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/serial.c b/src/device/serial.c index ecc08f15d..2b832f750 100644 --- a/src/device/serial.c +++ b/src/device/serial.c @@ -223,7 +223,7 @@ serial_write_fifo(serial_t *dev, uint8_t dat) ((dev->type >= SERIAL_16550) && dev->fifo_enabled) ? fifo_get_count(dev->rcvr_fifo) : 0); - if (!(dev->mctrl & 0x10)) + if ((dev != NULL) && !(dev->mctrl & 0x10)) write_fifo(dev, dat); } From 7e003b0390075844517dca220a4f2ca719cc719a Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 31 Aug 2024 09:32:33 +0200 Subject: [PATCH 393/624] x87: Remove an excess logging line. --- src/cpu/x87.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/cpu/x87.h b/src/cpu/x87.h index 197e18bfe..060f2fe27 100644 --- a/src/cpu/x87.h +++ b/src/cpu/x87.h @@ -228,7 +228,6 @@ FPU_save_regi_tag(extFloat80_t reg, int tag, int stnr) #define FPU_check_pending_exceptions() \ do { \ if (fpu_state.swd & FPU_SW_Summary) { \ - pclog("SW Summary.\n"); \ if (cr0 & 0x20) { \ x86_int(16); \ return 1; \ From 43ff35c10c4020574156a59d35184509cefeacf4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 31 Aug 2024 19:13:06 +0200 Subject: [PATCH 394/624] Add the Acer A1G to the Siemens PCD-2L hack, fixes POST: 31 30 freeze with non-SL-enhanced 486 CPU's. --- src/device/kbc_at.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index d38a9bb72..b1f15d42a 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -828,7 +828,7 @@ write_p2(atkbc_t *dev, uint8_t val) and can find out what they actually did to make it boot from FFFFF0 correctly despite A20 being gated when the CPU is reset, this will have to do. */ - if (kbc_ven == KBC_VEN_SIEMENS) + if ((kbc_ven == KBC_VEN_SIEMENS) || !strcmp(machine_get_internal_name(), "acera1g")) is486 ? loadcs(0xf000) : loadcs_2386(0xf000); } } From 924db10d13389f4bec486f21593a90bc0b237251 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Sat, 31 Aug 2024 16:17:05 -0400 Subject: [PATCH 395/624] Update dates for 4.2.1 release --- debian/changelog | 2 +- src/unix/assets/86Box.spec | 2 +- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/debian/changelog b/debian/changelog index 78c838a01..6dc3f1586 100644 --- a/debian/changelog +++ b/debian/changelog @@ -2,4 +2,4 @@ * Bump release. - -- Jasmine Iwanek Fri, 26 Jul 2024 21:09:16 +0200 + -- Jasmine Iwanek Sat, 31 Aug 2024 16:12:39 -0400 diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index 15eca9400..fc1573e37 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Fri Jul 26 2024 Robert de Rooy 4.2.1-1 +* Sat Aug 31 Jasmine Iwanek 4.2.1-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index 7fbac6d7f..d8ecc4b54 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + From a10407a0aa001e834feb8eebc6c4085eb0ff19dd Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 2 Sep 2024 00:11:14 +0200 Subject: [PATCH 396/624] The Gigabyte GA-586IS and GA-586IP now have correctly an AT keyboard controller, fixes #4783. --- src/machine/m_at_socket4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_socket4.c b/src/machine/m_at_socket4.c index e39ab87be..79e46819e 100644 --- a/src/machine/m_at_socket4.c +++ b/src/machine/m_at_socket4.c @@ -296,7 +296,7 @@ machine_at_award_common_init(const machine_t *model) if (fdc_current[0] == FDC_INTERNAL) device_add(&fdc_at_device); - device_add(&keyboard_ps2_ami_pci_device); + device_add(&keyboard_at_ami_device); device_add(&sio_zb_device); device_add(&intel_flash_bxt_device); } From 52a78f3ffb895c57566bd57afcab0cf9cbf2a09d Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 2 Sep 2024 00:17:05 +0200 Subject: [PATCH 397/624] Bumped the version to 4.3. --- CMakeLists.txt | 2 +- debian/changelog | 4 ++-- src/unix/assets/86Box.spec | 4 ++-- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- vcpkg.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 2766d4921..f3da96f5e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -35,7 +35,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 4.2.1 + VERSION 4.3 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/debian/changelog b/debian/changelog index 6dc3f1586..827665880 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -86box (4.2.1) UNRELEASED; urgency=medium +86box (4.3) UNRELEASED; urgency=medium * Bump release. - -- Jasmine Iwanek Sat, 31 Aug 2024 16:12:39 -0400 + -- Jasmine Iwanek Mon, 02 Sep 2024 00:16:28 +0200 diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index fc1573e37..86f380d22 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -15,7 +15,7 @@ %global romver 4.1 Name: 86Box -Version: 4.2.1 +Version: 4.3 Release: 1%{?dist} Summary: Classic PC emulator License: GPLv2+ @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Sat Aug 31 Jasmine Iwanek 4.2.1-1 +* Sat Aug 31 Jasmine Iwanek 4.3-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index d8ecc4b54..7a0786a16 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + diff --git a/vcpkg.json b/vcpkg.json index 0d71210c2..87859869b 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "86box", - "version-string": "4.2.1", + "version-string": "4.3", "homepage": "https://86box.net/", "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", From 09a6aab21ae731a3905e0b10303beb3834b2f52d Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 2 Sep 2024 06:32:28 +0200 Subject: [PATCH 398/624] More CD-ROM fixes, fixes Johnny Bazookatone. --- src/scsi/scsi_cdrom.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index e9abdd0d1..4d8b73e6a 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -279,7 +279,7 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default = { { 0, 0 }, { 0, 0 }, { 0, 0 }, - { GPMODE_CAPABILITIES_PAGE, 0x12, 0, 0, 1, 0, 0, 0, 2, 0xC2, 1, 0, 0, 0, 2, 0xC2, 0, 0, 0, 0 }} + { GPMODE_CAPABILITIES_PAGE, 0x12, 7, 0, 0x3f, 1, 0x0d, 3, 2, 0xC2, 1, 0, 0, 0, 2, 0xC2, 0, 0, 0, 0 }} }; static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_scsi = { @@ -325,7 +325,7 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_scsi = { { 0, 0 }, { 0, 0 }, { 0, 0 }, - { GPMODE_CAPABILITIES_PAGE, 0x12, 0, 0, 1, 0, 0, 0, 2, 0xC2, 1, 0, 0, 0, 2, 0xC2, 0, 0, 0, 0 }} + { GPMODE_CAPABILITIES_PAGE, 0x12, 7, 0, 0x3f, 1, 0x0d, 3, 2, 0xC2, 1, 0, 0, 0, 2, 0xC2, 0, 0, 0, 0 }} }; static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_sony_scsi = { @@ -371,7 +371,7 @@ static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_default_sony_scsi = { 0, 0 }, { 0, 0 }, { 0, 0 }, - { GPMODE_CAPABILITIES_PAGE, 0x12, 0, 0, 1, 0, 0, 0, 2, 0xC2, 1, 0, 0, 0, 2, 0xC2, 0, 0, 0, 0 }} + { GPMODE_CAPABILITIES_PAGE, 0x12, 7, 0, 0x3f, 1, 0x0d, 3, 2, 0xC2, 1, 0, 0, 0, 2, 0xC2, 0, 0, 0, 0 }} }; static const mode_sense_pages_t scsi_cdrom_mode_sense_pages_changeable = { From 547ae9ad6ae7a7d369fd65b8756ce2af638473dd Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 2 Sep 2024 06:48:07 +0200 Subject: [PATCH 399/624] Make GET_CONFIGURATION results more consistent with the capabilities page. --- src/scsi/scsi_cdrom.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 4d8b73e6a..4fe6b7567 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -2436,7 +2436,15 @@ begin: b[2] = (0 << 2) | 0x02 | 0x01; /* persistent and current */ b[3] = 4; - b[4] = 0x1d; + b[4] = 0x0d; + /* The early CD-ROM drives we emulate (NEC CDR-260 for ATAPI and + early vendor SCSI CD-ROM models) are caddy drives, the later + ones are tray drives. */ + if (dev->drv->bus_type == CDROM_BUS_SCSI) + b[4] |= ((dev->drv->type == CDROM_TYPE_86BOX_100) ? 0x20 : 0x00); + else + b[4] |= ((dev->drv->type == CDROM_TYPE_NEC_260_100) || + ((dev->drv->type == CDROM_TYPE_NEC_260_101)) ? 0x00 : 0x20); alloc_length += 8; b += 8; From 1e5f8f9d3f14041570116ee3e44d524e0bf89c12 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 2 Sep 2024 19:33:13 +0200 Subject: [PATCH 400/624] FDC: Fix initial condition on non-DMA writes, fixes #4785. --- src/floppy/fdc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 6baef8ab8..0c18f2f30 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -612,9 +612,11 @@ fdc_io_command_phase1(fdc_t *fdc, int out) ui_sb_update_icon(SB_FLOPPY | real_drive(fdc, fdc->drive), 1); fdc->stat = out ? 0x10 : 0x50; - if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma) + if ((fdc->flags & FDC_FLAG_PCJR) || !fdc->dma) { fdc->stat |= 0x20; - else + if (out) + fdc->stat |= 0x80; + } else dma_set_drq(fdc->dma_ch, 1); } From c54286ccd2efd74e0e231bf2b393cffe65ab6034 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Tue, 3 Sep 2024 03:15:43 +0500 Subject: [PATCH 401/624] Remove leftovers of the "Reload prev. image" option --- src/qt/qt_mediamenu.cpp | 4 ---- src/qt/qt_mediamenu.hpp | 3 --- 2 files changed, 7 deletions(-) diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index d9db79db0..f61dd1d0e 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -877,9 +877,7 @@ MediaMenu::zipUpdateMenu(int i) auto childs = menu->children(); auto *ejectMenu = dynamic_cast(childs[zipEjectPos]); - auto *reloadMenu = dynamic_cast(childs[zipReloadPos]); ejectMenu->setEnabled(!name.isEmpty()); - reloadMenu->setEnabled(!prev_name.isEmpty()); QString busName = tr("Unknown Bus"); switch (zip_drives[i].bus_type) { @@ -1008,9 +1006,7 @@ MediaMenu::moUpdateMenu(int i) auto childs = menu->children(); auto *ejectMenu = dynamic_cast(childs[moEjectPos]); - auto *reloadMenu = dynamic_cast(childs[moReloadPos]); ejectMenu->setEnabled(!name.isEmpty()); - reloadMenu->setEnabled(!prev_name.isEmpty()); QString busName = tr("Unknown Bus"); switch (mo_drives[i].bus_type) { diff --git a/src/qt/qt_mediamenu.hpp b/src/qt/qt_mediamenu.hpp index aec2f553f..b069c67d9 100644 --- a/src/qt/qt_mediamenu.hpp +++ b/src/qt/qt_mediamenu.hpp @@ -108,17 +108,14 @@ private: int floppyImageHistoryPos[MAX_PREV_IMAGES]; int cdromMutePos; - int cdromReloadPos; int cdromImagePos; int cdromDirPos; int cdromImageHistoryPos[MAX_PREV_IMAGES]; int zipEjectPos; - int zipReloadPos; int zipImageHistoryPos[MAX_PREV_IMAGES]; int moEjectPos; - int moReloadPos; int moImageHistoryPos[MAX_PREV_IMAGES]; int netDisconnPos; From 16f4ebab9ca5a1a65bb53a77b406a2fafea52415 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 3 Sep 2024 00:45:40 +0200 Subject: [PATCH 402/624] Mouse: Fix the if blocks in mouse_subtract_z(). --- src/device/mouse.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/mouse.c b/src/device/mouse.c index fc193398b..604109668 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -482,10 +482,10 @@ mouse_subtract_z(int *delta_z, int min, int max, int invert) int z = atomic_load(&mouse_z); int real_z = invert ? -z : z; - if (mouse_z > max) { + if (real_z > max) { *delta_z = max; real_z -= max; - } else if (mouse_z < min) { + } else if (real_z < min) { *delta_z = min; real_z += ABS(min); } else { From ca880a3bbbfede593f5a938dfb85fea0feaf9665 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 3 Sep 2024 02:44:30 +0200 Subject: [PATCH 403/624] Gave the J-Bond PCI400C-A and Asus PCI/I-486SP3 the correct keyboard controllers, #4790. --- src/machine/m_at_386dx_486.c | 4 ++-- src/machine/machine_table.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 6b0ffae50..00a4021fe 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -914,7 +914,7 @@ machine_at_pci400ca_init(const machine_t *model) pci_register_slot(0x04, PCI_CARD_NORMAL, 2, 3, 4, 1); pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&keyboard_ps2_ami_device); + device_add(&keyboard_at_ami_device); device_add(&sio_device); device_add(&intel_flash_bxt_ami_device); @@ -1352,7 +1352,7 @@ machine_at_486sp3_init(const machine_t *model) pci_register_slot(0x05, PCI_CARD_NORMAL, 3, 4, 1, 2); /* 05 = Slot 3 */ pci_register_slot(0x06, PCI_CARD_NORMAL, 4, 1, 2, 3); /* 06 = Slot 4 */ pci_register_slot(0x02, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); - device_add(&keyboard_ps2_ami_pci_device); /* Uses the AMIKEY KBC */ + device_add(&keyboard_at_ami_device); /* Uses the AMIKEY KBC */ device_add(&sio_device); device_add(&fdc37c663_ide_device); device_add(&sst_flash_29ee010_device); diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 942c97541..f389ae75a 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -6476,7 +6476,7 @@ const machine_t machines[] = { .step = 1024 }, .nvrmask = 127, - .kbc_device = &keyboard_ps2_ami_device, + .kbc_device = &keyboard_at_ami_device, .kbc_p1 = 0xff, .gpio = 0xffffffff, .gpio_acpi = 0xffffffff, From 00354749f291ab53dc7d8dc99769068bb7fa7517 Mon Sep 17 00:00:00 2001 From: Mike Swanson Date: Mon, 2 Sep 2024 22:52:24 -0700 Subject: [PATCH 404/624] Use ftruncate on Unix to create hard disk images quickly Instead of writing out disk blocks slowly across the entire volume, just use the ftruncate function to create a file instantly at the desired size. Depending on file system, this can either result in identical results to the old code just faster (eg: ZFS and btrfs with compression enabled), sparse files (most native Unix file systems without compression, eg ext4 and UFS), or a full non-sparse file like before (creating an image on FAT). --- src/disk/hdd_image.c | 13 +++++++++++++ src/qt/qt_harddiskdialog.cpp | 11 +++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index db56d5b78..f82b2d3f2 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -26,6 +26,9 @@ #include #include #include +#ifdef __unix__ +#include +#endif #define HAVE_STDARG_H #include <86box/86box.h> #include <86box/path.h> @@ -183,6 +186,7 @@ prepare_new_hard_disk(uint8_t id, uint64_t full_size) { uint64_t target_size = (full_size + hdd_images[id].base) - ftello64(hdd_images[id].file); +#ifndef __unix__ uint32_t size; uint32_t t; @@ -217,7 +221,16 @@ prepare_new_hard_disk(uint8_t id, uint64_t full_size) pclog_toggle_suppr(); free(empty_sector_1mb); +#else + pclog("Creating hard disk image: "); + int ret = ftruncate(fileno(hdd_images[id].file), (size_t) target_size); + if (ret) { + pclog("failed\n"); + fatal("Could not create hard disk image\n"); + } + pclog("OK!\n"); +#endif hdd_images[id].last_sector = (uint32_t) (full_size >> 9) - 1; hdd_images[id].loaded = 1; diff --git a/src/qt/qt_harddiskdialog.cpp b/src/qt/qt_harddiskdialog.cpp index df10a6d38..f2326ef8b 100644 --- a/src/qt/qt_harddiskdialog.cpp +++ b/src/qt/qt_harddiskdialog.cpp @@ -20,6 +20,9 @@ #include "ui_qt_harddiskdialog.h" extern "C" { +#ifdef __unix__ +#include +#endif #include <86box/86box.h> #include <86box/hdd.h> #include "../disk/minivhd/minivhd.h" @@ -447,6 +450,7 @@ HarddiskDialog::onCreateNewFile() } // formats 0, 1 and 2 +#ifndef __unix__ connect(this, &HarddiskDialog::fileProgress, this, [this](int value) { ui->progressBar->setValue(value); QApplication::processEvents(); }); ui->progressBar->setVisible(true); [size, &file, this] { @@ -469,6 +473,13 @@ HarddiskDialog::onCreateNewFile() } emit fileProgress(100); }(); +#else + int ret = ftruncate(file.handle(), (size_t) size); + + if (ret) { + QMessageBox::critical(this, tr("Unable to write file"), tr("Make sure the file is being saved to a writable directory.")); + } +#endif QMessageBox::information(this, tr("Disk image created"), tr("Remember to partition and format the newly-created drive.")); setResult(QDialog::Accepted); From 7ed674eee1d9c8858bbc2dbed7ccc3ea06a0cabc Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 3 Sep 2024 14:14:42 -0300 Subject: [PATCH 405/624] Initial removal of 32-bit builds --- .ci/Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index a57d3c715..38e89eca0 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -23,8 +23,8 @@ def buildType = ['beta', 'alpha'] def buildBranch = env.JOB_BASE_NAME.contains('-') ? 1 : 0 def osArchs = [ - 'Windows': ['32', '64'], - 'Linux': ['x86', 'x86_64', 'arm32', 'arm64'], + 'Windows': ['64'], + 'Linux': ['x86_64', 'arm64'], 'macOS': ['x86_64+x86_64h+arm64'] ] From 4db6fd4a899595a4467e2f0405f437f2b5a5d563 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 3 Sep 2024 14:23:56 -0300 Subject: [PATCH 406/624] Jenkins: Don't include manifest in branch builds --- .ci/Jenkinsfile | 3 ++- .ci/build.sh | 9 ++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.ci/Jenkinsfile b/.ci/Jenkinsfile index 38e89eca0..04b0bc350 100644 --- a/.ci/Jenkinsfile +++ b/.ci/Jenkinsfile @@ -20,6 +20,7 @@ def repository = ['https://github.com/86Box/86Box.git', scm.userRemoteConfigs[0] def commitBrowser = ['https://github.com/86Box/86Box/commit/%s', null] def branch = ['master', scm.branches[0].name] def buildType = ['beta', 'alpha'] +def tarballFlags = ['', '-s'] def buildBranch = env.JOB_BASE_NAME.contains('-') ? 1 : 0 def osArchs = [ @@ -238,7 +239,7 @@ pipeline { dir("${env.WORKSPACE_TMP}/output") { /* Run source tarball creation process. */ def packageName = "${env.JOB_BASE_NAME}-Source$buildSuffix" - if (runBuild("-s \"$packageName\"") == 0) { + if (runBuild("-s \"$packageName\" ${tarballFlags[buildBranch]}") == 0) { /* Archive resulting artifacts. */ archiveArtifacts artifacts: "$packageName*" } else { diff --git a/.ci/build.sh b/.ci/build.sh index ca77d7b83..c60016d51 100755 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -208,7 +208,7 @@ cmake_flags_extra= if [ -z "$package_name" -a -z "$tarball_name" ] || [ -n "$package_name" -a -z "$arch" ] then echo '[!] Usage: build.sh -b {package_name} {architecture} [-t] [cmake_flags...]' - echo ' build.sh -s {source_tarball_name}' + echo ' build.sh -s {source_tarball_name} [-t]' echo 'Dep. tree: build.sh -p [archive_tmp/path/to/binary]' exit 100 fi @@ -228,7 +228,10 @@ then [ ! -d "$cwd" ] && mkdir -p "$cwd" # Save current HEAD commit to VERSION. - git log --stat -1 > VERSION || rm -f VERSION + if [ $strip -eq 0 ] + then + git log --stat -1 > VERSION || rm -f VERSION + fi # Archive source. make_tar "$cwd/$tarball_name.tar" @@ -537,7 +540,7 @@ then fi # Patch wget to remove libproxy support, as it depends on shared-mime-info which - # fails to build for a 10.14 target, which we have to do despite wget only being + # fails to build for a 10.13 target, which we have to do despite wget only being # a host dependency. MacPorts issue 69406 strongly implies this will not be fixed. wget_portfile="$macports/var/macports/sources/rsync.macports.org/macports/release/tarballs/ports/net/wget/Portfile" sudo sed -i -e 's/--enable-libproxy/--disable-libproxy/g' "$wget_portfile" From 8dc8079c2196b6e359116c1fa68f31b1a0585804 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 4 Sep 2024 00:01:03 +0200 Subject: [PATCH 407/624] QT: Attempt to fix mouse wheel on Linux. --- src/qt/qt_rendererstack.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index d594b94f0..fd22b5173 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -200,7 +200,11 @@ RendererStack::mousePressEvent(QMouseEvent *event) void RendererStack::wheelEvent(QWheelEvent *event) { - mouse_set_z(event->pixelDelta().y()); + double numSteps = (double) event->angleDelta().y() / 120.0; + + mouse_set_z((int) numSteps); + + event->accept(); } void From 7b6e5e5ad93e21e1c803eb537704f89105884b4c Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 4 Sep 2024 15:22:24 +0200 Subject: [PATCH 408/624] Implements the second CMDFIFO2 queue for Voodoo 3, fixing BeOS's Voodoo 3/Banshee drivers, fixes #4794. --- src/include/86box/vid_voodoo_common.h | 16 +- src/video/vid_voodoo.c | 4 +- src/video/vid_voodoo_banshee.c | 128 +++++++++++ src/video/vid_voodoo_fifo.c | 298 ++++++++++++++++++++++++++ 4 files changed, 443 insertions(+), 3 deletions(-) diff --git a/src/include/86box/vid_voodoo_common.h b/src/include/86box/vid_voodoo_common.h index 96865ac6d..5ab63ec3a 100644 --- a/src/include/86box/vid_voodoo_common.h +++ b/src/include/86box/vid_voodoo_common.h @@ -408,6 +408,7 @@ typedef struct voodoo_t { atomic_int cmd_read; atomic_int cmd_written; atomic_int cmd_written_fifo; + atomic_int cmd_written_fifo_2; voodoo_params_t params_buffer[PARAM_SIZE]; atomic_int params_read_idx[4]; @@ -426,7 +427,20 @@ typedef struct voodoo_t { uint32_t cmdfifo_amax; int cmdfifo_holecount; - atomic_uint cmd_status; + uint32_t cmdfifo_base_2; + uint32_t cmdfifo_end_2; + uint32_t cmdfifo_size_2; + int cmdfifo_rp_2; + int cmdfifo_ret_addr_2; + int cmdfifo_in_sub_2; + atomic_int cmdfifo_depth_rd_2; + atomic_int cmdfifo_depth_wr_2; + atomic_int cmdfifo_enabled_2; + uint32_t cmdfifo_amin_2; + uint32_t cmdfifo_amax_2; + int cmdfifo_holecount_2; + + atomic_uint cmd_status, cmd_status_2; uint32_t sSetupMode; vert_t verts[4]; diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 93bdd1a4c..efa2d20c8 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -222,12 +222,12 @@ voodoo_readl(uint32_t addr, void *priv) { int fifo_entries = FIFO_ENTRIES; int swap_count = voodoo->swap_count; - int written = voodoo->cmd_written + voodoo->cmd_written_fifo; + int written = voodoo->cmd_written + voodoo->cmd_written_fifo + voodoo->cmd_written_fifo_2; int busy = (written - voodoo->cmd_read) || (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr); if (SLI_ENABLED && voodoo->type != VOODOO_2) { voodoo_t *voodoo_other = (voodoo == voodoo->set->voodoos[0]) ? voodoo->set->voodoos[1] : voodoo->set->voodoos[0]; - int other_written = voodoo_other->cmd_written + voodoo_other->cmd_written_fifo; + int other_written = voodoo_other->cmd_written + voodoo_other->cmd_written_fifo + voodoo->cmd_written_fifo_2; if (voodoo_other->swap_count > swap_count) swap_count = voodoo_other->swap_count; diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index 8e2b98980..c1fb65b00 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -204,6 +204,17 @@ enum { cmdFifoDepth0 = 0x44, cmdHoleCnt0 = 0x48, + cmdBaseAddr1 = 0x50, + cmdBaseSize1 = 0x50 + 0x4, + cmdBump1 = 0x50 + 0x8, + cmdRdPtrL1 = 0x50 + 0xc, + cmdRdPtrH1 = 0x50 + 0x10, + cmdAMin1 = 0x50 + 0x14, + cmdAMax1 = 0x50 + 0x1c, + cmdStatus1 = 0x50 + 0x20, + cmdFifoDepth1 = 0x50 + 0x24, + cmdHoleCnt1 = 0x50 + 0x28, + Agp_agpReqSize = 0x00, Agp_agpHostAddressLow = 0x04, Agp_agpHostAddressHigh = 0x08, @@ -1341,6 +1352,29 @@ banshee_cmd_read(banshee_t *banshee, uint32_t addr) ret = voodoo->cmdfifo_size; break; + case cmdBaseAddr1: + ret = voodoo->cmdfifo_base_2 >> 12; + // banshee_log("Read cmdfifo_base %08x\n", ret); + break; + + case cmdRdPtrL1: + ret = voodoo->cmdfifo_rp_2; + // banshee_log("Read cmdfifo_rp %08x\n", ret); + break; + + case cmdFifoDepth1: + ret = voodoo->cmdfifo_depth_wr_2 - voodoo->cmdfifo_depth_rd_2; + // banshee_log("Read cmdfifo_depth %08x\n", ret); + break; + + case cmdStatus1: + ret = voodoo->cmd_status_2; + break; + + case cmdBaseSize1: + ret = voodoo->cmdfifo_size_2; + break; + case 0x108: break; @@ -1625,6 +1659,45 @@ banshee_cmd_write(banshee_t *banshee, uint32_t addr, uint32_t val) voodoo->cmdfifo_depth_wr = val & 0xffff; break; + case cmdBaseAddr1: + voodoo->cmdfifo_base_2 = (val & 0xfff) << 12; + voodoo->cmdfifo_end_2 = voodoo->cmdfifo_base_2 + (((voodoo->cmdfifo_size_2 & 0xff) + 1) << 12); +#if 0 + banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x %08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end, val); +#endif + break; + + case cmdBaseSize1: + voodoo->cmdfifo_size_2 = val; + voodoo->cmdfifo_end_2 = voodoo->cmdfifo_base_2 + (((voodoo->cmdfifo_size_2 & 0xff) + 1) << 12); + voodoo->cmdfifo_enabled_2 = val & 0x100; + if (!voodoo->cmdfifo_enabled_2) + voodoo->cmdfifo_in_sub_2 = 0; /*Not sure exactly when this should be reset*/ +#if 0 + banshee_log("cmdfifo_base=%08x cmdfifo_end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); +#endif + break; + +#if 0 + voodoo->cmdfifo_end = ((val >> 16) & 0x3ff) << 12; + banshee_log("CMDFIFO base=%08x end=%08x\n", voodoo->cmdfifo_base, voodoo->cmdfifo_end); + break; +#endif + + case cmdRdPtrL1: + voodoo->cmdfifo_rp_2 = val; + break; + case cmdAMin1: + voodoo->cmdfifo_amin_2 = val; + break; + case cmdAMax1: + voodoo->cmdfifo_amax_2 = val; + break; + case cmdFifoDepth1: + voodoo->cmdfifo_depth_rd_2 = 0; + voodoo->cmdfifo_depth_wr_2 = val & 0xffff; + break; + default: banshee_log("Unknown banshee_cmd_write: addr=%08x val=%08x reg=0x%03x\n", addr, val, addr & 0x1fc); break; @@ -2064,6 +2137,60 @@ banshee_write_linear_l(uint32_t addr, uint32_t val, void *priv) voodoo->cmdfifo_holecount = ((voodoo->cmdfifo_amax - voodoo->cmdfifo_amin) >> 2) - 1; #if 0 banshee_log("CMDFIFO out of order: amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); +#endif + } + } + + if (voodoo->cmdfifo_enabled_2 && addr >= voodoo->cmdfifo_base_2 && addr < voodoo->cmdfifo_end_2) { +#if 0 + banshee_log("CMDFIFO write %08x %08x old amin=%08x amax=%08x hlcnt=%i depth_wr=%i rp=%08x\n", addr, val, voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount, voodoo->cmdfifo_depth_wr, voodoo->cmdfifo_rp); +#endif + if (addr == voodoo->cmdfifo_base_2 && !voodoo->cmdfifo_holecount_2) { +#if 0 + if (voodoo->cmdfifo_holecount) + fatal("CMDFIFO reset pointers while outstanding holes\n"); +#endif + /*Reset pointers*/ + voodoo->cmdfifo_amin_2 = voodoo->cmdfifo_base_2; + voodoo->cmdfifo_amax_2 = voodoo->cmdfifo_base_2; + voodoo->cmdfifo_depth_wr_2++; + voodoo_wake_fifo_thread(voodoo); + } else if (voodoo->cmdfifo_holecount_2) { +#if 0 + if ((addr <= voodoo->cmdfifo_amin && voodoo->cmdfifo_amin != -4) || addr >= voodoo->cmdfifo_amax) + fatal("CMDFIFO holecount write outside of amin/amax - amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); + banshee_log("holecount %i\n", voodoo->cmdfifo_holecount); +#endif + voodoo->cmdfifo_holecount_2--; + if (!voodoo->cmdfifo_holecount_2) { + /*Filled in holes, resume normal operation*/ + voodoo->cmdfifo_depth_wr_2 += ((voodoo->cmdfifo_amax_2 - voodoo->cmdfifo_amin_2) >> 2); + voodoo->cmdfifo_amin_2 = voodoo->cmdfifo_amax_2; + voodoo_wake_fifo_thread(voodoo); +#if 0 + banshee_log("hole filled! amin=%08x amax=%08x added %i words\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, words_to_add); +#endif + } + } else if (addr == voodoo->cmdfifo_amax_2 + 4) { + /*In-order write*/ + voodoo->cmdfifo_amin_2 = addr; + voodoo->cmdfifo_amax_2 = addr; + voodoo->cmdfifo_depth_wr_2++; + voodoo_wake_fifo_thread(voodoo); + } else { + /*Out-of-order write*/ + if (addr < voodoo->cmdfifo_amin_2) { + /*Reset back to start. Note that write is still out of order!*/ + voodoo->cmdfifo_amin_2 = voodoo->cmdfifo_base_2 - 4; + } +#if 0 + else if (addr < voodoo->cmdfifo_amax) + fatal("Out-of-order write really out of order\n"); +#endif + voodoo->cmdfifo_amax_2 = addr; + voodoo->cmdfifo_holecount_2 = ((voodoo->cmdfifo_amax_2 - voodoo->cmdfifo_amin_2) >> 2) - 1; +#if 0 + banshee_log("CMDFIFO out of order: amin=%08x amax=%08x holecount=%i\n", voodoo->cmdfifo_amin, voodoo->cmdfifo_amax, voodoo->cmdfifo_holecount); #endif } } @@ -3313,6 +3440,7 @@ banshee_init_common(const device_t *info, char *fn, int has_sgram, int type, int banshee->voodoo->tex_mem_w[1] = (uint16_t *) banshee->svga.vram; banshee->voodoo->texture_mask = banshee->svga.vram_mask; banshee->voodoo->cmd_status = (1 << 28); + banshee->voodoo->cmd_status_2 = (1 << 28); voodoo_generate_filter_v1(banshee->voodoo); banshee->vidSerialParallelPort = VIDSERIAL_DDC_DCK_W | VIDSERIAL_DDC_DDA_W; diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index f8495edec..88a6905c2 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -188,6 +188,40 @@ cmdfifo_get_f(voodoo_t *voodoo) return tempif.f; } +static uint32_t +cmdfifo_get_2(voodoo_t *voodoo) +{ + uint32_t val; + + if (!voodoo->cmdfifo_in_sub_2) { + while (voodoo->fifo_thread_run && (voodoo->cmdfifo_depth_rd_2 == voodoo->cmdfifo_depth_wr_2)) { + thread_wait_event(voodoo->wake_fifo_thread, -1); + thread_reset_event(voodoo->wake_fifo_thread); + } + } + + val = *(uint32_t *) &voodoo->fb_mem[voodoo->cmdfifo_rp_2 & voodoo->fb_mask]; + + if (!voodoo->cmdfifo_in_sub_2) + voodoo->cmdfifo_depth_rd_2++; + voodoo->cmdfifo_rp_2 += 4; + + // voodoo_fifo_log(" CMDFIFO get %08x\n", val); + return val; +} + +static inline float +cmdfifo_get_f_2(voodoo_t *voodoo) +{ + union { + uint32_t i; + float f; + } tempif; + + tempif.i = cmdfifo_get(voodoo); + return tempif.f; +} + enum { CMDFIFO3_PC_MASK_RGB = (1 << 10), CMDFIFO3_PC_MASK_ALPHA = (1 << 11), @@ -283,6 +317,7 @@ voodoo_fifo_thread(void *param) } voodoo->cmd_status |= (1 << 24); + voodoo->cmd_status_2 |= (1 << 24); while (voodoo->cmdfifo_enabled && (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr || voodoo->cmdfifo_in_sub)) { uint64_t start_time = plat_timer_read(); @@ -545,6 +580,269 @@ voodoo_fifo_thread(void *param) end_time = plat_timer_read(); voodoo->time += end_time - start_time; } + + while (voodoo->cmdfifo_enabled_2 && (voodoo->cmdfifo_depth_rd_2 != voodoo->cmdfifo_depth_wr_2 || voodoo->cmdfifo_in_sub_2)) { + uint64_t start_time = plat_timer_read(); + uint64_t end_time; + uint32_t header = cmdfifo_get_2(voodoo); + uint32_t addr; + uint32_t mask; + int smode; + int num; + int num_verticies; + int v_num; + +#if 0 + voodoo_fifo_log(" CMDFIFO header %08x at %08x\n", header, voodoo->cmdfifo_rp); +#endif + + voodoo->cmd_status_2 &= ~7; + voodoo->cmd_status_2 |= (header & 7); + voodoo->cmd_status_2 |= (1 << 11); + switch (header & 7) { + case 0: +#if 0 + voodoo_fifo_log("CMDFIFO0\n"); +#endif + voodoo->cmd_status_2 = (voodoo->cmd_status_2 & 0xffff8fff) | (((header >> 3) & 7) << 12); + switch ((header >> 3) & 7) { + case 0: /*NOP*/ + break; + + case 1: /*JSR*/ +#if 0 + voodoo_fifo_log("JSR %08x\n", (header >> 4) & 0xfffffc); +#endif + voodoo->cmdfifo_ret_addr_2 = voodoo->cmdfifo_rp_2; + voodoo->cmdfifo_rp_2 = (header >> 4) & 0xfffffc; + voodoo->cmdfifo_in_sub_2 = 1; + break; + + case 2: /*RET*/ + voodoo->cmdfifo_rp_2 = voodoo->cmdfifo_ret_addr_2; + voodoo->cmdfifo_in_sub_2 = 0; + break; + + case 3: /*JMP local frame buffer*/ + voodoo->cmdfifo_rp_2 = (header >> 4) & 0xfffffc; +#if 0 + voodoo_fifo_log("JMP to %08x %04x\n", voodoo->cmdfifo_rp, header); +#endif + break; + + default: + fatal("Bad CMDFIFO0 %08x\n", header); + } + voodoo->cmd_status_2 = (voodoo->cmd_status_2 & ~(1 << 27)) | (voodoo->cmdfifo_in_sub_2 << 27); + break; + + case 1: + num = header >> 16; + addr = (header & 0x7ff8) >> 1; +#if 0 + voodoo_fifo_log("CMDFIFO1 addr=%08x\n",addr); +#endif + while (num--) { + uint32_t val = cmdfifo_get_2(voodoo); + if ((addr & (1 << 13)) && voodoo->type >= VOODOO_BANSHEE) { +#if 0 + if (voodoo->type != VOODOO_BANSHEE) + fatal("CMDFIFO1: Not Banshee\n"); +#endif + +#if 0 + voodoo_fifo_log("CMDFIFO1: write %08x %08x\n", addr, val); +#endif + voodoo_2d_reg_writel(voodoo, addr, val); + } else { + if ((addr & 0x3ff) == SST_triangleCMD || (addr & 0x3ff) == SST_ftriangleCMD || (addr & 0x3ff) == SST_fastfillCMD || (addr & 0x3ff) == SST_nopCMD) + voodoo->cmd_written_fifo_2++; + + if (voodoo->type >= VOODOO_BANSHEE && (addr & 0x3ff) == SST_swapbufferCMD) + voodoo->cmd_written_fifo_2++; + voodoo_reg_writel(addr, val, voodoo); + } + + if (header & (1 << 15)) + addr += 4; + } + break; + + case 2: + if (voodoo->type < VOODOO_2) + fatal("CMDFIFO2: Not Voodoo 2\n"); + mask = (header >> 3); + addr = 8; + while (mask) { + if (mask & 1) { + uint32_t val = cmdfifo_get_2(voodoo); + + voodoo_2d_reg_writel(voodoo, addr, val); + } + + addr += 4; + mask >>= 1; + } + break; + + case 3: + num = (header >> 29) & 7; + mask = header; //(header >> 10) & 0xff; + smode = (header >> 22) & 0xf; + voodoo_reg_writel(SST_sSetupMode, ((header >> 10) & 0xff) | (smode << 16), voodoo); + num_verticies = (header >> 6) & 0xf; + v_num = 0; + if (((header >> 3) & 7) == 2) + v_num = 1; +#if 0 + voodoo_fifo_log("CMDFIFO3: num=%i verts=%i mask=%02x\n", num, num_verticies, (header >> 10) & 0xff); + voodoo_fifo_log("CMDFIFO3 %02x %i\n", (header >> 10), (header >> 3) & 7); +#endif + + while (num_verticies--) { + voodoo->verts[3].sVx = cmdfifo_get_f_2(voodoo); + voodoo->verts[3].sVy = cmdfifo_get_f_2(voodoo); + if (mask & CMDFIFO3_PC_MASK_RGB) { + if (header & CMDFIFO3_PC) { + uint32_t val = cmdfifo_get_2(voodoo); + voodoo->verts[3].sBlue = (float) (val & 0xff); + voodoo->verts[3].sGreen = (float) ((val >> 8) & 0xff); + voodoo->verts[3].sRed = (float) ((val >> 16) & 0xff); + voodoo->verts[3].sAlpha = (float) ((val >> 24) & 0xff); + } else { + voodoo->verts[3].sRed = cmdfifo_get_f_2(voodoo); + voodoo->verts[3].sGreen = cmdfifo_get_f_2(voodoo); + voodoo->verts[3].sBlue = cmdfifo_get_f_2(voodoo); + } + } + if ((mask & CMDFIFO3_PC_MASK_ALPHA) && !(header & CMDFIFO3_PC)) + voodoo->verts[3].sAlpha = cmdfifo_get_f_2(voodoo); + if (mask & CMDFIFO3_PC_MASK_Z) + voodoo->verts[3].sVz = cmdfifo_get_f_2(voodoo); + if (mask & CMDFIFO3_PC_MASK_Wb) + voodoo->verts[3].sWb = cmdfifo_get_f_2(voodoo); + if (mask & CMDFIFO3_PC_MASK_W0) + voodoo->verts[3].sW0 = cmdfifo_get_f_2(voodoo); + if (mask & CMDFIFO3_PC_MASK_S0_T0) { + voodoo->verts[3].sS0 = cmdfifo_get_f_2(voodoo); + voodoo->verts[3].sT0 = cmdfifo_get_f_2(voodoo); + } + if (mask & CMDFIFO3_PC_MASK_W1) + voodoo->verts[3].sW1 = cmdfifo_get_f_2(voodoo); + if (mask & CMDFIFO3_PC_MASK_S1_T1) { + voodoo->verts[3].sS1 = cmdfifo_get_f_2(voodoo); + voodoo->verts[3].sT1 = cmdfifo_get_f_2(voodoo); + } + if (v_num) + voodoo_reg_writel(SST_sDrawTriCMD, 0, voodoo); + else + voodoo_reg_writel(SST_sBeginTriCMD, 0, voodoo); + v_num++; + if (v_num == 3 && ((header >> 3) & 7) == 0) + v_num = 0; + } + while (num--) + cmdfifo_get_2(voodoo); + break; + + case 4: + num = (header >> 29) & 7; + mask = (header >> 15) & 0x3fff; + addr = (header & 0x7ff8) >> 1; +#if 0 + voodoo_fifo_log("CMDFIFO4 addr=%08x\n",addr); +#endif + while (mask) { + if (mask & 1) { + uint32_t val = cmdfifo_get_2(voodoo); + + if ((addr & (1 << 13)) && voodoo->type >= VOODOO_BANSHEE) { + if (voodoo->type < VOODOO_BANSHEE) + fatal("CMDFIFO1: Not Banshee\n"); +#if 0 + voodoo_fifo_log("CMDFIFO1: write %08x %08x\n", addr, val); +#endif + + voodoo_2d_reg_writel(voodoo, addr, val); + } else { + if ((addr & 0x3ff) == SST_triangleCMD || (addr & 0x3ff) == SST_ftriangleCMD || (addr & 0x3ff) == SST_fastfillCMD || (addr & 0x3ff) == SST_nopCMD) + voodoo->cmd_written_fifo_2++; + + if (voodoo->type >= VOODOO_BANSHEE && (addr & 0x3ff) == SST_swapbufferCMD) + voodoo->cmd_written_fifo_2++; + voodoo_reg_writel(addr, val, voodoo); + } + } + + addr += 4; + mask >>= 1; + } + while (num--) + cmdfifo_get_2(voodoo); + break; + + case 5: +#if 0 + if (header & 0x3fc00000) + fatal("CMDFIFO packet 5 has byte disables set %08x\n", header); +#endif + num = (header >> 3) & 0x7ffff; + addr = cmdfifo_get_2(voodoo) & 0xffffff; + if (!num) + num = 1; +#if 0 + voodoo_fifo_log("CMDFIFO5 addr=%08x num=%i\n", addr, num); +#endif + switch (header >> 30) { + case 0: /*Linear framebuffer (Banshee)*/ + case 1: /*Planar YUV*/ + if (voodoo->texture_present[0][(addr & voodoo->texture_mask) >> TEX_DIRTY_SHIFT]) { +#if 0 + voodoo_fifo_log("texture_present at %08x %i\n", addr, (addr & voodoo->texture_mask) >> TEX_DIRTY_SHIFT); +#endif + flush_texture_cache(voodoo, addr & voodoo->texture_mask, 0); + } + if (voodoo->texture_present[1][(addr & voodoo->texture_mask) >> TEX_DIRTY_SHIFT]) { +#if 0 + voodoo_fifo_log("texture_present at %08x %i\n", addr, (addr & voodoo->texture_mask) >> TEX_DIRTY_SHIFT); +#endif + flush_texture_cache(voodoo, addr & voodoo->texture_mask, 1); + } + while (num--) { + uint32_t val = cmdfifo_get_2(voodoo); + if (addr <= voodoo->fb_mask) + *(uint32_t *) &voodoo->fb_mem[addr] = val; + addr += 4; + } + break; + case 2: /*Framebuffer*/ + while (num--) { + uint32_t val = cmdfifo_get_2(voodoo); + voodoo_fb_writel(addr, val, voodoo); + addr += 4; + } + break; + case 3: /*Texture*/ + while (num--) { + uint32_t val = cmdfifo_get_2(voodoo); + voodoo_tex_writel(addr, val, voodoo); + addr += 4; + } + break; + + default: + fatal("CMDFIFO packet 5 bad space %08x %08x\n", header, voodoo->cmdfifo_rp); + } + break; + + default: + fatal("Bad CMDFIFO packet %08x %08x\n", header, voodoo->cmdfifo_rp); + } + + end_time = plat_timer_read(); + voodoo->time += end_time - start_time; + } + voodoo->voodoo_busy = 0; } } From 581cbcb0c69d57e013a6c36ecf4e17a58f677b8e Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 4 Sep 2024 15:41:30 +0200 Subject: [PATCH 409/624] A small fix to video/vid_voodoo_fifo.c. --- src/video/vid_voodoo_fifo.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index 88a6905c2..54a0140f6 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -218,7 +218,7 @@ cmdfifo_get_f_2(voodoo_t *voodoo) float f; } tempif; - tempif.i = cmdfifo_get(voodoo); + tempif.i = cmdfifo_get_2(voodoo); return tempif.f; } From f4b63caf0b99b2816fdb776d706a77f60ff47e36 Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Wed, 4 Sep 2024 18:34:06 -0400 Subject: [PATCH 410/624] One line per file in CmakeLists.txt --- CMakeLists.txt | 85 ++++++++++++++-------------- src/CMakeLists.txt | 44 +++++++++++++-- src/cdrom/CMakeLists.txt | 10 +++- src/chipset/CMakeLists.txt | 80 ++++++++++++++++++++++---- src/codegen/CMakeLists.txt | 19 +++++-- src/codegen_new/CMakeLists.txt | 72 +++++++++++++++++------- src/cpu/CMakeLists.txt | 34 ++++++++--- src/device/CMakeLists.txt | 47 +++++++++++++--- src/disk/CMakeLists.txt | 27 +++++++-- src/floppy/CMakeLists.txt | 21 ++++++- src/game/CMakeLists.txt | 11 +++- src/mac/CMakeLists.txt | 2 + src/machine/CMakeLists.txt | 49 +++++++++++++--- src/mem/CMakeLists.txt | 16 +++++- src/network/CMakeLists.txt | 25 ++++++++- src/printer/CMakeLists.txt | 10 +++- src/qt/CMakeLists.txt | 23 +++++--- src/scsi/CMakeLists.txt | 20 ++++++- src/sio/CMakeLists.txt | 35 +++++++++--- src/sound/CMakeLists.txt | 45 +++++++++++++-- src/unix/CMakeLists.txt | 15 ++++- src/video/CMakeLists.txt | 100 ++++++++++++++++++++++++++------- 22 files changed, 621 insertions(+), 169 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f3da96f5e..f2a78aa2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,16 +1,17 @@ # -# 86Box A hypervisor and IBM PC system emulator that specializes in -# running old operating systems and software designed for IBM -# PC systems and compatibles from 1981 through fairly recent -# system designs based on the PCI bus. +# 86Box A hypervisor and IBM PC system emulator that specializes in +# running old operating systems and software designed for IBM +# PC systems and compatibles from 1981 through fairly recent +# system designs based on the PCI bus. # -# This file is part of the 86Box distribution. +# This file is part of the 86Box distribution. # -# CMake build script. +# CMake build script. # -# Authors: David Hrdlička, +# Authors: David Hrdlička, # -# Copyright 2020-2021 David Hrdlička. +# Copyright 2020-2021 David Hrdlička. +# Copyright 2021-2024 Jasmine Iwanek. # cmake_minimum_required(VERSION 3.16) @@ -122,21 +123,21 @@ set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) # Optional features # -# Option Description Def. -# ------ ----------- ---- -option(RELEASE "Release build" OFF) -option(DYNAREC "Dynamic recompiler" ON) -option(OPENAL "OpenAL" ON) -option(RTMIDI "RtMidi" ON) -option(FLUIDSYNTH "FluidSynth" ON) -option(MUNT "MUNT" ON) -option(VNC "VNC renderer" OFF) -option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF) -option(MINITRACE "Enable Chrome tracing using the modified minitrace library" OFF) -option(GDBSTUB "Enable GDB stub server for debugging" OFF) -option(DEV_BRANCH "Development branch" OFF) -option(DISCORD "Discord Rich Presence support" ON) -option(DEBUGREGS486 "Enable debug register opeartion on 486+ CPUs" OFF) +# Option Description Def. +# ------ ----------- ---- +option(RELEASE "Release build" OFF) +option(DYNAREC "Dynamic recompiler" ON) +option(OPENAL "OpenAL" ON) +option(RTMIDI "RtMidi" ON) +option(FLUIDSYNTH "FluidSynth" ON) +option(MUNT "MUNT" ON) +option(VNC "VNC renderer" OFF) +option(NEW_DYNAREC "Use the PCem v15 (\"new\") dynamic recompiler" OFF) +option(MINITRACE "Enable Chrome tracing using the modified minitrace library" OFF) +option(GDBSTUB "Enable GDB stub server for debugging" OFF) +option(DEV_BRANCH "Development branch" OFF) +option(DISCORD "Discord Rich Presence support" ON) +option(DEBUGREGS486 "Enable debug register opeartion on 486+ CPUs" OFF) if(WIN32) set(QT ON) @@ -148,25 +149,25 @@ endif() # Development branch features # -# Option Description Def. Condition Otherwise -# ------ ----------- ---- --------- --------- -cmake_dependent_option(AMD_K5 "AMD K5" ON "DEV_BRANCH" OFF) -cmake_dependent_option(AN430TX "Intel AN430TX" ON "DEV_BRANCH" OFF) -cmake_dependent_option(CDROM_MITSUMI "Mitsumi CDROM" ON "DEV_BRANCH" OFF) -cmake_dependent_option(CYRIX_6X86 "Cyrix 6x86" ON "DEV_BRANCH" OFF) -cmake_dependent_option(G100 "Matrox Productiva G100" ON "DEV_BRANCH" OFF) -cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" ON "DEV_BRANCH" OFF) -cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage" ON "DEV_BRANCH" OFF) -cmake_dependent_option(ISAMEM_IAB "Intel Above Board" ON "DEV_BRANCH" OFF) -cmake_dependent_option(ISAMEM_BRAT "BocaRAM/AT" ON "DEV_BRANCH" OFF) -cmake_dependent_option(LASERXT "VTech Laser XT" ON "DEV_BRANCH" OFF) -cmake_dependent_option(OLIVETTI "Olivetti M290" ON "DEV_BRANCH" OFF) -cmake_dependent_option(OPEN_AT "OpenAT" ON "DEV_BRANCH" OFF) -cmake_dependent_option(OPL4ML "OPL4-ML daughterboard" ON "DEV_BRANCH" OFF) -cmake_dependent_option(PCL "Generic PCL5e Printer" ON "DEV_BRANCH" OFF) -cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF) -cmake_dependent_option(WACOM "Wacom Input Devices" ON "DEV_BRANCH" OFF) -cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF) +# Option Description Def. Condition Otherwise +# ------ ----------- ---- ------------ --------- +cmake_dependent_option(AMD_K5 "AMD K5" ON "DEV_BRANCH" OFF) +cmake_dependent_option(AN430TX "Intel AN430TX" ON "DEV_BRANCH" OFF) +cmake_dependent_option(CDROM_MITSUMI "Mitsumi CDROM" ON "DEV_BRANCH" OFF) +cmake_dependent_option(CYRIX_6X86 "Cyrix 6x86" ON "DEV_BRANCH" OFF) +cmake_dependent_option(G100 "Matrox Productiva G100" ON "DEV_BRANCH" OFF) +cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" ON "DEV_BRANCH" OFF) +cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage" ON "DEV_BRANCH" OFF) +cmake_dependent_option(ISAMEM_IAB "Intel Above Board" ON "DEV_BRANCH" OFF) +cmake_dependent_option(ISAMEM_BRAT "BocaRAM/AT" ON "DEV_BRANCH" OFF) +cmake_dependent_option(LASERXT "VTech Laser XT" ON "DEV_BRANCH" OFF) +cmake_dependent_option(OLIVETTI "Olivetti M290" ON "DEV_BRANCH" OFF) +cmake_dependent_option(OPEN_AT "OpenAT" ON "DEV_BRANCH" OFF) +cmake_dependent_option(OPL4ML "OPL4-ML daughterboard" ON "DEV_BRANCH" OFF) +cmake_dependent_option(PCL "Generic PCL5e Printer" ON "DEV_BRANCH" OFF) +cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF) +cmake_dependent_option(WACOM "Wacom Input Devices" ON "DEV_BRANCH" OFF) +cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF) # Ditto but for Qt if(QT) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0841fabdd..7d6daff9c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -12,16 +12,45 @@ # dob205 # # Copyright 2020-2022 David Hrdlička. -# Copyright 2021 dob205. +# Copyright 2021 dob205. +# Copyright 2024 Jasmine Iwanek. # + if(APPLE) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) endif() -add_executable(86Box 86box.c config.c log.c random.c timer.c io.c acpi.c apm.c - dma.c ddma.c nmi.c pic.c pit.c pit_fast.c port_6x.c port_92.c ppi.c pci.c - mca.c usb.c fifo.c fifo8.c device.c nvr.c nvr_at.c nvr_ps2.c - machine_status.c ini.c cJSON.c) +add_executable(86Box + 86box.c + config.c + log.c + random.c + timer.c + io.c + acpi.c + apm.c + dma.c + ddma.c + nmi.c + pic.c + pit.c + pit_fast.c + port_6x.c + port_92.c + ppi.c + pci.c + mca.c + usb.c + fifo.c + fifo8.c + device.c + nvr.c + nvr_at.c + nvr_ps2.c + machine_status.c + ini.c + cJSON.c +) if(CMAKE_SYSTEM_NAME MATCHES "Linux") add_compile_definitions(_FILE_OFFSET_BITS=64 _LARGEFILE_SOURCE=1 _LARGEFILE64_SOURCE=1) @@ -61,7 +90,10 @@ if(VNC) find_package(LibVNCServer) if(LibVNCServer_FOUND) add_compile_definitions(USE_VNC) - add_library(vnc OBJECT vnc.c vnc_keymap.c) + add_library(vnc OBJECT + vnc.c + vnc_keymap.c + ) target_link_libraries(86Box vnc LibVNCServer::vncserver) if(WIN32) target_link_libraries(86Box ws2_32) diff --git a/src/cdrom/CMakeLists.txt b/src/cdrom/CMakeLists.txt index 0b4455eda..2f0f1cd23 100644 --- a/src/cdrom/CMakeLists.txt +++ b/src/cdrom/CMakeLists.txt @@ -9,15 +9,23 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # find_package(PkgConfig REQUIRED) pkg_check_modules(SNDFILE REQUIRED IMPORTED_TARGET sndfile) -add_library(cdrom OBJECT cdrom.c cdrom_image_backend.c cdrom_image_viso.c cdrom_image.c cdrom_ioctl.c) +add_library(cdrom OBJECT + cdrom.c + cdrom_image_backend.c + cdrom_image_viso.c + cdrom_image.c + cdrom_ioctl.c +) target_link_libraries(86Box PkgConfig::SNDFILE) if(CDROM_MITSUMI) diff --git a/src/chipset/CMakeLists.txt b/src/chipset/CMakeLists.txt index 36e840dc7..6018dd045 100644 --- a/src/chipset/CMakeLists.txt +++ b/src/chipset/CMakeLists.txt @@ -9,20 +9,80 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(chipset OBJECT 82c100.c acc2168.c cs8230.c ali1429.c ali1435.c ali1489.c - ali1531.c ali1541.c ali1543.c ali1621.c ali6117.c ali1409.c headland.c ims8848.c intel_82335.c - compaq_386.c contaq_82c59x.c cs4031.c intel_420ex.c intel_4x0.c intel_i450kx.c - intel_sio.c intel_piix.c ../ioapic.c neat.c opti283.c opti291.c opti391.c opti495.c - opti499.c opti602.c opti822.c opti895.c opti5x7.c scamp.c scat.c sis_85c310.c sis_85c4xx.c - sis_85c496.c sis_85c50x.c sis_5511.c sis_5571.c sis_5581.c sis_5591.c sis_5600.c - sis_5511_h2p.c sis_5571_h2p.c sis_5581_h2p.c sis_5591_h2p.c sis_5600_h2p.c - sis_5513_p2i.c sis_5513_ide.c sis_5572_usb.c sis_5595_pmu.c sis_55xx.c via_vt82c49x.c - via_vt82c505.c gc100.c stpc.c - umc_8886.c umc_hb4.c umc_8890.c via_apollo.c via_pipc.c vl82c480.c wd76c10.c) +add_library(chipset OBJECT + 82c100.c + acc2168.c + cs8230.c + ali1429.c + ali1435.c + ali1489.c + ali1531.c + ali1541.c + ali1543.c + ali1621.c + ali6117.c + ali1409.c + headland.c + ims8848.c + intel_82335.c + compaq_386.c + contaq_82c59x.c + cs4031.c + intel_420ex.c + intel_4x0.c + intel_i450kx.c + intel_sio.c + intel_piix.c + ../ioapic.c + neat.c + opti283.c + opti291.c + opti391.c + opti495.c + opti499.c + opti602.c + opti822.c + opti895.c + opti5x7.c + scamp.c + scat.c + sis_85c310.c + sis_85c4xx.c + sis_85c496.c + sis_85c50x.c + sis_5511.c + sis_5571.c + sis_5581.c + sis_5591.c + sis_5600.c + sis_5511_h2p.c + sis_5571_h2p.c + sis_5581_h2p.c + sis_5591_h2p.c + sis_5600_h2p.c + sis_5513_p2i.c + sis_5513_ide.c + sis_5572_usb.c + sis_5595_pmu.c + sis_55xx.c + via_vt82c49x.c + via_vt82c505.c + gc100.c + stpc.c + umc_8886.c + umc_hb4.c + umc_8890.c + via_apollo.c + via_pipc.c + vl82c480.c + wd76c10.c +) if(OLIVETTI) target_sources(chipset PRIVATE olivetti_eva.c) diff --git a/src/codegen/CMakeLists.txt b/src/codegen/CMakeLists.txt index 3cb9de6ca..3d000c98d 100644 --- a/src/codegen/CMakeLists.txt +++ b/src/codegen/CMakeLists.txt @@ -9,19 +9,28 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # if(DYNAREC) - add_library(dynarec OBJECT codegen.c codegen_ops.c) + add_library(dynarec OBJECT + codegen.c + codegen_ops.c + ) if(ARCH STREQUAL "i386") - target_sources(dynarec PRIVATE codegen_x86.c - codegen_accumulate_x86.c) + target_sources(dynarec PRIVATE + codegen_x86.c + codegen_accumulate_x86.c + ) elseif(ARCH STREQUAL "x86_64") - target_sources(dynarec PRIVATE codegen_x86-64.c - codegen_accumulate_x86-64.c) + target_sources(dynarec PRIVATE + codegen_x86-64.c + codegen_accumulate_x86-64.c + ) else() message(SEND_ERROR "Dynarec is incompatible with target platform ${ARCH}") diff --git a/src/codegen_new/CMakeLists.txt b/src/codegen_new/CMakeLists.txt index 038f1edd1..cee7d5cb9 100644 --- a/src/codegen_new/CMakeLists.txt +++ b/src/codegen_new/CMakeLists.txt @@ -9,39 +9,71 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # if(DYNAREC) - add_library(dynarec OBJECT codegen.c codegen_accumulate.c - codegen_allocator.c codegen_block.c codegen_ir.c codegen_ops.c - codegen_ops_3dnow.c codegen_ops_branch.c codegen_ops_arith.c - codegen_ops_fpu_arith.c codegen_ops_fpu_constant.c - codegen_ops_fpu_loadstore.c codegen_ops_fpu_misc.c - codegen_ops_helpers.c codegen_ops_jump.c codegen_ops_logic.c - codegen_ops_misc.c codegen_ops_mmx_arith.c codegen_ops_mmx_cmp.c - codegen_ops_mmx_loadstore.c codegen_ops_mmx_logic.c - codegen_ops_mmx_pack.c codegen_ops_mmx_shift.c codegen_ops_mov.c - codegen_ops_shift.c codegen_ops_stack.c codegen_reg.c) + add_library(dynarec OBJECT + codegen.c + codegen_accumulate.c + codegen_allocator.c + codegen_block.c + codegen_ir.c + codegen_ops.c + codegen_ops_3dnow.c + codegen_ops_branch.c + codegen_ops_arith.c + codegen_ops_fpu_arith.c + codegen_ops_fpu_constant.c + codegen_ops_fpu_loadstore.c + codegen_ops_fpu_misc.c + codegen_ops_helpers.c + codegen_ops_jump.c + codegen_ops_logic.c + codegen_ops_misc.c + codegen_ops_mmx_arith.c + codegen_ops_mmx_cmp.c + codegen_ops_mmx_loadstore.c + codegen_ops_mmx_logic.c + codegen_ops_mmx_pack.c + codegen_ops_mmx_shift.c + codegen_ops_mov.c + codegen_ops_shift.c + codegen_ops_stack.c + codegen_reg.c + ) if(ARCH STREQUAL "i386") - target_sources(dynarec PRIVATE codegen_backend_x86.c - codegen_backend_x86_ops.c codegen_backend_x86_ops_fpu.c + target_sources(dynarec PRIVATE + codegen_backend_x86.c + codegen_backend_x86_ops.c + codegen_backend_x86_ops_fpu.c codegen_backend_x86_ops_sse.c - codegen_backend_x86_uops.c) + codegen_backend_x86_uops.c + ) elseif(ARCH STREQUAL "x86_64") - target_sources(dynarec PRIVATE codegen_backend_x86-64.c + target_sources(dynarec PRIVATE + codegen_backend_x86-64.c codegen_backend_x86-64_ops.c codegen_backend_x86-64_ops_sse.c - codegen_backend_x86-64_uops.c) + codegen_backend_x86-64_uops.c + ) elseif(ARCH STREQUAL "arm64") - target_sources(dynarec PRIVATE codegen_backend_arm64.c - codegen_backend_arm64_ops.c codegen_backend_arm64_uops.c - codegen_backend_arm64_imm.c) + target_sources(dynarec PRIVATE + codegen_backend_arm64.c + codegen_backend_arm64_ops.c + codegen_backend_arm64_uops.c + codegen_backend_arm64_imm.c + ) elseif(ARCH STREQUAL "arm") - target_sources(dynarec PRIVATE codegen_backend_arm.c - codegen_backend_arm_ops.c codegen_backend_arm_uops.c) + target_sources(dynarec PRIVATE + codegen_backend_arm.c + codegen_backend_arm_ops.c + codegen_backend_arm_uops.c + ) else() message(SEND_ERROR "Dynarec is incompatible with target platform ${ARCH}") diff --git a/src/cpu/CMakeLists.txt b/src/cpu/CMakeLists.txt index 8ae97e2e6..890d02e3e 100644 --- a/src/cpu/CMakeLists.txt +++ b/src/cpu/CMakeLists.txt @@ -9,13 +9,28 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(cpu OBJECT cpu.c cpu_table.c fpu.c x86.c 808x.c 386.c 386_common.c - 386_dynarec.c x86_ops_mmx.c x86seg_common.c x86seg.c x86seg_2386.c x87.c - x87_timings.c 8080.c) +add_library(cpu OBJECT + cpu.c + cpu_table.c + fpu.c x86.c + 808x.c + 386.c + 386_common.c + 386_dynarec.c + x86_ops_mmx.c + x86seg_common.c + x86seg.c + x86seg_2386.c + x87.c + x87_timings.c + 8080.c +) if(AMD_K5) target_compile_definitions(cpu PRIVATE USE_AMD_K5) @@ -39,10 +54,15 @@ endif() if(DYNAREC) target_sources(cpu PRIVATE 386_dynarec_ops.c) - add_library(cgt OBJECT codegen_timing_486.c - codegen_timing_common.c codegen_timing_k6.c - codegen_timing_pentium.c codegen_timing_p6.c - codegen_timing_winchip.c codegen_timing_winchip2.c) + add_library(cgt OBJECT + codegen_timing_486.c + codegen_timing_common.c + codegen_timing_k6.c + codegen_timing_pentium.c + codegen_timing_p6.c + codegen_timing_winchip.c + codegen_timing_winchip2.c + ) endif() add_subdirectory(softfloat3e) diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index d1f4cdc68..ae3fbf3f2 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -9,22 +9,53 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. # Copyright 2021 Andreas J. Reichel. -# Copyright 2021-2022 Jasmine Iwanek. +# Copyright 2021-2024 Jasmine Iwanek. # -add_library(dev OBJECT bugger.c cassette.c cartridge.c hasp.c hwm.c hwm_lm75.c hwm_lm78.c hwm_gl518sm.c - hwm_vt82c686.c ibm_5161.c isamem.c isartc.c ../lpt.c pci_bridge.c - postcard.c serial.c unittester.c clock_ics9xxx.c isapnp.c i2c.c i2c_gpio.c - smbus_piix4.c smbus_ali7101.c smbus_sis5595.c keyboard.c keyboard_xt.c - kbc_at.c kbc_at_dev.c +add_library(dev OBJECT + bugger.c + cassette.c + cartridge.c + hasp.c + hwm.c + hwm_lm75.c + hwm_lm78.c + hwm_gl518sm.c + hwm_vt82c686.c + ibm_5161.c + isamem.c + isartc.c + ../lpt.c + pci_bridge.c + postcard.c + serial.c + unittester.c + clock_ics9xxx.c + isapnp.c + i2c.c + i2c_gpio.c + smbus_piix4.c + smbus_ali7101.c + smbus_sis5595.c + keyboard.c + keyboard_xt.c + kbc_at.c + kbc_at_dev.c keyboard_at.c - mouse.c mouse_bus.c mouse_serial.c mouse_ps2.c nec_mate_unk.c phoenix_486_jumper.c + mouse.c + mouse_bus.c + mouse_serial.c + mouse_ps2.c + nec_mate_unk.c + phoenix_486_jumper.c serial_passthrough.c novell_cardkey.c - mouse_microtouch_touchscreen.c) + mouse_microtouch_touchscreen.c +) if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_link_libraries(86Box atomic) diff --git a/src/disk/CMakeLists.txt b/src/disk/CMakeLists.txt index 87b9593fa..3f6a4d018 100644 --- a/src/disk/CMakeLists.txt +++ b/src/disk/CMakeLists.txt @@ -9,14 +9,33 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(hdd OBJECT hdd.c hdd_image.c hdd_table.c hdc.c hdc_st506_xt.c - hdc_st506_at.c hdc_xta.c hdc_esdi_at.c hdc_esdi_mca.c hdc_xtide.c - hdc_ide.c hdc_ide_ali5213.c hdc_ide_opti611.c hdc_ide_cmd640.c hdc_ide_cmd646.c - hdc_ide_sff8038i.c hdc_ide_um8673f.c hdc_ide_w83769f.c lba_enhancer.c) +add_library(hdd OBJECT + hdd.c + hdd_image.c + hdd_table.c + hdc.c + hdc_st506_xt.c + hdc_st506_at.c + hdc_xta.c + hdc_esdi_at.c + hdc_esdi_mca.c + hdc_xtide.c + hdc_ide.c + hdc_ide_ali5213.c + hdc_ide_opti611.c + hdc_ide_cmd640.c + hdc_ide_cmd646.c + hdc_ide_sff8038i.c + hdc_ide_um8673f.c + hdc_ide_w83769f.c + lba_enhancer.c +) add_library(zip OBJECT zip.c) diff --git a/src/floppy/CMakeLists.txt b/src/floppy/CMakeLists.txt index 5aea98714..d86ff4bc2 100644 --- a/src/floppy/CMakeLists.txt +++ b/src/floppy/CMakeLists.txt @@ -9,13 +9,28 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(fdd OBJECT fdd.c fdc.c fdc_magitronic.c fdc_monster.c fdc_pii15xb.c - fdi2raw.c fdd_common.c fdd_86f.c fdd_fdi.c fdd_imd.c fdd_img.c fdd_pcjs.c - fdd_mfm.c fdd_td0.c) +add_library(fdd OBJECT + fdd.c + fdc.c + fdc_magitronic.c + fdc_monster.c + fdc_pii15xb.c + fdi2raw.c + fdd_common.c + fdd_86f.c + fdd_fdi.c + fdd_imd.c + fdd_img.c + fdd_pcjs.c + fdd_mfm.c + fdd_td0.c +) add_subdirectory(lzw) target_link_libraries(86Box lzw) diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index 83dcd4836..6b44a2236 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -9,9 +9,16 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(game OBJECT gameport.c joystick_standard.c - joystick_ch_flightstick_pro.c joystick_sw_pad.c joystick_tm_fcs.c) +add_library(game OBJECT + gameport.c + joystick_standard.c + joystick_ch_flightstick_pro.c + joystick_sw_pad.c + joystick_tm_fcs.c +) diff --git a/src/mac/CMakeLists.txt b/src/mac/CMakeLists.txt index bbdf1d5d5..0562ca01d 100644 --- a/src/mac/CMakeLists.txt +++ b/src/mac/CMakeLists.txt @@ -11,10 +11,12 @@ # Authors: dob205, # Jerome Vernet # David Hrdlička, +# Jasmine Iwanek, # # Copyright 2021 dob205. # Copyright 2021 Jerome Vernet. # Copyright 2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # # Pick the bundle icon depending on the release channel diff --git a/src/machine/CMakeLists.txt b/src/machine/CMakeLists.txt index ecc374e66..55e0e0197 100644 --- a/src/machine/CMakeLists.txt +++ b/src/machine/CMakeLists.txt @@ -9,20 +9,51 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(mch OBJECT machine.c machine_table.c m_xt.c m_xt_compaq.c +add_library(mch OBJECT + machine.c + machine_table.c + m_xt.c + m_xt_compaq.c m_xt_philips.c - m_xt_t1000.c m_xt_t1000_vid.c m_xt_xi8088.c m_xt_zenith.c m_pcjr.c - m_amstrad.c m_europc.c m_elt.c m_xt_olivetti.c m_tandy.c m_v86p.c - m_at.c m_at_commodore.c - m_at_t3100e.c m_at_t3100e_vid.c m_ps1.c m_ps1_hdc.c m_ps2_isa.c - m_ps2_mca.c m_at_compaq.c m_at_286_386sx.c m_at_386dx_486.c - m_at_socket4.c m_at_socket5.c m_at_socket7_3v.c m_at_socket7.c - m_at_sockets7.c m_at_socket8.c m_at_slot1.c m_at_slot2.c m_at_socket370.c - m_at_misc.c) + m_xt_t1000.c + m_xt_t1000_vid.c + m_xt_xi8088.c + m_xt_zenith.c + m_pcjr.c + m_amstrad.c + m_europc.c + m_elt.c + m_xt_olivetti.c + m_tandy.c + m_v86p.c + m_at.c + m_at_commodore.c + m_at_t3100e.c + m_at_t3100e_vid.c + m_ps1.c + m_ps1_hdc.c + m_ps2_isa.c + m_ps2_mca.c + m_at_compaq.c + m_at_286_386sx.c + m_at_386dx_486.c + m_at_socket4.c + m_at_socket5.c + m_at_socket7_3v.c + m_at_socket7.c + m_at_sockets7.c + m_at_socket8.c + m_at_slot1.c + m_at_slot2.c + m_at_socket370.c + m_at_misc.c +) if(AN430TX) target_compile_definitions(mch PRIVATE USE_AN430TX) diff --git a/src/mem/CMakeLists.txt b/src/mem/CMakeLists.txt index d3d5d1ce7..0e52beb4e 100644 --- a/src/mem/CMakeLists.txt +++ b/src/mem/CMakeLists.txt @@ -9,9 +9,21 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(mem OBJECT catalyst_flash.c i2c_eeprom.c intel_flash.c mem.c mmu_2386.c - rom.c row.c smram.c spd.c sst_flash.c) +add_library(mem OBJECT + catalyst_flash.c + i2c_eeprom.c + intel_flash.c + mem.c + mmu_2386.c + rom.c + row.c + smram.c + spd.c + sst_flash.c +) diff --git a/src/network/CMakeLists.txt b/src/network/CMakeLists.txt index 0783e4b4c..0d42cbd8d 100644 --- a/src/network/CMakeLists.txt +++ b/src/network/CMakeLists.txt @@ -9,13 +9,32 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # set(net_sources) -list(APPEND net_sources network.c net_pcap.c net_slirp.c net_dp8390.c net_3c501.c - net_3c503.c net_ne2000.c net_pcnet.c net_wd8003.c net_plip.c net_event.c net_null.c - net_eeprom_nmc93cxx.c net_tulip.c net_rtl8139.c net_l80225.c net_modem.c utils/getline.c) +list(APPEND net_sources + network.c + net_pcap.c + net_slirp.c + net_dp8390.c + net_3c501.c + net_3c503.c + net_ne2000.c + net_pcnet.c + net_wd8003.c + net_plip.c + net_event.c + net_null.c + net_eeprom_nmc93cxx.c + net_tulip.c + net_rtl8139.c + net_l80225.c + net_modem.c + utils/getline.c +) find_package(PkgConfig REQUIRED) pkg_check_modules(SLIRP REQUIRED IMPORTED_TARGET slirp) diff --git a/src/printer/CMakeLists.txt b/src/printer/CMakeLists.txt index 6ee52baba..071bf7113 100644 --- a/src/printer/CMakeLists.txt +++ b/src/printer/CMakeLists.txt @@ -9,11 +9,19 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(print OBJECT png.c prt_cpmap.c prt_escp.c prt_text.c prt_ps.c) +add_library(print OBJECT + png.c + prt_cpmap.c + prt_escp.c + prt_text.c + prt_ps.c +) if(PCL) target_compile_definitions(print PRIVATE USE_PCL) diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index cf9420a4d..c21dfd5bb 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -8,6 +8,11 @@ # # CMake build script. # +# Authors: David Hrdlička, +# Jasmine Iwanek, +# +# Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -232,9 +237,15 @@ if(WIN32 AND NOT CPPTHREADS) endif() if(WIN32) - target_sources(plat PRIVATE win_serial_passthrough.c win_netsocket.c) + target_sources(plat PRIVATE + win_serial_passthrough.c + win_netsocket.c + ) else() - target_sources(plat PRIVATE ../unix/unix_serial_passthrough.c ../unix/unix_netsocket.c) + target_sources(plat PRIVATE + ../unix/unix_serial_passthrough.c + ../unix/unix_netsocket.c + ) endif() if(WIN32) @@ -268,18 +279,14 @@ if (WIN32) ) endif() -target_link_libraries( - plat - PRIVATE +target_link_libraries(plat PRIVATE Qt${QT_MAJOR}::Widgets Qt${QT_MAJOR}::Gui Qt${QT_MAJOR}::Network Threads::Threads ) -target_link_libraries( - ui - PRIVATE +target_link_libraries(ui PRIVATE Qt${QT_MAJOR}::Widgets Qt${QT_MAJOR}::Gui Qt${QT_MAJOR}::OpenGL diff --git a/src/scsi/CMakeLists.txt b/src/scsi/CMakeLists.txt index 01e20b929..c710f758d 100644 --- a/src/scsi/CMakeLists.txt +++ b/src/scsi/CMakeLists.txt @@ -9,10 +9,24 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(scsi OBJECT scsi.c scsi_device.c scsi_cdrom.c scsi_disk.c - scsi_x54x.c scsi_aha154x.c scsi_buslogic.c scsi_ncr5380.c scsi_ncr53c400.c - scsi_t128.c scsi_ncr53c8xx.c scsi_pcscsi.c scsi_spock.c) +add_library(scsi OBJECT + scsi.c + scsi_device.c + scsi_cdrom.c + scsi_disk.c + scsi_x54x.c + scsi_aha154x.c + scsi_buslogic.c + scsi_ncr5380.c + scsi_ncr53c400.c + scsi_t128.c + scsi_ncr53c8xx.c + scsi_pcscsi.c + scsi_spock.c +) diff --git a/src/sio/CMakeLists.txt b/src/sio/CMakeLists.txt index ecb780a9b..6106871bc 100644 --- a/src/sio/CMakeLists.txt +++ b/src/sio/CMakeLists.txt @@ -9,18 +9,39 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(sio OBJECT sio_acc3221.c sio_ali5123.c sio_f82c710.c sio_82091aa.c - sio_fdc37c6xx.c sio_fdc37c67x.c sio_fdc37c669.c sio_fdc37c93x.c sio_fdc37m60x.c +add_library(sio OBJECT + sio_acc3221.c + sio_ali5123.c + sio_f82c710.c + sio_82091aa.c + sio_fdc37c6xx.c + sio_fdc37c67x.c + sio_fdc37c669.c + sio_fdc37c93x.c + sio_fdc37m60x.c sio_it86x1f.c - sio_pc87306.c sio_pc87307.c sio_pc87309.c sio_pc87310.c sio_pc87311.c sio_pc87332.c - sio_prime3b.c sio_prime3c.c - sio_w83787f.c sio_w83877f.c sio_w83977f.c - sio_um8663f.c sio_um8669f.c - sio_vl82c113.c sio_vt82c686.c) + sio_pc87306.c + sio_pc87307.c + sio_pc87309.c + sio_pc87310.c + sio_pc87311.c + sio_pc87332.c + sio_prime3b.c + sio_prime3c.c + sio_w83787f.c + sio_w83877f.c + sio_w83977f.c + sio_um8663f.c + sio_um8669f.c + sio_vl82c113.c + sio_vt82c686.c +) if(SIO_DETECT) target_sources(sio PRIVATE sio_detect.c) diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index 2d57a42e0..9fbdd6ac1 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -9,16 +9,49 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(snd OBJECT sound.c snd_opl.c snd_opl_nuked.c snd_opl_ymfm.cpp snd_resid.cpp - midi.c snd_speaker.c snd_pssj.c snd_lpt_dac.c snd_ac97_codec.c snd_ac97_via.c - snd_lpt_dss.c snd_ps1.c snd_adlib.c snd_adlibgold.c snd_ad1848.c snd_audiopci.c - snd_azt2316a.c snd_cms.c snd_cmi8x38.c snd_cs423x.c snd_gus.c snd_sb.c snd_sb_dsp.c - snd_emu8k.c snd_mpu401.c snd_pas16.c snd_sn76489.c snd_ssi2001.c snd_wss.c snd_ym7128.c - snd_optimc.c esfmu/esfm.c esfmu/esfm_registers.c snd_opl_esfm.c) +add_library(snd OBJECT + sound.c + snd_opl.c + snd_opl_nuked.c + snd_opl_ymfm.cpp + snd_resid.cpp + midi.c + snd_speaker.c + snd_pssj.c + snd_lpt_dac.c + snd_ac97_codec.c + snd_ac97_via.c + snd_lpt_dss.c + snd_ps1.c + snd_adlib.c + snd_adlibgold.c + snd_ad1848.c + snd_audiopci.c + snd_azt2316a.c + snd_cms.c + snd_cmi8x38.c + snd_cs423x.c + snd_gus.c + snd_sb.c + snd_sb_dsp.c + snd_emu8k.c + snd_mpu401.c + snd_pas16.c + snd_sn76489.c + snd_ssi2001.c + snd_wss.c + snd_ym7128.c + snd_optimc.c + esfmu/esfm.c + esfmu/esfm_registers.c + snd_opl_esfm.c +) if(OPENAL) if(VCPKG_TOOLCHAIN) diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt index 4cbda5c83..91fa25f39 100644 --- a/src/unix/CMakeLists.txt +++ b/src/unix/CMakeLists.txt @@ -10,14 +10,19 @@ # # Authors: Cacodemon345 # David Hrdlička, +# Jasmine Iwanek, # # Copyright 2021 Cacodemon345. # Copyright 2021 David Hrdlička. # Copyright 2021 Andreas J. Reichel. -# Copyright 2021-2022 Jasmine Iwanek. +# Copyright 2021-2024 Jasmine Iwanek. # -add_library(plat OBJECT unix.c unix_serial_passthrough.c unix_netsocket.c) +add_library(plat OBJECT + unix.c + unix_serial_passthrough.c + unix_netsocket.c +) if (NOT CPPTHREADS) target_sources(plat PRIVATE unix_thread.c) @@ -27,7 +32,11 @@ set(THREADS_PREFER_PTHREAD_FLAG TRUE) find_package(Threads REQUIRED) target_link_libraries(86Box Threads::Threads) -add_library(ui OBJECT unix_sdl.c unix_cdrom.c dummy_cdrom_ioctl.c) +add_library(ui OBJECT + unix_sdl.c + unix_cdrom.c + dummy_cdrom_ioctl.c +) target_compile_definitions(ui PUBLIC _FILE_OFFSET_BITS=64) target_link_libraries(ui ${CMAKE_DL_LIBS}) diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index 2f7607ad6..d41da8b2c 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -9,25 +9,78 @@ # CMake build script. # # Authors: David Hrdlička, +# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. +# Copyright 2024 Jasmine Iwanek. # -add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c - vid_compaq_cga.c vid_mda.c vid_hercules.c vid_herculesplus.c - vid_incolor.c vid_colorplus.c vid_genius.c vid_pgc.c vid_im1024.c - vid_sigma.c vid_wy700.c vid_ega.c vid_ega_render.c vid_svga.c vid_8514a.c - vid_svga_render.c vid_ddc.c vid_vga.c vid_ati_eeprom.c vid_ati18800.c - vid_ati28800.c vid_ati_mach8.c vid_ati_mach64.c vid_ati68875_ramdac.c - vid_ati68860_ramdac.c vid_bt48x_ramdac.c vid_chips_69000.c - vid_av9194.c vid_icd2061.c vid_ics2494.c vid_ics2595.c vid_cl54xx.c - vid_et3000.c vid_et4000.c vid_sc1148x_ramdac.c vid_sc1502x_ramdac.c - vid_et4000w32.c vid_stg_ramdac.c vid_ht216.c vid_oak_oti.c vid_paradise.c - vid_rtg310x.c vid_f82c425.c vid_ti_cf62011.c vid_tvga.c vid_tgui9440.c - vid_tkd8001_ramdac.c vid_att20c49x_ramdac.c vid_s3.c vid_s3_virge.c - vid_ibm_rgb528_ramdac.c vid_sdac_ramdac.c vid_ogc.c vid_mga.c vid_nga.c - vid_tvp3026_ramdac.c vid_att2xc498_ramdac.c vid_xga.c - vid_bochs_vbe.c) +add_library(vid OBJECT + agpgart.c + video.c + vid_table.c + vid_cga.c + vid_cga_comp.c + vid_compaq_cga.c + vid_mda.c + vid_hercules.c + vid_herculesplus.c + vid_incolor.c + vid_colorplus.c + vid_genius.c + vid_pgc.c + vid_im1024.c + vid_sigma.c + vid_wy700.c + vid_ega.c + vid_ega_render.c + vid_svga.c + vid_8514a.c + vid_svga_render.c + vid_ddc.c + vid_vga.c + vid_ati_eeprom.c + vid_ati18800.c + vid_ati28800.c + vid_ati_mach8.c + vid_ati_mach64.c + vid_ati68875_ramdac.c + vid_ati68860_ramdac.c + vid_bt48x_ramdac.c + vid_chips_69000.c + vid_av9194.c + vid_icd2061.c + vid_ics2494.c + vid_ics2595.c + vid_cl54xx.c + vid_et3000.c + vid_et4000.c + vid_sc1148x_ramdac.c + vid_sc1502x_ramdac.c + vid_et4000w32.c + vid_stg_ramdac.c + vid_ht216.c + vid_oak_oti.c + vid_paradise.c + vid_rtg310x.c + vid_f82c425.c + vid_ti_cf62011.c + vid_tvga.c + vid_tgui9440.c + vid_tkd8001_ramdac.c + vid_att20c49x_ramdac.c + vid_s3.c + vid_s3_virge.c + vid_ibm_rgb528_ramdac.c + vid_sdac_ramdac.c + vid_ogc.c + vid_mga.c + vid_nga.c + vid_tvp3026_ramdac.c + vid_att2xc498_ramdac.c + vid_xga.c + vid_bochs_vbe.c +) if(G100) target_compile_definitions(vid PRIVATE USE_G100) @@ -37,10 +90,19 @@ if(XL24) target_compile_definitions(vid PRIVATE USE_XL24) endif() -add_library(voodoo OBJECT vid_voodoo.c vid_voodoo_banshee.c - vid_voodoo_banshee_blitter.c vid_voodoo_blitter.c vid_voodoo_display.c - vid_voodoo_fb.c vid_voodoo_fifo.c vid_voodoo_reg.c vid_voodoo_render.c - vid_voodoo_setup.c vid_voodoo_texture.c) +add_library(voodoo OBJECT + vid_voodoo.c + vid_voodoo_banshee.c + vid_voodoo_banshee_blitter.c + vid_voodoo_blitter.c + vid_voodoo_display.c + vid_voodoo_fb.c + vid_voodoo_fifo.c + vid_voodoo_reg.c + vid_voodoo_render.c + vid_voodoo_setup.c + vid_voodoo_texture.c +) if(NOT MSVC AND (ARCH STREQUAL "i386" OR ARCH STREQUAL "x86_64")) target_compile_options(voodoo PRIVATE "-msse2") From f4303dfce281bcde85d459316d4a9669099a1dff Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 5 Sep 2024 01:06:34 +0200 Subject: [PATCH 411/624] XGA changes of the day (September 5th, 2024) Don't overwrite the VGA DAC mask in XGA mode, instead, using dedicated variables for it. --- src/include/86box/vid_xga.h | 6 +++++ src/video/vid_xga.c | 54 ++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 27 deletions(-) diff --git a/src/include/86box/vid_xga.h b/src/include/86box/vid_xga.h index e5248b309..0686972ca 100644 --- a/src/include/86box/vid_xga.h +++ b/src/include/86box/vid_xga.h @@ -47,6 +47,8 @@ typedef struct xga_t { uint8_t pos_regs[8]; uint8_t disp_addr; + uint8_t dac_mask; + uint8_t dac_status; uint8_t cfg_reg; uint8_t instance; uint8_t op_mode; @@ -106,6 +108,10 @@ typedef struct xga_t { uint16_t old_pal_addr_idx; uint16_t sprite_pal_addr_idx_prefetch; + int dac_addr; + int dac_pos; + int dac_r; + int dac_g; int v_total; int dispend; int v_syncstart; diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index f1cad184e..824a3dbf0 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -417,8 +417,8 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) case 0x60: xga->sprite_pal_addr_idx = (xga->sprite_pal_addr_idx & 0x3f00) | val; - svga->dac_pos = 0; - svga->dac_addr = val & 0xff; + xga->dac_pos = 0; + xga->dac_addr = val & 0xff; break; case 0x61: xga->sprite_pal_addr_idx = (xga->sprite_pal_addr_idx & 0xff) | ((val & 0x3f) << 8); @@ -430,8 +430,8 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) case 0x62: xga->sprite_pal_addr_idx_prefetch = (xga->sprite_pal_addr_idx_prefetch & 0x3f00) | val; - svga->dac_pos = 0; - svga->dac_addr = val & 0xff; + xga->dac_pos = 0; + xga->dac_addr = val & 0xff; break; case 0x63: xga->sprite_pal_addr_idx_prefetch = (xga->sprite_pal_addr_idx_prefetch & 0xff) | ((val & 0x3f) << 8); @@ -439,29 +439,29 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) break; case 0x64: - svga->dac_mask = val; + xga->dac_mask = val; break; case 0x65: svga->fullchange = svga->monitor->mon_changeframecount; - switch (svga->dac_pos) { + switch (xga->dac_pos) { case 0: - svga->dac_r = val; - svga->dac_pos++; + xga->dac_r = val; + xga->dac_pos++; break; case 1: - svga->dac_g = val; - svga->dac_pos++; + xga->dac_g = val; + xga->dac_pos++; break; case 2: xga->pal_b = val; - index = svga->dac_addr & 0xff; - svga->vgapal[index].r = svga->dac_r; - svga->vgapal[index].g = svga->dac_g; + index = xga->dac_addr & 0xff; + svga->vgapal[index].r = xga->dac_r; + svga->vgapal[index].g = xga->dac_g; svga->vgapal[index].b = xga->pal_b; xga->pallook[index] = makecol32(svga->vgapal[index].r, svga->vgapal[index].g, svga->vgapal[index].b); - svga->dac_pos = 0; - svga->dac_addr = (svga->dac_addr + 1) & 0xff; + xga->dac_pos = 0; + xga->dac_addr = (xga->dac_addr + 1) & 0xff; break; default: @@ -474,13 +474,13 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) break; case 0x67: - svga->dac_r = val; + xga->dac_r = val; break; case 0x68: xga->pal_b = val; break; case 0x69: - svga->dac_g = val; + xga->dac_g = val; break; case 0x6a: @@ -730,24 +730,24 @@ xga_ext_inb(uint16_t addr, void *priv) break; case 0x64: - ret = svga->dac_mask; + ret = xga->dac_mask; break; case 0x65: - index = svga->dac_addr & 0xff; - switch (svga->dac_pos) { + index = xga->dac_addr & 0xff; + switch (xga->dac_pos) { case 0: - svga->dac_pos++; + xga->dac_pos++; ret = svga->vgapal[index].r; break; case 1: - svga->dac_pos++; + xga->dac_pos++; ret = svga->vgapal[index].g; break; case 2: - svga->dac_pos = 0; - svga->dac_addr = (svga->dac_addr + 1) & 0xff; - ret = svga->vgapal[index].b; + xga->dac_pos = 0; + xga->dac_addr = (xga->dac_addr + 1) & 0xff; + ret = svga->vgapal[index].b; break; default: @@ -760,13 +760,13 @@ xga_ext_inb(uint16_t addr, void *priv) break; case 0x67: - ret = svga->dac_r; + ret = xga->dac_r; break; case 0x68: ret = xga->pal_b; break; case 0x69: - ret = svga->dac_g; + ret = xga->dac_g; break; case 0x6a: From f37c2339dce9213c21c7ccc8f8ad01260ce80603 Mon Sep 17 00:00:00 2001 From: Tarek Soliman Date: Fri, 6 Sep 2024 17:05:44 -0500 Subject: [PATCH 412/624] Media history: fix buffer overflow --- src/qt/qt_mediahistorymanager.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index 9886c205b..cd9be766b 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -337,7 +337,7 @@ MediaHistoryManager::removeMissingImages(device_index_list_t &device_history) } char *p = checked_path.toUtf8().data(); - char temp[1024] = { 0 }; + char temp[MAX_IMAGE_PATH_LEN -1] = { 0 }; if (path_abs(p)) { if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) From 86185c189b0add80d21424bd3ec1dc630f1c38cc Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 7 Sep 2024 00:46:44 +0200 Subject: [PATCH 413/624] ESS: Add MPU sanity checks. --- src/sound/snd_sb.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 88a7d875a..4f6961fab 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -1585,7 +1585,7 @@ ess_mixer_write(uint16_t addr, uint8_t val, void *priv) ess->opl.priv); } } - switch ((mixer->regs[0x40] >> 5) & 0x7) { + if (ess->mpu != NULL) switch ((mixer->regs[0x40] >> 5) & 0x7) { default: break; case 0: @@ -2288,7 +2288,8 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co addr = ess->midi_addr; if (addr) { ess->midi_addr = 0; - mpu401_change_addr(ess->mpu, 0); + if (ess->mpu != NULL) + mpu401_change_addr(ess->mpu, 0); io_removehandler(addr, 0x0002, ess_fm_midi_read, NULL, NULL, ess_fm_midi_write, NULL, NULL, @@ -2298,7 +2299,7 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co sb_dsp_setaddr(&ess->dsp, 0); sb_dsp_setirq(&ess->dsp, 0); - if (ess->pnp == 3) + if ((ess->pnp == 3) && (ess->mpu != NULL)) mpu401_setirq(ess->mpu, -1); sb_dsp_setdma8(&ess->dsp, ISAPNP_DMA_DISABLED); sb_dsp_setdma16_8(&ess->dsp, ISAPNP_DMA_DISABLED); @@ -2357,7 +2358,8 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co if (ess->pnp == 3) { addr = config->io[2].base; if (addr != ISAPNP_IO_DISABLED) { - mpu401_change_addr(ess->mpu, addr); + if (ess->mpu != NULL) + mpu401_change_addr(ess->mpu, addr); io_sethandler(addr, 0x0002, ess_fm_midi_read, NULL, NULL, ess_fm_midi_write, NULL, NULL, @@ -2368,7 +2370,7 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co val = config->irq[0].irq; if (val != ISAPNP_IRQ_DISABLED) { sb_dsp_setirq(&ess->dsp, val); - if (ess->pnp == 3) + if ((ess->pnp == 3) && (ess->mpu != NULL)) mpu401_setirq(ess->mpu, val); } @@ -2383,7 +2385,7 @@ ess_x688_pnp_config_changed(UNUSED(const uint8_t ld), isapnp_device_config_t *co case 1: if (ess->pnp == 3) { /* Game */ gameport_remap(ess->gameport, (config->activate && (config->io[0].base != ISAPNP_IO_DISABLED)) ? config->io[0].base : 0); - } else { /* MPU-401 */ + } else if (ess->mpu != NULL) { /* MPU-401 */ mpu401_change_addr(ess->mpu, 0); mpu401_setirq(ess->mpu, -1); From db3bbad00310cf8e882800ca321acbb6b9845ac2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 8 Sep 2024 12:21:31 +0200 Subject: [PATCH 414/624] AT KBC: Check for T3100E 'Fn' key after translating the current scan code, should fix the keys with translated scan code set 2 as well. --- src/device/kbc_at.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index b1f15d42a..ad63099fb 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -277,9 +277,26 @@ kbc_translate(atkbc_t *dev, uint8_t val) return ret; } + kbc_at_log("ATkbc: translate is %s, ", translate ? "on" : "off"); +#ifdef ENABLE_KEYBOARD_AT_LOG + kbc_at_log("scan code: "); + if (translate) { + kbc_at_log("%02X (original: ", (nont_to_t[val] | dev->sc_or)); + if (dev->sc_or == 0x80) + kbc_at_log("F0 "); + kbc_at_log("%02X)\n", val); + } else + kbc_at_log("%02X\n", val); +#endif + + ret = translate ? (nont_to_t[val] | dev->sc_or) : val; + + if (dev->sc_or == 0x80) + dev->sc_or = 0; + /* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */ if ((dev != NULL) && (kbc_ven == KBC_VEN_TOSHIBA) && - (keyboard_recv(0x138) || keyboard_recv(0x11d))) switch (val) { + (keyboard_recv(0x138) || keyboard_recv(0x11d))) switch (ret) { case 0x4f: t3100e_notify_set(0x01); break; /* End */ @@ -329,23 +346,6 @@ kbc_translate(atkbc_t *dev, uint8_t val) break; } - kbc_at_log("ATkbc: translate is %s, ", translate ? "on" : "off"); -#ifdef ENABLE_KEYBOARD_AT_LOG - kbc_at_log("scan code: "); - if (translate) { - kbc_at_log("%02X (original: ", (nont_to_t[val] | dev->sc_or)); - if (dev->sc_or == 0x80) - kbc_at_log("F0 "); - kbc_at_log("%02X)\n", val); - } else - kbc_at_log("%02X\n", val); -#endif - - ret = translate ? (nont_to_t[val] | dev->sc_or) : val; - - if (dev->sc_or == 0x80) - dev->sc_or = 0; - return ret; } From bdf89f43aeaf9adf49619685c8e98cbc9f89b940 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 12 Sep 2024 06:45:09 +0200 Subject: [PATCH 415/624] Temporarily revert the changes to video/CMakeLists.txt to allow for clean potential merges between us and the PS/55 fork. --- src/video/CMakeLists.txt | 81 ++++++++-------------------------------- 1 file changed, 15 insertions(+), 66 deletions(-) diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index d41da8b2c..8308a7306 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -15,72 +15,21 @@ # Copyright 2024 Jasmine Iwanek. # -add_library(vid OBJECT - agpgart.c - video.c - vid_table.c - vid_cga.c - vid_cga_comp.c - vid_compaq_cga.c - vid_mda.c - vid_hercules.c - vid_herculesplus.c - vid_incolor.c - vid_colorplus.c - vid_genius.c - vid_pgc.c - vid_im1024.c - vid_sigma.c - vid_wy700.c - vid_ega.c - vid_ega_render.c - vid_svga.c - vid_8514a.c - vid_svga_render.c - vid_ddc.c - vid_vga.c - vid_ati_eeprom.c - vid_ati18800.c - vid_ati28800.c - vid_ati_mach8.c - vid_ati_mach64.c - vid_ati68875_ramdac.c - vid_ati68860_ramdac.c - vid_bt48x_ramdac.c - vid_chips_69000.c - vid_av9194.c - vid_icd2061.c - vid_ics2494.c - vid_ics2595.c - vid_cl54xx.c - vid_et3000.c - vid_et4000.c - vid_sc1148x_ramdac.c - vid_sc1502x_ramdac.c - vid_et4000w32.c - vid_stg_ramdac.c - vid_ht216.c - vid_oak_oti.c - vid_paradise.c - vid_rtg310x.c - vid_f82c425.c - vid_ti_cf62011.c - vid_tvga.c - vid_tgui9440.c - vid_tkd8001_ramdac.c - vid_att20c49x_ramdac.c - vid_s3.c - vid_s3_virge.c - vid_ibm_rgb528_ramdac.c - vid_sdac_ramdac.c - vid_ogc.c - vid_mga.c - vid_nga.c - vid_tvp3026_ramdac.c - vid_att2xc498_ramdac.c - vid_xga.c - vid_bochs_vbe.c -) +add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c + vid_compaq_cga.c vid_mda.c vid_hercules.c vid_herculesplus.c + vid_incolor.c vid_colorplus.c vid_genius.c vid_pgc.c vid_im1024.c + vid_sigma.c vid_wy700.c vid_ega.c vid_ega_render.c vid_svga.c vid_8514a.c + vid_svga_render.c vid_ddc.c vid_vga.c vid_ati_eeprom.c vid_ati18800.c + vid_ati28800.c vid_ati_mach8.c vid_ati_mach64.c vid_ati68875_ramdac.c + vid_ati68860_ramdac.c vid_bt48x_ramdac.c vid_chips_69000.c + vid_av9194.c vid_icd2061.c vid_ics2494.c vid_ics2595.c vid_cl54xx.c + vid_et3000.c vid_et4000.c vid_sc1148x_ramdac.c vid_sc1502x_ramdac.c + vid_et4000w32.c vid_stg_ramdac.c vid_ht216.c vid_oak_oti.c vid_paradise.c + vid_rtg310x.c vid_f82c425.c vid_ti_cf62011.c vid_tvga.c vid_tgui9440.c + vid_tkd8001_ramdac.c vid_att20c49x_ramdac.c vid_s3.c vid_s3_virge.c + vid_ibm_rgb528_ramdac.c vid_sdac_ramdac.c vid_ogc.c vid_mga.c vid_nga.c + vid_tvp3026_ramdac.c vid_att2xc498_ramdac.c vid_xga.c + vid_bochs_vbe.c vid_ps55da2.c ) if(G100) target_compile_definitions(vid PRIVATE USE_G100) From 884dfa8bcf3f1d3227efbd0d5ba504d8b99348a0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 12 Sep 2024 08:59:22 +0200 Subject: [PATCH 416/624] Removed a .c file that's nto there from video/CMakeLists.txt. --- src/video/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index 8308a7306..080848108 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -29,7 +29,7 @@ add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c vid_tkd8001_ramdac.c vid_att20c49x_ramdac.c vid_s3.c vid_s3_virge.c vid_ibm_rgb528_ramdac.c vid_sdac_ramdac.c vid_ogc.c vid_mga.c vid_nga.c vid_tvp3026_ramdac.c vid_att2xc498_ramdac.c vid_xga.c - vid_bochs_vbe.c vid_ps55da2.c ) + vid_bochs_vbe.c ) if(G100) target_compile_definitions(vid PRIVATE USE_G100) From fe5177fd0069193346e3f9e8082a1ae9f29e0390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Thu, 12 Sep 2024 20:19:43 +0200 Subject: [PATCH 417/624] Update CMakeLists.txt --- src/video/CMakeLists.txt | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index 080848108..2f7607ad6 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -9,10 +9,8 @@ # CMake build script. # # Authors: David Hrdlička, -# Jasmine Iwanek, # # Copyright 2020-2021 David Hrdlička. -# Copyright 2024 Jasmine Iwanek. # add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c @@ -29,7 +27,7 @@ add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c vid_tkd8001_ramdac.c vid_att20c49x_ramdac.c vid_s3.c vid_s3_virge.c vid_ibm_rgb528_ramdac.c vid_sdac_ramdac.c vid_ogc.c vid_mga.c vid_nga.c vid_tvp3026_ramdac.c vid_att2xc498_ramdac.c vid_xga.c - vid_bochs_vbe.c ) + vid_bochs_vbe.c) if(G100) target_compile_definitions(vid PRIVATE USE_G100) @@ -39,19 +37,10 @@ if(XL24) target_compile_definitions(vid PRIVATE USE_XL24) endif() -add_library(voodoo OBJECT - vid_voodoo.c - vid_voodoo_banshee.c - vid_voodoo_banshee_blitter.c - vid_voodoo_blitter.c - vid_voodoo_display.c - vid_voodoo_fb.c - vid_voodoo_fifo.c - vid_voodoo_reg.c - vid_voodoo_render.c - vid_voodoo_setup.c - vid_voodoo_texture.c -) +add_library(voodoo OBJECT vid_voodoo.c vid_voodoo_banshee.c + vid_voodoo_banshee_blitter.c vid_voodoo_blitter.c vid_voodoo_display.c + vid_voodoo_fb.c vid_voodoo_fifo.c vid_voodoo_reg.c vid_voodoo_render.c + vid_voodoo_setup.c vid_voodoo_texture.c) if(NOT MSVC AND (ARCH STREQUAL "i386" OR ARCH STREQUAL "x86_64")) target_compile_options(voodoo PRIVATE "-msse2") From 8e4cd08a19145ae51b5197ce069c09584541f212 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Fri, 13 Sep 2024 13:51:20 +0200 Subject: [PATCH 418/624] Mach64 font fix about Solaris. (September 13th, 2024) The so called "NT 3.5 font fix" on the Mach64 applies only to the Source Control reg with bits 2-3 set, but Solaris only sets bit 2 (without bit 3), so, don't align the source with bit 3 cleared. This fixes the garbled fonts under Solaris using said card. --- src/video/vid_ati_mach64.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index d54c09f56..fa2b7992c 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -333,7 +333,8 @@ enum { enum { SRC_PATT_EN = 1, SRC_PATT_ROT_EN = 2, - SRC_LINEAR_EN = 4 + SRC_LINEAR_EN = 4, + SRC_BYTE_ALIGN = 8 }; enum { @@ -1280,6 +1281,14 @@ mach64_queue(mach64_t *mach64, uint32_t addr, uint32_t val, uint32_t type) void mach64_start_fill(mach64_t *mach64) { + mach64->accel.dst_pix_width = mach64->dp_pix_width & 7; + mach64->accel.src_pix_width = (mach64->dp_pix_width >> 8) & 7; + mach64->accel.host_pix_width = (mach64->dp_pix_width >> 16) & 7; + + mach64->accel.dst_size = mach64_width[mach64->accel.dst_pix_width]; + mach64->accel.src_size = mach64_width[mach64->accel.src_pix_width]; + mach64->accel.host_size = mach64_width[mach64->accel.host_pix_width]; + mach64->accel.dst_x = 0; mach64->accel.dst_y = 0; @@ -1293,7 +1302,8 @@ mach64_start_fill(mach64_t *mach64) mach64->accel.dst_width = (mach64->dst_height_width >> 16) & 0x1fff; mach64->accel.dst_height = mach64->dst_height_width & 0x1fff; - if (((mach64->dp_src >> 16) & 7) == MONO_SRC_BLITSRC) { + if ((((mach64->dp_src >> 16) & 7) == MONO_SRC_BLITSRC) && + ((mach64->src_cntl & (SRC_LINEAR_EN | SRC_BYTE_ALIGN)) == (SRC_LINEAR_EN | SRC_BYTE_ALIGN))) { if (mach64->accel.dst_width & 7) mach64->accel.dst_width = (mach64->accel.dst_width & ~7) + 8; } @@ -1345,14 +1355,6 @@ mach64_start_fill(mach64_t *mach64) mach64->accel.source_fg = (mach64->dp_src >> 8) & 7; mach64->accel.source_mix = (mach64->dp_src >> 16) & 7; - mach64->accel.dst_pix_width = mach64->dp_pix_width & 7; - mach64->accel.src_pix_width = (mach64->dp_pix_width >> 8) & 7; - mach64->accel.host_pix_width = (mach64->dp_pix_width >> 16) & 7; - - mach64->accel.dst_size = mach64_width[mach64->accel.dst_pix_width]; - mach64->accel.src_size = mach64_width[mach64->accel.src_pix_width]; - mach64->accel.host_size = mach64_width[mach64->accel.host_pix_width]; - if (mach64->accel.src_size == WIDTH_1BIT) mach64->accel.src_offset <<= 3; else @@ -1861,6 +1863,7 @@ mach64_blit(uint32_t cpu_dat, int count, mach64_t *mach64) cpu_dat >>= (count & 7); else cpu_dat <<= (count & 7); + count &= ~7; } } From 7399969f2bf110c11ad2364356d632646b54d169 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 13 Sep 2024 14:04:53 +0200 Subject: [PATCH 419/624] MCA ESDI: Implement the PARK HEADS (0x06) command. --- src/disk/hdc_esdi_mca.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index c906c7ca1..60cdf7583 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -188,6 +188,7 @@ typedef struct esdi_t { #define CMD_READ_VERIFY 0x03 #define CMD_WRITE_VERIFY 0x04 #define CMD_SEEK 0x05 +#define CMD_PARK_HEADS 0x06 #define CMD_GET_DEV_STATUS 0x08 #define CMD_GET_DEV_CONFIG 0x09 #define CMD_GET_POS_INFO 0x0a @@ -605,6 +606,35 @@ esdi_callback(void *priv) } break; + case CMD_PARK_HEADS: + ESDI_DRIVE_ONLY(); + + if (!drive->present) { + device_not_present(dev); + return; + } + + switch (dev->cmd_state) { + case 0: + dev->rba = 0x00000000; + cmd_time = hdd_seek_get_time(&hdd[drive->hdd_num], dev->rba, HDD_OP_SEEK, 0, 0.0); + esdi_mca_set_callback(dev, ESDI_TIME + cmd_time); + dev->cmd_state = 1; + break; + + case 1: + complete_command_status(dev); + dev->status = STATUS_IRQ | STATUS_STATUS_OUT_FULL; + dev->irq_status = dev->cmd_dev | IRQ_CMD_COMPLETE_SUCCESS; + dev->irq_in_progress = 1; + set_irq(dev); + break; + + default: + break; + } + break; + case CMD_GET_DEV_STATUS: ESDI_DRIVE_ONLY(); From 866d6599a1f0c4102a3a321858e3e106dc745329 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 15 Sep 2024 01:18:37 +0200 Subject: [PATCH 420/624] Implement Mode Point and Mode Down/Up. Merge HEX/DEC functions in order to do so efficiently. Optimize. --- src/device/mouse_microtouch_touchscreen.c | 93 +++++++++-------------- 1 file changed, 35 insertions(+), 58 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index d91b10440..1c2393d16 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -22,7 +22,6 @@ - Decouple serial packet generation from mouse poll rate. - Dynamic baud rate selection from software following this. - Add additional SMT2/3 formats as we currently only support Tablet, Hex and Dec. - - Add additional SMT2/3 modes as we currently hardcode Mode Stream. */ #include #include @@ -62,8 +61,7 @@ const char* mtouch_identity[] = { }; typedef struct mouse_microtouch_t { - double baud_rate; - unsigned int abs_x_int, abs_y_int; + double baud_rate, abs_x, abs_y; int b; char cmd[256]; int cmd_pos; @@ -266,10 +264,10 @@ mtouch_poll(void *priv) return 0; } - unsigned int abs_x_int = 0, abs_y_int = 0; double abs_x; double abs_y; int b = mouse_get_buttons_ex(); + char buffer[10]; mouse_get_abs_coords(&abs_x, &abs_y); @@ -314,76 +312,55 @@ mtouch_poll(void *priv) return 0; } - if (dev->format == FORMAT_DEC) { - abs_x_int = abs_x * 999; - abs_y_int = 999 - (abs_y * 999); - char buffer[10]; - - if (!dev->mode_status) { - if (b) { // Touch - snprintf(buffer, sizeof(buffer), "\x1%03d,%03d\r", abs_x_int, abs_y_int); + if (dev->format == FORMAT_DEC || dev->format == FORMAT_HEX) { + if (b) { + if (!dev->b) { /* Touchdown (MS, MP, MDU)*/ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x19 : 0x01); + if (dev->format == FORMAT_DEC){ + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); + } else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } else if (dev->mode == MODE_STREAM){ /* Touch Continuation (MS)*/ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x1c : 0x01); + if (dev->format == FORMAT_DEC){ + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); + } else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); + } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - } else { - if (b) { - if (!dev->b) { /* Touchdown Status */ - snprintf(buffer, sizeof(buffer), "\x19%03d,%03d\r", abs_x_int, abs_y_int); - } else { /* Touch Continuation Status */ - snprintf(buffer, sizeof(buffer), "\x1c%03d,%03d\r", abs_x_int, abs_y_int); - } - } else if (dev->b) { /* Liftoff Status */ - snprintf(buffer, sizeof(buffer), "\x18%03d,%03d\r", dev->abs_x_int, dev->abs_y_int); - } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } - } - - else if (dev->format == FORMAT_HEX) { - abs_x_int = abs_x * 1023; - abs_y_int = 1023 - (abs_y * 1023); - char buffer[10]; - - if (!dev->mode_status) { - if (b) { // Touch - snprintf(buffer, sizeof(buffer), "\x1%03X,%03X\r", abs_x_int, abs_y_int); - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } - } else { - if (b) { - if (!dev->b) { /* Touchdown Status */ - snprintf(buffer, sizeof(buffer), "\x19%03X,%03X\r", abs_x_int, abs_y_int); - } else { /* Touch Continuation Status */ - snprintf(buffer, sizeof(buffer), "\x1c%03X,%03X\r", abs_x_int, abs_y_int); - } - } else if (dev->b) { /* Liftoff Status */ - snprintf(buffer, sizeof(buffer), "\x18%03X,%03X\r", dev->abs_x_int, dev->abs_y_int); + } else if (dev->b && dev->mode != MODE_POINT) { /* Touch Liftoff (MS, MDU)*/ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x18 : 0x01); + if (dev->format == FORMAT_DEC) { + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * dev->abs_x), (uint16_t)(999 * (1 - dev->abs_y))); + } else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * dev->abs_x), (uint16_t)(1023 * (1 - dev->abs_y))); } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } } else if (dev->format == FORMAT_TABLET) { - abs_x_int = abs_x * 16383; - abs_y_int = 16383 - abs_y * 16383; - if (b) { /* Touchdown/Continuation */ fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5) | ((b & 3))) : 0)); - fifo8_push(&dev->resp, abs_x_int & 0b1111111); - fifo8_push(&dev->resp, (abs_x_int >> 7) & 0b1111111); - fifo8_push(&dev->resp, abs_y_int & 0b1111111); - fifo8_push(&dev->resp, (abs_y_int >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * abs_x) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * abs_x) >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * (1 - abs_y)) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * (1 - abs_y)) >> 7) & 0b1111111); } else if (dev->b) { /* Liftoff */ fifo8_push(&dev->resp, 0b10000000 | ((dev->pen_mode == 2) ? ((1 << 5)) : 0)); - fifo8_push(&dev->resp, dev->abs_x_int & 0b1111111); - fifo8_push(&dev->resp, (dev->abs_x_int >> 7) & 0b1111111); - fifo8_push(&dev->resp, dev->abs_y_int & 0b1111111); - fifo8_push(&dev->resp, (dev->abs_y_int >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * dev->abs_x) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * dev->abs_x) >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * (1 - dev->abs_y))& 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * (1 - dev->abs_y)) >> 7) & 0b1111111); } } /* Save old states*/ - dev->abs_x_int = abs_x_int; - dev->abs_y_int = abs_y_int; + dev->abs_x = abs_x; + dev->abs_y = abs_y; dev->b = b; return 0; } From 22240a592521dae86c8ca5c3f03e747bdbac3e5c Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 15 Sep 2024 01:56:45 +0200 Subject: [PATCH 421/624] Code style cleanups, optimize if statement order --- src/device/mouse_microtouch_touchscreen.c | 49 +++++++++-------------- 1 file changed, 20 insertions(+), 29 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 1c2393d16..8ca2a0469 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -259,26 +259,25 @@ static int mtouch_poll(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - - if (fifo8_num_free(&dev->resp) <= 256 - 10 || dev->mode == MODE_INACTIVE) { - return 0; - } - double abs_x; double abs_y; int b = mouse_get_buttons_ex(); char buffer[10]; + if (fifo8_num_free(&dev->resp) <= 256 - 10 || dev->mode == MODE_INACTIVE) { + return 0; + } + + if (dev->cal_cntr || (!b && !dev->b)) { /* Calibration or no buttonpress */ + if (!b && dev->b) { + microtouch_calibrate_timer(dev); + } + dev->b = b; /* Save buttonpress */ + return 0; + } + mouse_get_abs_coords(&abs_x, &abs_y); - if (abs_x >= 1.0) - abs_x = 1.0; - if (abs_y >= 1.0) - abs_y = 1.0; - if (abs_x <= 0.0) - abs_x = 0.0; - if (abs_y <= 0.0) - abs_y = 0.0; if (enable_overscan) { int index = mouse_tablet_in_proximity - 1; if (mouse_tablet_in_proximity == -1) { @@ -298,19 +297,12 @@ mtouch_poll(void *priv) abs_y -= (monitors[index].mon_overscan_y / 2.); abs_x = abs_x / (double) monitors[index].mon_xsize; abs_y = abs_y / (double) monitors[index].mon_ysize; - if (abs_x >= 1.0) - abs_x = 1.0; - if (abs_y >= 1.0) - abs_y = 1.0; } - if (dev->cal_cntr || (!b && !dev->b)) { /* Calibration or no buttonpress */ - if (!b && dev->b) { - microtouch_calibrate_timer(dev); - } - dev->b = b; /* Save buttonpress */ - return 0; - } + if (abs_x >= 1.0) abs_x = 1.0; + if (abs_y >= 1.0) abs_y = 1.0; + if (abs_x <= 0.0) abs_x = 0.0; + if (abs_y <= 0.0) abs_y = 0.0; if (dev->format == FORMAT_DEC || dev->format == FORMAT_HEX) { if (b) { @@ -342,7 +334,7 @@ mtouch_poll(void *priv) } } - else if (dev->format == FORMAT_TABLET) { + if (dev->format == FORMAT_TABLET) { if (b) { /* Touchdown/Continuation */ fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5) | ((b & 3))) : 0)); fifo8_push(&dev->resp, (uint16_t)(16383 * abs_x) & 0b1111111); @@ -393,8 +385,7 @@ mtouch_init(const device_t *info) if (dev->id < 2) { /* legacy controllers */ dev->format = FORMAT_DEC; mouse_set_sample_rate(106); - } - else { + } else { dev->format = FORMAT_TABLET; mouse_set_sample_rate(192); } @@ -402,7 +393,6 @@ mtouch_init(const device_t *info) mouse_input_mode = device_get_config_int("crosshair") + 1; mouse_set_buttons(2); mouse_set_poll_ex(mtouch_poll_global); - mtouch_inst = dev; return dev; @@ -415,8 +405,9 @@ mtouch_close(void *priv) fifo8_destroy(&dev->resp); /* Detach serial port from the mouse. */ - if (dev && dev->serial && dev->serial->sd) + if (dev && dev->serial && dev->serial->sd) { memset(dev->serial->sd, 0, sizeof(serial_device_t)); + } free(dev); mtouch_inst = NULL; From 2b4b9aae644055c8d5bc5cadfa58301b625da59d Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 15 Sep 2024 03:13:54 +0200 Subject: [PATCH 422/624] Cleanup --- src/device/mouse_microtouch_touchscreen.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 8ca2a0469..82c936f9c 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -22,6 +22,7 @@ - Decouple serial packet generation from mouse poll rate. - Dynamic baud rate selection from software following this. - Add additional SMT2/3 formats as we currently only support Tablet, Hex and Dec. + - Mode Polled. */ #include #include @@ -83,7 +84,7 @@ microtouch_reset_complete(void *priv) { mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; - mtouch->reset = true; + mtouch->reset = true; mtouch->in_reset = false; fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } @@ -266,7 +267,7 @@ mtouch_poll(void *priv) if (fifo8_num_free(&dev->resp) <= 256 - 10 || dev->mode == MODE_INACTIVE) { return 0; - } + } if (dev->cal_cntr || (!b && !dev->b)) { /* Calibration or no buttonpress */ if (!b && dev->b) { @@ -274,7 +275,7 @@ mtouch_poll(void *priv) } dev->b = b; /* Save buttonpress */ return 0; - } + } mouse_get_abs_coords(&abs_x, &abs_y); @@ -306,7 +307,7 @@ mtouch_poll(void *priv) if (dev->format == FORMAT_DEC || dev->format == FORMAT_HEX) { if (b) { - if (!dev->b) { /* Touchdown (MS, MP, MDU)*/ + if (!dev->b) { /* Touchdown (MS, MP, MDU) */ fifo8_push(&dev->resp, (dev->mode_status) ? 0x19 : 0x01); if (dev->format == FORMAT_DEC){ snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); @@ -314,7 +315,7 @@ mtouch_poll(void *priv) snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } else if (dev->mode == MODE_STREAM){ /* Touch Continuation (MS)*/ + } else if (dev->mode == MODE_STREAM){ /* Touch Continuation (MS) */ fifo8_push(&dev->resp, (dev->mode_status) ? 0x1c : 0x01); if (dev->format == FORMAT_DEC){ snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); @@ -323,7 +324,7 @@ mtouch_poll(void *priv) } fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); } - } else if (dev->b && dev->mode != MODE_POINT) { /* Touch Liftoff (MS, MDU)*/ + } else if (dev->b && dev->mode != MODE_POINT) { /* Touch Liftoff (MS, MDU) */ fifo8_push(&dev->resp, (dev->mode_status) ? 0x18 : 0x01); if (dev->format == FORMAT_DEC) { snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * dev->abs_x), (uint16_t)(999 * (1 - dev->abs_y))); @@ -353,7 +354,7 @@ mtouch_poll(void *priv) /* Save old states*/ dev->abs_x = abs_x; dev->abs_y = abs_y; - dev->b = b; + dev->b = b; return 0; } From b2dcc4f1b2d3d632e095f1682ad623795a0e8621 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 15 Sep 2024 17:47:06 +0200 Subject: [PATCH 423/624] Decouple mouse polling from serial speed, add software baud selection, remove baud menu option --- src/device/mouse_microtouch_touchscreen.c | 312 +++++++++++----------- 1 file changed, 159 insertions(+), 153 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 82c936f9c..ca50a0b6b 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -19,8 +19,6 @@ /* TODO: - Properly implement GP/SP commands (formats are not documented at all, like anywhere; no dumps yet). - - Decouple serial packet generation from mouse poll rate. - - Dynamic baud rate selection from software following this. - Add additional SMT2/3 formats as we currently only support Tablet, Hex and Dec. - Mode Polled. */ @@ -62,8 +60,8 @@ const char* mtouch_identity[] = { }; typedef struct mouse_microtouch_t { - double baud_rate, abs_x, abs_y; - int b; + double baud_rate, abs_x, abs_x_old, abs_y, abs_y_old; + int but, but_old; char cmd[256]; int cmd_pos; uint8_t format, mode; @@ -109,55 +107,51 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ mtouch->cal_cntr = 2; } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ - mouse_set_sample_rate(106); + else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ mtouch->format = FORMAT_DEC; mtouch->mode_status = false; } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ + else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ mtouch->pen_mode = 1; } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ - mouse_set_sample_rate(106); + else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ mtouch->format = FORMAT_HEX; mtouch->mode_status = false; } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ - mouse_set_sample_rate(106); + else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ mtouch->format = FORMAT_RAW; mtouch->mode = MODE_INACTIVE; mtouch->cal_cntr = 0; } - if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ - mouse_set_sample_rate(192); + else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ mtouch->format = FORMAT_TABLET; } - if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ + else if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", 26); } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'D' && mtouch->cmd[2] == 'U') { /* Mode Down/Up */ + else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'D' && mtouch->cmd[2] == 'U') { /* Mode Down/Up */ mtouch->mode = MODE_DOWNUP; } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'I') { /* Mode Inactive */ + else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'I') { /* Mode Inactive */ mtouch->mode = MODE_INACTIVE; } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'P') { /* Mode Point */ + else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'P') { /* Mode Point */ mtouch->mode = MODE_POINT; } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'T') { /* Mode Status */ + else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'T') { /* Mode Status */ mtouch->mode_status = true; } - if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ + else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ mtouch->mode = MODE_STREAM; } - if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ + else if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ fifo8_push(&mtouch->resp, 0x01); fifo8_push_all(&mtouch->resp, (uint8_t *) mtouch_identity[mtouch->id], 6); fifo8_push(&mtouch->resp, 0x0D); return; } - if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'S') { /* Output Status */ + else if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'S') { /* Output Status */ if (mtouch->reset) { fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x40\x60\x0D", 4); } else { @@ -165,11 +159,23 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) } return; } - if (mtouch->cmd[0] == 'P') { - if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ - else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ + else if (mtouch->cmd[0] == 'P') { + if (strlen(mtouch->cmd) == 2) { /* Pen */ + if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ + else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ + } + else if (strlen(mtouch->cmd) == 5) { /* Serial Options */ + if (mtouch->cmd[4] == 1) mtouch->baud_rate = 19200; + else if (mtouch->cmd[4] == 2) mtouch->baud_rate = 9600; + else if (mtouch->cmd[4] == 3) mtouch->baud_rate = 4600; + else if (mtouch->cmd[4] == 4) mtouch->baud_rate = 2400; + else if (mtouch->cmd[4] == 5) mtouch->baud_rate = 1200; + + timer_stop(&mtouch->host_to_serial_timer); + timer_on_auto(&mtouch->host_to_serial_timer, (1000000. / mtouch->baud_rate) * 10); + } } - if (mtouch->cmd[0] == 'R') { /* Reset */ + else if (mtouch->cmd[0] == 'R') { /* Reset */ mtouch->in_reset = true; mtouch->cal_cntr = 0; mtouch->pen_mode = 3; @@ -179,10 +185,8 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mtouch->mode_status = false; if (mtouch->id < 2) { - mouse_set_sample_rate(106); mtouch->format = FORMAT_DEC; } else { - mouse_set_sample_rate(192); mtouch->format = FORMAT_TABLET; } } @@ -190,11 +194,11 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) timer_on_auto(&mtouch->reset_timer, 500. * 1000.); return; } - if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ + else if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ return; } - if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ + else if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ fifo8_push(&mtouch->resp, 0x01); if (mtouch->id == 2) { @@ -209,6 +213,111 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } +void +mtouch_write(serial_t *serial, void *priv, uint8_t data) +{ + mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + if (data == '\x1') { + dev->soh = 1; + } + else if (dev->soh) { + if (data != '\r') { + dev->cmd[dev->cmd_pos++] = data; + } else { + dev->soh = 0; + + if (!dev->cmd_pos) { + return; + } + + dev->cmd[dev->cmd_pos++] = data; + dev->cmd_pos = 0; + microtouch_process_commands(dev); + } + } +} + +static int +mtouch_prepare_transmit(void *priv) +{ + char buffer[10]; + mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + + double abs_x = dev->abs_x; + double abs_y = dev->abs_y; + int but = dev->but; + + if (dev->mode == MODE_INACTIVE) { + return 0; + } + + if (dev->cal_cntr || (!dev->but && !dev->but_old)) { /* Calibration or no buttonpress */ + if (!dev->but && dev->but_old) { + microtouch_calibrate_timer(dev); + } + dev->but_old = but; /* Save buttonpress */ + return 0; + } + + if (dev->format == FORMAT_TABLET) { + if (but) { /* Touchdown/Continuation */ + fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5) | ((but & 3))) : 0)); + fifo8_push(&dev->resp, (uint16_t)(16383 * abs_x) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * abs_x) >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * (1 - abs_y)) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * (1 - abs_y)) >> 7) & 0b1111111); + } + else if (dev->but_old) { /* Liftoff */ + fifo8_push(&dev->resp, 0b10000000 | ((dev->pen_mode == 2) ? ((1 << 5)) : 0)); + fifo8_push(&dev->resp, (uint16_t)(16383 * dev->abs_x_old) & 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * dev->abs_x_old) >> 7) & 0b1111111); + fifo8_push(&dev->resp, (uint16_t)(16383 * (1 - dev->abs_y_old))& 0b1111111); + fifo8_push(&dev->resp, ((uint16_t)(16383 * (1 - dev->abs_y_old)) >> 7) & 0b1111111); + } + } + + else if (dev->format == FORMAT_DEC || dev->format == FORMAT_HEX) { + if (but) { + if (!dev->but_old) { /* Touchdown (MS, MP, MDU) */ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x19 : 0x01); + if (dev->format == FORMAT_DEC){ + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); + } + else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } + else if (dev->mode == MODE_STREAM){ /* Touch Continuation (MS) */ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x1c : 0x01); + if (dev->format == FORMAT_DEC){ + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); + } + else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } + } + else if (dev->but_old && dev->mode != MODE_POINT) { /* Touch Liftoff (MS, MDU) */ + fifo8_push(&dev->resp, (dev->mode_status) ? 0x18 : 0x01); + if (dev->format == FORMAT_DEC) { + snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * dev->abs_x_old), (uint16_t)(999 * (1 - dev->abs_y_old))); + } + else if (dev->format == FORMAT_HEX) { + snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * dev->abs_x_old), (uint16_t)(1023 * (1 - dev->abs_y_old))); + } + fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); + } + } + + /* Save old states*/ + dev->abs_x_old = abs_x; + dev->abs_y_old = abs_y; + dev->but_old = but; + return 0; +} + void mtouch_write_to_host(void *priv) { @@ -228,56 +337,21 @@ mtouch_write_to_host(void *priv) if (fifo8_num_used(&dev->resp)) { serial_write_fifo(dev->serial, fifo8_pop(&dev->resp)); } + else { + mtouch_prepare_transmit(dev); + } no_write_to_machine: timer_on_auto(&dev->host_to_serial_timer, (1000000.0 / (double) dev->baud_rate) * (double) (1 + 8 + 1)); } -void -mtouch_write(serial_t *serial, void *priv, uint8_t data) -{ - mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - if (data == '\x1') { - dev->soh = 1; - } else if (dev->soh) { - if (data != '\r') { - dev->cmd[dev->cmd_pos++] = data; - } else { - dev->soh = 0; - - if (!dev->cmd_pos) { - return; - } - - dev->cmd[dev->cmd_pos++] = data; - dev->cmd_pos = 0; - microtouch_process_commands(dev); - } - } -} - static int mtouch_poll(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - double abs_x; - double abs_y; - int b = mouse_get_buttons_ex(); - char buffer[10]; - if (fifo8_num_free(&dev->resp) <= 256 - 10 || dev->mode == MODE_INACTIVE) { - return 0; - } - - if (dev->cal_cntr || (!b && !dev->b)) { /* Calibration or no buttonpress */ - if (!b && dev->b) { - microtouch_calibrate_timer(dev); - } - dev->b = b; /* Save buttonpress */ - return 0; - } - - mouse_get_abs_coords(&abs_x, &abs_y); + dev->but = mouse_get_buttons_ex(); + mouse_get_abs_coords(&dev->abs_x, &dev->abs_y); if (enable_overscan) { int index = mouse_tablet_in_proximity - 1; @@ -285,76 +359,26 @@ mtouch_poll(void *priv) mouse_tablet_in_proximity = 0; } - abs_x *= monitors[index].mon_unscaled_size_x - 1; - abs_y *= monitors[index].mon_efscrnsz_y - 1; + dev->abs_x *= monitors[index].mon_unscaled_size_x - 1; + dev->abs_y *= monitors[index].mon_efscrnsz_y - 1; - if (abs_x <= (monitors[index].mon_overscan_x / 2.)) { - abs_x = (monitors[index].mon_overscan_x / 2.); + if (dev->abs_x <= (monitors[index].mon_overscan_x / 2.)) { + dev->abs_x = (monitors[index].mon_overscan_x / 2.); } - if (abs_y <= (monitors[index].mon_overscan_y / 2.)) { - abs_y = (monitors[index].mon_overscan_y / 2.); + if (dev->abs_y <= (monitors[index].mon_overscan_y / 2.)) { + dev->abs_y = (monitors[index].mon_overscan_y / 2.); } - abs_x -= (monitors[index].mon_overscan_x / 2.); - abs_y -= (monitors[index].mon_overscan_y / 2.); - abs_x = abs_x / (double) monitors[index].mon_xsize; - abs_y = abs_y / (double) monitors[index].mon_ysize; + dev->abs_x -= (monitors[index].mon_overscan_x / 2.); + dev->abs_y -= (monitors[index].mon_overscan_y / 2.); + dev->abs_x = dev->abs_x / (double) monitors[index].mon_xsize; + dev->abs_y = dev->abs_y / (double) monitors[index].mon_ysize; } - if (abs_x >= 1.0) abs_x = 1.0; - if (abs_y >= 1.0) abs_y = 1.0; - if (abs_x <= 0.0) abs_x = 0.0; - if (abs_y <= 0.0) abs_y = 0.0; + if (dev->abs_x >= 1.0) dev->abs_x = 1.0; + if (dev->abs_y >= 1.0) dev->abs_y = 1.0; + if (dev->abs_x <= 0.0) dev->abs_x = 0.0; + if (dev->abs_y <= 0.0) dev->abs_y = 0.0; - if (dev->format == FORMAT_DEC || dev->format == FORMAT_HEX) { - if (b) { - if (!dev->b) { /* Touchdown (MS, MP, MDU) */ - fifo8_push(&dev->resp, (dev->mode_status) ? 0x19 : 0x01); - if (dev->format == FORMAT_DEC){ - snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); - } else if (dev->format == FORMAT_HEX) { - snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); - } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } else if (dev->mode == MODE_STREAM){ /* Touch Continuation (MS) */ - fifo8_push(&dev->resp, (dev->mode_status) ? 0x1c : 0x01); - if (dev->format == FORMAT_DEC){ - snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * abs_x), (uint16_t)(999 * (1 - abs_y))); - } else if (dev->format == FORMAT_HEX) { - snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * abs_x), (uint16_t)(1023 * (1 - abs_y))); - } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } - } else if (dev->b && dev->mode != MODE_POINT) { /* Touch Liftoff (MS, MDU) */ - fifo8_push(&dev->resp, (dev->mode_status) ? 0x18 : 0x01); - if (dev->format == FORMAT_DEC) { - snprintf(buffer, sizeof(buffer), "%03d,%03d\r", (uint16_t)(999 * dev->abs_x), (uint16_t)(999 * (1 - dev->abs_y))); - } else if (dev->format == FORMAT_HEX) { - snprintf(buffer, sizeof(buffer), "%03X,%03X\r", (uint16_t)(1023 * dev->abs_x), (uint16_t)(1023 * (1 - dev->abs_y))); - } - fifo8_push_all(&dev->resp, (uint8_t *)buffer, strlen(buffer)); - } - } - - if (dev->format == FORMAT_TABLET) { - if (b) { /* Touchdown/Continuation */ - fifo8_push(&dev->resp, 0b11000000 | ((dev->pen_mode == 2) ? ((1 << 5) | ((b & 3))) : 0)); - fifo8_push(&dev->resp, (uint16_t)(16383 * abs_x) & 0b1111111); - fifo8_push(&dev->resp, ((uint16_t)(16383 * abs_x) >> 7) & 0b1111111); - fifo8_push(&dev->resp, (uint16_t)(16383 * (1 - abs_y)) & 0b1111111); - fifo8_push(&dev->resp, ((uint16_t)(16383 * (1 - abs_y)) >> 7) & 0b1111111); - } else if (dev->b) { /* Liftoff */ - fifo8_push(&dev->resp, 0b10000000 | ((dev->pen_mode == 2) ? ((1 << 5)) : 0)); - fifo8_push(&dev->resp, (uint16_t)(16383 * dev->abs_x) & 0b1111111); - fifo8_push(&dev->resp, ((uint16_t)(16383 * dev->abs_x) >> 7) & 0b1111111); - fifo8_push(&dev->resp, (uint16_t)(16383 * (1 - dev->abs_y))& 0b1111111); - fifo8_push(&dev->resp, ((uint16_t)(16383 * (1 - dev->abs_y)) >> 7) & 0b1111111); - } - } - - /* Save old states*/ - dev->abs_x = abs_x; - dev->abs_y = abs_y; - dev->b = b; return 0; } @@ -370,7 +394,7 @@ mtouch_init(const device_t *info) mouse_microtouch_t *dev = calloc(1, sizeof(mouse_microtouch_t)); dev->serial = serial_attach(device_get_config_int("port"), NULL, mtouch_write, dev); - dev->baud_rate = device_get_config_int("baudrate"); + dev->baud_rate = 9600; serial_set_cts(dev->serial, 1); serial_set_dsr(dev->serial, 1); serial_set_dcd(dev->serial, 1); @@ -385,10 +409,8 @@ mtouch_init(const device_t *info) if (dev->id < 2) { /* legacy controllers */ dev->format = FORMAT_DEC; - mouse_set_sample_rate(106); } else { dev->format = FORMAT_TABLET; - mouse_set_sample_rate(192); } mouse_input_mode = device_get_config_int("crosshair") + 1; @@ -432,22 +454,6 @@ static const device_config_t mtouch_config[] = { { .description = "" } } }, - { - .name = "baudrate", - .description = "Baud Rate", - .type = CONFIG_SELECTION, - .default_string = "", - .default_int = 9600, - .file_filter = NULL, - .spinner = { 0 }, - .selection = { - { .description = "19200", .value = 19200 }, - { .description = "9600", .value = 9600 }, - { .description = "4800", .value = 4800 }, - { .description = "2400", .value = 2400 }, - { .description = "1200", .value = 1200 } - } - }, { .name = "identity", .description = "Controller", @@ -486,4 +492,4 @@ const device_t mouse_mtouch_device = { .speed_changed = NULL, .force_redraw = NULL, .config = mtouch_config -}; +}; \ No newline at end of file From cb6286a1de03a1fd911e0763bf14346e77a30ef8 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 15 Sep 2024 19:48:58 +0200 Subject: [PATCH 424/624] Add a proper 1MB capable ATI 28800-6 BIOS The ATI VGA Wonder 1024D XL Plus. --- src/include/86box/video.h | 1 + src/video/vid_ati28800.c | 76 ++++++++++++++++++++++++++++----------- src/video/vid_table.c | 1 + 3 files changed, 58 insertions(+), 20 deletions(-) diff --git a/src/include/86box/video.h b/src/include/86box/video.h index dfbf072c5..9ee710592 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -326,6 +326,7 @@ extern const device_t ati18800_device; /* ATi 28800 */ extern const device_t ati28800_device; +extern const device_t ati28800_wonder1024d_xl_plus_device; extern const device_t ati28800k_device; extern const device_t ati28800k_spc4620p_device; extern const device_t ati28800k_spc6033p_device; diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 16bb36201..6f31d109d 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -36,10 +36,11 @@ #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> -#define VGAWONDERXL 1 -#ifdef USE_XL24 -# define VGAWONDERXL24 2 -#endif /* USE_XL24 */ +#define VGAWONDERXL 1 +#define VGAWONDERXLPLUS 2 +#if defined(DEV_BRANCH) && defined(USE_XL24) +# define VGAWONDERXL24 3 +#endif #define BIOS_ATIKOR_PATH "roms/video/ati28800/atikorvga.bin" #define BIOS_ATIKOR_4620P_PATH_L "roms/machines/spc4620p/31005h.u8" @@ -52,13 +53,14 @@ #define BIOS_VGAXL_EVEN_PATH "roms/video/ati28800/xleven.bin" #define BIOS_VGAXL_ODD_PATH "roms/video/ati28800/xlodd.bin" -#ifdef USE_XL24 +#if defined(DEV_BRANCH) && defined(USE_XL24) # define BIOS_XL24_EVEN_PATH "roms/video/ati28800/112-14318-102.bin" # define BIOS_XL24_ODD_PATH "roms/video/ati28800/112-14319-102.bin" -#endif /* USE_XL24 */ +#endif -#define BIOS_ROM_PATH "roms/video/ati28800/bios.bin" -#define BIOS_VGAXL_ROM_PATH "roms/video/ati28800/ATI_VGAWonder_XL.bin" +#define BIOS_ROM_PATH "roms/video/ati28800/bios.bin" +#define BIOS_VGAXL_ROM_PATH "roms/video/ati28800/ATI_VGAWonder_XL.bin" +#define BIOS_VGAXL_PLUS_ROM_PATH "roms/video/ati28800/VGAWonder1024D_XL_Plus_VGABIOS_U19.BIN" typedef struct ati28800_t { svga_t svga; @@ -183,7 +185,7 @@ ati28800_out(uint16_t addr, uint8_t val, void *priv) case 0x3C7: case 0x3C8: case 0x3C9: - if (ati28800->type == 1) + if ((ati28800->type == VGAWONDERXL) || (ati28800->type == VGAWONDERXLPLUS)) sc1148x_ramdac_out(addr, 0, val, svga->ramdac, svga); else svga_out(addr, val, svga); @@ -339,7 +341,7 @@ ati28800_in(uint16_t addr, void *priv) case 0x3C7: case 0x3C8: case 0x3C9: - if (ati28800->type == 1) + if ((ati28800->type == VGAWONDERXL) || (ati28800->type == VGAWONDERXLPLUS)) return sc1148x_ramdac_in(addr, 0, svga->ramdac, svga); return svga_in(addr, svga); @@ -609,7 +611,17 @@ ati28800_init(const device_t *info) ati28800->svga.ramdac = device_add(&sc11486_ramdac_device); break; -#ifdef USE_XL24 + case VGAWONDERXLPLUS: + ati28800->id = 6; + rom_init(&ati28800->bios_rom, + BIOS_VGAXL_PLUS_ROM_PATH, + 0xc0000, 0x8000, 0x7fff, + 0, MEM_MAPPING_EXTERNAL); + ati28800->svga.ramdac = device_add(&sc11483_ramdac_device); + ati28800->memory = 1024; + break; + +#if defined(DEV_BRANCH) && defined(USE_XL24) case VGAWONDERXL24: ati28800->id = 6; rom_init_interleaved(&ati28800->bios_rom, @@ -618,7 +630,7 @@ ati28800_init(const device_t *info) 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); break; -#endif /* USE_XL24 */ +#endif default: ati28800->id = 5; @@ -653,11 +665,15 @@ ati28800_init(const device_t *info) ati_eeprom_load(&ati28800->eeprom, "ati28800xl.nvr", 0); break; -#ifdef USE_XL24 + case VGAWONDERXLPLUS: + ati_eeprom_load(&ati28800->eeprom, "ati28800_wonder1024d_xl_plus.nvr", 0); + break; + +#if defined(DEV_BRANCH) && defined(USE_XL24) case VGAWONDERXL24: ati_eeprom_load(&ati28800->eeprom, "ati28800xl24.nvr", 0); break; -#endif /* USE_XL24 */ +#endif default: ati_eeprom_load(&ati28800->eeprom, "ati28800.nvr", 0); @@ -685,13 +701,19 @@ compaq_ati28800_available(void) return (rom_present(BIOS_VGAXL_ROM_PATH)); } -#ifdef USE_XL24 +static int +ati28800_wonder1024d_xl_plus_available(void) +{ + return (rom_present(BIOS_VGAXL_PLUS_ROM_PATH)); +} + +#if defined(DEV_BRANCH) && defined(USE_XL24) static int ati28800_wonderxl24_available(void) { return (rom_present(BIOS_XL24_EVEN_PATH) && rom_present(BIOS_XL24_ODD_PATH)); } -#endif /* USE_XL24 */ +#endif static void ati28800_close(void *priv) @@ -749,7 +771,7 @@ static const device_config_t ati28800_config[] = { } }; -#ifdef USE_XL24 +#if defined(DEV_BRANCH) && defined(USE_XL24) static const device_config_t ati28800_wonderxl_config[] = { { .name = "memory", @@ -778,7 +800,7 @@ static const device_config_t ati28800_wonderxl_config[] = { .type = CONFIG_END } }; -#endif /* USE_XL24 */ +#endif // clang-format on const device_t ati28800_device = { @@ -851,7 +873,21 @@ const device_t compaq_ati28800_device = { .config = ati28800_config }; -#ifdef USE_XL24 +const device_t ati28800_wonder1024d_xl_plus_device = { + .name = "ATI 28800-6 (ATI VGA Wonder 1024D XL Plus)", + .internal_name = "ati28800_wonder1024d_xl_plus", + .flags = DEVICE_ISA, + .local = VGAWONDERXLPLUS, + .init = ati28800_init, + .close = ati28800_close, + .reset = NULL, + { .available = ati28800_wonder1024d_xl_plus_available }, + .speed_changed = ati28800_speed_changed, + .force_redraw = ati28800_force_redraw, + .config = NULL +}; + +#if defined(DEV_BRANCH) && defined(USE_XL24) const device_t ati28800_wonderxl24_device = { .name = "ATI-28800 (VGA Wonder XL24)", .internal_name = "ati28800w", @@ -865,4 +901,4 @@ const device_t ati28800_wonderxl24_device = { .force_redraw = ati28800_force_redraw, .config = ati28800_wonderxl_config }; -#endif /* USE_XL24 */ +#endif diff --git a/src/video/vid_table.c b/src/video/vid_table.c index c4dee5719..859712357 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -60,6 +60,7 @@ video_cards[] = { { &ati18800_vga88_device }, { &ati28800_device }, { &compaq_ati28800_device }, + { &ati28800_wonder1024d_xl_plus_device }, #ifdef USE_XL24 { &ati28800_wonderxl24_device }, #endif /* USE_XL24 */ From 7a9b25f2cc39b459390b288fa864bef90c24ac6f Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 15 Sep 2024 19:57:12 +0200 Subject: [PATCH 425/624] Fix compile. --- src/video/vid_ati28800.c | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 6f31d109d..5a73991c0 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -38,9 +38,9 @@ #define VGAWONDERXL 1 #define VGAWONDERXLPLUS 2 -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 # define VGAWONDERXL24 3 -#endif +#endif /* USE_XL24 */ #define BIOS_ATIKOR_PATH "roms/video/ati28800/atikorvga.bin" #define BIOS_ATIKOR_4620P_PATH_L "roms/machines/spc4620p/31005h.u8" @@ -53,10 +53,10 @@ #define BIOS_VGAXL_EVEN_PATH "roms/video/ati28800/xleven.bin" #define BIOS_VGAXL_ODD_PATH "roms/video/ati28800/xlodd.bin" -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 # define BIOS_XL24_EVEN_PATH "roms/video/ati28800/112-14318-102.bin" # define BIOS_XL24_ODD_PATH "roms/video/ati28800/112-14319-102.bin" -#endif +#endif /* USE_XL24 */ #define BIOS_ROM_PATH "roms/video/ati28800/bios.bin" #define BIOS_VGAXL_ROM_PATH "roms/video/ati28800/ATI_VGAWonder_XL.bin" @@ -621,7 +621,7 @@ ati28800_init(const device_t *info) ati28800->memory = 1024; break; -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 case VGAWONDERXL24: ati28800->id = 6; rom_init_interleaved(&ati28800->bios_rom, @@ -630,7 +630,7 @@ ati28800_init(const device_t *info) 0xc0000, 0x10000, 0xffff, 0, MEM_MAPPING_EXTERNAL); break; -#endif +#endif /* USE_XL24 */ default: ati28800->id = 5; @@ -669,11 +669,11 @@ ati28800_init(const device_t *info) ati_eeprom_load(&ati28800->eeprom, "ati28800_wonder1024d_xl_plus.nvr", 0); break; -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 case VGAWONDERXL24: ati_eeprom_load(&ati28800->eeprom, "ati28800xl24.nvr", 0); break; -#endif +#endif /* USE_XL24 */ default: ati_eeprom_load(&ati28800->eeprom, "ati28800.nvr", 0); @@ -707,13 +707,13 @@ ati28800_wonder1024d_xl_plus_available(void) return (rom_present(BIOS_VGAXL_PLUS_ROM_PATH)); } -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 static int ati28800_wonderxl24_available(void) { return (rom_present(BIOS_XL24_EVEN_PATH) && rom_present(BIOS_XL24_ODD_PATH)); } -#endif +#endif /* USE_XL24 */ static void ati28800_close(void *priv) @@ -771,7 +771,7 @@ static const device_config_t ati28800_config[] = { } }; -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 static const device_config_t ati28800_wonderxl_config[] = { { .name = "memory", @@ -800,7 +800,7 @@ static const device_config_t ati28800_wonderxl_config[] = { .type = CONFIG_END } }; -#endif +#endif /* USE_XL24 */ // clang-format on const device_t ati28800_device = { @@ -887,7 +887,7 @@ const device_t ati28800_wonder1024d_xl_plus_device = { .config = NULL }; -#if defined(DEV_BRANCH) && defined(USE_XL24) +#ifdef USE_XL24 const device_t ati28800_wonderxl24_device = { .name = "ATI-28800 (VGA Wonder XL24)", .internal_name = "ati28800w", @@ -901,4 +901,4 @@ const device_t ati28800_wonderxl24_device = { .force_redraw = ati28800_force_redraw, .config = ati28800_wonderxl_config }; -#endif +#endif /* USE_XL24 */ From 4b9ee9d591b10091632b82a6868cab7b78071785 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 15 Sep 2024 21:37:43 +0200 Subject: [PATCH 426/624] Fix compiler warning --- src/device/mouse_microtouch_touchscreen.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index ca50a0b6b..0aa0ce727 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -240,7 +240,7 @@ mtouch_write(serial_t *serial, void *priv, uint8_t data) static int mtouch_prepare_transmit(void *priv) { - char buffer[10]; + char buffer[16]; mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; double abs_x = dev->abs_x; From a95a0c4518587466216a6047fdacbb9df81ce6f1 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 15 Sep 2024 22:13:46 +0200 Subject: [PATCH 427/624] Remove a useless AND to 0x7f in the SB DSP reset routine in its port 0x0e (Read) This fixes the audio issue on Zool 2. --- src/sound/snd_sb_dsp.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index 7b010c77b..6e9a32086 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -1983,10 +1983,8 @@ sb_read(uint16_t a, void *priv) else ret = (dsp->sb_read_rp == dsp->sb_read_wp) ? 0x7f : 0xff; } - if (dsp->state == DSP_S_RESET_WAIT) { - ret &= 0x7f; + if (dsp->state == DSP_S_RESET_WAIT) dsp->state = DSP_S_NORMAL; - } break; case 0xF: /* 16-bit ack */ if (IS_NOT_ESS(dsp)) { From 1b9df9cf9337bf8cf1ed91fb348a3166c41ede08 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 17 Sep 2024 00:34:46 +0200 Subject: [PATCH 428/624] Mach64VT class 8bpp render fix. Make it sure the alternative 8bpp renderer to avoid any palette flickering. --- src/video/vid_ati_mach64.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index fa2b7992c..1c79ae1d5 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -539,7 +539,7 @@ mach64_recalctimings(svga_t *svga) break; case BPP_8: if (mach64->type != MACH64_GX) - svga->render = svga_render_8bpp_highres; + svga->render = svga_render_8bpp_clone_highres; svga->hdisp <<= 3; svga->rowoffset >>= 1; break; From fe5c89785f5021bc16f4f33eb750a234fb0ec75e Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 18 Sep 2024 01:00:19 +0200 Subject: [PATCH 429/624] ESDI MCA changes of the late night (September 18th, 2024) 1. More logs. 2. Placed the required bits in the reset routine to make Xenix 2.3.4q work (at least getting past the reset detection). 3. Some more fixes for OS/2 1.x (proposed by WNT50) --- src/disk/hdc_esdi_mca.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index 60cdf7583..1061cbc78 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -372,7 +372,9 @@ esdi_callback(void *priv) if (dev->in_reset) { esdi_mca_log("ESDI reset.\n"); dev->in_reset = 0; - dev->status = STATUS_IRQ; + dev->status = STATUS_IRQ | STATUS_TRANSFER_REQ | STATUS_STATUS_OUT_FULL; + dev->status_len = 1; /*ToDo: better implementation for Xenix?*/ + dev->status_data[0] = STATUS_LEN(1) | ATTN_HOST_ADAPTER; dev->irq_status = IRQ_HOST_ADAPTER | IRQ_RESET_COMPLETE; return; } @@ -1055,8 +1057,10 @@ esdi_readw(uint16_t port, void *priv) switch (port & 7) { case 0: /*Status Interface Register*/ - if (dev->status_pos >= dev->status_len) + if (dev->status_pos >= dev->status_len) { + esdi_mca_log("esdi_readw port=%04x, ret=0000 (pos=%d, len=%d).\n", port, dev->status_pos, dev->status_len); return 0; + } ret = dev->status_data[dev->status_pos++]; if (dev->status_pos >= dev->status_len) { dev->status &= ~STATUS_STATUS_OUT_FULL; @@ -1068,6 +1072,7 @@ esdi_readw(uint16_t port, void *priv) fatal("esdi_readw port=%04x\n", port); } + esdi_mca_log("esdi_readw port=%04x, ret=%04x.\n", port, ret); return ret; } @@ -1250,7 +1255,7 @@ esdi_init(UNUSED(const device_t *info)) drive->spt = hdd[i].spt; drive->hpc = hdd[i].hpc; drive->tracks = hdd[i].tracks; - drive->sectors = hdd_image_get_last_sector(i) + 1; + drive->sectors = hdd_image_get_last_sector(i); drive->hdd_num = i; /* Mark drive as present. */ From 70686553433d1f7f865d71cfe1c515e1619bf704 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 18 Sep 2024 08:01:38 +0200 Subject: [PATCH 430/624] CD-ROM: Implement not ready to ready transition in a cleaner and better way, fixes #4805. --- src/cdrom/cdrom.c | 32 +++++++++++++++++++++++++------- src/include/86box/cdrom.h | 2 ++ src/qt/qt_mediamenu.cpp | 6 ++---- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 88811c016..393009839 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -1076,6 +1076,7 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m for (i = first_track; i <= last_track; i++) { cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); + pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); dev->ops->get_track_info(dev, i + 1, 0, &ti); b[len++] = 0; /* reserved */ @@ -1173,6 +1174,7 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) int last_track; cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b); + pclog("read_toc_raw(%08X, %08X)\n", dev, b); dev->ops->get_tracks(dev, &first_track, &last_track); @@ -1183,6 +1185,7 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) dev->ops->get_track_info(dev, i + 1, 0, &ti); cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); + pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); b[len++] = 1; /* Session number */ b[len++] = ti.attr; /* Track ADR and Control */ @@ -2016,6 +2019,27 @@ cdrom_insert(uint8_t id) dev->insert(dev->priv); } +void +cdrom_exit(uint8_t id) +{ + cdrom_t *dev = &cdrom[id]; + + strcpy(dev->prev_image_path, dev->image_path); + + if (dev->ops) { + if (dev->ops->exit) + dev->ops->exit(dev); + + dev->ops = NULL; + } + + memset(dev->image_path, 0, sizeof(dev->image_path)); + + cdrom_insert(id); + + pclog("CD-ROM exited\n"); +} + /* The mechanics of ejecting a CD-ROM from a drive. */ void cdrom_eject(uint8_t id) @@ -2028,13 +2052,7 @@ cdrom_eject(uint8_t id) return; } - strcpy(dev->prev_image_path, dev->image_path); - - dev->ops->exit(dev); - dev->ops = NULL; - memset(dev->image_path, 0, sizeof(dev->image_path)); - - cdrom_insert(id); + cdrom_exit(id); plat_cdrom_ui_update(id, 0); diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index b97693560..636c151ce 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -25,6 +25,7 @@ #define CD_STATUS_PLAYING_COMPLETED 5 /* Medium changed flag. */ +#define CD_STATUS_TRANSITION 0x40 #define CD_STATUS_MEDIUM_CHANGED 0x80 #define CD_TRACK_AUDIO 0x08 @@ -298,6 +299,7 @@ extern void cdrom_seek(cdrom_t *dev, uint32_t pos, uint8_t vendor_type); extern void cdrom_close_handler(uint8_t id); extern void cdrom_insert(uint8_t id); +extern void cdrom_exit(uint8_t id); extern void cdrom_eject(uint8_t id); extern void cdrom_reload(uint8_t id); diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index f61dd1d0e..1fa5283d2 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -526,11 +526,8 @@ MediaMenu::cdromMount(int i, const QString &filename) { QByteArray fn = filename.toUtf8().data(); - strcpy(cdrom[i].prev_image_path, cdrom[i].image_path); - if (cdrom[i].ops && cdrom[i].ops->exit) - cdrom[i].ops->exit(&(cdrom[i])); + cdrom_exit(i); - cdrom[i].ops = nullptr; memset(cdrom[i].image_path, 0, sizeof(cdrom[i].image_path)); #ifdef Q_OS_WINDOWS if ((fn.data() != nullptr) && (strlen(fn.data()) >= 1) && (fn.data()[strlen(fn.data()) - 1] == '/')) @@ -543,6 +540,7 @@ MediaMenu::cdromMount(int i, const QString &filename) cdrom_ioctl_open(&(cdrom[i]), fn.data()); else cdrom_image_open(&(cdrom[i]), fn.data()); + /* Signal media change to the emulated machine. */ if (cdrom[i].insert) cdrom[i].insert(cdrom[i].priv); From 7ae5110af2e082ef0cde10c1baec69a03fec1074 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 18 Sep 2024 09:38:47 +0200 Subject: [PATCH 431/624] Status bar: update the empty/full icon states even when status bar icons updating is disabled. --- src/qt/qt_machinestatus.cpp | 53 ++++++++++++++++++++++++------------- src/qt/qt_machinestatus.hpp | 1 + src/qt/qt_mainwindow.cpp | 7 +++++ src/qt/qt_mainwindow.hpp | 1 + src/qt/qt_ui.cpp | 3 +++ 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index 64f3b0e43..ebc18e198 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -61,6 +61,8 @@ extern uint64_t tsc; extern MainWindow *main_window; +static bool sbar_initialized = false; + namespace { struct PixmapSetActive { QPixmap normal; @@ -380,6 +382,31 @@ hdd_count(int bus) return c; } +void +MachineStatus::refreshEmptyIcons() +{ + /* Check if icons are initialized. */ + if (!sbar_initialized) + return; + + for (size_t i = 0; i < FDD_NUM; ++i) + d->fdd[i].setEmpty(machine_status.fdd[i].empty); + for (size_t i = 0; i < CDROM_NUM; ++i) + d->cdrom[i].setEmpty(machine_status.cdrom[i].empty); + for (size_t i = 0; i < ZIP_NUM; i++) + d->zip[i].setEmpty(machine_status.zip[i].empty); + for (size_t i = 0; i < MO_NUM; i++) + d->mo[i].setEmpty(machine_status.mo[i].empty); + + d->cassette.setEmpty(machine_status.cassette.empty); + + for (size_t i = 0; i < NET_CARD_MAX; i++) + d->net[i].setEmpty(machine_status.net[i].empty); + + for (int i = 0; i < 2; ++i) + d->cartridge[i].setEmpty(machine_status.cartridge[i].empty); +} + void MachineStatus::refreshIcons() { @@ -387,48 +414,32 @@ MachineStatus::refreshIcons() if (!update_icons) return; - for (size_t i = 0; i < FDD_NUM; ++i) { + for (size_t i = 0; i < FDD_NUM; ++i) d->fdd[i].setActive(machine_status.fdd[i].active); - d->fdd[i].setEmpty(machine_status.fdd[i].empty); - } for (size_t i = 0; i < CDROM_NUM; ++i) { d->cdrom[i].setActive(machine_status.cdrom[i].active); if (machine_status.cdrom[i].active) ui_sb_update_icon(SB_CDROM | i, 0); - - d->cdrom[i].setEmpty(machine_status.cdrom[i].empty); } for (size_t i = 0; i < ZIP_NUM; i++) { d->zip[i].setActive(machine_status.zip[i].active); if (machine_status.zip[i].active) ui_sb_update_icon(SB_ZIP | i, 0); - - d->zip[i].setEmpty(machine_status.zip[i].empty); } for (size_t i = 0; i < MO_NUM; i++) { d->mo[i].setActive(machine_status.mo[i].active); if (machine_status.mo[i].active) ui_sb_update_icon(SB_MO | i, 0); - - d->mo[i].setEmpty(machine_status.mo[i].empty); } - d->cassette.setEmpty(machine_status.cassette.empty); - for (size_t i = 0; i < HDD_BUS_USB; i++) { d->hdds[i].setActive(machine_status.hdd[i].active); if (machine_status.hdd[i].active) ui_sb_update_icon(SB_HDD | i, 0); } - for (size_t i = 0; i < NET_CARD_MAX; i++) { + for (size_t i = 0; i < NET_CARD_MAX; i++) d->net[i].setActive(machine_status.net[i].active); - d->net[i].setEmpty(machine_status.net[i].empty); - } - - for (int i = 0; i < 2; ++i) { - d->cartridge[i].setEmpty(machine_status.cartridge[i].empty); - } } void @@ -664,6 +675,10 @@ MachineStatus::refresh(QStatusBar *sbar) sbar->addWidget(d->sound.get()); d->text = std::make_unique(); sbar->addWidget(d->text.get()); + + sbar_initialized = true; + + refreshEmptyIcons(); } void @@ -719,4 +734,6 @@ MachineStatus::updateTip(int tag) case SB_TEXT: break; } + + refreshEmptyIcons(); } diff --git a/src/qt/qt_machinestatus.hpp b/src/qt/qt_machinestatus.hpp index cf706180d..fc0e33e91 100644 --- a/src/qt/qt_machinestatus.hpp +++ b/src/qt/qt_machinestatus.hpp @@ -75,6 +75,7 @@ public slots: void refresh(QStatusBar *sbar); void message(const QString &msg); void updateTip(int tag); + void refreshEmptyIcons(); void refreshIcons(); private: diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 57efc7ce7..b06473a8a 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1904,6 +1904,13 @@ MainWindow::updateUiPauseState() ui->actionPause->setToolTip(tooltip_text); } +void +MainWindow::updateStatusEmptyIcons() +{ + if (status != nullptr) + status->refreshEmptyIcons(); +} + void MainWindow::on_actionPreferences_triggered() { diff --git a/src/qt/qt_mainwindow.hpp b/src/qt/qt_mainwindow.hpp index 175ef5b7e..9db428051 100644 --- a/src/qt/qt_mainwindow.hpp +++ b/src/qt/qt_mainwindow.hpp @@ -63,6 +63,7 @@ public slots: void togglePause(); void initRendererMonitorSlot(int monitor_index); void destroyRendererMonitorSlot(int monitor_index); + void updateStatusEmptyIcons(); void updateUiPauseState(); private slots: void on_actionFullscreen_triggered(); diff --git a/src/qt/qt_ui.cpp b/src/qt/qt_ui.cpp index fc111e5b4..b24731f55 100644 --- a/src/qt/qt_ui.cpp +++ b/src/qt/qt_ui.cpp @@ -256,6 +256,9 @@ ui_sb_update_icon_state(int tag, int state) case SB_TEXT: break; } + + if (main_window != nullptr) + main_window->updateStatusEmptyIcons(); } void From 1a877cef871bc53a9e84ab6ceb23517d24a0b6ac Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 18 Sep 2024 19:20:34 +0200 Subject: [PATCH 432/624] T3100E: Set memory state of the 384 kB immediately above the top of RAM to read/write internal, allows the remapping of the upper 384k to the top of RAM to actually work, fixes #4809. --- src/machine/m_at_t3100e.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/machine/m_at_t3100e.c b/src/machine/m_at_t3100e.c index 357f012f2..3c83b0cce 100644 --- a/src/machine/m_at_t3100e.c +++ b/src/machine/m_at_t3100e.c @@ -850,6 +850,9 @@ machine_at_t3100e_init(const machine_t *model) NULL, MEM_MAPPING_INTERNAL, &t3100e_ems); mem_mapping_disable(&t3100e_ems.upper_mapping); + if (mem_size < (16384 - 448)) + mem_set_mem_state_both(mem_size * 1024, 384 * 1024, MEM_READ_INTERNAL | MEM_WRITE_INTERNAL); + device_add(&t3100e_device); return ret; From 52344461945573946080afd645d3601cb6a2c526 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 18 Sep 2024 19:57:58 +0200 Subject: [PATCH 433/624] CD-ROM: Remove excess logging. --- src/cdrom/cdrom.c | 5 --- src/scsi/scsi_cdrom.c | 72 ++++++++++++++++++++++++------------------- 2 files changed, 41 insertions(+), 36 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 393009839..41cc1db98 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -1076,7 +1076,6 @@ read_toc_normal(cdrom_t *dev, unsigned char *b, unsigned char start_track, int m for (i = first_track; i <= last_track; i++) { cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); - pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); dev->ops->get_track_info(dev, i + 1, 0, &ti); b[len++] = 0; /* reserved */ @@ -1174,7 +1173,6 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) int last_track; cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b); - pclog("read_toc_raw(%08X, %08X)\n", dev, b); dev->ops->get_tracks(dev, &first_track, &last_track); @@ -1185,7 +1183,6 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) dev->ops->get_track_info(dev, i + 1, 0, &ti); cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); - pclog(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); b[len++] = 1; /* Session number */ b[len++] = ti.attr; /* Track ADR and Control */ @@ -2036,8 +2033,6 @@ cdrom_exit(uint8_t id) memset(dev->image_path, 0, sizeof(dev->image_path)); cdrom_insert(id); - - pclog("CD-ROM exited\n"); } /* The mechanics of ejecting a CD-ROM from a drive. */ diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 4fe6b7567..d014945a7 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1182,8 +1182,6 @@ scsi_cdrom_cmd_error(scsi_cdrom_t *dev) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); dev->tf->error = ((scsi_cdrom_sense_key & 0xf) << 4) | ABRT_ERR; - if (dev->unit_attention > 2) - dev->tf->error |= MCR_ERR; dev->tf->status = READY_STAT | ERR_STAT; dev->tf->phase = 3; dev->tf->pos = 0; @@ -1199,8 +1197,6 @@ scsi_cdrom_unit_attention(scsi_cdrom_t *dev) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); dev->tf->error = (SENSE_UNIT_ATTENTION << 4) | ABRT_ERR; - if (dev->unit_attention > 2) - dev->tf->error |= MCR_ERR; dev->tf->status = READY_STAT | ERR_STAT; dev->tf->phase = 3; dev->tf->pos = 0; @@ -1543,13 +1539,23 @@ scsi_cdrom_insert(void *priv) { scsi_cdrom_t *dev = (scsi_cdrom_t *) priv; - if (!dev) + if ((dev == NULL) || (dev->drv == NULL)) return; - dev->unit_attention = 1; - /* Turn off the medium changed status. */ - dev->drv->cd_status &= ~CD_STATUS_MEDIUM_CHANGED; - scsi_cdrom_log("CD-ROM %i: Media insert\n", dev->id); + if (dev->drv->ops == NULL) { + dev->unit_attention = 0; + dev->drv->cd_status = CD_STATUS_EMPTY; + scsi_cdrom_log("CD-ROM %i: Media removal\n", dev->id); + } else if (dev->drv->cd_status & CD_STATUS_TRANSITION) { + dev->unit_attention = 1; + /* Turn off the medium changed status. */ + dev->drv->cd_status &= ~(CD_STATUS_TRANSITION | CD_STATUS_MEDIUM_CHANGED); + scsi_cdrom_log("CD-ROM %i: Media insert\n", dev->id); + } else { + dev->unit_attention = 0; + dev->drv->cd_status |= CD_STATUS_TRANSITION; + scsi_cdrom_log("CD-ROM %i: Media transition\n", dev->id); + } } static int @@ -1621,29 +1627,31 @@ scsi_cdrom_pre_execution_check(scsi_cdrom_t *dev, uint8_t *cdb) goto skip_ready_check; } - if ((dev->drv->cd_status & CD_STATUS_MEDIUM_CHANGED) || (ext_medium_changed == 1)) - scsi_cdrom_insert((void *) dev); + if (dev->drv->cd_status & CD_STATUS_TRANSITION) { + if ((cdb[0] == GPCMD_TEST_UNIT_READY) || (cdb[0] == GPCMD_REQUEST_SENSE)) + ready = 0; + else { + scsi_cdrom_insert((void *) dev); - ready = (dev->drv->cd_status != CD_STATUS_EMPTY) || (ext_medium_changed == -1); + ready = (dev->drv->cd_status != CD_STATUS_EMPTY) || (ext_medium_changed == -1); + } + } else { + if ((dev->drv->cd_status & CD_STATUS_MEDIUM_CHANGED) || (ext_medium_changed == 1)) + scsi_cdrom_insert((void *) dev); + + ready = (dev->drv->cd_status != CD_STATUS_EMPTY) || (ext_medium_changed == -1); + } skip_ready_check: /* If the drive is not ready, there is no reason to keep the UNIT ATTENTION condition present, as we only use it to mark disc changes. */ - if (!ready && (dev->unit_attention > 2)) + if (!ready && (dev->unit_attention > 0)) dev->unit_attention = 0; /* If the UNIT ATTENTION condition is set and the command does not allow execution under it, error out and report the condition. */ - if ((dev->unit_attention > 0) && (dev->unit_attention < 3)) { - dev->media_status = MEC_MEDIA_REMOVAL; - if (scsi_command_check_ready(dev, cdb)) { - dev->unit_attention++; - scsi_cdrom_log("CD-ROM %i: Simulated not ready phase (%02X)\n", dev->id, cdb[0]); - scsi_cdrom_not_ready(dev); - return 0; - } - } else if (dev->unit_attention == 3) { + if (dev->unit_attention == 1) { /* Only increment the unit attention phase if the command can not pass through it. */ if (!(scsi_cdrom_command_flags[cdb[0]] & ALLOW_UA)) { /* scsi_cdrom_log("CD-ROM %i: Unit attention now 2\n", dev->id); */ @@ -1653,7 +1661,7 @@ skip_ready_check: scsi_cdrom_unit_attention(dev); return 0; } - } else if (dev->unit_attention == 4) { + } else if (dev->unit_attention == 2) { if (cdb[0] != GPCMD_REQUEST_SENSE) { /* scsi_cdrom_log("CD-ROM %i: Unit attention now 0\n", dev->id); */ dev->unit_attention = 0; @@ -1666,10 +1674,10 @@ skip_ready_check: scsi_cdrom_sense_clear(dev, cdb[0]); /* Next it's time for NOT READY. */ - if (!ready || ((dev->unit_attention > 0) && (dev->unit_attention < 3))) - dev->media_status = MEC_MEDIA_REMOVAL; + if (ready) + dev->media_status = dev->unit_attention ? MEC_NEW_MEDIA : MEC_NO_CHANGE; else - dev->media_status = (dev->unit_attention > 2) ? MEC_NEW_MEDIA : MEC_NO_CHANGE; + dev->media_status = MEC_MEDIA_REMOVAL; if (!ready && scsi_command_check_ready(dev, cdb)) { scsi_cdrom_log("CD-ROM %i: Not ready (%02X)\n", dev->id, cdb[0]); @@ -1726,8 +1734,7 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt buffer[2] = SENSE_ILLEGAL_REQUEST; buffer[12] = ASC_AUDIO_PLAY_OPERATION; buffer[13] = (dev->drv->cd_status == CD_STATUS_PLAYING) ? ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS : ASCQ_AUDIO_PLAY_OPERATION_PAUSED; - } else if ((dev->unit_attention > 2) && - ((scsi_cdrom_sense_key == 0) || (scsi_cdrom_sense_key == 2))) { + } else if (dev->unit_attention && ((scsi_cdrom_sense_key == 0) || (scsi_cdrom_sense_key == 2))) { buffer[2] = SENSE_UNIT_ATTENTION; buffer[12] = ASC_MEDIUM_MAY_HAVE_CHANGED; buffer[13] = 0; @@ -1740,6 +1747,9 @@ scsi_cdrom_request_sense(scsi_cdrom_t *dev, uint8_t *buffer, uint8_t alloc_lengt that condition. */ dev->unit_attention = 0; } + + if (dev->drv->cd_status & CD_STATUS_TRANSITION) + scsi_cdrom_insert((void *) dev); } void @@ -1750,7 +1760,7 @@ scsi_cdrom_request_sense_for_scsi(scsi_common_t *sc, uint8_t *buffer, uint8_t al if (dev->drv->cd_status & CD_STATUS_MEDIUM_CHANGED) scsi_cdrom_insert((void *) dev); - if ((dev->drv->cd_status == CD_STATUS_EMPTY) && (dev->unit_attention > 2)) { + if ((dev->drv->cd_status == CD_STATUS_EMPTY) && dev->unit_attention) { /* If the drive is not ready, there is no reason to keep the UNIT ATTENTION condition present, as we only use it to mark disc changes. */ @@ -1833,7 +1843,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) memcpy(dev->current_cdb, cdb, 12); dev->sony_vendor = 0; - if (cdb[0] != 0) { + // if (cdb[0] != 0) { scsi_cdrom_log("CD-ROM %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, Unit attention: %i\n", dev->id, cdb[0], scsi_cdrom_sense_key, scsi_cdrom_asc, scsi_cdrom_ascq, dev->unit_attention); @@ -1842,7 +1852,7 @@ scsi_cdrom_command(scsi_common_t *sc, uint8_t *cdb) scsi_cdrom_log("CD-ROM %i: CDB: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n", dev->id, cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7], cdb[8], cdb[9], cdb[10], cdb[11]); - } + // } msf = cdb[1] & 2; dev->sector_len = 0; From 61ac77affe18287df63697d208ed84f9a151284a Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 19 Sep 2024 08:08:21 +0200 Subject: [PATCH 434/624] Modem: Increase buffer sizes to 256k and make sure to never transfer more packets than there are available FIFO slots, and removed excess logging, fixes #4793. --- src/network/net_modem.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/network/net_modem.c b/src/network/net_modem.c index e48467a86..6addec352 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -264,7 +264,7 @@ modem_read_phonebook_file(modem_t *modem, const char *path) if (strspn(entry.phone, "01234567890*=,;#+>") != strlen(entry.phone)) { /* Invalid characters. */ - pclog("Modem: Invalid character in phone number %s\n", entry.phone); + modem_log("Modem: Invalid character in phone number %s\n", entry.phone); continue; } @@ -617,7 +617,7 @@ modem_enter_idle_state(modem_t *modem) if (modem->listen_port) { modem->serversocket = plat_netsocket_create_server(NET_SOCKET_TCP, modem->listen_port); if (modem->serversocket == (SOCKET) -1) { - pclog("Failed to set up server on port %d\n", modem->listen_port); + modem_log("Failed to set up server on port %d\n", modem->listen_port); } } @@ -703,14 +703,14 @@ modem_dial(modem_t *modem, const char *str) modem->numberinprogress[0] = 0; modem->clientsocket = plat_netsocket_create(NET_SOCKET_TCP); if (modem->clientsocket == -1) { - pclog("Failed to create client socket\n"); + modem_log("Failed to create client socket\n"); modem_send_res(modem, ResNOCARRIER); modem_enter_idle_state(modem); return; } if (-1 == plat_netsocket_connect(modem->clientsocket, buf, port)) { - pclog("Failed to connect to %s\n", buf); + modem_log("Failed to connect to %s\n", buf); modem_send_res(modem, ResNOCARRIER); modem_enter_idle_state(modem); return; @@ -1147,7 +1147,7 @@ fifo8_resize_2x(Fifo8 *fifo) if (!used) return; - uint8_t *temp_buf = calloc(fifo->capacity * 2, 1); + uint8_t *temp_buf = calloc(size, 1); if (!temp_buf) { fatal("net_modem: Out Of Memory!\n"); } @@ -1440,7 +1440,8 @@ modem_cmdpause_timer_callback(void *priv) if (modem->connected) { uint8_t buffer[16]; int wouldblock = 0; - int res = plat_netsocket_receive(modem->clientsocket, buffer, sizeof(buffer), &wouldblock); + int recv = MIN(modem->rx_data.capacity - modem->rx_data.num, sizeof(buffer)); + int res = plat_netsocket_receive(modem->clientsocket, buffer, recv, &wouldblock); if (res > 0) { if (modem->telnet_mode) @@ -1488,8 +1489,8 @@ modem_init(const device_t *info) modem->clientsocket = modem->serversocket = modem->waitingclientsocket = -1; - fifo8_create(&modem->data_pending, 0x20000); - fifo8_create(&modem->rx_data, 0x20000); + fifo8_create(&modem->data_pending, 0x40000); + fifo8_create(&modem->rx_data, 0x40000); timer_add(&modem->dtr_timer, modem_dtr_callback_timer, modem, 0); timer_add(&modem->host_to_serial_timer, host_to_modem_cb, modem, 0); From 2abfaf923b0f57ff15c2bcb084573354fbfd7fb1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 19 Sep 2024 09:45:32 +0200 Subject: [PATCH 435/624] plat_getcwd() now uses ~/Library/86Box on Mac, fixed #4838. --- src/qt/qt_platform.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index a200e38ec..f22b5f351 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -227,7 +227,12 @@ plat_getcwd(char *bufp, int max) { #ifdef __APPLE__ /* Working directory for .app bundles is undefined. */ +#ifdef USE_EXE_PATH strncpy(bufp, exe_path, max); +#else + CharPointer(bufp, max) = QDir::homePath().toUtf8(); + path_append_fiename(bufp, bufp, "Library/86Box"); +#endif #else CharPointer(bufp, max) = QDir::currentPath().toUtf8(); #endif From 0d3cb1c9d67fbf04e7565b250a333e082a388e57 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 19 Sep 2024 10:28:07 +0200 Subject: [PATCH 436/624] UMC 8886: PCI IRQ steering fixes. --- src/chipset/umc_8886.c | 41 +++++++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/src/chipset/umc_8886.c b/src/chipset/umc_8886.c index fb11af0e7..f2a89aed4 100644 --- a/src/chipset/umc_8886.c +++ b/src/chipset/umc_8886.c @@ -164,11 +164,32 @@ umc_8886_bus_recalc(umc_8886_t *dev) } } +static void +umc_8886_irq_recalc(umc_8886_t *dev) +{ + int irq_routing; + uint8_t *conf = dev->pci_conf_sb[0]; + + irq_routing = (conf[0x46] & 0x01) ? (conf[0x43] >> 8) : PCI_IRQ_DISABLED; + pci_set_irq_routing(PCI_INTA, irq_routing); + irq_routing = (conf[0x46] & 0x02) ? (conf[0x43] & 0x0f) : PCI_IRQ_DISABLED; + pci_set_irq_routing(PCI_INTB, irq_routing); + + irq_routing = (conf[0x46] & 0x04) ? (conf[0x44] >> 8) : PCI_IRQ_DISABLED; + pci_set_irq_routing(PCI_INTC, irq_routing); + irq_routing = (conf[0x46] & 0x08) ? (conf[0x44] & 0x0f) : PCI_IRQ_DISABLED; + pci_set_irq_routing(PCI_INTD, irq_routing); + + pci_set_irq_level(PCI_INTA, !!(conf[0x47] & 0x01)); + pci_set_irq_level(PCI_INTB, !!(conf[0x47] & 0x02)); + pci_set_irq_level(PCI_INTC, !!(conf[0x47] & 0x04)); + pci_set_irq_level(PCI_INTD, !!(conf[0x47] & 0x08)); +} + static void umc_8886_write(int func, int addr, uint8_t val, void *priv) { umc_8886_t *dev = (umc_8886_t *) priv; - int irq_routing; if (func <= dev->max_func) switch (func) { @@ -195,28 +216,12 @@ umc_8886_write(int func, int addr, uint8_t val, void *priv) break; case 0x43: - dev->pci_conf_sb[func][addr] = val; - irq_routing = (dev->pci_conf_sb[func][0x46] & 0x01) ? (val >> 8) : - PCI_IRQ_DISABLED; - pci_set_irq_routing(PCI_INTA, irq_routing); - irq_routing = (dev->pci_conf_sb[func][0x46] & 0x02) ? (val & 0x0f) : - PCI_IRQ_DISABLED; - pci_set_irq_routing(PCI_INTB, irq_routing); - break; case 0x44: - dev->pci_conf_sb[func][addr] = val; - irq_routing = (dev->pci_conf_sb[func][0x46] & 0x04) ? (val >> 8) : - PCI_IRQ_DISABLED; - pci_set_irq_routing(PCI_INTC, irq_routing); - irq_routing = (dev->pci_conf_sb[func][0x46] & 0x08) ? (val & 0x0f) : - PCI_IRQ_DISABLED; - pci_set_irq_routing(PCI_INTD, irq_routing); - break; - case 0x46: /* Bits 3-0 = 0 = IRQ disabled, 1 = IRQ enabled. */ case 0x47: /* Bits 3-0 = 0 = IRQ edge-triggered, 1 = IRQ level-triggered. */ /* Bit 6 seems to be the IRQ/SMI# toggle, 1 = IRQ, 0 = SMI#. */ dev->pci_conf_sb[func][addr] = val; + umc_8886_irq_recalc(dev); break; case 0x56: From c210f4f42afc7ccb527f8954ebd353ec92c7424f Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 19 Sep 2024 10:34:10 +0200 Subject: [PATCH 437/624] Fixed a typo in the Mac path code. --- src/qt/qt_platform.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index f22b5f351..98907f07a 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -231,7 +231,7 @@ plat_getcwd(char *bufp, int max) strncpy(bufp, exe_path, max); #else CharPointer(bufp, max) = QDir::homePath().toUtf8(); - path_append_fiename(bufp, bufp, "Library/86Box"); + path_append_filename(bufp, bufp, "Library/86Box"); #endif #else CharPointer(bufp, max) = QDir::currentPath().toUtf8(); From 6d5fd97cda4a2703bbce7bc865993eb56085e36d Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 19 Sep 2024 19:43:38 +0200 Subject: [PATCH 438/624] UMC UM8886: Invert PCI IRQ edge/level flags. --- src/chipset/umc_8886.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/chipset/umc_8886.c b/src/chipset/umc_8886.c index f2a89aed4..2b867c000 100644 --- a/src/chipset/umc_8886.c +++ b/src/chipset/umc_8886.c @@ -180,10 +180,10 @@ umc_8886_irq_recalc(umc_8886_t *dev) irq_routing = (conf[0x46] & 0x08) ? (conf[0x44] & 0x0f) : PCI_IRQ_DISABLED; pci_set_irq_routing(PCI_INTD, irq_routing); - pci_set_irq_level(PCI_INTA, !!(conf[0x47] & 0x01)); - pci_set_irq_level(PCI_INTB, !!(conf[0x47] & 0x02)); - pci_set_irq_level(PCI_INTC, !!(conf[0x47] & 0x04)); - pci_set_irq_level(PCI_INTD, !!(conf[0x47] & 0x08)); + pci_set_irq_level(PCI_INTA, !(conf[0x47] & 0x01)); + pci_set_irq_level(PCI_INTB, !(conf[0x47] & 0x02)); + pci_set_irq_level(PCI_INTC, !(conf[0x47] & 0x04)); + pci_set_irq_level(PCI_INTD, !(conf[0x47] & 0x08)); } static void From ea878410b0ff2fc8d6ff54b641b7396aaa584006 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 20 Sep 2024 13:36:01 +0200 Subject: [PATCH 439/624] Serial mouse, microtouch, and modem: Add some more sanity checks. --- src/device/mouse_microtouch_touchscreen.c | 2 ++ src/device/mouse_serial.c | 3 ++- src/network/net_modem.c | 25 +++++++++++++++-------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 0aa0ce727..ce87a4b68 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -322,6 +322,8 @@ void mtouch_write_to_host(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + if (dev->serial == NULL) + goto no_write_to_machine; if ((dev->serial->type >= SERIAL_16550) && dev->serial->fifo_enabled) { if (fifo_get_full(dev->serial->rcvr_fifo)) { goto no_write_to_machine; diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index 08aee09d8..afc662a19 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -142,7 +142,8 @@ sermouse_transmit_byte(mouse_t *dev, int do_next) if (dev->buf_pos == 0) dev->acc_time = 0.0; - serial_write_fifo(dev->serial, dev->buf[dev->buf_pos]); + if (dev->serial) + serial_write_fifo(dev->serial, dev->buf[dev->buf_pos]); if (do_next) { dev->buf_pos = (dev->buf_pos + 1) % dev->buf_len; diff --git a/src/network/net_modem.c b/src/network/net_modem.c index 6addec352..bb312ec31 100644 --- a/src/network/net_modem.c +++ b/src/network/net_modem.c @@ -434,7 +434,7 @@ host_to_modem_cb(void *priv) { modem_t *modem = (modem_t *) priv; - if (modem->in_warmup) + if (modem->in_warmup || (modem->serial == NULL)) goto no_write_to_machine; if ((modem->serial->type >= SERIAL_16550) && modem->serial->fifo_enabled) { @@ -621,10 +621,12 @@ modem_enter_idle_state(modem_t *modem) } } - serial_set_cts(modem->serial, 1); - serial_set_dsr(modem->serial, 1); - serial_set_dcd(modem->serial, (!modem->dcdmode ? 1 : 0)); - serial_set_ri(modem->serial, 0); + if (modem->serial != NULL) { + serial_set_cts(modem->serial, 1); + serial_set_dsr(modem->serial, 1); + serial_set_dcd(modem->serial, (!modem->dcdmode ? 1 : 0)); + serial_set_ri(modem->serial, 0); + } } void @@ -640,8 +642,11 @@ modem_enter_connected_state(modem_t *modem) plat_netsocket_close(modem->serversocket); modem->serversocket = -1; memset(&modem->telClient, 0, sizeof(modem->telClient)); - serial_set_dcd(modem->serial, 1); - serial_set_ri(modem->serial, 0); + + if (modem->serial != NULL) { + serial_set_dcd(modem->serial, 1); + serial_set_ri(modem->serial, 0); + } } void @@ -1391,7 +1396,8 @@ modem_cmdpause_timer_callback(void *priv) } else { modem->ringing = true; modem_send_res(modem, ResRING); - serial_set_ri(modem->serial, !serial_get_ri(modem->serial)); + if (modem->serial != NULL) + serial_set_ri(modem->serial, !serial_get_ri(modem->serial)); modem->ringtimer = 3000; modem->reg[MREG_RING_COUNT] = 0; } @@ -1405,7 +1411,8 @@ modem_cmdpause_timer_callback(void *priv) return; } modem_send_res(modem, ResRING); - serial_set_ri(modem->serial, !serial_get_ri(modem->serial)); + if (modem->serial != NULL) + serial_set_ri(modem->serial, !serial_get_ri(modem->serial)); modem->ringtimer = 3000; } From 1acafb261600bdc324d59a9258cbc98416db2958 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 21 Sep 2024 03:14:36 +0200 Subject: [PATCH 440/624] 86F: Fix the physical hole retention logic, fixes PROLOK-protected 86F images after the first run. --- src/floppy/fdd_86f.c | 53 +++++++++++++++++++++++--------------------- 1 file changed, 28 insertions(+), 25 deletions(-) diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 35ddbb1dd..0fed9bd3a 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -1098,9 +1098,9 @@ d86f_get_bit(int drive, int side) /* In some cases, misindentification occurs so we need to make sure the surface data array is not not NULL. */ if (d86f_has_surface_desc(drive) && dev->track_surface_data[side]) { - if (d86f_reverse_bytes(drive)) { + if (d86f_reverse_bytes(drive)) surface_data = dev->track_surface_data[side][track_word] & 0xFF; - } else { + else { surface_data = (dev->track_surface_data[side][track_word] & 0xFF) << 8; surface_data |= (dev->track_surface_data[side][track_word] >> 8); } @@ -1150,9 +1150,9 @@ d86f_put_bit(int drive, int side, int bit) } if (d86f_has_surface_desc(drive)) { - if (d86f_reverse_bytes(drive)) { + if (d86f_reverse_bytes(drive)) surface_data = dev->track_surface_data[side][track_word] & 0xFF; - } else { + else { surface_data = (dev->track_surface_data[side][track_word] & 0xFF) << 8; surface_data |= (dev->track_surface_data[side][track_word] >> 8); } @@ -1177,9 +1177,9 @@ d86f_put_bit(int drive, int side, int bit) surface_data &= ~(1 << track_bit); surface_data |= (surface_bit << track_bit); - if (d86f_reverse_bytes(drive)) { + if (d86f_reverse_bytes(drive)) dev->track_surface_data[side][track_word] = surface_data; - } else { + else { dev->track_surface_data[side][track_word] = (surface_data & 0xFF) << 8; dev->track_surface_data[side][track_word] |= (surface_data >> 8); } @@ -1191,9 +1191,9 @@ d86f_put_bit(int drive, int side, int bit) encoded_data &= ~(1 << track_bit); encoded_data |= (current_bit << track_bit); - if (d86f_reverse_bytes(drive)) { + if (d86f_reverse_bytes(drive)) d86f_handler[drive].encoded_data(drive, side)[track_word] = encoded_data; - } else { + else { d86f_handler[drive].encoded_data(drive, side)[track_word] = (encoded_data & 0xFF) << 8; d86f_handler[drive].encoded_data(drive, side)[track_word] |= (encoded_data >> 8); } @@ -1833,7 +1833,6 @@ d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type, uint3 uint16_t mask_data; uint16_t mask_surface; uint16_t mask_hole; - uint16_t mask_fuzzy; decoded_t dbyte; decoded_t dpbyte; @@ -1866,13 +1865,18 @@ d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type, uint3 dev->preceding_bit[side] = encoded_byte & 1; if (d86f_has_surface_desc(drive)) { - mask_data = dev->track_encoded_data[side][pos] ^= 0xFFFF; + /* Inverted track data, clear bits are now set. */ + mask_data = ~dev->track_encoded_data[side][pos]; + /* Surface data. */ mask_surface = dev->track_surface_data[side][pos]; - mask_hole = (mask_surface & mask_data) ^ 0xFFFF; /* This will retain bits that are both fuzzy and 0, therefore physical holes. */ - encoded_byte &= mask_hole; /* Filter out physical hole bits from the encoded data. */ - mask_data ^= 0xFFFF; /* Invert back so bits 1 are 1 again. */ - mask_fuzzy = (mask_surface & mask_data) ^ 0xFFFF; /* All fuzzy bits are 0. */ - dev->track_surface_data[side][pos] &= mask_fuzzy; /* Remove fuzzy bits (but not hole bits) from the surface mask, making them regular again. */ + + /* Hole = surface & ~data, so holes are one. */ + mask_hole = mask_surface & mask_data; + /* Hole bits are ones again, set the surface data to that. */ + dev->track_surface_data[side][pos] = mask_hole; + + /* Force the data of any hole to zero. */ + encoded_byte &= ~mask_hole; } dev->track_encoded_data[side][pos] = encoded_byte; @@ -2909,15 +2913,14 @@ d86f_decompose_encoded_buffer(int drive, int side) if (d86f_has_surface_desc(drive)) { /* Source image has surface description data, so we have some more handling to do. We need hole masks for both buffers. Holes have data bit clear and surface bit set. */ - temp = src1[i] & (src1_s[i] ^ 0xffff); - temp2 = src2[i] & (src2_s[i] ^ 0xffff); - src1[i] = dst[i] & temp; - src1_s[i] = temp ^ 0xffff; - src2[i] = dst[i] & temp2; - src2_s[i] = temp2 ^ 0xffff; - } else { + temp = ~src1[i] & src1_s[i]; + temp2 = ~src2[i] & src2_s[i]; + src1[i] = dst[i] & ~temp; + src1_s[i] = temp; + src2[i] = dst[i] & ~temp2; + src2_s[i] = temp2; + } else src1[i] = src2[i] = dst[i]; - } } } @@ -3544,9 +3547,9 @@ d86f_load(int drive, char *fn) writeprot[drive] = 1; } - if (ui_writeprot[drive]) { + if (ui_writeprot[drive]) writeprot[drive] = 1; - } + fwriteprot[drive] = writeprot[drive]; fseek(dev->fp, 0, SEEK_END); From 43d93843fac06746f26275d858630a8c49a15abb Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 21 Sep 2024 05:55:39 +0200 Subject: [PATCH 441/624] 86F: More fixes. --- src/floppy/fdd_86f.c | 49 ++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 0fed9bd3a..5a5eec398 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -628,10 +628,12 @@ d86f_get_array_size(int drive, int side, int words) int hole; int rm; int ssd; + int mpc; rm = d86f_get_rpm_mode(drive); ssd = d86f_get_speed_shift_dir(drive); - hole = (d86f_handler[drive].disk_flags(drive) & 6) >> 1; + hole = (d86f_handler[drive].disk_flags(drive) >> 1) & 3; + mpc = (d86f_handler[drive].disk_flags(drive) >> 13) & 1; if (!rm && ssd) /* Special case - extra bit cells size specifies entire array size. */ array_size = 0; @@ -703,13 +705,20 @@ d86f_get_array_size(int drive, int side, int words) array_size <<= 4; array_size += d86f_handler[drive].extra_bit_cells(drive, side); - if (array_size & 15) - array_size = (array_size >> 4) + 1; - else - array_size = (array_size >> 4); + if (mpc && !words) { + if (array_size & 7) + array_size = (array_size >> 3) + 1; + else + array_size = (array_size >> 3); + } else { + if (array_size & 15) + array_size = (array_size >> 4) + 1; + else + array_size = (array_size >> 4); - if (!words) - array_size <<= 1; + if (!words) + array_size <<= 1; + } return array_size; } @@ -2869,22 +2878,22 @@ d86f_construct_encoded_buffer(int drive, int side) /* Source image has surface description data, so we have some more handling to do. */ src1_fuzm = src1[i] & src1_s[i]; src2_fuzm = src2[i] & src2_s[i]; - dst_fuzm = src1_fuzm | src2_fuzm; /* The bits that remain set are fuzzy in either one or - the other or both. */ - src1_holm = src1[i] | (src1_s[i] ^ 0xffff); - src2_holm = src2[i] | (src2_s[i] ^ 0xffff); - dst_holm = (src1_holm & src2_holm) ^ 0xffff; /* The bits that remain set are holes in both. */ - dst_neim = (dst_fuzm | dst_holm) ^ 0xffff; /* The bits that remain set are those that are neither - fuzzy nor are holes in both. */ + dst_fuzm = src1_fuzm | src2_fuzm; /* The bits that remain set are fuzzy in either one or + the other or both. */ + src1_holm = ~src1[i] & src1_s[i]; + src2_holm = ~src2[i] & src2_s[i]; + dst_holm = src1_holm & src2_holm; /* The bits that remain set are holes in both. */ + dst_neim = ~(dst_fuzm | dst_holm); /* The bits that remain set are those that are neither + fuzzy nor are holes in both. */ src1_d = src1[i] & dst_neim; src2_d = src2[i] & dst_neim; - dst_s[i] = (dst_neim ^ 0xffff); /* The set bits are those that are either fuzzy or are - holes in both. */ - dst[i] = (src1_d | src2_d); /* Initial data is remaining data from Source 1 and - Source 2. */ - dst[i] |= dst_fuzm; /* Add to it the fuzzy bytes (holes have surface bit set - but data bit clear). */ + dst_s[i] = ~dst_neim; /* The set bits are those that are either fuzzy or are + holes in both. */ + dst[i] = (src1_d | src2_d); /* Initial data is remaining data from Source 1 and + Source 2. */ + dst[i] |= dst_fuzm; /* Add to it the fuzzy bytes (holes have surface bit set + but data bit clear). */ } else { /* No surface data, the handling is much simpler - a simple OR. */ dst[i] = src1[i] | src2[i]; From 1c03839965b3653ec83aac4ca36b7912f94bfffe Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 21 Sep 2024 12:00:05 +0200 Subject: [PATCH 442/624] IDE: Restore RAM disk timings to how they were before the timings support was are (non-RAM disk timings are not affected), allows OS/2 Warp 3 to successfully install. --- src/disk/hdc_ide.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 3793f778b..d13c18a64 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1252,7 +1252,10 @@ ide_write_data(ide_t *ide, const uint16_t val) const double xfer_time = ide_get_xfer_time(ide, 512); const double wait_time = seek_time + xfer_time; if (ide->command == WIN_WRITE_MULTIPLE) { - if ((ide->blockcount + 1) >= ide->blocksize || ide->tf->secount == 1) { + if (hdd[ide->hdd_num].speed_preset == 0) { + ide->pending_delay = 0; + ide_callback(ide); + } else if ((ide->blockcount + 1) >= ide->blocksize || ide->tf->secount == 1) { ide_set_callback(ide, seek_time + xfer_time + ide->pending_delay); ide->pending_delay = 0; } else { @@ -1607,9 +1610,13 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv) ide->sc->callback = 100.0 * IDE_TIME; ide_set_callback(ide, 100.0 * IDE_TIME); } else { - double seek_time = hdd_seek_get_time(&hdd[ide->hdd_num], (val & 0x60) ? - ide_get_sector(ide) : 0, HDD_OP_SEEK, 0, 0.0); - ide_set_callback(ide, seek_time); + if (hdd[ide->hdd_num].speed_preset == 0) + ide_set_callback(ide, 100.0 * IDE_TIME); + else { + double seek_time = hdd_seek_get_time(&hdd[ide->hdd_num], (val & 0x60) ? + ide_get_sector(ide) : 0, HDD_OP_SEEK, 0, 0.0); + ide_set_callback(ide, seek_time); + } } break; @@ -1652,6 +1659,10 @@ ide_writeb(uint16_t addr, uint8_t val, void *priv) ide_get_sector(ide), sec_count); double xfer_time = ide_get_xfer_time(ide, 512 * sec_count); wait_time = seek_time > xfer_time ? seek_time : xfer_time; + } else if ((val == WIN_READ_MULTIPLE) && (hdd[ide->hdd_num].speed_preset == 0)) { + ide_set_callback(ide, 200.0 * IDE_TIME); + ide->do_initial_read = 1; + break; } else if ((val == WIN_READ_MULTIPLE) && (ide->blocksize > 0)) { sec_count = ide->tf->secount ? ide->tf->secount : 256; if (sec_count > ide->blocksize) @@ -1848,7 +1859,9 @@ ide_read_data(ide_t *ide) ide_next_sector(ide); ide->tf->atastat = BSY_STAT | READY_STAT | DSC_STAT; if (ide->command == WIN_READ_MULTIPLE) { - if (!ide->blockcount) { + if (hdd[ide->hdd_num].speed_preset == 0) + ide_callback(ide); + else if (!ide->blockcount) { uint32_t cnt = ide->tf->secount ? ide->tf->secount : 256; if (cnt > ide->blocksize) From 3556232c21ff4f52c3566d3f22eb39c4b5b2c147 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 22 Sep 2024 05:44:25 +0200 Subject: [PATCH 443/624] IDE: Status now once again returns 0x00 on an absent slave with a present master, fixes #4843. --- src/disk/hdc_ide.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index d13c18a64..1ec054de9 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -1901,8 +1901,7 @@ ide_status(ide_t *ide, ide_t *ide_other, int ch) /* On real hardware, a slave with a present master always returns a status of 0x00. Confirmed by the ATA-3 and ATA-4 specifications. */ - // ret = 0x00; - ret = 0x01; + ret = 0x00; } else { ret = ide->tf->atastat; if (ide->type == IDE_ATAPI) From cc67f712b05d966125faed28b6c25318488811b8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 22 Sep 2024 07:11:09 +0200 Subject: [PATCH 444/624] RTL8139C+: Return correct PCI revision 0x10, fixes #4839. --- src/network/net_rtl8139.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/network/net_rtl8139.c b/src/network/net_rtl8139.c index bc44b3fb1..335e3297a 100644 --- a/src/network/net_rtl8139.c +++ b/src/network/net_rtl8139.c @@ -3111,7 +3111,7 @@ rtl8139_pci_read(UNUSED(int func), int addr, void *priv) case 0x05: return s->pci_conf[addr & 0xFF] & 1; case 0x08: - return 0x20; + return 0x10; case 0x09: return 0x0; case 0x0a: From 8593b175fd5807f36dd4cc6dd052ec7c155dbd49 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 22 Sep 2024 10:22:03 +0200 Subject: [PATCH 445/624] More slight fixes to the RTL8139C+. --- src/network/net_rtl8139.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/network/net_rtl8139.c b/src/network/net_rtl8139.c index 335e3297a..0b00d589a 100644 --- a/src/network/net_rtl8139.c +++ b/src/network/net_rtl8139.c @@ -352,7 +352,8 @@ enum chip_flags { #define RTL8139_PCI_REVID_8139 0x10 #define RTL8139_PCI_REVID_8139CPLUS 0x20 -#define RTL8139_PCI_REVID RTL8139_PCI_REVID_8139CPLUS +/* Return 0x10 - the RTL8139C+ datasheet and Windows 2000 driver both confirm this. */ +#define RTL8139_PCI_REVID RTL8139_PCI_REVID_8139 #pragma pack(push, 1) typedef struct RTL8139TallyCounters { @@ -3111,7 +3112,7 @@ rtl8139_pci_read(UNUSED(int func), int addr, void *priv) case 0x05: return s->pci_conf[addr & 0xFF] & 1; case 0x08: - return 0x10; + return RTL8139_PCI_REVID; case 0x09: return 0x0; case 0x0a: From 2afa424261d28081e83d025db2e5a1e514ddf399 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 22 Sep 2024 14:39:50 +0200 Subject: [PATCH 446/624] Sound Blaster / ESS: DSP reset now properly disables DMA, fixes the OS/2 ESS ES688 driver. --- src/dma.c | 2 -- src/sound/snd_sb_dsp.c | 62 ++++++++++++++++++++++++------------------ 2 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/dma.c b/src/dma.c index 8bf60cdc8..86c29fe26 100644 --- a/src/dma.c +++ b/src/dma.c @@ -814,8 +814,6 @@ dma16_read(uint16_t addr, UNUSED(void *priv)) case 7: /*Count registers*/ dma_wp[1] ^= 1; count = dma[channel].cc/* + 1*/; - // if (count > dma[channel].cb) - // count = 0x0000; if (dma_wp[1]) ret = count & 0xff; else diff --git a/src/sound/snd_sb_dsp.c b/src/sound/snd_sb_dsp.c index 6e9a32086..4cfd2c7bb 100644 --- a/src/sound/snd_sb_dsp.c +++ b/src/sound/snd_sb_dsp.c @@ -446,11 +446,47 @@ sb_dsp_set_mpu(sb_dsp_t *dsp, mpu_t *mpu) mpu401_irq_attach(mpu, sb_dsp_irq_update, sb_dsp_irq_pending, dsp); } +static void +sb_stop_dma(const sb_dsp_t *dsp) +{ + dma_set_drq(dsp->sb_8_dmanum, 0); + + if (dsp->sb_16_dmanum != 0xff) { + if (dsp->sb_16_dmanum == 4) + dma_set_drq(dsp->sb_8_dmanum, 0); + else + dma_set_drq(dsp->sb_16_dmanum, 0); + } + + if (dsp->sb_16_8_dmanum != 0xff) + dma_set_drq(dsp->sb_16_8_dmanum, 0); +} + +static void +sb_finish_dma(sb_dsp_t *dsp) +{ + if (dsp->ess_playback_mode) { + ESSreg(0xB8) &= ~0x01; + dma_set_drq(dsp->sb_8_dmanum, 0); + } else + sb_stop_dma(dsp); +} + void sb_dsp_reset(sb_dsp_t *dsp) { midi_clear_buffer(); + if (dsp->sb_8_enable) { + dsp->sb_8_enable = 0; + sb_finish_dma(dsp); + } + + if (dsp->sb_16_enable) { + dsp->sb_16_enable = 0; + sb_finish_dma(dsp); + } + timer_disable(&dsp->output_timer); timer_disable(&dsp->input_timer); @@ -565,22 +601,6 @@ sb_resume_dma(const sb_dsp_t *dsp, const int is_8) } } -static void -sb_stop_dma(const sb_dsp_t *dsp) -{ - dma_set_drq(dsp->sb_8_dmanum, 0); - - if (dsp->sb_16_dmanum != 0xff) { - if (dsp->sb_16_dmanum == 4) - dma_set_drq(dsp->sb_8_dmanum, 0); - else - dma_set_drq(dsp->sb_16_dmanum, 0); - } - - if (dsp->sb_16_8_dmanum != 0xff) - dma_set_drq(dsp->sb_16_8_dmanum, 0); -} - void sb_start_dma(sb_dsp_t *dsp, int dma8, int autoinit, uint8_t format, int len) { @@ -2206,16 +2226,6 @@ sb_dsp_dma_attach(sb_dsp_t *dsp, dsp->dma_priv = priv; } -static void -sb_finish_dma(sb_dsp_t *dsp) -{ - if (dsp->ess_playback_mode) { - ESSreg(0xB8) &= ~0x01; - dma_set_drq(dsp->sb_8_dmanum, 0); - } else - sb_stop_dma(dsp); -} - void sb_espcm_fifoctl_run(sb_dsp_t *dsp) { From 8e84dc04c3182b91997681ba78cb103491ad3628 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 22 Sep 2024 20:31:22 +0200 Subject: [PATCH 447/624] PVGA changes of the day (September 22nd, 2024) Correct the memory size (and its bits) of said chips and reorganize them. --- src/video/vid_paradise.c | 59 ++++++++++++++++++++++------------------ 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 70f90d6d8..73902345d 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -204,6 +204,14 @@ paradise_out(uint16_t addr, uint8_t val, void *priv) return; case 0x0b: svga->gdcreg[0x0b] = val; + svga->gdcreg[0x0b] &= ~0xc0; + if (paradise->memory == 1024) + svga->gdcreg[0x0b] |= 0xc0; + else if (paradise->memory == 512) + svga->gdcreg[0x0b] |= 0x80; + else + svga->gdcreg[0x0b] |= 0x40; + paradise_remap(paradise); return; case 0x0e: @@ -282,6 +290,7 @@ paradise_remap(paradise_t *paradise) paradise->write_bank[1] = paradise->write_bank[3] = (svga->gdcreg[9] << 12) + ((svga->gdcreg[6] & 0x08) ? 0 : 0x8000); } + /*There are separate drivers for 1M and 512K/256K versions of the PVGA chips.*/ if ((svga->gdcreg[0x0b] & 0xc0) < 0xc0) { paradise->read_bank[1] &= 0x7ffff; paradise->write_bank[1] &= 0x7ffff; @@ -482,7 +491,7 @@ paradise_readw(uint32_t addr, void *priv) } void * -paradise_init(const device_t *info, uint32_t memsize) +paradise_init(const device_t *info, uint32_t memory) { paradise_t *paradise = malloc(sizeof(paradise_t)); svga_t *svga = ¶dise->svga; @@ -493,35 +502,35 @@ paradise_init(const device_t *info, uint32_t memsize) else video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_paradise_wd90c); - paradise->memory = memsize >> 10; + paradise->memory = memory; switch (info->local) { case PVGA1A: - svga_init(info, svga, paradise, memsize, /*256kb*/ + svga_init(info, svga, paradise, (memory << 10), /*256kb default*/ paradise_recalctimings, paradise_in, paradise_out, NULL, NULL); - paradise->vram_mask = memsize - 1; - svga->decode_mask = memsize - 1; + paradise->vram_mask = (memory << 10) - 1; + svga->decode_mask = (memory << 10) - 1; break; case WD90C11: - svga_init(info, svga, paradise, 1 << 19, /*512kb*/ + svga_init(info, svga, paradise, (memory << 10), /*512kb default*/ paradise_recalctimings, paradise_in, paradise_out, NULL, NULL); - paradise->vram_mask = (1 << 19) - 1; - svga->decode_mask = (1 << 19) - 1; + paradise->vram_mask = (memory << 10) - 1; + svga->decode_mask = (memory << 10) - 1; break; case WD90C30: - svga_init(info, svga, paradise, memsize, + svga_init(info, svga, paradise, (memory << 10), paradise_recalctimings, paradise_in, paradise_out, NULL, NULL); - paradise->vram_mask = memsize - 1; - svga->decode_mask = memsize - 1; + paradise->vram_mask = (memory << 10) - 1; + svga->decode_mask = (memory << 10) - 1; svga->ramdac = device_add(&sc11487_ramdac_device); /*Actually a Winbond W82c487-80, probably a clone.*/ break; @@ -566,7 +575,7 @@ paradise_init(const device_t *info, uint32_t memsize) static void * paradise_pvga1a_ncr3302_init(const device_t *info) { - paradise_t *paradise = paradise_init(info, 1 << 18); + paradise_t *paradise = paradise_init(info, 256); if (paradise) rom_init(¶dise->bios_rom, "roms/machines/3302/c000-wd_1987-1989-740011-003058-019c.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -577,7 +586,7 @@ paradise_pvga1a_ncr3302_init(const device_t *info) static void * paradise_pvga1a_pc2086_init(const device_t *info) { - paradise_t *paradise = paradise_init(info, 1 << 18); + paradise_t *paradise = paradise_init(info, 256); if (paradise) rom_init(¶dise->bios_rom, "roms/machines/pc2086/40186.ic171", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -588,7 +597,7 @@ paradise_pvga1a_pc2086_init(const device_t *info) static void * paradise_pvga1a_pc3086_init(const device_t *info) { - paradise_t *paradise = paradise_init(info, 1 << 18); + paradise_t *paradise = paradise_init(info, 256); if (paradise) rom_init(¶dise->bios_rom, "roms/machines/pc3086/c000.bin", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -600,12 +609,9 @@ static void * paradise_pvga1a_standalone_init(const device_t *info) { paradise_t *paradise; - uint32_t memory = 512; + uint32_t memsize = device_get_config_int("memory"); - memory = device_get_config_int("memory"); - memory <<= 10; - - paradise = paradise_init(info, memory); + paradise = paradise_init(info, memsize); if (paradise) rom_init(¶dise->bios_rom, "roms/video/pvga1a/BIOS.BIN", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -622,7 +628,7 @@ paradise_pvga1a_standalone_available(void) static void * paradise_wd90c11_megapc_init(const device_t *info) { - paradise_t *paradise = paradise_init(info, 0); + paradise_t *paradise = paradise_init(info, 512); if (paradise) rom_init_interleaved(¶dise->bios_rom, @@ -636,7 +642,7 @@ paradise_wd90c11_megapc_init(const device_t *info) static void * paradise_wd90c11_standalone_init(const device_t *info) { - paradise_t *paradise = paradise_init(info, 0); + paradise_t *paradise = paradise_init(info, 512); if (paradise) rom_init(¶dise->bios_rom, "roms/video/wd90c11/WD90C11.VBI", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -654,12 +660,9 @@ static void * paradise_wd90c30_standalone_init(const device_t *info) { paradise_t *paradise; - uint32_t memory = 512; + uint32_t memsize = device_get_config_int("memory"); - memory = device_get_config_int("memory"); - memory <<= 10; - - paradise = paradise_init(info, memory); + paradise = paradise_init(info, memsize); if (paradise) rom_init(¶dise->bios_rom, "roms/video/wd90c30/90C30-LR.VBI", 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); @@ -818,6 +821,10 @@ static const device_config_t paradise_wd90c30_config[] = { .type = CONFIG_SELECTION, .default_int = 1024, .selection = { + { + .description = "256 kB", + .value = 256 + }, { .description = "512 kB", .value = 512 From 705d29342059d14f07c65871a563d3f7f7f366c3 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 22 Sep 2024 21:05:10 +0200 Subject: [PATCH 448/624] Mach32 and clock changes of the day (September 22nd, 2024) 1. Going from screenshots of the Mach32 chips, they all have the ati18811-1 clock regardless of the bus type, whilst the Mach8 has an ati18812, which is actually a ati18811-0 2. Unbreak the NS3.1 Mach32 driver, ergo, don't block the LFB processing. --- src/video/vid_ati_mach8.c | 36 +++++++++--------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index b170ae205..46d884adf 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2592,6 +2592,8 @@ mach_recalctimings(svga_t *svga) } svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen); + if (mach->accel.clock_sel & 0x40) + svga->clock8514 *= 2; if (dev->interlace) dev->dispend >>= 1; @@ -3532,13 +3534,14 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0xaef: WRITE8(port, mach->cursor_offset_lo_reg, val); mach->cursor_offset_lo = mach->cursor_offset_lo_reg; + dev->hwcursor.addr = ((mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2); break; case 0xeee: case 0xeef: WRITE8(port, mach->cursor_offset_hi_reg, val); mach->cursor_offset_hi = mach->cursor_offset_hi_reg & 0x0f; - dev->hwcursor.addr = (mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2; + dev->hwcursor.addr = ((mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2); dev->hwcursor.ena = !!(mach->cursor_offset_hi_reg & 0x8000); break; @@ -4633,9 +4636,6 @@ mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t cycles -= svga->monitor->mon_video_timing_write_b; if (linear) { - addr &= svga->decode_mask; - if (addr >= dev->vram_size) - return; addr &= dev->vram_mask; dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; dev->vram[addr] = val; @@ -4825,9 +4825,6 @@ mach32_writew_linear(uint32_t addr, uint16_t val, mach_t *mach) cycles -= svga->monitor->mon_video_timing_write_w; - addr &= svga->decode_mask; - if (addr >= dev->vram_size) - return; addr &= dev->vram_mask; dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; *(uint16_t *) &dev->vram[addr] = val; @@ -4841,9 +4838,6 @@ mach32_writel_linear(uint32_t addr, uint32_t val, mach_t *mach) cycles -= svga->monitor->mon_video_timing_write_l; - addr &= svga->decode_mask; - if (addr >= dev->vram_size) - return; addr &= dev->vram_mask; dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; *(uint32_t *) &dev->vram[addr] = val; @@ -4862,10 +4856,6 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) cycles -= svga->monitor->mon_video_timing_read_b; if (linear) { - addr &= svga->decode_mask; - if (addr >= dev->vram_size) - return 0xff; - return dev->vram[addr & dev->vram_mask]; } else { addr = mach32_decode_addr(svga, addr, 0); @@ -5022,10 +5012,6 @@ mach32_readw_linear(uint32_t addr, mach_t *mach) cycles -= svga->monitor->mon_video_timing_read_w; - addr &= svga->decode_mask; - if (addr >= dev->vram_size) - return 0xffff; - return *(uint16_t *) &dev->vram[addr & dev->vram_mask]; } @@ -5037,10 +5023,6 @@ mach32_readl_linear(uint32_t addr, mach_t *mach) cycles -= svga->monitor->mon_video_timing_read_l; - addr &= svga->decode_mask; - if (addr >= dev->vram_size) - return 0xffffffff; - return *(uint32_t *) &dev->vram[addr & dev->vram_mask]; } @@ -5294,7 +5276,7 @@ mach32_hwcursor_draw(svga_t *svga, int displine) int x_pos; int y_pos; - mach_log("BPP=%d.\n", dev->accel_bpp); + mach_log("BPP=%d, displine=%d.\n", dev->accel_bpp, displine); switch (dev->accel_bpp) { default: case 8: @@ -5888,7 +5870,7 @@ mach8_init(const device_t *info) else mach->config1 |= 0x0c; mach->config1 |= 0x0400; - svga->clock_gen = device_add(&ati18811_0_device); + svga->clock_gen = device_add(&ati18811_1_device); } else if (mach->mca_bus) { video_inform(VIDEO_FLAG_TYPE_8514, &timing_mach32_mca); if (is286 && !is386) @@ -5905,11 +5887,11 @@ mach8_init(const device_t *info) else mach->config1 |= 0x0a00; mach->config2 |= 0x2000; - svga->clock_gen = device_add(&ati18811_0_device); + svga->clock_gen = device_add(&ati18811_1_device); } else { video_inform(VIDEO_FLAG_TYPE_8514, &timing_gfxultra_isa); mach->config1 |= 0x0400; - svga->clock_gen = device_add(&ati18811_0_device); + svga->clock_gen = device_add(&ati18811_1_device); } mem_mapping_add(&mach->mmio_linear_mapping, 0, 0, mach32_ap_readb, mach32_ap_readw, mach32_ap_readl, mach32_ap_writeb, mach32_ap_writew, mach32_ap_writel, NULL, MEM_MAPPING_EXTERNAL, mach); mem_mapping_disable(&mach->mmio_linear_mapping); @@ -5926,7 +5908,7 @@ mach8_init(const device_t *info) video_inform(VIDEO_FLAG_TYPE_8514, &timing_gfxultra_isa); mach->config1 = 0x01 | 0x02 | 0x20 | 0x08 | 0x80; mach->config2 = 0x02; - svga->clock_gen = device_add(&ati18810_device); + svga->clock_gen = device_add(&ati18811_0_device); } dev->bpp = 0; svga->getclock = ics2494_getclock; From 9cc8f0ffd4682faa4e3be1356101f0607ceb6730 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 22 Sep 2024 21:29:00 +0200 Subject: [PATCH 449/624] Workaround the volume that is too low on the PAS Plus. And added a note about it. --- src/sound/snd_pas16.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c index 80a2c9a7b..5ab14d1b8 100644 --- a/src/sound/snd_pas16.c +++ b/src/sound/snd_pas16.c @@ -1020,7 +1020,7 @@ pas16_nsc_mixer_reset(nsc_mixer_t *mixer) mixer->lmc1982_regs[LMC1982_REG_ISELECT] = 0x01; mixer->lmc1982_regs[LMC1982_REG_LES] = 0x00; mixer->lmc1982_regs[LMC1982_REG_BASS] = mixer->lmc1982_regs[LMC1982_REG_TREBLE] = 0x06; - mixer->lmc1982_regs[LMC1982_REG_VOL_L] = mixer->lmc1982_regs[LMC1982_REG_VOL_R] = 0x28; + mixer->lmc1982_regs[LMC1982_REG_VOL_L] = mixer->lmc1982_regs[LMC1982_REG_VOL_R] = 0x00; /*0x28*/ /*Note by TC1995: otherwise the volume gets lowered too much*/ mixer->lmc1982_regs[LMC1982_REG_MODE] = 0x05; lmc1982_recalc(mixer); From f2eb6a01610716b39e68e9f5e5d7e1796c487feb Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 23 Sep 2024 05:54:46 +0200 Subject: [PATCH 450/624] UM8886: More IRQ-related bug fixes, including incorrect shifts to the right by 8 instead of 4 bits which was causing all PCI devices to use IRQ 0 instead of their assigned IRQ. --- src/chipset/umc_8886.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/chipset/umc_8886.c b/src/chipset/umc_8886.c index 2b867c000..3ec6885b6 100644 --- a/src/chipset/umc_8886.c +++ b/src/chipset/umc_8886.c @@ -170,20 +170,20 @@ umc_8886_irq_recalc(umc_8886_t *dev) int irq_routing; uint8_t *conf = dev->pci_conf_sb[0]; - irq_routing = (conf[0x46] & 0x01) ? (conf[0x43] >> 8) : PCI_IRQ_DISABLED; + irq_routing = (conf[0x46] & 0x01) ? (conf[0x43] >> 4) : PCI_IRQ_DISABLED; pci_set_irq_routing(PCI_INTA, irq_routing); irq_routing = (conf[0x46] & 0x02) ? (conf[0x43] & 0x0f) : PCI_IRQ_DISABLED; pci_set_irq_routing(PCI_INTB, irq_routing); - irq_routing = (conf[0x46] & 0x04) ? (conf[0x44] >> 8) : PCI_IRQ_DISABLED; + irq_routing = (conf[0x46] & 0x04) ? (conf[0x44] >> 4) : PCI_IRQ_DISABLED; pci_set_irq_routing(PCI_INTC, irq_routing); irq_routing = (conf[0x46] & 0x08) ? (conf[0x44] & 0x0f) : PCI_IRQ_DISABLED; pci_set_irq_routing(PCI_INTD, irq_routing); - pci_set_irq_level(PCI_INTA, !(conf[0x47] & 0x01)); - pci_set_irq_level(PCI_INTB, !(conf[0x47] & 0x02)); - pci_set_irq_level(PCI_INTC, !(conf[0x47] & 0x04)); - pci_set_irq_level(PCI_INTD, !(conf[0x47] & 0x08)); + pci_set_irq_level(PCI_INTA, (conf[0x47] & 0x01)); + pci_set_irq_level(PCI_INTB, (conf[0x47] & 0x02)); + pci_set_irq_level(PCI_INTC, (conf[0x47] & 0x04)); + pci_set_irq_level(PCI_INTD, (conf[0x47] & 0x08)); } static void From 8c705b4ad191d7b837cd68ad1664ae7b5a423a8d Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 24 Sep 2024 04:32:46 +0200 Subject: [PATCH 451/624] Flush on writes to hard disk images, fixes partition creation on the Samsung SPC7700LP-W. --- src/disk/hdd_image.c | 3 +++ src/disk/minivhd/minivhd_io.c | 8 ++++++++ 2 files changed, 11 insertions(+) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index f82b2d3f2..7c2618969 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -577,6 +577,7 @@ hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) } num_write = fwrite(buffer, 512, count, hdd_images[id].file); + fflush(hdd_images[id].file); hdd_images[id].pos = sector + num_write; } } @@ -618,6 +619,8 @@ hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count) hdd_images[id].pos = sector + i; fwrite(empty_sector, 512, 1, hdd_images[id].file); } + + fflush(hdd_images[id].file); } } diff --git a/src/disk/minivhd/minivhd_io.c b/src/disk/minivhd/minivhd_io.c index ffc6aba44..1a349dbc4 100644 --- a/src/disk/minivhd/minivhd_io.c +++ b/src/disk/minivhd/minivhd_io.c @@ -89,6 +89,8 @@ mvhd_write_empty_sectors(FILE *f, int sector_count) for (int i = 0; i < sector_count; i++) fwrite(zero_bytes, sizeof zero_bytes, 1, f); + + fflush(f); } /** @@ -141,6 +143,7 @@ write_bat_entry(MVHDMeta *vhdm, int blk) mvhd_fseeko64(vhdm->f, table_offset, SEEK_SET); fwrite(&offset, sizeof offset, 1, vhdm->f); + fflush(vhdm->f); } /** @@ -197,6 +200,8 @@ create_block(MVHDMeta *vhdm, int blk) /* We no longer have a sparse block. Update that BAT! */ vhdm->block_offset[blk] = sect_offset; write_bat_entry(vhdm, blk); + + fflush(vhdm->f); } int @@ -317,6 +322,7 @@ mvhd_fixed_write(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *in_buff addr = (int64_t)offset * MVHD_SECTOR_SIZE; mvhd_fseeko64(vhdm->f, addr, SEEK_SET); fwrite(in_buff, transfer_sectors * MVHD_SECTOR_SIZE, 1, vhdm->f); + fflush(vhdm->f); return truncated_sectors; } @@ -376,6 +382,8 @@ mvhd_sparse_diff_write(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *i /* And write the sector bitmap for the last block we visited to disk */ write_curr_sect_bitmap(vhdm); + fflush(vhdm->f); + return truncated_sectors; } From 7639d8b031a4d3c09d7674e5f6aef2077d664eba Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 24 Sep 2024 04:36:01 +0200 Subject: [PATCH 452/624] Flush on write to floppy images as well. --- src/floppy/fdd_86f.c | 2 ++ src/floppy/fdd_imd.c | 2 ++ src/floppy/fdd_img.c | 2 ++ 3 files changed, 6 insertions(+) diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 5a5eec398..3fe1428a1 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -3225,6 +3225,8 @@ d86f_writeback(int drive) free(dev->filebuf); } #endif + + fflush(dev->fp); } void diff --git a/src/floppy/fdd_imd.c b/src/floppy/fdd_imd.c index fd6c59d01..0839c2900 100644 --- a/src/floppy/fdd_imd.c +++ b/src/floppy/fdd_imd.c @@ -549,6 +549,8 @@ imd_writeback(int drive) } } } + + fflush(dev->fp); } static uint8_t diff --git a/src/floppy/fdd_img.c b/src/floppy/fdd_img.c index 404cbf9fa..62b05a944 100644 --- a/src/floppy/fdd_img.c +++ b/src/floppy/fdd_img.c @@ -431,6 +431,8 @@ write_back(int drive) if (fwrite(dev->track_data[side], 1, size, dev->fp) != size) fatal("IMG write_back(): Error writing data\n"); } + + fflush(dev->fp); } static uint16_t From 9c1d9e2d82ca93dec5487bf85eaa615ad36eb161 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 24 Sep 2024 04:37:26 +0200 Subject: [PATCH 453/624] MO and ZIP. --- src/disk/mo.c | 4 ++++ src/disk/zip.c | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/disk/mo.c b/src/disk/mo.c index 44f68effa..ed1ab2472 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -951,6 +951,8 @@ mo_blocks(mo_t *dev, int32_t *len, UNUSED(int first_batch), int out) if (out) { if (fwrite(dev->buffer + (i * dev->drv->sector_size), 1, dev->drv->sector_size, dev->drv->fp) != dev->drv->sector_size) fatal("mo_blocks(): Error writing data\n"); + + fflush(dev->drv->fp); } else { if (fread(dev->buffer + (i * dev->drv->sector_size), 1, dev->drv->sector_size, dev->drv->fp) != dev->drv->sector_size) fatal("mo_blocks(): Error reading data\n"); @@ -1069,6 +1071,8 @@ mo_erase(mo_t *dev) fwrite(dev->buffer, 1, dev->drv->sector_size, dev->drv->fp); } + fflush(dev->drv->fp); + mo_log("MO %i: Erased %i bytes of blocks...\n", dev->id, i * dev->drv->sector_size); dev->sector_pos += i; diff --git a/src/disk/zip.c b/src/disk/zip.c index 764dc1f53..a948cab2f 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -1134,6 +1134,8 @@ zip_blocks(zip_t *dev, int32_t *len, UNUSED(int first_batch), int out) if (out) { if (fwrite(dev->buffer + (i << 9), 1, 512, dev->drv->fp) != 512) fatal("zip_blocks(): Error writing data\n"); + + fflush(dev->drv->fp); } else { if (fread(dev->buffer + (i << 9), 1, 512, dev->drv->fp) != 512) fatal("zip_blocks(): Error reading data\n"); @@ -2125,6 +2127,8 @@ zip_phase_data_out(scsi_common_t *sc) if (fwrite(dev->buffer, 1, 512, dev->drv->fp) != 512) fatal("zip_phase_data_out(): Error writing data\n"); } + + fflush(dev->drv->fp); break; case GPCMD_MODE_SELECT_6: case GPCMD_MODE_SELECT_10: From 17f6ddecb319ae2ea1a4de0e333001b3cce7560b Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 24 Sep 2024 04:41:45 +0200 Subject: [PATCH 454/624] More UM888x fixes. --- src/chipset/umc_8886.c | 48 ++++++++++------------ src/chipset/umc_hb4.c | 93 +++++++++++++++++++++++++++++++++++------- 2 files changed, 100 insertions(+), 41 deletions(-) diff --git a/src/chipset/umc_8886.c b/src/chipset/umc_8886.c index 3ec6885b6..4242062c6 100644 --- a/src/chipset/umc_8886.c +++ b/src/chipset/umc_8886.c @@ -126,10 +126,10 @@ umc_8886_ide_handler(umc_8886_t *dev) ide_sec_disable(); if (dev->pci_conf_sb[1][0x04] & 0x01) { - if (dev->pci_conf_sb[1][0x40] & 0x80) + if (dev->pci_conf_sb[1][0x41] & 0x80) ide_pri_enable(); - if (dev->pci_conf_sb[1][0x40] & 0x40) + if (dev->pci_conf_sb[1][0x41] & 0x40) ide_sec_enable(); } } @@ -204,7 +204,7 @@ umc_8886_write(int func, int addr, uint8_t val, void *priv) case 0x50 ... 0x55: case 0x57: case 0x70 ... 0x76: - case 0x80 ... 0x82: + case 0x80 ... 0x83: case 0x90 ... 0x92: case 0xa0 ... 0xa1: case 0xa5 ... 0xa8: @@ -270,13 +270,13 @@ umc_8886_write(int func, int addr, uint8_t val, void *priv) break; case 0x3c: - case 0x41 ... 0x4b: - case 0x54 ... 0x59: + case 0x40: + case 0x42 ... 0x59: if (dev->ide_id == 0x673a) dev->pci_conf_sb[func][addr] = val; break; - case 0x40: + case 0x41: if (dev->ide_id == 0x673a) { dev->pci_conf_sb[func][addr] = val; umc_8886_ide_handler(dev); @@ -322,25 +322,17 @@ umc_8886_reset(void *priv) dev->pci_conf_sb[0][0x09] = 0x00; dev->pci_conf_sb[0][0x0a] = 0x01; dev->pci_conf_sb[0][0x0b] = 0x06; + dev->pci_conf_sb[0][0x40] = 0x01; - dev->pci_conf_sb[0][0x41] = 0x06; + dev->pci_conf_sb[0][0x41] = 0x04; dev->pci_conf_sb[0][0x42] = 0x08; - dev->pci_conf_sb[0][0x43] = 0x00; - dev->pci_conf_sb[0][0x44] = 0x00; - dev->pci_conf_sb[0][0x45] = 0x04; - dev->pci_conf_sb[0][0x46] = 0x00; - dev->pci_conf_sb[0][0x47] = 0x40; - dev->pci_conf_sb[0][0x50] = 0x01; - dev->pci_conf_sb[0][0x51] = 0x03; - dev->pci_conf_sb[0][0x56] = dev->pci_conf_sb[0][0x57] = 0x00; - dev->pci_conf_sb[0][0x70] = dev->pci_conf_sb[0][0x71] = 0x00; - dev->pci_conf_sb[0][0x72] = dev->pci_conf_sb[0][0x73] = 0x00; - dev->pci_conf_sb[0][0x74] = dev->pci_conf_sb[0][0x76] = 0x00; - dev->pci_conf_sb[0][0x82] = 0x00; - dev->pci_conf_sb[0][0x90] = dev->pci_conf_sb[0][0x91] = 0x00; - dev->pci_conf_sb[0][0xa0] = dev->pci_conf_sb[0][0xa2] = 0x00; - dev->pci_conf_sb[0][0xa4] = 0x00; - dev->pci_conf_sb[0][0xa8] = 0x20; + dev->pci_conf_sb[0][0x43] = 0x9a; + dev->pci_conf_sb[0][0x44] = 0xbc; + dev->pci_conf_sb[0][0x45] = 0x00; + dev->pci_conf_sb[0][0x46] = 0x10; + dev->pci_conf_sb[0][0x47] = 0x30; + + dev->pci_conf_sb[0][0x51] = 0x02; if (dev->has_ide) { dev->pci_conf_sb[1][0x00] = 0x60; /* UMC */ @@ -363,13 +355,15 @@ umc_8886_reset(void *priv) dev->pci_conf_sb[1][0x21] = 0x10; if (dev->ide_id == 0x673a) { - dev->pci_conf_sb[1][0x40] = 0xc0; - dev->pci_conf_sb[1][0x41] = 0x00; + dev->pci_conf_sb[1][0x40] = 0x00; + dev->pci_conf_sb[1][0x41] = 0xc0; dev->pci_conf_sb[1][0x42] = dev->pci_conf_sb[1][0x43] = 0x00; dev->pci_conf_sb[1][0x44] = dev->pci_conf_sb[1][0x45] = 0x00; dev->pci_conf_sb[1][0x46] = dev->pci_conf_sb[1][0x47] = 0x00; - dev->pci_conf_sb[1][0x48] = dev->pci_conf_sb[1][0x49] = 0x00; - dev->pci_conf_sb[1][0x4a] = dev->pci_conf_sb[1][0x4b] = 0x00; + dev->pci_conf_sb[1][0x48] = dev->pci_conf_sb[1][0x49] = 0x55; + dev->pci_conf_sb[1][0x4a] = dev->pci_conf_sb[1][0x4b] = 0x55; + dev->pci_conf_sb[1][0x4c] = dev->pci_conf_sb[1][0x4d] = 0x88; + dev->pci_conf_sb[1][0x4e] = dev->pci_conf_sb[1][0x4f] = 0xaa; dev->pci_conf_sb[1][0x54] = dev->pci_conf_sb[1][0x55] = 0x00; dev->pci_conf_sb[1][0x56] = dev->pci_conf_sb[1][0x57] = 0x00; dev->pci_conf_sb[1][0x58] = dev->pci_conf_sb[1][0x59] = 0x00; diff --git a/src/chipset/umc_hb4.c b/src/chipset/umc_hb4.c index a7ed0b880..707bbdd45 100644 --- a/src/chipset/umc_hb4.c +++ b/src/chipset/umc_hb4.c @@ -136,6 +136,9 @@ hb4_log(const char *fmt, ...) #endif typedef struct hb4_t { + uint8_t idx; + uint8_t access_data; + uint8_t pci_slot; uint8_t pci_conf[256]; /* PCI Registers */ @@ -176,7 +179,10 @@ hb4_shadow_bios_low(hb4_t *dev) int state; /* Erratum in Vogons' datasheet: Register 55h bit 7 in fact controls E0000-FFFFF. */ - state = shadow_bios[dev->pci_conf[0x55] >> 6]; + // state = shadow_bios[dev->pci_conf[0x55] >> 6]; + state = (dev->pci_conf[0x55] & 0x80) ? shadow_read[dev->pci_conf[0x54] & 0x01] : + MEM_READ_EXTANY; + state |= shadow_write[(dev->pci_conf[0x55] >> 6) & 0x01]; if (state != dev->mem_state[7]) { mem_set_mem_state_both(0xe0000, 0x10000, state); @@ -194,8 +200,9 @@ hb4_shadow_main(hb4_t *dev) int n = 0; for (uint8_t i = 0; i < 6; i++) { - state = shadow_read[(dev->pci_conf[0x54] >> (i + 2)) & 0x01] | - shadow_write[(dev->pci_conf[0x55] >> 6) & 0x01]; + state = (dev->pci_conf[0x55] & 0x80) ? shadow_read[(dev->pci_conf[0x54] >> (i + 2)) & 0x01] : + MEM_READ_EXTANY; + state |= shadow_write[(dev->pci_conf[0x55] >> 6) & 0x01]; if (state != dev->mem_state[i + 1]) { n++; @@ -212,8 +219,9 @@ hb4_shadow_video(hb4_t *dev) { int state; - state = shadow_read[(dev->pci_conf[0x54] >> 1) & 0x01] | - shadow_write[(dev->pci_conf[0x55] >> 6) & 0x01]; + state = (dev->pci_conf[0x55] & 0x80) ? shadow_read[(dev->pci_conf[0x54] >> 1) & 0x01] : + MEM_READ_EXTANY; + state |= shadow_write[(dev->pci_conf[0x55] >> 6) & 0x01]; if (state != dev->mem_state[0]) { mem_set_mem_state_both(0xc0000, 0x8000, state); @@ -302,7 +310,7 @@ hb4_write(UNUSED(int func), int addr, uint8_t val, void *priv) hb4_shadow(dev); break; - case 0x56 ... 0x5b: + case 0x56 ... 0x5a: case 0x5e ... 0x5f: dev->pci_conf[addr] = val; break; @@ -313,10 +321,14 @@ hb4_write(UNUSED(int func), int addr, uint8_t val, void *priv) hb4_smram(dev); break; - case 0x61 ... 0x62: + case 0x61: dev->pci_conf[addr] = val; break; + case 0x62: + dev->pci_conf[addr] = val & 0x03; + break; + default: break; } @@ -354,14 +366,16 @@ hb4_reset(void *priv) dev->pci_conf[0x52] = 0x01; dev->pci_conf[0x53] = 0x00; dev->pci_conf[0x54] = 0x00; - dev->pci_conf[0x55] = 0x00; - dev->pci_conf[0x56] = 0x00; - dev->pci_conf[0x57] = 0x00; - dev->pci_conf[0x58] = 0x00; - dev->pci_conf[0x59] = 0x00; - dev->pci_conf[0x5a] = 0x04; + dev->pci_conf[0x55] = 0x40; + dev->pci_conf[0x56] = 0xff; + dev->pci_conf[0x57] = 0x0f; + dev->pci_conf[0x58] = 0xff; + dev->pci_conf[0x59] = 0x0f; + dev->pci_conf[0x5a] = 0x00; + dev->pci_conf[0x5b] = 0x2c; dev->pci_conf[0x5c] = 0x00; - dev->pci_conf[0x5d] = 0x20; + dev->pci_conf[0x5d] = 0x0f; + dev->pci_conf[0x5e] = 0x00; dev->pci_conf[0x5f] = 0xff; dev->pci_conf[0x60] = 0x00; dev->pci_conf[0x61] = 0x00; @@ -385,6 +399,55 @@ hb4_close(void *priv) free(dev); } +static void +ims8848_write(uint16_t addr, uint8_t val, void *priv) +{ + hb4_t *dev = (hb4_t *) priv; + + switch (addr) { + case 0x22: + dev->idx = val; + break; + case 0x23: + if (((val & 0x0f) == ((dev->idx >> 4) & 0x0f)) && ((val & 0xf0) == ((dev->idx << 4) & 0xf0))) + dev->access_data = 1; + break; + case 0x24: + if (dev->access_data) + dev->access_data = 0; + break; + + default: + break; + } +} + +static uint8_t +ims8848_read(uint16_t addr, void *priv) +{ + uint8_t ret = 0xff; + hb4_t *dev = (hb4_t *) priv; + + switch (addr) { + case 0x22: + ret = dev->idx; + break; + case 0x23: + ret = (dev->idx >> 4) | (dev->idx << 4); + break; + case 0x24: + if (dev->access_data) { + ret = dev->pci_conf[dev->idx]; + dev->access_data = 0; + } + break; + default: + break; + } + + return ret; +} + static void * hb4_init(UNUSED(const device_t *info)) { @@ -402,6 +465,8 @@ hb4_init(UNUSED(const device_t *info)) dev->smram_base = 0x000a0000; hb4_reset(dev); + io_sethandler(0x0022, 0x0003, ims8848_read, NULL, NULL, ims8848_write, NULL, NULL, dev); + return dev; } From 24c6ebc6dd6df5b3c7e7d189f7ea714eeede7b31 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 24 Sep 2024 04:50:41 +0200 Subject: [PATCH 455/624] Samsung SPC7700P-LW: reset SMBASE on soft reset via the keyboard controller, fixes segmentation fault on soft reset after FDISK. --- src/device/kbc_at.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index ad63099fb..5c3c9ac6e 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -821,7 +821,7 @@ write_p2(atkbc_t *dev, uint8_t val) softresetx86(); /* Pulse reset! */ cpu_set_edx(); flushmmucache(); - if (kbc_ven == KBC_VEN_ALI) + if ((kbc_ven == KBC_VEN_ALI) || !strcmp(machine_get_internal_name(), "spc7700plw")) smbase = 0x00030000; /* Yes, this is a hack, but until someone gets ahold of the real PCD-2L From 83d4997e5cd0c85b6ac98926b0a02b08ad577ad9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 24 Sep 2024 04:53:10 +0200 Subject: [PATCH 456/624] UMC 8881: Remove an excess commented out line. --- src/chipset/umc_hb4.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/chipset/umc_hb4.c b/src/chipset/umc_hb4.c index 707bbdd45..c1f359f26 100644 --- a/src/chipset/umc_hb4.c +++ b/src/chipset/umc_hb4.c @@ -179,7 +179,6 @@ hb4_shadow_bios_low(hb4_t *dev) int state; /* Erratum in Vogons' datasheet: Register 55h bit 7 in fact controls E0000-FFFFF. */ - // state = shadow_bios[dev->pci_conf[0x55] >> 6]; state = (dev->pci_conf[0x55] & 0x80) ? shadow_read[dev->pci_conf[0x54] & 0x01] : MEM_READ_EXTANY; state |= shadow_write[(dev->pci_conf[0x55] >> 6) & 0x01]; From 13e18a067adfc0237d45ea1dc1e988fe4db67b2d Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 24 Sep 2024 08:39:13 +0200 Subject: [PATCH 457/624] SN76489: Remove some wrong code, fixes #4821. --- src/sound/snd_sn76489.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/sound/snd_sn76489.c b/src/sound/snd_sn76489.c index 5ccc0cd10..32f81c596 100644 --- a/src/sound/snd_sn76489.c +++ b/src/sound/snd_sn76489.c @@ -189,12 +189,6 @@ void sn74689_set_extra_divide(sn76489_t *sn76489, int enable) { sn76489->extra_divide = enable; - - if (!enable) { - for (uint8_t c = 1; c < 4; c++) - sn76489->latch[c] &= ~(0x400 << 6); - sn76489->latch[0] &= ~(0x400 << 6); - } } void From 5fd1d0be9fe21c56bcf3d32ff7895965be1dd96c Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 24 Sep 2024 20:39:20 +0200 Subject: [PATCH 458/624] XGA aperture fixes of the day (September 24th, 2024) Fixed 1MB aperture vram access. --- src/video/vid_xga.c | 64 ++++++++++++++++++++++++--------------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index 824a3dbf0..8946d7122 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -168,12 +168,14 @@ xga_updatemapping(svga_t *svga) xga_log("XGA: Extended Graphics mode.\n"); switch (xga->aperture_cntl) { case 0: - xga_log("XGA: No 64KB aperture.\n"); - if (xga->base_addr_1mb) + xga_log("XGA: No 64KB aperture: 1MB=%x, 4MB=%x.\n", xga->base_addr_1mb, xga->linear_base); + if (xga->base_addr_1mb) { mem_mapping_set_addr(&xga->linear_mapping, xga->base_addr_1mb, 0x100000); - else if (xga->linear_base) + mem_mapping_enable(&xga->linear_mapping); + } else if (xga->linear_base) { mem_mapping_set_addr(&xga->linear_mapping, xga->linear_base, 0x400000); - else + mem_mapping_enable(&xga->linear_mapping); + } else mem_mapping_disable(&xga->linear_mapping); mem_mapping_disable(&xga->video_mapping); @@ -912,13 +914,8 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b uint8_t px; int skip = 0; - if (xga->base_addr_1mb) { - if (addr < xga->base_addr_1mb || (addr > (xga->base_addr_1mb + 0xfffff))) - skip = 1; - } else { - if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) - skip = 1; - } + if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) + skip = 1; addr += (y * (width >> 3)); addr += (x >> 3); @@ -956,13 +953,8 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int uint8_t px; int skip = 0; - if (xga->base_addr_1mb) { - if (addr < xga->base_addr_1mb || (addr > (xga->base_addr_1mb + 0xfffff))) - skip = 1; - } else { - if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) - skip = 1; - } + if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) + skip = 1; switch (xga->accel.px_map_format[map] & 7) { case 0: /*1-bit*/ @@ -1033,13 +1025,8 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui uint8_t mask; int skip = 0; - if (xga->base_addr_1mb) { - if (addr < xga->base_addr_1mb || (addr > (xga->base_addr_1mb + 0xfffff))) - skip = 1; - } else { - if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) - skip = 1; - } + if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) + skip = 1; switch (xga->accel.px_map_format[map] & 7) { case 0: /*1-bit*/ @@ -1476,7 +1463,8 @@ xga_bitblt(svga_t *svga) if (xga->accel.dst_map_x >= 0x1800) dx |= ~0x17ff; if (xga->accel.dst_map_y >= 0x1800) - dy |= ~0x17ff; + dy -= 0x1800; + xga_log("D(%d,%d), SWH(%d,%d), BLT(%d,%d), dstwidth=%d.\n", dx, dy, xga->accel.x, xga->accel.y, srcwidth, srcheight, dstwidth); xga->accel.pattern = 0; @@ -2776,8 +2764,10 @@ xga_write_linear(uint32_t addr, uint8_t val, void *priv) addr &= svga->decode_mask; - if (addr >= xga->vram_size) + if (addr >= xga->vram_size) { + xga_log("Write Linear Over!.\n"); return; + } cycles -= svga->monitor->mon_video_timing_write_b; @@ -2839,8 +2829,10 @@ xga_read_linear(uint32_t addr, void *priv) addr &= svga->decode_mask; - if (addr >= xga->vram_size) + if (addr >= xga->vram_size) { + xga_log("Read Linear Over!.\n"); return ret; + } cycles -= svga->monitor->mon_video_timing_read_b; @@ -3369,9 +3361,9 @@ xga_init(const device_t *info) free(rom); } - xga->base_addr_1mb = 0; if (info->flags & DEVICE_MCA) { video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_xga_mca); + xga->base_addr_1mb = 0; xga->linear_base = 0; xga->instance = 0; xga->rom_addr = 0; @@ -3384,7 +3376,19 @@ xga_init(const device_t *info) xga->pos_regs[2] = 1 | (xga->instance_isa << 1) | xga->ext_mem_addr; xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; - xga->pos_regs[4] = 1 | 2; + xga->pos_regs[4] = 2; + if (mem_size >= 16384) { + xga->pos_regs[4] |= 1; + xga->pos_regs[5] = 0; + } else { + xga->pos_regs[5] = ((mem_size * 64) >> 0x10) + 1; + if (xga->pos_regs[5] == 0x10) { + xga->pos_regs[5] = 0; + xga->pos_regs[4] |= 1; + } + } + + xga->base_addr_1mb = (xga->pos_regs[5] & 0x0f) << 20; xga->linear_base = ((xga->pos_regs[4] & 0xfe) * 0x1000000) + (xga->instance << 22); xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xf0) >> 4) * 0x2000); } From 6d84c4d33c7bb95cffca81a7f3e66fc5f8c8ef60 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 25 Sep 2024 07:57:02 +0200 Subject: [PATCH 459/624] FIC VA-503+: The Winbond W83877TF Super I/O chip needs to have bit 0 of HEFRAS set at power on, fixes #4855. --- src/machine/m_at_sockets7.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/m_at_sockets7.c b/src/machine/m_at_sockets7.c index fe6983733..0360b5650 100644 --- a/src/machine/m_at_sockets7.c +++ b/src/machine/m_at_sockets7.c @@ -263,7 +263,7 @@ machine_at_mvp3_init(const machine_t *model) device_add(&via_mvp3_device); device_add(&via_vt82c586b_device); device_add(&keyboard_ps2_pci_device); - device_add(&w83877tf_device); + device_add(&w83877tf_acorp_device); device_add(&sst_flash_39sf010_device); spd_register(SPD_TYPE_SDRAM, 0x3, 256); From 26b7053318ad6d3f37459eac29e33753ffbe029c Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 25 Sep 2024 08:58:40 +0200 Subject: [PATCH 460/624] CGA and Tandy 1000 SX/HX: Implement light pen latch readout with a sane value, fixes #4856. --- src/machine/m_tandy.c | 18 +++++++++++++++++- src/video/vid_cga.c | 12 +++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 6c478b37a..bc20a4510 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -864,7 +864,23 @@ vid_in(uint16_t addr, void *priv) break; case 0x03d5: - ret = vid->crtc[vid->crtcreg]; + switch (vid->crtcreg) { + default: + ret = vid->crtc[vid->crtcreg]; + break; + case 0x10: + if (dev->is_sl2) + ret = vid->crtc[vid->crtcreg]; + else + ret = 0x0f; + break; + case 0x11: + if (dev->is_sl2) + ret = vid->crtc[vid->crtcreg]; + else + ret = 0x78; + break; + } break; case 0x03da: diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 2ea07c346..b5590c2c0 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -131,7 +131,17 @@ cga_in(uint16_t addr, void *priv) ret = cga->crtcreg; break; case 0x3D5: - ret = cga->crtc[cga->crtcreg]; + switch (cga->crtcreg) { + default: + ret = cga->crtc[cga->crtcreg]; + break; + case 0x10: + ret = 0x0f; + break; + case 0x11: + ret = 0x78; + break; + } break; case 0x3DA: ret = cga->cgastat; From 32ed6a30d42fe5663750ad496a172547d00a65f9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 25 Sep 2024 11:11:52 +0200 Subject: [PATCH 461/624] Fixed the AdLib Gold regression that were causing noise. --- src/sound/snd_adlibgold.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/sound/snd_adlibgold.c b/src/sound/snd_adlibgold.c index 488dcb8a6..8f62d0417 100644 --- a/src/sound/snd_adlibgold.c +++ b/src/sound/snd_adlibgold.c @@ -791,8 +791,8 @@ adgold_get_buffer(int32_t *buffer, int len, void *priv) adgold_update(adgold); for (c = 0; c < len * 2; c += 2) { - adgold_buffer[c] += ((adgold->mma_buffer[0][c >> 1] * adgold->samp_vol_l) >> 7) / 4; - adgold_buffer[c + 1] += ((adgold->mma_buffer[1][c >> 1] * adgold->samp_vol_r) >> 7) / 4; + adgold_buffer[c] = ((adgold->mma_buffer[0][c >> 1] * adgold->samp_vol_l) >> 7) / 4; + adgold_buffer[c + 1] = ((adgold->mma_buffer[1][c >> 1] * adgold->samp_vol_r) >> 7) / 4; } if (adgold->surround_enabled) @@ -904,7 +904,6 @@ adgold_get_music_buffer(int32_t *buffer, int len, void *priv) int c; const int32_t *opl_buf = adgold->opl.update(adgold->opl.priv); - adgold_update(adgold); for (c = 0; c < len * 2; c += 2) { adgold_buffer[c] = ((opl_buf[c] * adgold->fm_vol_l) >> 7) / 2; From d6a01a102b6dfc5ca91542e88120b30101145db3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 25 Sep 2024 14:13:00 +0200 Subject: [PATCH 462/624] CGA and Tandy 1000 HX/SX: Properly implement the light pen strobe. Jungle Hunt's palette changed area still moves, that's a PIT bug, I'm going to look into that again in 5.0 when I go back to porting 808x etc. from MartyPC. --- src/include/86box/vid_cga.h | 2 ++ src/machine/m_tandy.c | 54 ++++++++++++++++++++++++------------- src/video/vid_cga.c | 48 +++++++++++++++++++++++---------- 3 files changed, 72 insertions(+), 32 deletions(-) diff --git a/src/include/86box/vid_cga.h b/src/include/86box/vid_cga.h index 5b6a2dea2..a503d12ba 100644 --- a/src/include/86box/vid_cga.h +++ b/src/include/86box/vid_cga.h @@ -31,6 +31,8 @@ typedef struct cga_t { uint8_t cgamode; uint8_t cgacol; + uint8_t lp_strobe; + int fontbase; int linepos; int displine; diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index bc20a4510..2fdc491f9 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -84,6 +84,7 @@ typedef struct t1kvid_t { uint32_t b8000_mask; uint32_t b8000_limit; uint8_t planar_ctrl; + uint8_t lp_strobe; int linepos; int displine; @@ -770,6 +771,15 @@ recalc_address_sl(tandy_t *dev) } } +static void +vid_update_latch(t1kvid_t *vid) +{ + uint32_t lp_latch = vid->displine * vid->crtc[1]; + + vid->crtc[0x10] = (lp_latch >> 8) & 0x3f; + vid->crtc[0x11] = lp_latch & 0xff; +} + static void vid_out(uint16_t addr, uint8_t val, void *priv) { @@ -816,6 +826,18 @@ vid_out(uint16_t addr, uint8_t val, void *priv) vid->array_index = val & 0x1f; break; + case 0x3db: + if (dev->is_sl2 && (vid->lp_strobe == 1)) + vid->lp_strobe = 0; + break; + + case 0x3dc: + if (dev->is_sl2 && (vid->lp_strobe == 0)) { + vid->lp_strobe = 1; + vid_update_latch(vid); + } + break; + case 0x03de: if (vid->array_index & 16) val &= 0xf; @@ -852,7 +874,7 @@ static uint8_t vid_in(uint16_t addr, void *priv) { const tandy_t *dev = (tandy_t *) priv; - const t1kvid_t *vid = dev->vid; + t1kvid_t *vid = dev->vid; uint8_t ret = 0xff; if ((addr >= 0x3d0) && (addr <= 0x3d7)) @@ -864,29 +886,25 @@ vid_in(uint16_t addr, void *priv) break; case 0x03d5: - switch (vid->crtcreg) { - default: - ret = vid->crtc[vid->crtcreg]; - break; - case 0x10: - if (dev->is_sl2) - ret = vid->crtc[vid->crtcreg]; - else - ret = 0x0f; - break; - case 0x11: - if (dev->is_sl2) - ret = vid->crtc[vid->crtcreg]; - else - ret = 0x78; - break; - } + ret = vid->crtc[vid->crtcreg]; break; case 0x03da: ret = vid->stat; break; + case 0x3db: + if (dev->is_sl2 && (vid->lp_strobe == 1)) + vid->lp_strobe = 0; + break; + + case 0x3dc: + if (dev->is_sl2 && (vid->lp_strobe == 0)) { + vid->lp_strobe = 1; + vid_update_latch(vid); + } + break; + default: break; } diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index b5590c2c0..c58c319df 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -70,6 +70,15 @@ static video_timings_t timing_cga = { .type = VIDEO_ISA, .write_b = 8, .write_w void cga_recalctimings(cga_t *cga); +static void +cga_update_latch(cga_t *cga) +{ + uint32_t lp_latch = cga->displine * cga->crtc[1]; + + cga->crtc[0x10] = (lp_latch >> 8) & 0x3f; + cga->crtc[0x11] = lp_latch & 0xff; +} + void cga_out(uint16_t addr, uint8_t val, void *priv) { @@ -87,7 +96,7 @@ cga_out(uint16_t addr, uint8_t val, void *priv) old = cga->crtc[cga->crtcreg]; cga->crtc[cga->crtcreg] = val & crtcmask[cga->crtcreg]; if (old != val) { - if ((cga->crtcreg < 0xe) || (cga->crtcreg > 0x10)) { + if ((cga->crtcreg < 0xe) || (cga->crtcreg > 0x11)) { cga->fullchange = changeframecount; cga_recalctimings(cga); } @@ -111,6 +120,17 @@ cga_out(uint16_t addr, uint8_t val, void *priv) cga_recalctimings(cga); return; + case 0x3DB: + if (cga->lp_strobe == 1) + cga->lp_strobe = 0; + return; + case 0x3DC: + if (cga->lp_strobe == 0) { + cga->lp_strobe = 1; + cga_update_latch(cga); + } + return; + default: break; } @@ -119,8 +139,7 @@ cga_out(uint16_t addr, uint8_t val, void *priv) uint8_t cga_in(uint16_t addr, void *priv) { - const cga_t *cga = (cga_t *) priv; - + cga_t *cga = (cga_t *) priv; uint8_t ret = 0xff; if ((addr >= 0x3d0) && (addr <= 0x3d7)) @@ -131,22 +150,23 @@ cga_in(uint16_t addr, void *priv) ret = cga->crtcreg; break; case 0x3D5: - switch (cga->crtcreg) { - default: - ret = cga->crtc[cga->crtcreg]; - break; - case 0x10: - ret = 0x0f; - break; - case 0x11: - ret = 0x78; - break; - } + ret = cga->crtc[cga->crtcreg]; break; case 0x3DA: ret = cga->cgastat; break; + case 0x3DB: + if (cga->lp_strobe == 1) + cga->lp_strobe = 0; + break; + case 0x3DC: + if (cga->lp_strobe == 0) { + cga->lp_strobe = 1; + cga_update_latch(cga); + } + break; + default: break; } From 4c086d543c515141d90900158fe1b94faea7d984 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 26 Sep 2024 07:16:05 +0200 Subject: [PATCH 463/624] Tandy 1000 SX/HX: Fix the condition for the latch pen strobe reads and writes, fixes Jungle Hunt freezing on Tandy again. --- src/machine/m_tandy.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/machine/m_tandy.c b/src/machine/m_tandy.c index 2fdc491f9..11bd41a66 100644 --- a/src/machine/m_tandy.c +++ b/src/machine/m_tandy.c @@ -827,12 +827,12 @@ vid_out(uint16_t addr, uint8_t val, void *priv) break; case 0x3db: - if (dev->is_sl2 && (vid->lp_strobe == 1)) + if (!dev->is_sl2 && (vid->lp_strobe == 1)) vid->lp_strobe = 0; break; case 0x3dc: - if (dev->is_sl2 && (vid->lp_strobe == 0)) { + if (!dev->is_sl2 && (vid->lp_strobe == 0)) { vid->lp_strobe = 1; vid_update_latch(vid); } @@ -894,12 +894,12 @@ vid_in(uint16_t addr, void *priv) break; case 0x3db: - if (dev->is_sl2 && (vid->lp_strobe == 1)) + if (!dev->is_sl2 && (vid->lp_strobe == 1)) vid->lp_strobe = 0; break; case 0x3dc: - if (dev->is_sl2 && (vid->lp_strobe == 0)) { + if (!dev->is_sl2 && (vid->lp_strobe == 0)) { vid->lp_strobe = 1; vid_update_latch(vid); } From 625da7cab6f7abfe4ee972c57c05c3f33ef1cd53 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 26 Sep 2024 22:14:28 +0200 Subject: [PATCH 464/624] PIIX3: Fix MIRQ0 / legacy IRQ switch, fixes #4861. --- src/chipset/intel_piix.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index 1f95c28b3..c6a6fc0ac 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -599,9 +599,9 @@ piix_write(int func, int addr, uint8_t val, void *priv) pci_set_mirq_routing(PCI_MIRQ0 + (addr & 0x01), val & 0xf); if (dev->type == 3) { if (val & 0x20) - sff_set_irq_mode(dev->bm[1], IRQ_MODE_MIRQ_0); - else sff_set_irq_mode(dev->bm[1], IRQ_MODE_LEGACY); + else + sff_set_irq_mode(dev->bm[1], IRQ_MODE_MIRQ_0); } piix_log("MIRQ%i is %s\n", addr & 0x01, (val & 0x20) ? "disabled" : "enabled"); } From 962c9cdf2ff43fdab96d444930a1c0dbad0cee3d Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 26 Sep 2024 23:18:38 +0200 Subject: [PATCH 465/624] S3 Pre-ViRGE changes of the day (September 26th, 2024) 1. Actually fix the remaining pinkish/reddish stuff in 32bpp modes properly (for real, especially OS/2 and possibly other stuff). 2. The Compare accel stuff is more sanitized. 3. When the BitBLT DY coordinates are negative, don't draw the pixels. This fixes some software cursor issues with OS/2's S3 3.03.xx drivers. 4. Reset the FIFO when the card is reset. 5. Indentation fixes (to be improved further however). 6. Implement bit 5 functionality of 0xBEE8 index 0xE (MULT_MISC) (and currently only in the Rectangle Fill command). This fixes missing text on I-O Data Vision968 specific drivers for Windows 3.10 Japanese (PC/AT compatible) 7. Moved the Streams engine out of the FIFO (like the ViRGE) as well as making all CRTC's of the Trio64V2 writable and SEQREGs from 0x10 onwards to make sure the Streams engine works properly. 8. Added a missing break from the RAMDAC read stuff. 9. Remove a leftover of PCem. --- src/video/vid_s3.c | 1920 ++++++++++++++++++++++++++++++-------------- 1 file changed, 1307 insertions(+), 613 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 27d4f023e..4a0ffc993 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -365,7 +365,7 @@ typedef struct s3_t { event_t *wake_fifo_thread; event_t *fifo_not_full_event; - int blitter_busy; + atomic_int blitter_busy; uint64_t blitter_time; uint64_t status_time; @@ -950,6 +950,10 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0x9ae9: s3->accel.cmd = (s3->accel.cmd & 0xff) | (val << 8); s3->accel.ssv_state = 0; + if (s3->bpp == 3) { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] &= ~0x10; + } s3->accel_start(-1, 0, 0xffffffff, 0, s3); break; @@ -985,20 +989,50 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xa148: case 0xa2e8: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16); - else + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16); + else + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x000000ff) | val; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16); + else + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x000000ff) | val; + } + } else s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x000000ff) | val; break; case 0xa149: case 0xa2e9: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24); - else - s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8); - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24); + else + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8); + s3->accel.multifunc[0xe] ^= 0x10; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24); + else + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8); + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8); + + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) + s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->chip >= S3_VISION964) { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } if (s3->accel.color_16bit_check) s3->accel.bkgd_color_actual[1] = s3->accel.bkgd_color & 0xff; else @@ -1006,43 +1040,79 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa14a: case 0xa2ea: - if (s3->accel.multifunc[0xe] & 0x200) - s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16); - else if (s3->bpp == 3) { - if (s3->accel.multifunc[0xe] & 0x10) + if (s3->chip >= S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x200) s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16); - else - s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x000000ff) | val; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x00ff0000) | (val << 16); + else + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x000000ff) | val; + } } break; case 0xa14b: case 0xa2eb: - if (s3->accel.multifunc[0xe] & 0x200) - s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24); - else if (s3->bpp == 3) { - if (s3->accel.multifunc[0xe] & 0x10) + if (s3->chip >= S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x200) s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24); - else - s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8); - s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0xff000000) | (val << 24); + else + s3->accel.bkgd_color = (s3->accel.bkgd_color & ~0x0000ff00) | (val << 8); + + s3->accel.multifunc[0xe] ^= 0x10; + } } break; case 0xa548: case 0xa6e8: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16); - else + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16); + else + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x000000ff) | val; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16); + else + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x000000ff) | val; + } + } else s3->accel.frgd_color = (s3->accel.frgd_color & ~0x000000ff) | val; break; case 0xa549: case 0xa6e9: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24); - else + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24); + else + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x0000ff00) | (val << 8); + + s3->accel.multifunc[0xe] ^= 0x10; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24); + else + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x0000ff00) | (val << 8); + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { s3->accel.frgd_color = (s3->accel.frgd_color & ~0x0000ff00) | (val << 8); - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) + s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->chip >= S3_VISION964) { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } if (s3->accel.color_16bit_check) s3->accel.frgd_color_actual[1] = s3->accel.frgd_color & 0xff; @@ -1051,43 +1121,79 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa54a: case 0xa6ea: - if (s3->accel.multifunc[0xe] & 0x200) - s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16); - else if (s3->bpp == 3) { - if (s3->accel.multifunc[0xe] & 0x10) + if (s3->chip >= S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x200) s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16); - else - s3->accel.frgd_color = (s3->accel.frgd_color & ~0x000000ff) | val; + else if (s3->bpp == 3) { + if ((s3->accel.multifunc[0xe] & 0x10)) + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x00ff0000) | (val << 16); + else + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x000000ff) | val; + } } break; case 0xa54b: case 0xa6eb: - if (s3->accel.multifunc[0xe] & 0x200) - s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24); - else if (s3->bpp == 3) { - if (s3->accel.multifunc[0xe] & 0x10) + if (s3->chip >= S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x200) s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24); - else - s3->accel.frgd_color = (s3->accel.frgd_color & ~0x0000ff00) | (val << 8); - s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.frgd_color = (s3->accel.frgd_color & ~0xff000000) | (val << 24); + else + s3->accel.frgd_color = (s3->accel.frgd_color & ~0x0000ff00) | (val << 8); + + s3->accel.multifunc[0xe] ^= 0x10; + } } break; case 0xa948: case 0xaae8: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); - else + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); + else + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x000000ff) | val; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); + else + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x000000ff) | val; + } + } else s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x000000ff) | val; break; case 0xa949: case 0xaae9: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24); - else + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24); + else + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x0000ff00) | (val << 8); + + s3->accel.multifunc[0xe] ^= 0x10; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24); + else + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x0000ff00) | (val << 8); + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x0000ff00) | (val << 8); - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) + s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->chip >= S3_VISION964) { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } if (s3->accel.color_16bit_check) s3->accel.wrt_mask_actual[1] = s3->accel.wrt_mask & 0xff; @@ -1096,83 +1202,296 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa94a: case 0xaaea: - if (s3->accel.multifunc[0xe] & 0x200) - s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); - else if (s3->bpp == 3) { - if (s3->accel.multifunc[0xe] & 0x10) + if (s3->chip >= S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x200) s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); - else - s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x000000ff) | val; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x00ff0000) | (val << 16); + else + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x000000ff) | val; + } } break; case 0xa94b: case 0xaaeb: - if (s3->accel.multifunc[0xe] & 0x200) - s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24); - else if (s3->bpp == 3) { - if (s3->accel.multifunc[0xe] & 0x10) + if (s3->chip >= S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x200) s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24); - else - s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x0000ff00) | (val << 8); - s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0xff000000) | (val << 24); + else + s3->accel.wrt_mask = (s3->accel.wrt_mask & ~0x0000ff00) | (val << 8); + + s3->accel.multifunc[0xe] ^= 0x10; + } } break; case 0xad48: case 0xaee8: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16); - else + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16); + else + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x000000ff) | val; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16); + else + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x000000ff) | val; + } + } else s3->accel.rd_mask = (s3->accel.rd_mask & ~0x000000ff) | val; break; case 0xad49: case 0xaee9: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24); - else + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24); + else + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x0000ff00) | (val << 8); + + s3->accel.multifunc[0xe] ^= 0x10; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24); + else + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x0000ff00) | (val << 8); + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { s3->accel.rd_mask = (s3->accel.rd_mask & ~0x0000ff00) | (val << 8); - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) + s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->chip >= S3_VISION964) { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } break; case 0xad4a: case 0xaeea: - if (s3->accel.multifunc[0xe] & 0x200) - s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16); - else if (s3->bpp == 3) { - if (s3->accel.multifunc[0xe] & 0x10) + if (s3->chip >= S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x200) s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16); - else - s3->accel.rd_mask = (s3->accel.rd_mask & ~0x000000ff) | val; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x00ff0000) | (val << 16); + else + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x000000ff) | val; + } } break; case 0xad4b: case 0xaeeb: - if (s3->accel.multifunc[0xe] & 0x200) - s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24); - else if (s3->bpp == 3) { - if (s3->accel.multifunc[0xe] & 0x10) + if (s3->chip >= S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x200) s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24); - else - s3->accel.rd_mask = (s3->accel.rd_mask & ~0x0000ff00) | (val << 8); - s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.rd_mask = (s3->accel.rd_mask & ~0xff000000) | (val << 24); + else + s3->accel.rd_mask = (s3->accel.rd_mask & ~0x0000ff00) | (val << 8); + + s3->accel.multifunc[0xe] ^= 0x10; + } } break; case 0xb148: case 0xb2e8: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.color_cmp = (s3->accel.color_cmp & ~0x00ff0000) | (val << 16); - else - s3->accel.color_cmp = (s3->accel.color_cmp & ~0x000000ff) | val; + if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_86C928)) { + s3->accel.b2e8_pix = 0; + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.color_cmp = (s3->accel.color_cmp & ~0x00ff0000) | (val << 16); + else + s3->accel.color_cmp = (s3->accel.color_cmp & ~0x000000ff) | val; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.color_cmp = (s3->accel.color_cmp & ~0x00ff0000) | (val << 16); + else + s3->accel.color_cmp = (s3->accel.color_cmp & ~0x000000ff) | val; + } + } else + s3->accel.color_cmp = (s3->accel.color_cmp & ~0x000000ff) | val; + } else { + s3->accel.b2e8_pix = 1; + if (s3_cpu_dest(s3)) + break; + s3->accel.pix_trans[0] = val; + if (s3->accel.cmd & 0x100) { + switch (s3->accel.cmd & 0x600) { + case 0x000: + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) + s3->accel_start(8, 1, s3->accel.pix_trans[0], 0, s3); + else + s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); + } else { + if (s3->accel.color_16bit_check_rectfill) { + if (s3->accel.color_16bit_check) { + if (s3->accel.pix_trans_x_count < s3->accel.pix_trans_ptr_cnt) { + s3_log("Byte: CPU data CMD=%04x, byte write=%02x, cnt=%d, " + "check=%d.\n", s3->accel.cmd, val, + s3->accel.pix_trans_x_count, s3->accel.color_16bit_check); + s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count] = val; + s3->accel.pix_trans_x_count++; + s3->accel.pix_trans_x_count2 = s3->accel.pix_trans_x_count; + } + } else { + if (s3->accel.pix_trans_x_count2 < s3->accel.pix_trans_ptr_cnt) { + s3_log("Byte: CPU data CMD=%04x, byte write=%02x, cnt=%d, " + "check=%d.\n", s3->accel.cmd, val, + s3->accel.pix_trans_x_count2, s3->accel.color_16bit_check); + s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count2] = val; + s3->accel.pix_trans_x_count2++; + } + s3_log("WriteCNT=%d, TotalCNT=%d.\n", s3->accel.pix_trans_x_count2, + s3->accel.pix_trans_ptr_cnt); + if (s3->accel.pix_trans_x_count2 == s3->accel.pix_trans_ptr_cnt) { + for (int i = 0; i < s3->accel.pix_trans_ptr_cnt; i += 2) { + s3_log("Transferring write count=%d, bytes=%04x.\n", i, + s3->accel.pix_trans_ptr[i] | + (s3->accel.pix_trans_ptr[i + 1] << 8)); + s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans_ptr[i] | + (s3->accel.pix_trans_ptr[i + 1] << 8), s3); + } + + s3->accel.pix_trans_x_count2 = 0; + s3->accel.color_16bit_check_rectfill = 0; + if (s3->accel.pix_trans_ptr != NULL) { + free(s3->accel.pix_trans_ptr); + s3->accel.pix_trans_ptr = NULL; + } + } + } + break; + } + s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); + } + break; + + default: + break; + } + } + } break; case 0xb149: case 0xb2e9: - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24); - else - s3->accel.color_cmp = (s3->accel.color_cmp & ~0x0000ff00) | (val << 8); - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_86C928)) { + s3->accel.b2e8_pix = 0; + if (s3->bpp == 3) { + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { + if (s3->accel.multifunc[0xe] & 0x10) + s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24); + else + s3->accel.color_cmp = (s3->accel.color_cmp & ~0x0000ff00) | (val << 8); + + s3->accel.multifunc[0xe] ^= 0x10; + } else if (s3->chip >= S3_VISION964) { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24); + else + s3->accel.color_cmp = (s3->accel.color_cmp & ~0x0000ff00) | (val << 8); + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { + s3->accel.color_cmp = (s3->accel.color_cmp & ~0x0000ff00) | (val << 8); + + if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) + s3->accel.multifunc[0xe] ^= 0x10; + else if (s3->chip >= S3_VISION964) { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } + } else { + s3->accel.b2e8_pix = 1; + if (s3_cpu_dest(s3)) + break; + s3->accel.pix_trans[1] = val; + if (s3->accel.cmd & 0x100) { + switch (s3->accel.cmd & 0x600) { + case 0x000: + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.frgd_mix & 0x60) != 0x40) || + ((s3->accel.bkgd_mix & 0x60) != 0x40)) + s3->accel_start(8, 1, s3->accel.pix_trans[0] | + (s3->accel.pix_trans[1] << 8), 0, s3); + else + s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0] | + (s3->accel.pix_trans[1] << 8), s3); + } else + s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0] | + (s3->accel.pix_trans[1] << 8), s3); + break; + case 0x200: + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.frgd_mix & 0x60) != 0x40) || + ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + if (s3->accel.cmd & 0x1000) + s3->accel_start(16, 1, s3->accel.pix_trans[1] | + (s3->accel.pix_trans[0] << 8), 0, s3); + else + s3->accel_start(16, 1, s3->accel.pix_trans[0] | + (s3->accel.pix_trans[1] << 8), 0, s3); + } else { + if (s3->accel.cmd & 0x1000) + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[1] | + (s3->accel.pix_trans[0] << 8), s3); + else + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | + (s3->accel.pix_trans[1] << 8), s3); + } + } else { + if (s3->accel.cmd & 0x1000) + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[1] | + (s3->accel.pix_trans[0] << 8), s3); + else + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | + (s3->accel.pix_trans[1] << 8), s3); + } + break; + case 0x400: + if (svga->crtc[0x53] & 0x08) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) + s3->accel_start(32, 1, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), 0, s3); + else + s3->accel_start(4, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), s3); + } else + s3->accel_start(4, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), s3); + } + break; + case 0x600: + if (s3->chip == S3_TRIO32 || s3->chip == S3_VISION968 || s3->chip == S3_VISION868 || s3->chip >= S3_TRIO64V) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + s3->accel_start(8, 1, s3->accel.pix_trans[1], 0, s3); + s3->accel_start(8, 1, s3->accel.pix_trans[0], 0, s3); + } + } + } + break; + + default: + break; + } + + } + } break; case 0xb14a: case 0xb2ea: @@ -1194,6 +1513,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.color_cmp = (s3->accel.color_cmp & ~0xff000000) | (val << 24); else s3->accel.color_cmp = (s3->accel.color_cmp & ~0x0000ff00) | (val << 8); + s3->accel.multifunc[0xe] ^= 0x10; } break; @@ -1391,9 +1711,6 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; s3->accel.pix_trans[1] = val; if (s3->accel.cmd & 0x100) { - s3_log("S3 PIXTRANS_B write (E2E9): cmd=%03x, pixelcntl=%02x, frgdmix=%02x, " - "bkgdmix=%02x, curx=%d, val=%04x.\n", s3->accel.cmd, s3->accel.multifunc[0x0a], - s3->accel.frgd_mix, s3->accel.bkgd_mix, s3->accel.cur_x, val); switch (s3->accel.cmd & 0x600) { case 0x000: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { @@ -1541,13 +1858,26 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) static void s3_accel_out_fifo_w(s3_t *s3, uint16_t port, uint16_t val) { - if (port != 0x9ee8 && port != 0x9d48) { - if (port == 0xb2e8 || port == 0xb148) { - s3->accel.b2e8_pix = 1; + if ((port != 0x9ee8) && (port != 0x9d48)) { + if ((port == 0xb2e8) || (port == 0xb148)) { + if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_86C928)) { + s3->accel.b2e8_pix = 0; + s3_accel_out_fifo(s3, port, val); + s3_accel_out_fifo(s3, port + 1, val >> 8); + } else { + s3->accel.b2e8_pix = 1; + s3_accel_out_pixtrans_w(s3, val); + } } else { + s3_log("Port WriteW FIFO=%04x, val=%04x, bussize=%03x.\n", port, val, s3->accel.cmd & 0x600); s3->accel.b2e8_pix = 0; + if ((port == 0xe2e8) || (port == 0xe2ea) || (port == 0xe148) || (port == 0xe14a)) + s3_accel_out_pixtrans_w(s3, val); + else { + s3_accel_out_fifo(s3, port, val); + s3_accel_out_fifo(s3, port + 1, val >> 8); + } } - s3_accel_out_pixtrans_w(s3, val); } else { s3->accel.short_stroke = val; s3->accel.ssv_state = 1; @@ -1568,12 +1898,29 @@ s3_accel_out_fifo_w(s3_t *s3, uint16_t port, uint16_t val) static void s3_accel_out_fifo_l(s3_t *s3, uint16_t port, uint32_t val) { - if (port == 0xb2e8 || port == 0xb148) - s3->accel.b2e8_pix = 1; - else + if ((port == 0xb2e8) || (port == 0xb148)) { + if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_86C928)) { + s3->accel.b2e8_pix = 0; + s3_accel_out_fifo(s3, port, val); + s3_accel_out_fifo(s3, port + 1, val >> 8); + s3_accel_out_fifo(s3, port + 2, val >> 16); + s3_accel_out_fifo(s3, port + 3, val >> 24); + } else { + s3->accel.b2e8_pix = 1; + s3_accel_out_pixtrans_l(s3, val); + } + } else { s3->accel.b2e8_pix = 0; - - s3_accel_out_pixtrans_l(s3, val); + s3_log("Port WriteL FIFO=%04x, val=%08x, bussize=%03x.\n", port, val, s3->accel.cmd & 0x600); + if ((port == 0xe2e8) || (port == 0xe148)) + s3_accel_out_pixtrans_l(s3, val); + else { + s3_accel_out_fifo(s3, port, val); + s3_accel_out_fifo(s3, port + 1, val >> 8); + s3_accel_out_fifo(s3, port + 2, val >> 16); + s3_accel_out_fifo(s3, port + 3, val >> 24); + } + } } static void @@ -1749,77 +2096,7 @@ s3_accel_write_fifo(s3_t *s3, uint32_t addr, uint8_t val) s3->accel_start(1, 1, 0xffffffff, val | (val << 8) | (val << 16) | (val << 24), s3); } } else { - switch (addr & 0x1ffff) { - case 0x83b0: - case 0x83b1: - case 0x83b2: - case 0x83b3: - case 0x83b4: - case 0x83b5: - case 0x83b6: - case 0x83b7: - case 0x83b8: - case 0x83b9: - case 0x83ba: - case 0x83bb: - case 0x83bc: - case 0x83bd: - case 0x83be: - case 0x83bf: - case 0x83c0: - case 0x83c1: - case 0x83c2: - case 0x83c3: - case 0x83c4: - case 0x83c5: - case 0x83c6: - case 0x83c7: - case 0x83c8: - case 0x83c9: - case 0x83ca: - case 0x83cb: - case 0x83cc: - case 0x83cd: - case 0x83ce: - case 0x83cf: - case 0x83d0: - case 0x83d1: - case 0x83d2: - case 0x83d3: - case 0x83d4: - case 0x83d5: - case 0x83d6: - case 0x83d7: - case 0x83d8: - case 0x83d9: - case 0x83da: - case 0x83db: - case 0x83dc: - case 0x83dd: - case 0x83de: - case 0x83df: - s3_out(addr & 0x3ff, val, s3); - break; - case 0x8504: - s3->subsys_stat &= ~val; - s3_update_irqs(s3); - break; - case 0x8505: - s3->subsys_cntl = val; - s3_update_irqs(s3); - break; - case 0x850c: - s3->accel.advfunc_cntl = val; - s3_updatemapping(s3); - break; - case 0xff20: - s3->serialport = val; - i2c_gpio_set(s3->i2c, !!(val & SERIAL_PORT_SCW), !!(val & SERIAL_PORT_SDW)); - break; - default: - s3_accel_out_fifo(s3, addr & 0xffff, val); - break; - } + s3_accel_out_fifo(s3, addr & 0xffff, val); } } else { if (addr & 0x8000) { @@ -1858,45 +2135,21 @@ mmio_byte_write: static void s3_accel_write_fifo_w(s3_t *s3, uint32_t addr, uint16_t val) { - const svga_t *svga = &s3->svga; - - if (svga->crtc[0x53] & 0x08) { - if ((addr & 0x1fffe) < 0x8000) { - s3_accel_out_pixtrans_w(s3, val); - } else { - switch (addr & 0x1fffe) { - default: - case 0x83d4: - s3_accel_write_fifo(s3, addr, val); - s3_accel_write_fifo(s3, addr + 1, val >> 8); - break; - case 0xff20: - s3_accel_write_fifo(s3, addr, val); - break; - case 0x811c: - s3_accel_out_fifo_w(s3, 0x9ee8, val); - break; - } - } - } else { - if (addr & 0x8000) { - if (addr == 0x811c) - s3_accel_out_fifo_w(s3, 0x9ee8, val); + if ((addr & 0x1fffe) < 0x8000) { + s3_accel_out_pixtrans_w(s3, val); + } else if ((addr & 0x1fffe) == 0x811c) { + s3_accel_out_fifo_w(s3, 0x9ee8, val); + } else if (((addr & 0x1fffe) >= 0x8000) && (addr & 0x1fffe) < 0x10000) { + if (((addr & 0x1fffe) == 0xe2e8) || ((addr & 0x1fffe) == 0xe2ea)) { + if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || (s3->chip == S3_86C928) || (s3->chip == S3_86C928PCI)) + s3_accel_out_pixtrans_w(s3, val); else { - if ((addr == 0xe2e8) || (addr == 0xe2ea)) { - if ((s3->chip == S3_86C801) || (s3->chip == S3_86C805) || (s3->chip == S3_86C928) || (s3->chip == S3_86C928PCI)) - s3_accel_out_pixtrans_w(s3, val); - else { - s3_accel_write_fifo(s3, addr, val); - s3_accel_write_fifo(s3, addr + 1, val >> 8); - } - } else { - s3_accel_write_fifo(s3, addr, val); - s3_accel_write_fifo(s3, addr + 1, val >> 8); - } + s3_accel_write_fifo(s3, addr, val); + s3_accel_write_fifo(s3, addr + 1, val >> 8); } } else { - s3_accel_out_pixtrans_w(s3, val); + s3_accel_write_fifo(s3, addr, val); + s3_accel_write_fifo(s3, addr + 1, val >> 8); } } } @@ -1904,221 +2157,78 @@ s3_accel_write_fifo_w(s3_t *s3, uint32_t addr, uint16_t val) static void s3_accel_write_fifo_l(s3_t *s3, uint32_t addr, uint32_t val) { - svga_t *svga = &s3->svga; + if ((addr & 0x1fffc) >= 0x10000 && (addr & 0x1fffc) < 0x18000) { + s3_visionx68_video_engine_op(val, s3); + } else if ((addr & 0x1fffc) < 0x8000) { + s3_accel_out_pixtrans_l(s3, val); + } else if ((addr & 0x1fffc) >= 0x18000) { + switch (addr & 0x1fffc) { + case 0x18080: + s3->videoengine.nop = 1; + break; - if (svga->crtc[0x53] & 0x08) { - if ((addr & 0x1fffc) < 0x8000 || ((addr & 0x1fffc) >= 0x10000 && (addr & 0x1fffc) < 0x18000)) { - if ((addr & 0x1fffc) >= 0x10000 && (addr & 0x1fffc) < 0x18000) { - s3_visionx68_video_engine_op(val, s3); - } else if ((addr & 0x1fffc) < 0x8000) { - s3_accel_out_pixtrans_l(s3, val); - } - } else { - switch (addr & 0x1fffc) { - case 0x8180: - s3->streams.pri_ctrl = val; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x8184: - s3->streams.chroma_ctrl = val; - break; - case 0x8190: - s3->streams.sec_ctrl = val; - s3->streams.dda_horiz_accumulator = val & 0xfff; - if (val & (1 << 11)) - s3->streams.dda_horiz_accumulator |= 0xfffff800; - s3->streams.sdif = (val >> 24) & 7; - break; - case 0x8194: - s3->streams.chroma_upper_bound = val; - break; - case 0x8198: - s3->streams.sec_filter = val; - s3->streams.k1_horiz_scale = val & 0x7ff; - if (val & (1 << 10)) - s3->streams.k1_horiz_scale |= 0xfffff800; - s3->streams.k2_horiz_scale = (val >> 16) & 0x7ff; - if ((val >> 16) & (1 << 10)) - s3->streams.k2_horiz_scale |= 0xfffff800; - break; - case 0x81a0: - s3->streams.blend_ctrl = val; - break; - case 0x81c0: - s3->streams.pri_fb0 = val & 0x3fffff; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81c4: - s3->streams.pri_fb1 = val & 0x3fffff; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81c8: - s3->streams.pri_stride = val & 0xfff; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81cc: - s3->streams.buffer_ctrl = val; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81d0: - s3->streams.sec_fb0 = val; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81d4: - s3->streams.sec_fb1 = val; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81d8: - s3->streams.sec_stride = val; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81dc: - s3->streams.overlay_ctrl = val; - break; - case 0x81e0: - s3->streams.k1_vert_scale = val & 0x7ff; - if (val & (1 << 10)) - s3->streams.k1_vert_scale |= 0xfffff800; - break; - case 0x81e4: - s3->streams.k2_vert_scale = val & 0x7ff; - if (val & (1 << 10)) - s3->streams.k2_vert_scale |= 0xfffff800; - break; - case 0x81e8: - s3->streams.dda_vert_accumulator = val & 0xfff; - if (val & (1 << 11)) - s3->streams.dda_vert_accumulator |= 0xfffff800; - break; - case 0x81ec: - s3->streams.fifo_ctrl = val; - break; - case 0x81f0: - s3->streams.pri_start = val; - s3->streams.pri_x = (val >> 16) & 0x7ff; - s3->streams.pri_y = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81f4: - s3->streams.pri_size = val; - s3->streams.pri_w = (val >> 16) & 0x7ff; - s3->streams.pri_h = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81f8: - s3->streams.sec_start = val; - s3->streams.sec_x = (val >> 16) & 0x7ff; - s3->streams.sec_y = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; - case 0x81fc: - s3->streams.sec_size = val; - s3->streams.sec_w = (val >> 16) & 0x7ff; - s3->streams.sec_h = val & 0x7ff; - svga_recalctimings(svga); - svga->fullchange = svga->monitor->mon_changeframecount; - break; + case 0x18088: + s3->videoengine.cntl = val; + s3->videoengine.dda_init_accumulator = val & 0xfff; + s3->videoengine.odf = (val >> 16) & 7; + s3->videoengine.yuv = !!(val & (1 << 19)); + s3->videoengine.idf = (val >> 20) & 7; + s3->videoengine.dither = !!(val & (1 << 29)); + s3->videoengine.dm_index = (val >> 23) & 7; + break; - case 0x8504: - s3->subsys_stat &= ~(val & 0xff); - s3->subsys_cntl = (val >> 8); - s3_update_irqs(s3); - break; + case 0x1808c: + s3->videoengine.stretch_filt_const = val; + s3->videoengine.k2 = val & 0x7ff; + s3->videoengine.k1 = (val >> 16) & 0x7ff; + s3->videoengine.host_data = !!(val & (1 << 30)); + s3->videoengine.scale_down = !!(val & (1 << 31)); + break; - case 0x850c: - s3->accel.advfunc_cntl = val & 0xff; - s3_updatemapping(s3); - break; + case 0x18090: + s3->videoengine.src_dst_step = val; + s3->videoengine.dst_step = val & 0x1fff; + s3->videoengine.src_step = (val >> 16) & 0x1fff; + break; - case 0xff20: - s3_accel_write_fifo(s3, addr, val); - break; + case 0x18094: + s3->videoengine.crop = val; + s3->videoengine.len = val & 0xfff; + s3->videoengine.start = (val >> 16) & 0xfff; + s3->videoengine.input = 1; + break; - case 0x18080: - s3->videoengine.nop = 1; - break; + case 0x18098: + s3->videoengine.src_base = val & 0xffffff; + break; - case 0x18088: - s3->videoengine.cntl = val; - s3->videoengine.dda_init_accumulator = val & 0xfff; - s3->videoengine.odf = (val >> 16) & 7; - s3->videoengine.yuv = !!(val & (1 << 19)); - s3->videoengine.idf = (val >> 20) & 7; - s3->videoengine.dither = !!(val & (1 << 29)); - s3->videoengine.dm_index = (val >> 23) & 7; - break; + case 0x1809c: + s3->videoengine.dest_base = val & 0xffffff; + break; - case 0x1808c: - s3->videoengine.stretch_filt_const = val; - s3->videoengine.k2 = val & 0x7ff; - s3->videoengine.k1 = (val >> 16) & 0x7ff; - s3->videoengine.host_data = !!(val & (1 << 30)); - s3->videoengine.scale_down = !!(val & (1 << 31)); - break; - - case 0x18090: - s3->videoengine.src_dst_step = val; - s3->videoengine.dst_step = val & 0x1fff; - s3->videoengine.src_step = (val >> 16) & 0x1fff; - break; - - case 0x18094: - s3->videoengine.crop = val; - s3->videoengine.len = val & 0xfff; - s3->videoengine.start = (val >> 16) & 0xfff; - s3->videoengine.input = 1; - break; - - case 0x18098: - s3->videoengine.src_base = val & 0xffffff; - break; - - case 0x1809c: - s3->videoengine.dest_base = val & 0xffffff; - break; - - default: - s3_accel_write_fifo(s3, addr, val); - s3_accel_write_fifo(s3, addr + 1, val >> 8); - s3_accel_write_fifo(s3, addr + 2, val >> 16); - s3_accel_write_fifo(s3, addr + 3, val >> 24); - break; - } + default: + break; } - } else { - if (addr & 0x8000) { - if (addr == 0xe2e8) { - if ((s3->chip == S3_86C928) || (s3->chip == S3_86C928PCI)) - s3_accel_out_pixtrans_l(s3, val); - else { - s3_accel_write_fifo(s3, addr, val); - s3_accel_write_fifo(s3, addr + 1, val >> 8); - s3_accel_write_fifo(s3, addr + 2, val >> 16); - s3_accel_write_fifo(s3, addr + 3, val >> 24); - } - } else { + } else if (((addr & 0x1fffc) >= 0x8000) && ((addr & 0x1fffc) < 0x10000)) { + if ((addr & 0x1fffc) == 0xe2e8) { + if ((s3->chip == S3_86C928) || (s3->chip == S3_86C928PCI)) + s3_accel_out_pixtrans_l(s3, val); + else { s3_accel_write_fifo(s3, addr, val); s3_accel_write_fifo(s3, addr + 1, val >> 8); s3_accel_write_fifo(s3, addr + 2, val >> 16); s3_accel_write_fifo(s3, addr + 3, val >> 24); } } else { - s3_accel_out_pixtrans_l(s3, val); + s3_accel_write_fifo(s3, addr, val); + s3_accel_write_fifo(s3, addr + 1, val >> 8); + s3_accel_write_fifo(s3, addr + 2, val >> 16); + s3_accel_write_fifo(s3, addr + 3, val >> 24); } } } + static void s3_vblank_start(svga_t *svga) { @@ -2148,7 +2258,7 @@ s3_hwcursor_draw(svga_t *svga, int displine) const s3_t *s3 = (s3_t *) svga->priv; int shift = 1; int width = 16; - uint16_t dat[2]; + uint16_t dat[2] = { 0, 0 }; int xx; int offset = svga->hwcursor_latch.x - svga->hwcursor_latch.xoff; uint32_t fg; @@ -2481,7 +2591,6 @@ s3_trio64v_overlay_draw(svga_t *svga, int displine) { const s3_t *s3 = (s3_t *) svga->priv; int offset = (s3->streams.sec_x - s3->streams.pri_x) + 1; - int h_acc = s3->streams.dda_horiz_accumulator; int r[8]; int g[8]; int b[8]; @@ -2491,7 +2600,7 @@ s3_trio64v_overlay_draw(svga_t *svga, int displine) uint32_t *p; uint8_t *src = &svga->vram[svga->overlay_latch.addr]; - p = &(buffer32->line[displine][offset + svga->x_add]); + p = &((uint32_t *)buffer32->line[displine])[offset + svga->x_add]; if ((offset + s3->streams.sec_w) > s3->streams.pri_w) x_size = (s3->streams.pri_w - s3->streams.sec_x) + 1; @@ -2503,13 +2612,14 @@ s3_trio64v_overlay_draw(svga_t *svga, int displine) for (int x = 0; x < x_size; x++) { *p++ = r[x_read] | (g[x_read] << 8) | (b[x_read] << 16); - h_acc += s3->streams.k1_horiz_scale; - if (h_acc >= 0) { + svga->overlay_latch.h_acc += s3->streams.k1_horiz_scale; + if (svga->overlay_latch.h_acc >= 0) { if ((x_read ^ (x_read + 1)) & ~3) OVERLAY_SAMPLE(); + x_read = (x_read + 1) & 7; - h_acc += (s3->streams.k2_horiz_scale - s3->streams.k1_horiz_scale); + svga->overlay_latch.h_acc += (s3->streams.k2_horiz_scale - s3->streams.k1_horiz_scale); } } @@ -2731,16 +2841,24 @@ s3_out(uint16_t addr, uint8_t val, void *priv) break; case 0x3c5: - if (svga->seqaddr >= 0x10 && svga->seqaddr < 0x20) { - svga->seqregs[svga->seqaddr] = val; - switch (svga->seqaddr) { - case 0x12: - case 0x13: - svga_recalctimings(svga); - return; + if (s3->chip == S3_TRIO64V2) { + if (svga->seqaddr >= 0x10) { + svga->seqregs[svga->seqaddr] = val; + svga_recalctimings(svga); + return; + } + } else { + if (svga->seqaddr >= 0x10 && svga->seqaddr < 0x20) { + svga->seqregs[svga->seqaddr] = val; + switch (svga->seqaddr) { + case 0x12: + case 0x13: + svga_recalctimings(svga); + return; - default: - break; + default: + break; + } } } if (svga->seqaddr == 4) /*Chain-4 - update banking*/ @@ -2813,8 +2931,6 @@ s3_out(uint16_t addr, uint8_t val, void *priv) return; if ((svga->crtcreg == 0x36) && (svga->crtc[0x39] != 0xa5)) return; - if ((s3->chip == S3_TRIO64V2) && (svga->crtcreg >= 0x80)) - return; if ((s3->chip <= S3_86C924) && (svga->crtcreg >= 0x50)) return; @@ -2833,6 +2949,7 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x50: s3->bpp = (svga->crtc[0x50] >> 4) & 3; + s3_log("S3 BPP=%d.\n", s3->bpp); if (s3->bpp == 3) { if (!(s3->accel.multifunc[0xe] & 0x200)) /*On True Color mode change, reset bit 4 of Misc Index register*/ s3->accel.multifunc[0xe] &= ~0x10; @@ -3084,7 +3201,7 @@ s3_in(uint16_t addr, void *priv) break; case 0x3c5: - if (svga->seqaddr >= 0x10 && svga->seqaddr < 0x20) { + if ((svga->seqaddr >= 0x10 && svga->seqaddr < 0x20) && (s3->chip < S3_TRIO64V2)) { temp = svga->seqregs[svga->seqaddr]; /* This is needed for the Intel Advanced/ATX's built-in S3 Trio64V+ BIOS to not get stuck in an infinite loop. */ @@ -3093,6 +3210,8 @@ s3_in(uint16_t addr, void *priv) (s3->card_type == S3_CARDEX_TRIO64VPLUS)) && (svga->seqaddr == 0x17)) svga->seqregs[svga->seqaddr] ^= 0x01; return temp; + } if ((svga->seqaddr >= 0x10) && (s3->chip >= S3_TRIO64V2)) { + return svga->seqregs[svga->seqaddr]; } else if ((svga->seqaddr >= 5) && (svga->seqaddr < 8)) return 0xff; else @@ -3131,6 +3250,7 @@ s3_in(uint16_t addr, void *priv) return sc1502x_ramdac_in(addr, svga->ramdac, svga); else return sdac_ramdac_in(addr, rs2, svga->ramdac, svga); + break; case 0x3d4: return svga->crtcreg; @@ -3382,7 +3502,6 @@ s3_recalctimings(svga_t *svga) #endif if ((svga->crtc[0x3a] & 0x10) && !svga->lowres) { - svga->vram_display_mask = s3->vram_mask; s3_log("BPP=%d, pitch=%d, width=%02x, double?=%x, 16bit?=%d, highres?=%d, " "attr=%02x, hdisp=%d.\n", svga->bpp, s3->width, svga->crtc[0x50], svga->crtc[0x31] & 0x02, s3->color_16bit, s3->accel.advfunc_cntl & 4, @@ -4144,12 +4263,11 @@ s3_recalctimings(svga_t *svga) default: break; } + svga->vram_display_mask = s3->vram_mask; } else { - svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { if (svga->crtc[0x31] & 0x08) { - svga->vram_display_mask = s3->vram_mask; if (svga->bpp == 8) { if (!(svga->crtc[0x5e] & 0x04)) svga->vblankstart = svga->dispend; /*Applies only to Enhanced modes*/ @@ -4158,9 +4276,13 @@ s3_recalctimings(svga_t *svga) svga->render = svga_render_8bpp_highres; svga->rowoffset <<= 1; } - } - } - } + svga->vram_display_mask = s3->vram_mask; + } else + svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; + } else + svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; + } else + svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; } if ((s3->chip == S3_TRIO32) || (s3->chip == S3_TRIO64) || (s3->chip == S3_VISION864)) @@ -4272,7 +4394,6 @@ s3_trio64v_recalctimings(svga_t *svga) svga->lowres = (!!(svga->attrregs[0x10] & 0x40) && !(svga->crtc[0x3a] & 0x10)); if ((svga->crtc[0x3a] & 0x10) && !svga->lowres) { - svga->vram_display_mask = s3->vram_mask; switch (svga->bpp) { case 8: svga->render = svga_render_8bpp_highres; @@ -4299,9 +4420,9 @@ s3_trio64v_recalctimings(svga_t *svga) default: break; } + svga->vram_display_mask = s3->vram_mask; } else svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; - } else /*Streams mode*/ { if (s3->streams.buffer_ctrl & 1) @@ -4323,20 +4444,22 @@ s3_trio64v_recalctimings(svga_t *svga) svga->overlay.addr = s3->streams.sec_fb0; svga->overlay.ena = (svga->overlay.x >= 0); + svga->overlay.h_acc = s3->streams.dda_horiz_accumulator; svga->overlay.v_acc = s3->streams.dda_vert_accumulator; svga->rowoffset = s3->streams.pri_stride >> 3; - svga->vram_display_mask = s3->vram_mask; + if (svga->overlay.ena) { + svga->overlay.ena = (((s3->streams.blend_ctrl >> 24) & 7) == 0b000) || + (((s3->streams.blend_ctrl >> 24) & 7) == 0b101); + } switch ((s3->streams.pri_ctrl >> 24) & 0x7) { case 0: /*RGB-8 (CLUT)*/ svga->render = svga_render_8bpp_highres; break; case 3: /*KRGB-16 (1.5.5.5)*/ - svga->multiplier = 0.5; svga->render = svga_render_15bpp_highres; break; case 5: /*RGB-16 (5.6.5)*/ - svga->multiplier = 0.5; svga->render = svga_render_16bpp_highres; break; case 6: /*RGB-24 (8.8.8)*/ @@ -4349,6 +4472,7 @@ s3_trio64v_recalctimings(svga_t *svga) default: break; } + svga->vram_display_mask = s3->vram_mask; } svga->hoverride = 1; @@ -4411,8 +4535,6 @@ s3_updatemapping(s3_t *s3) else s3->linear_base &= 0x00ffffff; } - - s3_log("LinearBase=%x, crtc58bits=%x.\n", s3->linear_base, svga->crtc[0x58] & 0x13); if ((svga->crtc[0x58] & 0x10) || (s3->accel.advfunc_cntl & 0x10)) { /*Linear framebuffer*/ mem_mapping_disable(&svga->mapping); @@ -4478,8 +4600,8 @@ s3_updatemapping(s3_t *s3) mem_mapping_set_addr(&s3->mmio_mapping, 0xb8000, 0x8000); else mem_mapping_set_addr(&s3->mmio_mapping, 0xa0000, 0x10000); - } - mem_mapping_enable(&s3->mmio_mapping); + } else + mem_mapping_enable(&s3->mmio_mapping); } else { mem_mapping_disable(&s3->mmio_mapping); } @@ -4536,11 +4658,12 @@ s3_accel_out(uint16_t port, uint8_t val, void *priv) case 0x4148: case 0x42e8: s3->subsys_stat &= ~val; + s3->accel.subsys_cntl = (s3->accel.subsys_cntl & 0xff00) | val; s3_update_irqs(s3); break; case 0x4149: case 0x42e9: - s3->subsys_cntl = val; + s3->accel.subsys_cntl = (s3->accel.subsys_cntl & 0xff) | (val << 8); s3_update_irqs(s3); break; case 0x4548: @@ -4612,7 +4735,7 @@ s3_accel_in(uint16_t port, void *priv) return s3->subsys_stat; case 0x4149: case 0x42e9: - return s3->subsys_cntl; + return s3->accel.subsys_cntl >> 8; case 0x8148: case 0x82e8: @@ -4684,6 +4807,8 @@ s3_accel_in(uint16_t port, void *priv) case 0x9548: case 0x96e8: if (s3->chip >= S3_86C928) { + if (s3_enable_fifo(s3)) + s3_wait_fifo_idle(s3); return s3->accel.maj_axis_pcnt & 0xff; } break; @@ -4787,9 +4912,20 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.bkgd_color >> 16; - else + + if (s3->bpp == 3) { + if (s3->chip < S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.bkgd_color >> 16; + else + temp2 = s3->accel.bkgd_color & 0xff; + } else { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + temp2 = s3->accel.bkgd_color >> 16; + else + temp2 = s3->accel.bkgd_color & 0xff; + } + } else temp2 = s3->accel.bkgd_color & 0xff; return temp2; @@ -4800,13 +4936,34 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.bkgd_color >> 24; - else + + if (s3->bpp == 3) { + if (s3->chip < S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.bkgd_color >> 24; + else + temp2 = s3->accel.bkgd_color >> 8; + + s3->accel.multifunc[0xe] ^= 0x10; + } else { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + temp2 = s3->accel.bkgd_color >> 24; + else + temp2 = s3->accel.bkgd_color >> 8; + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { temp2 = s3->accel.bkgd_color >> 8; - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + if (s3->chip < S3_VISION964) + s3->accel.multifunc[0xe] ^= 0x10; + else { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } return temp2; } break; @@ -4814,32 +4971,51 @@ s3_accel_in(uint16_t port, void *priv) case 0xa2ea: if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.bkgd_color & 0xff; - else - temp2 = s3->accel.bkgd_color >> 16; + if (s3->accel.multifunc[0xe] & 0x200) + temp2 = s3->accel.bkgd_color >> 16; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.bkgd_color & 0xff; + else + temp2 = s3->accel.bkgd_color >> 16; + } return temp2; case 0xa14b: case 0xa2eb: if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.bkgd_color >> 8; - else - temp2 = s3->accel.bkgd_color >> 24; - if (!(s3->accel.multifunc[0xe] & 0x200)) + if (s3->accel.multifunc[0xe] & 0x200) + temp2 = s3->accel.bkgd_color >> 24; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.bkgd_color >> 8; + else + temp2 = s3->accel.bkgd_color >> 24; + s3->accel.multifunc[0xe] ^= 0x10; + } return temp2; case 0xa548: case 0xa6e8: if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.frgd_color >> 16; - else + + if (s3->bpp == 3) { + if (s3->chip < S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.frgd_color >> 16; + else + temp2 = s3->accel.frgd_color & 0xff; + } else { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + temp2 = s3->accel.frgd_color >> 16; + else + temp2 = s3->accel.frgd_color & 0xff; + } + } else temp2 = s3->accel.frgd_color & 0xff; return temp2; @@ -4850,13 +5026,34 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.frgd_color >> 24; - else + + if (s3->bpp == 3) { + if (s3->chip < S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.frgd_color >> 24; + else + temp2 = s3->accel.frgd_color >> 8; + + s3->accel.multifunc[0xe] ^= 0x10; + } else { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + temp2 = s3->accel.frgd_color >> 24; + else + temp2 = s3->accel.frgd_color >> 8; + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { temp2 = s3->accel.frgd_color >> 8; - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + if (s3->chip < S3_VISION964) + s3->accel.multifunc[0xe] ^= 0x10; + else { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } return temp2; } break; @@ -4864,23 +5061,31 @@ s3_accel_in(uint16_t port, void *priv) case 0xa6ea: if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.frgd_color & 0xff; - else - temp2 = s3->accel.frgd_color >> 16; + if (s3->accel.multifunc[0xe] & 0x200) + temp2 = s3->accel.frgd_color >> 16; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.frgd_color & 0xff; + else + temp2 = s3->accel.frgd_color >> 16; + } return temp2; case 0xa54b: case 0xa6eb: if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.frgd_color >> 8; - else - temp2 = s3->accel.frgd_color >> 24; - if (!(s3->accel.multifunc[0xe] & 0x200)) + if (s3->accel.multifunc[0xe] & 0x200) + temp2 = s3->accel.frgd_color >> 24; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.frgd_color >> 8; + else + temp2 = s3->accel.frgd_color >> 24; + s3->accel.multifunc[0xe] ^= 0x10; + } return temp2; case 0xa948: @@ -4888,9 +5093,20 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.wrt_mask >> 16; - else + + if (s3->bpp == 3) { + if (s3->chip < S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.wrt_mask >> 16; + else + temp2 = s3->accel.wrt_mask & 0xff; + } else { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + temp2 = s3->accel.wrt_mask >> 16; + else + temp2 = s3->accel.wrt_mask & 0xff; + } + } else temp2 = s3->accel.wrt_mask & 0xff; return temp2; @@ -4901,13 +5117,34 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.wrt_mask >> 24; - else + + if (s3->bpp == 3) { + if (s3->chip < S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.wrt_mask >> 24; + else + temp2 = s3->accel.wrt_mask >> 8; + + s3->accel.multifunc[0xe] ^= 0x10; + } else { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + temp2 = s3->accel.wrt_mask >> 24; + else + temp2 = s3->accel.wrt_mask >> 8; + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { temp2 = s3->accel.wrt_mask >> 8; - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + if (s3->chip < S3_VISION964) + s3->accel.multifunc[0xe] ^= 0x10; + else { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } return temp2; } break; @@ -4915,23 +5152,31 @@ s3_accel_in(uint16_t port, void *priv) case 0xaaea: if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.wrt_mask & 0xff; - else - temp2 = s3->accel.wrt_mask >> 16; + if (s3->accel.multifunc[0xe] & 0x200) + temp2 = s3->accel.wrt_mask >> 16; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.wrt_mask & 0xff; + else + temp2 = s3->accel.wrt_mask >> 16; + } return temp2; case 0xa94b: case 0xaaeb: if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.wrt_mask >> 8; - else - temp2 = s3->accel.wrt_mask >> 24; - if (!(s3->accel.multifunc[0xe] & 0x200)) + if (s3->accel.multifunc[0xe] & 0x200) + temp2 = s3->accel.wrt_mask >> 24; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.wrt_mask >> 8; + else + temp2 = s3->accel.wrt_mask >> 24; + s3->accel.multifunc[0xe] ^= 0x10; + } return temp2; case 0xad48: @@ -4939,9 +5184,20 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.rd_mask >> 16; - else + + if (s3->bpp == 3) { + if (s3->chip < S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.rd_mask >> 16; + else + temp2 = s3->accel.rd_mask & 0xff; + } else { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + temp2 = s3->accel.rd_mask >> 16; + else + temp2 = s3->accel.rd_mask & 0xff; + } + } else temp2 = s3->accel.rd_mask & 0xff; return temp2; @@ -4952,13 +5208,35 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.rd_mask >> 24; - else + + if (s3->bpp == 3) { + if (s3->chip < S3_VISION964) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.rd_mask >> 24; + else + temp2 = s3->accel.rd_mask >> 8; + + s3->accel.multifunc[0xe] ^= 0x10; + } else { + if ((s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) + temp2 = s3->accel.rd_mask >> 24; + else + temp2 = s3->accel.rd_mask >> 8; + + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } else { temp2 = s3->accel.rd_mask >> 8; - if (!(s3->accel.multifunc[0xe] & 0x200)) - s3->accel.multifunc[0xe] ^= 0x10; + if (s3->chip < S3_VISION964) + s3->accel.multifunc[0xe] ^= 0x10; + else { + if (!(s3->accel.multifunc[0xe] & 0x200)) + s3->accel.multifunc[0xe] ^= 0x10; + } + } + return temp2; } break; @@ -4966,23 +5244,31 @@ s3_accel_in(uint16_t port, void *priv) case 0xaeea: if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.rd_mask & 0xff; - else - temp2 = s3->accel.rd_mask >> 16; + if (s3->accel.multifunc[0xe] & 0x200) + temp2 = s3->accel.rd_mask >> 16; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.rd_mask & 0xff; + else + temp2 = s3->accel.rd_mask >> 16; + } return temp2; case 0xad4b: case 0xaeeb: if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - if ((s3->bpp == 3) && (s3->accel.multifunc[0xe] & 0x10) && !(s3->accel.multifunc[0xe] & 0x200)) - temp2 = s3->accel.rd_mask >> 8; - else - temp2 = s3->accel.rd_mask >> 24; - if (!(s3->accel.multifunc[0xe] & 0x200)) + if (s3->accel.multifunc[0xe] & 0x200) + temp2 = s3->accel.rd_mask >> 24; + else if (s3->bpp == 3) { + if (s3->accel.multifunc[0xe] & 0x10) + temp2 = s3->accel.rd_mask >> 8; + else + temp2 = s3->accel.rd_mask >> 24; + s3->accel.multifunc[0xe] ^= 0x10; + } return temp2; case 0xb148: @@ -5059,33 +5345,58 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - temp = s3->accel.multifunc[0xf] & 0xf; - switch (temp) { - case 0x0: - return s3->accel.multifunc[0x0] & 0xff; - case 0x1: - return s3->accel.multifunc[0x1] & 0xff; - case 0x2: - return s3->accel.multifunc[0x2] & 0xff; - case 0x3: - return s3->accel.multifunc[0x3] & 0xff; - case 0x4: - return s3->accel.multifunc[0x4] & 0xff; - case 0x5: - return s3->accel.multifunc[0xa] & 0xff; - case 0x6: - return s3->accel.multifunc[0xe] & 0xff; - case 0x7: - return s3->accel.cmd & 0xff; - case 0x8: - return s3->accel.subsys_cntl & 0xff; - case 0x9: - return s3->accel.setup_md & 0xff; - case 0xa: - return s3->accel.multifunc[0xd] & 0xff; + if (s3->chip >= S3_VISION964) { + temp = s3->accel.multifunc[0xf] & 0xf; + switch (temp) { + case 0x0: + return s3->accel.multifunc[0x0] & 0xff; + case 0x1: + return s3->accel.multifunc[0x1] & 0xff; + case 0x2: + return s3->accel.multifunc[0x2] & 0xff; + case 0x3: + return s3->accel.multifunc[0x3] & 0xff; + case 0x4: + return s3->accel.multifunc[0x4] & 0xff; + case 0x5: + return s3->accel.multifunc[0xa] & 0xff; + case 0x6: + return s3->accel.multifunc[0xe] & 0xff; + case 0x7: + return s3->accel.cmd & 0xff; + case 0x8: + return s3->accel.subsys_cntl & 0xff; + case 0x9: + return s3->accel.setup_md & 0xff; + case 0xa: + return s3->accel.multifunc[0xd] & 0xff; - default: - break; + default: + break; + } + } else { + temp = s3->accel.multifunc[0xf] & 7; + switch (temp) { + case 0x0: + return s3->accel.multifunc[0x0] & 0xff; + case 0x1: + return s3->accel.multifunc[0x1] & 0xff; + case 0x2: + return s3->accel.multifunc[0x2] & 0xff; + case 0x3: + return s3->accel.multifunc[0x3] & 0xff; + case 0x4: + return s3->accel.multifunc[0x4] & 0xff; + case 0x5: + return s3->accel.multifunc[0xa] & 0xff; + case 0x6: + return s3->accel.multifunc[0xe] & 0xff; + case 0x7: + return s3->accel.cmd & 0xff; + + default: + break; + } } return 0xff; } @@ -5095,34 +5406,60 @@ s3_accel_in(uint16_t port, void *priv) if (s3->chip >= S3_86C928) { if (s3_enable_fifo(s3)) s3_wait_fifo_idle(s3); - temp = s3->accel.multifunc[0xf] & 0xf; - s3->accel.multifunc[0xf]++; - switch (temp) { - case 0x0: - return s3->accel.multifunc[0x0] >> 8; - case 0x1: - return s3->accel.multifunc[0x1] >> 8; - case 0x2: - return s3->accel.multifunc[0x2] >> 8; - case 0x3: - return s3->accel.multifunc[0x3] >> 8; - case 0x4: - return s3->accel.multifunc[0x4] >> 8; - case 0x5: - return s3->accel.multifunc[0xa] >> 8; - case 0x6: - return s3->accel.multifunc[0xe] >> 8; - case 0x7: - return s3->accel.cmd >> 8; - case 0x8: - return (s3->accel.subsys_cntl >> 8) & ~0xe000; - case 0x9: - return (s3->accel.setup_md >> 8) & ~0xf000; - case 0xa: - return s3->accel.multifunc[0xd] >> 8; + if (s3->chip >= S3_VISION964) { + temp = s3->accel.multifunc[0xf] & 0xf; + s3->accel.multifunc[0xf] = (s3->accel.multifunc[0xf] + 1) & 0xf; + switch (temp) { + case 0x0: + return s3->accel.multifunc[0x0] >> 8; + case 0x1: + return s3->accel.multifunc[0x1] >> 8; + case 0x2: + return s3->accel.multifunc[0x2] >> 8; + case 0x3: + return s3->accel.multifunc[0x3] >> 8; + case 0x4: + return s3->accel.multifunc[0x4] >> 8; + case 0x5: + return s3->accel.multifunc[0xa] >> 8; + case 0x6: + return s3->accel.multifunc[0xe] >> 8; + case 0x7: + return s3->accel.cmd >> 8; + case 0x8: + return (s3->accel.subsys_cntl >> 8) & ~0xe000; + case 0x9: + return (s3->accel.setup_md >> 8) & ~0xf000; + case 0xa: + return s3->accel.multifunc[0xd] >> 8; - default: - break; + default: + break; + } + } else { + temp = s3->accel.multifunc[0xf] & 7; + s3->accel.multifunc[0xf] = (s3->accel.multifunc[0xf] + 1) & 7; + switch (temp) { + case 0x0: + return s3->accel.multifunc[0x0] >> 8; + case 0x1: + return s3->accel.multifunc[0x1] >> 8; + case 0x2: + return s3->accel.multifunc[0x2] >> 8; + case 0x3: + return s3->accel.multifunc[0x3] >> 8; + case 0x4: + return s3->accel.multifunc[0x4] >> 8; + case 0x5: + return s3->accel.multifunc[0xa] >> 8; + case 0x6: + return s3->accel.multifunc[0xe] >> 8; + case 0x7: + return s3->accel.cmd >> 8; + + default: + break; + } } return 0xff; } @@ -5515,15 +5852,40 @@ s3_accel_write(uint32_t addr, uint8_t val, void *priv) { s3_t *s3 = (s3_t *) priv; const svga_t *svga = &s3->svga; + uint32_t addr_mask = (svga->crtc[0x53] & 0x08) ? 0x1ffff : 0xffff; if (!s3->enable_8514) return; if (s3_enable_fifo(s3)) { - if (svga->crtc[0x53] & 0x08) - s3_queue(s3, addr & 0x1ffff, val, FIFO_WRITE_BYTE); - else - s3_queue(s3, addr & 0xffff, val, FIFO_WRITE_BYTE); + if ((addr & addr_mask) < 0x8000) { + s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_BYTE); + } else { + switch (addr & addr_mask) { + case 0x83b0 ... 0x83df: + s3_out(addr & 0x3ff, val, s3); + break; + case 0x8504: + s3->subsys_stat &= ~val; + s3_update_irqs(s3); + break; + case 0x8505: + s3->subsys_cntl = val; + s3_update_irqs(s3); + break; + case 0x850c: + s3->accel.advfunc_cntl = val; + s3_updatemapping(s3); + break; + case 0xff20: + s3->serialport = val; + i2c_gpio_set(s3->i2c, !!(val & SERIAL_PORT_SCW), !!(val & SERIAL_PORT_SDW)); + break; + default: + s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_BYTE); + break; + } + } } else s3_accel_write_fifo(s3, addr & 0xffff, val); } @@ -5533,15 +5895,28 @@ s3_accel_write_w(uint32_t addr, uint16_t val, void *priv) { s3_t *s3 = (s3_t *) priv; const svga_t *svga = &s3->svga; + uint32_t addr_mask = (svga->crtc[0x53] & 0x08) ? 0x1ffff : 0xffff; if (!s3->enable_8514) return; if (s3_enable_fifo(s3)) { - if (svga->crtc[0x53] & 0x08) - s3_queue(s3, addr & 0x1ffff, val, FIFO_WRITE_WORD); - else - s3_queue(s3, addr & 0xffff, val, FIFO_WRITE_WORD); + if ((addr & (addr_mask - 1)) < 0x8000) { + s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_WORD); + } else { + switch (addr & (addr_mask - 1)) { + case 0x83d4: + s3_accel_write_fifo(s3, addr, val); + s3_accel_write_fifo(s3, addr + 1, val >> 8); + break; + case 0xff20: + s3_accel_write_fifo(s3, addr, val); + break; + default: + s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_WORD); + break; + } + } } else s3_accel_write_fifo_w(s3, addr & 0xffff, val); } @@ -5550,16 +5925,162 @@ static void s3_accel_write_l(uint32_t addr, uint32_t val, void *priv) { s3_t *s3 = (s3_t *) priv; - const svga_t *svga = &s3->svga; + svga_t *svga = &s3->svga; + uint32_t addr_mask = (svga->crtc[0x53] & 0x08) ? 0x1ffff : 0xffff; if (!s3->enable_8514) return; if (s3_enable_fifo(s3)) { - if (svga->crtc[0x53] & 0x08) - s3_queue(s3, addr & 0x1ffff, val, FIFO_WRITE_DWORD); - else - s3_queue(s3, addr & 0xffff, val, FIFO_WRITE_DWORD); + if ((addr & (addr_mask - 3)) < 0x8000) { + s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_DWORD); + } else { + switch (addr & (addr_mask - 3)) { + case 0x8180: + s3->streams.pri_ctrl = val; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x8184: + s3->streams.chroma_ctrl = val; + break; + case 0x8190: + s3->streams.sec_ctrl = val; + s3->streams.dda_horiz_accumulator = val & 0xfff; + if (val & 0x1000) + s3->streams.dda_horiz_accumulator |= ~0xfff; + + s3->streams.sdif = (val >> 24) & 7; + break; + case 0x8194: + s3->streams.chroma_upper_bound = val; + break; + case 0x8198: + s3->streams.sec_filter = val; + s3->streams.k1_horiz_scale = val & 0x7ff; + if (val & 0x800) + s3->streams.k1_horiz_scale |= ~0x7ff; + + s3->streams.k2_horiz_scale = (val >> 16) & 0x7ff; + if ((val >> 16) & 0x800) + s3->streams.k2_horiz_scale |= ~0x7ff; + + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81a0: + s3->streams.blend_ctrl = val; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81c0: + s3->streams.pri_fb0 = val & 0x3fffff; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81c4: + s3->streams.pri_fb1 = val & 0x3fffff; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81c8: + s3->streams.pri_stride = val & 0xfff; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81cc: + s3->streams.buffer_ctrl = val; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81d0: + s3->streams.sec_fb0 = val; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81d4: + s3->streams.sec_fb1 = val; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81d8: + s3->streams.sec_stride = val; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81dc: + s3->streams.overlay_ctrl = val; + break; + case 0x81e0: + s3->streams.k1_vert_scale = val & 0x7ff; + if (val & 0x800) + s3->streams.k1_vert_scale |= ~0x7ff; + break; + case 0x81e4: + s3->streams.k2_vert_scale = val & 0x7ff; + if (val & 0x800) + s3->streams.k2_vert_scale |= ~0x7ff; + break; + case 0x81e8: + s3->streams.dda_vert_accumulator = val & 0xfff; + if (val & 0x1000) + s3->streams.dda_vert_accumulator |= ~0xfff; + + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81ec: + s3->streams.fifo_ctrl = val; + break; + case 0x81f0: + s3->streams.pri_start = val; + s3->streams.pri_x = (val >> 16) & 0x7ff; + s3->streams.pri_y = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81f4: + s3->streams.pri_size = val; + s3->streams.pri_w = (val >> 16) & 0x7ff; + s3->streams.pri_h = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81f8: + s3->streams.sec_start = val; + s3->streams.sec_x = (val >> 16) & 0x7ff; + s3->streams.sec_y = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + case 0x81fc: + s3->streams.sec_size = val; + s3->streams.sec_w = (val >> 16) & 0x7ff; + s3->streams.sec_h = val & 0x7ff; + svga_recalctimings(svga); + svga->fullchange = svga->monitor->mon_changeframecount;; + break; + + case 0x8504: + s3->subsys_stat &= ~(val & 0xff); + s3->subsys_cntl = (val >> 8); + s3_update_irqs(s3); + break; + + case 0x850c: + s3->accel.advfunc_cntl = val & 0xff; + s3_updatemapping(s3); + break; + + case 0xff20: + s3_accel_write_fifo(s3, addr, val); + break; + + default: + s3_queue(s3, addr & addr_mask, val, FIFO_WRITE_DWORD); + break; + } + } } else s3_accel_write_fifo_l(s3, addr & 0xffff, val); } @@ -7987,12 +8508,12 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi uint32_t *vram_l = (uint32_t *) svga->vram; uint32_t compare = s3->accel.color_cmp; uint8_t rop = s3->accel.ropmix & 0xff; - int compare_mode = (s3->accel.multifunc[0xe] >> 7) & 3; uint32_t rd_mask = s3->accel.rd_mask; uint32_t wrt_mask = s3->accel.wrt_mask; uint32_t frgd_color = s3->accel.frgd_color; uint32_t bkgd_color = s3->accel.bkgd_color; int cmd = s3->accel.cmd >> 13; + int update = 1; uint32_t srcbase; uint32_t dstbase; @@ -8075,6 +8596,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi /*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled. When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on the NOP command)*/ + s3_log("CMD=%d, full=%04x, s3bpp=%x, multifuncE=%03x, sourcedisplay=%x, mmio=%02x, srcbase=%08x, dstbase=%08x.\n", cmd, s3->accel.cmd, s3->bpp, s3->accel.multifunc[0x0e] & 0x230, vram_mask, svga->crtc[0x53] & 0x18, srcbase, dstbase); switch (cmd) { case 0: /*NOP (Short Stroke Vectors)*/ if (s3->accel.ssv_state == 0) @@ -8105,7 +8627,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); MIX @@ -8203,7 +8740,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); MIX @@ -8292,7 +8844,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); MIX @@ -8381,9 +8948,10 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi frgd_mix = (s3->accel.frgd_mix >> 5) & 3; bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && count == 16) { /*Stupid undocumented 0xB2E8 on 911/924*/ + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Stupid undocumented 0xB2E8 on 911/924*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; + s3_log("CMD2: B2E8 pixtrans, frgdmix=%d, bkgdmix=%d.\n", frgd_mix, bkgd_mix); } while (count-- && s3->accel.sy >= 0) { @@ -8392,7 +8960,8 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.temp_cnt = 16; } - if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { + if ((((s3->accel.cx) >= clip_l && (s3->accel.cx) <= clip_r && (s3->accel.cy) >= clip_t && (s3->accel.cy) <= clip_b) && !(s3->accel.multifunc[0xe] & 0x20)) || + (((s3->accel.cx) < clip_l && (s3->accel.cx) > clip_r && (s3->accel.cy) < clip_t && (s3->accel.cy) > clip_b) && (s3->accel.multifunc[0xe] & 0x20)) ) { if (s3_cpu_dest(s3) && ((s3->accel.multifunc[0xa] & 0xc0) == 0x00)) { mix_dat = mix_mask; /* Mix data = forced to foreground register. */ } else if (s3_cpu_dest(s3) && vram_mask) { @@ -8426,7 +8995,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ(s3->accel.dest + s3->accel.cx, dest_dat); MIX @@ -8462,11 +9046,12 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.sx--; if (s3->accel.sx < 0) { if (s3->accel.cmd & 0x20) - s3->accel.cx -= (s3->accel.maj_axis_pcnt & 0xfff) + 1; + s3->accel.cx -= ((s3->accel.maj_axis_pcnt & 0xfff) + 1); else - s3->accel.cx += (s3->accel.maj_axis_pcnt & 0xfff) + 1; + s3->accel.cx += ((s3->accel.maj_axis_pcnt & 0xfff) + 1); s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + if (s3->accel.cmd & 0x80) s3->accel.cy++; else @@ -8536,7 +9121,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ(s3->accel.dest + s3->accel.poly_x, dest_dat); MIX @@ -8571,11 +9171,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cur_x = s3->accel.poly_cx & 0xfff; s3->accel.cur_y = s3->accel.poly_cy & 0xfff; s3->accel.cur_x2 = s3->accel.poly_cx2 & 0xfff; - s3->accel.cur_y2 = s3->accel.poly_cy & 0xfff; + s3->accel.cur_y2 = s3->accel.poly_cy2 & 0xfff; } break; - case 6: /*BitBlt*/ + case 6: /*BitBlt*/ if (!cpu_input) { /*!cpu_input is trigger to start operation*/ s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; @@ -8597,15 +9197,17 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi frgd_mix = (s3->accel.frgd_mix >> 5) & 3; bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - if (!cpu_input && frgd_mix == 3 && !vram_mask && !compare_mode && (s3->accel.cmd & 0xa0) == 0xa0 && (s3->accel.frgd_mix & 0xf) == 7 && (s3->accel.bkgd_mix & 0xf) == 7) { + if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { while (1) { - if ((s3->accel.dx & 0xfff) >= clip_l && (s3->accel.dx & 0xfff) <= clip_r && (s3->accel.dy & 0xfff) >= clip_t && (s3->accel.dy & 0xfff) <= clip_b) { + if ((s3->accel.dx) >= clip_l && (s3->accel.dx) <= clip_r && (s3->accel.dy) >= clip_t && (s3->accel.dy) <= clip_b) { READ(s3->accel.src + s3->accel.cx, src_dat); READ(s3->accel.dest + s3->accel.dx, dest_dat); dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); - WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + if (s3->accel.cmd & 0x10) { + WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + } } s3->accel.cx++; @@ -8620,7 +9222,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cy++; s3->accel.dy++; - s3->accel.dy &= 0xfff; s3->accel.src = srcbase + s3->accel.cy * s3->width; s3->accel.dest = dstbase + s3->accel.dy * s3->width; @@ -8635,7 +9236,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } else { while (count-- && s3->accel.sy >= 0) { - if ((s3->accel.dx & 0xfff) >= clip_l && (s3->accel.dx & 0xfff) <= clip_r && ((s3->accel.dy & 0xfff) >= clip_t && (s3->accel.dy & 0xfff) <= clip_b)) { + if ((s3->accel.dx) >= clip_l && (s3->accel.dx) <= clip_r && ((s3->accel.dy) >= clip_t && (s3->accel.dy) <= clip_b)) { if (vram_mask && (s3->accel.cmd & 0x10)) { READ(s3->accel.src + s3->accel.cx, mix_dat); mix_dat = ((mix_dat & rd_mask) == rd_mask); @@ -8661,7 +9262,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ(s3->accel.dest + s3->accel.dx, dest_dat); MIX @@ -8706,7 +9322,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cy--; s3->accel.dy--; } - s3->accel.dy &= 0xfff; s3->accel.src = srcbase + s3->accel.cy * s3->width; s3->accel.dest = dstbase + s3->accel.dy * s3->width; @@ -8755,7 +9370,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; while (count-- && s3->accel.sy >= 0) { - if ((s3->accel.dx & 0xfff) >= clip_l && (s3->accel.dx & 0xfff) <= clip_r && (s3->accel.dy & 0xfff) >= clip_t && (s3->accel.dy & 0xfff) <= clip_b) { + if ((s3->accel.dx) >= clip_l && (s3->accel.dx) <= clip_r && (s3->accel.dy) >= clip_t && (s3->accel.dy) <= clip_b) { if (vram_mask) { READ(s3->accel.src + s3->accel.cx, mix_dat); mix_dat = ((mix_dat & rd_mask) == rd_mask); @@ -8781,7 +9396,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ(s3->accel.dest + s3->accel.dx, dest_dat); MIX @@ -8872,7 +9502,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { src_dat = s3->accel.frgd_color; - if (((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) && (s3->accel.cmd & 0x10)) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); MIX @@ -8906,7 +9551,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { src_dat = s3->accel.frgd_color; - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); MIX @@ -8995,7 +9655,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ(s3->accel.dest + s3->accel.poly_x, dest_dat); MIX @@ -9128,7 +9803,22 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } - if ((compare_mode == 2 && src_dat != compare) || (compare_mode == 3 && src_dat == compare) || compare_mode < 2) { + if (s3->accel.multifunc[0xe] & 0x100) { + if (s3->accel.multifunc[0xe] & 0x80) { + if (src_dat != compare) + update = 0; + else + update = 1; + } else { + if (src_dat == compare) + update = 0; + else + update = 1; + } + } else + update = 1; + + if (update) { READ(s3->accel.dest + s3->accel.dx, dest_dat); ROPMIX @@ -9309,16 +9999,18 @@ s3_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) break; case PCI_REG_COMMAND: - if (val & PCI_COMMAND_IO) + if (val & PCI_COMMAND_IO) { s3_io_set(s3); - else + } else s3_io_remove(s3); + if (s3->chip >= S3_TRIO64V) s3->pci_regs[PCI_REG_COMMAND] = (val & 0x27); else s3->pci_regs[PCI_REG_COMMAND] = (val & 0x23); + s3_updatemapping(s3); - break; + return; case 0x07: if (s3->chip == S3_TRIO64V2) { @@ -9470,6 +10162,10 @@ s3_reset(void *priv) if (reset_state != NULL) { s3->accel.multifunc[0xe] &= ~(0x200 | 0x10); s3_disable_handlers(s3); + s3->force_busy = 0; + s3->blitter_busy = 0; + s3->fifo_read_idx = 0; + s3->fifo_write_idx = 0; if (s3->pci) reset_state->pci_slot = s3->pci_slot; @@ -9751,6 +10447,7 @@ s3_init(const device_t *info) vram_size = vram << 20; else vram_size = 512 << 10; + s3->vram_mask = vram_size - 1; s3->vram = vram; @@ -10039,6 +10736,7 @@ s3_init(const device_t *info) stepping = 0xc0; /*Vision864*/ else stepping = 0xc1; /*Vision864P*/ + s3->id = stepping; s3->id_ext = s3->id_ext_pci = stepping; s3->packed_mmio = 0; @@ -10164,10 +10862,6 @@ s3_init(const device_t *info) case S3_CARDEX_TRIO64VPLUS: case S3_DIAMOND_STEALTH64_764: case S3_SPEA_MIRAGE_P64: - if (device_get_config_int("memory") == 1) - svga->vram_max = 1 << 20; /* Phoenix BIOS does not expect VRAM to be mirrored. */ - /* Fall over. */ - fallthrough; case S3_NUMBER9_9FX: svga->decode_mask = (4 << 20) - 1; s3->id = 0xe1; /*Trio64*/ From 9ff72338d1476d9c107de4457d04c5f7325110b1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 28 Sep 2024 13:33:43 +0200 Subject: [PATCH 466/624] Voodoo: Attempt to implement the 16bpp + depth combined writes. --- src/include/86box/vid_voodoo_regs.h | 20 ++++++++++++-------- src/video/vid_voodoo_fb.c | 28 +++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/include/86box/vid_voodoo_regs.h b/src/include/86box/vid_voodoo_regs.h index 379219d35..6aeb98bcc 100644 --- a/src/include/86box/vid_voodoo_regs.h +++ b/src/include/86box/vid_voodoo_regs.h @@ -338,18 +338,22 @@ enum { }; enum { - LFB_FORMAT_RGB565 = 0, - LFB_FORMAT_RGB555 = 1, - LFB_FORMAT_ARGB1555 = 2, - LFB_FORMAT_XRGB8888 = 4, - LFB_FORMAT_ARGB8888 = 5, - LFB_FORMAT_DEPTH = 15, - LFB_FORMAT_MASK = 15 + LFB_FORMAT_RGB565 = 0, + LFB_FORMAT_RGB555 = 1, + LFB_FORMAT_ARGB1555 = 2, + LFB_FORMAT_XRGB8888 = 4, + LFB_FORMAT_ARGB8888 = 5, + LFB_FORMAT_DEPTH_RGB565 = 12, + LFB_FORMAT_DEPTH_RGB555 = 13, + LFB_FORMAT_DEPTH_ARGB1555 = 14, + LFB_FORMAT_DEPTH = 15, + LFB_FORMAT_MASK = 15 }; enum { LFB_WRITE_COLOUR = 1, - LFB_WRITE_DEPTH = 2 + LFB_WRITE_DEPTH = 2, + LFB_WRITE_BOTH = 4 }; enum { diff --git a/src/video/vid_voodoo_fb.c b/src/video/vid_voodoo_fb.c index 5156cfdad..5ae26b4c5 100644 --- a/src/video/vid_voodoo_fb.c +++ b/src/video/vid_voodoo_fb.c @@ -373,6 +373,26 @@ voodoo_fb_writel(uint32_t addr, uint32_t val, void *priv) addr >>= 1; break; + case LFB_FORMAT_DEPTH_RGB565: + colour_data[0] = rgb565[val & 0xffff]; + depth_data[0] = val >> 16; + write_mask = LFB_WRITE_BOTH; + count = 1; + break; + case LFB_FORMAT_DEPTH_RGB555: + colour_data[0] = argb1555[val & 0xffff]; + depth_data[0] = val >> 16; + write_mask = LFB_WRITE_BOTH; + count = 1; + break; + case LFB_FORMAT_DEPTH_ARGB1555: + colour_data[0] = argb1555[val & 0xffff]; + alpha_data[0] = colour_data[0].a; + depth_data[0] = val >> 16; + write_mask = LFB_WRITE_BOTH; + count = 1; + break; + case LFB_FORMAT_DEPTH: depth_data[0] = val; depth_data[1] = val >> 16; @@ -469,9 +489,15 @@ skip_pixel: } else { for (int c = 0; c < count; c++) { if (write_mask & LFB_WRITE_COLOUR) - *(uint16_t *) (&voodoo->fb_mem[write_addr & voodoo->fb_mask]) = do_dither(&voodoo->params, colour_data[c], (x >> 1) + c, y); + *(uint16_t *) (&voodoo->fb_mem[write_addr & voodoo->fb_mask]) = + do_dither(&voodoo->params, colour_data[c], (x >> 1) + c, y); if (write_mask & LFB_WRITE_DEPTH) *(uint16_t *) (&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]) = depth_data[c]; + if (write_mask & LFB_WRITE_BOTH) { + *(uint16_t *) (&voodoo->fb_mem[write_addr & voodoo->fb_mask]) = + do_dither(&voodoo->params, colour_data[c], (x >> 1) + c, y); + *(uint16_t *) (&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]) = depth_data[c]; + } write_addr += 2; write_addr_aux += 2; From 74b398be29ff4d6aa199c9d088903a9ed837b931 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 28 Sep 2024 14:34:45 +0200 Subject: [PATCH 467/624] S3 non-ViRGE: Do not remove I/O handlers on ISA/VLB card reset, fixes soft reset, fixes #4866. --- src/video/vid_s3.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 4a0ffc993..2b14284c7 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -10131,7 +10131,8 @@ static int vram_sizes[] = { static void s3_disable_handlers(s3_t *s3) { - s3_io_remove(s3); + if (s3->pci) + s3_io_remove(s3); mem_mapping_disable(&s3->linear_mapping); mem_mapping_disable(&s3->mmio_mapping); From 36bccdf7a92d9e0e8f3c697b8fa29aaf4a46e60b Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 28 Sep 2024 18:32:43 +0200 Subject: [PATCH 468/624] Changed the version number to 4.2.2. --- CMakeLists.txt | 2 +- debian/changelog | 4 ++-- src/unix/assets/86Box.spec | 4 ++-- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- vcpkg.json | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f2a78aa2f..a1fae72e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 4.3 + VERSION 4.2.2 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/debian/changelog b/debian/changelog index 827665880..ae80cfa9d 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -86box (4.3) UNRELEASED; urgency=medium +86box (4.2.2) UNRELEASED; urgency=medium * Bump release. - -- Jasmine Iwanek Mon, 02 Sep 2024 00:16:28 +0200 + -- Jasmine Iwanek Sat, 28 Sep 2024 18:31:57 +0200 diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index 86f380d22..e351c017a 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -15,7 +15,7 @@ %global romver 4.1 Name: 86Box -Version: 4.3 +Version: 4.2.2 Release: 1%{?dist} Summary: Classic PC emulator License: GPLv2+ @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Sat Aug 31 Jasmine Iwanek 4.3-1 +* Sat Aug 31 Jasmine Iwanek 4.2.2-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index 7a0786a16..47a0a6b87 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + diff --git a/vcpkg.json b/vcpkg.json index 87859869b..af6f9a5c8 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "86box", - "version-string": "4.3", + "version-string": "4.2.2", "homepage": "https://86box.net/", "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", From bdc43043003ff39db1547dc3d23fbeef8d79fc0e Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 28 Sep 2024 19:17:57 +0200 Subject: [PATCH 469/624] Added more conditions under which control register writes cause MMU cache flushes. --- src/cpu/x86_ops_mov_ctrl.h | 8 ++++---- src/cpu/x86_ops_mov_ctrl_2386.h | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cpu/x86_ops_mov_ctrl.h b/src/cpu/x86_ops_mov_ctrl.h index f4241feb1..b4f0c498a 100644 --- a/src/cpu/x86_ops_mov_ctrl.h +++ b/src/cpu/x86_ops_mov_ctrl.h @@ -184,7 +184,7 @@ opMOV_CRx_r_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); switch (cpu_reg) { case 0: - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) + if ((cpu_state.regs[cpu_rm].l ^ cr0) & (0x00000001 | WP_FLAG)) flushmmucache(); else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { if (is_p6 || cpu_use_dynarec) @@ -222,7 +222,7 @@ opMOV_CRx_r_a16(uint32_t fetchdat) break; case 4: if (cpu_has_feature(CPU_FEATURE_CR4)) { - if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PAE | CR4_PGE)) + if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PSE | CR4_PAE | CR4_PGE)) flushmmucache(); cr4 = cpu_state.regs[cpu_rm].l & cpu_CR4_mask; break; @@ -249,7 +249,7 @@ opMOV_CRx_r_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); switch (cpu_reg) { case 0: - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) + if ((cpu_state.regs[cpu_rm].l ^ cr0) & (0x00000001 | WP_FLAG)) flushmmucache(); else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { if (is_p6 || cpu_use_dynarec) @@ -287,7 +287,7 @@ opMOV_CRx_r_a32(uint32_t fetchdat) break; case 4: if (cpu_has_feature(CPU_FEATURE_CR4)) { - if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PAE | CR4_PGE)) + if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PSE | CR4_PAE | CR4_PGE)) flushmmucache(); cr4 = cpu_state.regs[cpu_rm].l & cpu_CR4_mask; break; diff --git a/src/cpu/x86_ops_mov_ctrl_2386.h b/src/cpu/x86_ops_mov_ctrl_2386.h index 03a18caa7..13e08a145 100644 --- a/src/cpu/x86_ops_mov_ctrl_2386.h +++ b/src/cpu/x86_ops_mov_ctrl_2386.h @@ -180,7 +180,7 @@ opMOV_CRx_r_a16(uint32_t fetchdat) fetch_ea_16(fetchdat); switch (cpu_reg) { case 0: - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) + if ((cpu_state.regs[cpu_rm].l ^ cr0) & (0x00000001 | WP_FLAG)) flushmmucache(); else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { flushmmucache_nopc(); @@ -214,7 +214,7 @@ opMOV_CRx_r_a16(uint32_t fetchdat) break; case 4: if (cpu_has_feature(CPU_FEATURE_CR4)) { - if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PAE | CR4_PGE)) + if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PSE | CR4_PAE | CR4_PGE)) flushmmucache(); cr4 = cpu_state.regs[cpu_rm].l & cpu_CR4_mask; break; @@ -241,7 +241,7 @@ opMOV_CRx_r_a32(uint32_t fetchdat) fetch_ea_32(fetchdat); switch (cpu_reg) { case 0: - if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x00000001) + if ((cpu_state.regs[cpu_rm].l ^ cr0) & (0x00000001 | WP_FLAG)) flushmmucache(); else if ((cpu_state.regs[cpu_rm].l ^ cr0) & 0x80000000) { flushmmucache_nopc(); @@ -275,7 +275,7 @@ opMOV_CRx_r_a32(uint32_t fetchdat) break; case 4: if (cpu_has_feature(CPU_FEATURE_CR4)) { - if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PAE | CR4_PGE)) + if (((cpu_state.regs[cpu_rm].l ^ cr4) & cpu_CR4_mask) & (CR4_PSE | CR4_PAE | CR4_PGE)) flushmmucache(); cr4 = cpu_state.regs[cpu_rm].l & cpu_CR4_mask; break; From c172cc8dbea177b90430f3e106d364a98356ca3b Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 29 Sep 2024 10:27:21 +0200 Subject: [PATCH 470/624] RTL8139C+: Fix duplex negotiation so it correctly negotiates full duples, fixes #4867. --- src/network/net_rtl8139.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/network/net_rtl8139.c b/src/network/net_rtl8139.c index 0b00d589a..f04f9b7a3 100644 --- a/src/network/net_rtl8139.c +++ b/src/network/net_rtl8139.c @@ -1076,10 +1076,11 @@ rtl8139_reset(void *priv) s->cplus_enabled = 0; #if 0 - s->BasicModeCtrl = 0x3100; // 100Mbps, full duplex, autonegotiation s->BasicModeCtrl = 0x2100; // 100Mbps, full duplex -#endif + s->BasicModeCtrl = 0x3100; // 100Mbps, full duplex, autonegotiation s->BasicModeCtrl = 0x1000; // autonegotiation +#endif + s->BasicModeCtrl = 0x1100; // full duplex, autonegotiation rtl8139_reset_phy(s); From d5f01259bcefff1af5cf70b5d68ad5a0e9a16b97 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 29 Sep 2024 10:31:45 +0200 Subject: [PATCH 471/624] Preferences dialog: make the slider a bit bigger, fixes #4860. --- src/qt/qt_progsettings.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_progsettings.ui b/src/qt/qt_progsettings.ui index 16fb439be..ac4327341 100644 --- a/src/qt/qt_progsettings.ui +++ b/src/qt/qt_progsettings.ui @@ -88,7 +88,7 @@ - + 10 From 250f477200bf03068f29b7cda11795b28bcb0bd3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 29 Sep 2024 13:23:43 +0200 Subject: [PATCH 472/624] MMU: No longer page fault on CPU-initiated writes to write-protected pages (eg. when setting segment accessed bit), fixes OpenBSD 7.0, fixes #1853. --- src/mem/mem.c | 16 ++++++++-------- src/mem/mmu_2386.c | 8 ++++---- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/mem/mem.c b/src/mem/mem.c index 0b038d640..57dc31e33 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -320,7 +320,7 @@ mmutranslatereal_normal(uint32_t addr, int rw) if ((temp & 0x80) && (cr4 & CR4_PSE)) { /*4MB page*/ - if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !(temp & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { + if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { cr2 = addr; temp &= 1; if (CPL == 3) @@ -341,7 +341,7 @@ mmutranslatereal_normal(uint32_t addr, int rw) temp = rammap((temp & ~0xfff) + ((addr >> 10) & 0xffc)); temp3 = temp & temp2; - if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { + if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !cpl_override && !(temp3 & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { cr2 = addr; temp &= 1; if (CPL == 3) @@ -405,7 +405,7 @@ mmutranslatereal_pae(uint32_t addr, int rw) if (temp & 0x80) { /*2MB page*/ - if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !(temp & 2) && (((CPL == 3) && !cpl_override) || (cr0 & WP_FLAG)))) { + if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && (((CPL == 3) && !cpl_override) || (cr0 & WP_FLAG)))) { cr2 = addr; temp &= 1; if (CPL == 3) @@ -426,7 +426,7 @@ mmutranslatereal_pae(uint32_t addr, int rw) addr4 = (temp & ~0xfffULL) + ((addr >> 9) & 0xff8); temp = rammap64(addr4) & 0x000000ffffffffffULL; temp3 = temp & temp4; - if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && (((CPL == 3) && !cpl_override) || (cr0 & WP_FLAG)))) { + if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !cpl_override && !(temp3 & 2) && (((CPL == 3) && !cpl_override) || (cr0 & WP_FLAG)))) { cr2 = addr; temp &= 1; if (CPL == 3) @@ -488,7 +488,7 @@ mmutranslate_noabrt_normal(uint32_t addr, int rw) if ((temp & 0x80) && (cr4 & CR4_PSE)) { /*4MB page*/ - if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) + if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; return (temp & ~0x3fffff) + (addr & 0x3fffff); @@ -497,7 +497,7 @@ mmutranslate_noabrt_normal(uint32_t addr, int rw) temp = rammap((temp & ~0xfff) + ((addr >> 10) & 0xffc)); temp3 = temp & temp2; - if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) + if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !cpl_override && !(temp3 & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; return (uint64_t) ((temp & ~0xfff) + (addr & 0xfff)); @@ -532,7 +532,7 @@ mmutranslate_noabrt_pae(uint32_t addr, int rw) if (temp & 0x80) { /*2MB page*/ - if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) + if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; return ((temp & ~0x1fffffULL) + (addr & 0x1fffff)) & 0x000000ffffffffffULL; @@ -543,7 +543,7 @@ mmutranslate_noabrt_pae(uint32_t addr, int rw) temp3 = temp & temp4; - if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) + if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !cpl_override && !(temp3 & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; return ((temp & ~0xfffULL) + ((uint64_t) (addr & 0xfff))) & 0x000000ffffffffffULL; diff --git a/src/mem/mmu_2386.c b/src/mem/mmu_2386.c index 43bdd4602..7418a88d8 100644 --- a/src/mem/mmu_2386.c +++ b/src/mem/mmu_2386.c @@ -198,7 +198,7 @@ mmutranslatereal_2386(uint32_t addr, int rw) if ((temp & 0x80) && (cr4 & CR4_PSE)) { /*4MB page*/ - if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !(temp & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { + if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { cr2 = addr; temp &= 1; if (CPL == 3) @@ -219,7 +219,7 @@ mmutranslatereal_2386(uint32_t addr, int rw) temp = mem_readl_map((temp & ~0xfff) + ((addr >> 10) & 0xffc)); temp3 = temp & temp2; - if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { + if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !cpl_override && !(temp3 & 2) && (((CPL == 3) && !cpl_override) || ((is486 || isibm486) && (cr0 & WP_FLAG))))) { cr2 = addr; temp &= 1; if (CPL == 3) @@ -258,7 +258,7 @@ mmutranslate_noabrt_2386(uint32_t addr, int rw) if ((temp & 0x80) && (cr4 & CR4_PSE)) { /*4MB page*/ - if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) + if (((CPL == 3) && !(temp & 4) && !cpl_override) || (rw && !cpl_override && !(temp & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; return (temp & ~0x3fffff) + (addr & 0x3fffff); @@ -267,7 +267,7 @@ mmutranslate_noabrt_2386(uint32_t addr, int rw) temp = mem_readl_map((temp & ~0xfff) + ((addr >> 10) & 0xffc)); temp3 = temp & temp2; - if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !(temp3 & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) + if (!(temp & 1) || ((CPL == 3) && !(temp3 & 4) && !cpl_override) || (rw && !cpl_override && !(temp3 & 2) && ((CPL == 3) || (cr0 & WP_FLAG)))) return 0xffffffffffffffffULL; return (uint64_t) ((temp & ~0xfff) + (addr & 0xfff)); From 6c2a667d0cdb080b37893ff2a1a0999c1a7403af Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 29 Sep 2024 18:16:32 +0200 Subject: [PATCH 473/624] x86seg.c: Use the correct memory read/write functions on 486+. --- src/cpu/x86seg.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cpu/x86seg.c b/src/cpu/x86seg.c index 61e9e558a..61c0edd9f 100644 --- a/src/cpu/x86seg.c +++ b/src/cpu/x86seg.c @@ -48,12 +48,12 @@ #define seg_writememwl writememwl_2386 #define seg_writememll writememll_2386 #else -#define seg_readmembl readmembl_2386 -#define seg_readmemwl readmemwl_2386 -#define seg_readmemll readmemll_2386 -#define seg_writemembl writemembl_2386 -#define seg_writememwl writememwl_2386 -#define seg_writememll writememll_2386 +#define seg_readmembl readmembl +#define seg_readmemwl readmemwl +#define seg_readmemll readmemll +#define seg_writemembl writemembl +#define seg_writememwl writememwl +#define seg_writememll writememll #endif #define DPL ((segdat[2] >> 13) & 3) From 2844acee116b983afccb3e45e81c3fb11e34a6b7 Mon Sep 17 00:00:00 2001 From: "Joakim L. Gilje" Date: Sun, 29 Sep 2024 21:57:47 +0200 Subject: [PATCH 474/624] Compile and linker fixes for OpenBSD * link with wxneeded required for DYNAREC, in addition to being installed onto a filesystem with the wxallowed flag (like /usr/local on a default installation) * pthread_setname_np is pthread_set_name_np on OpenBSD --- CMakeLists.txt | 4 ++++ src/qt/qt_platform.cpp | 8 +++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a1fae72e7..a70cbd61f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,6 +147,10 @@ else() option(CPPTHREADS "C++11 threads" ON) endif() +if(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD") + SET(CMAKE_EXE_LINKER_FLAGS "-Wl,-z,wxneeded") +endif() + # Development branch features # # Option Description Def. Condition Otherwise diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 98907f07a..e48cb1f3e 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -54,6 +54,10 @@ # include #endif +#ifdef Q_OS_OPENBSD +# include +#endif + #if 0 static QByteArray buf; #endif @@ -804,8 +808,10 @@ plat_set_thread_name(void *thread, const char *name) char truncated[16]; # endif strncpy(truncated, name, sizeof(truncated) - 1); -# ifdef Q_OS_DARWIN +# if defined(Q_OS_DARWIN) pthread_setname_np(truncated); +# elif defined(Q_OS_OPENBSD) + pthread_set_name_np(thread ? *((pthread_t *) thread) : pthread_self(), truncated); # else pthread_setname_np(thread ? *((pthread_t *) thread) : pthread_self(), truncated); # endif From 7e0c6e9b698c33a777228e8cfd90e809caec62cc Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 30 Sep 2024 18:08:05 +0200 Subject: [PATCH 475/624] Enable the SYSENTER/SYSEXIT MSR's on Pentium Pro, fixes OpenBSD booting, fixes #4873. --- src/cpu/cpu.c | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 438e12d5c..878c67b6a 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -3300,26 +3300,17 @@ pentium_invalid_rdmsr: break; /* SYSENTER_CS - SYSENTER target CS */ case 0x174: - if (cpu_s->cpu_type == CPU_PENTIUMPRO) - goto i686_invalid_rdmsr; - EAX &= 0xffff0000; EAX |= msr.sysenter_cs; EDX = 0x00000000; break; /* SYSENTER_ESP - SYSENTER target ESP */ case 0x175: - if (cpu_s->cpu_type == CPU_PENTIUMPRO) - goto i686_invalid_rdmsr; - EAX = msr.sysenter_esp; EDX = 0x00000000; break; /* SYSENTER_EIP - SYSENTER target EIP */ case 0x176: - if (cpu_s->cpu_type == CPU_PENTIUMPRO) - goto i686_invalid_rdmsr; - EAX = msr.sysenter_eip; EDX = 0x00000000; break; @@ -4069,23 +4060,14 @@ pentium_invalid_wrmsr: break; /* SYSENTER_CS - SYSENTER target CS */ case 0x174: - if (cpu_s->cpu_type == CPU_PENTIUMPRO) - goto i686_invalid_wrmsr; - msr.sysenter_cs = EAX & 0xFFFF; break; /* SYSENTER_ESP - SYSENTER target ESP */ case 0x175: - if (cpu_s->cpu_type == CPU_PENTIUMPRO) - goto i686_invalid_wrmsr; - msr.sysenter_esp = EAX; break; /* SYSENTER_EIP - SYSENTER target EIP */ case 0x176: - if (cpu_s->cpu_type == CPU_PENTIUMPRO) - goto i686_invalid_wrmsr; - msr.sysenter_eip = EAX; break; /* MCG_CAP - Machine Check Global Capability */ From 1e84b46a5db15645365f1a6b0aefdb7575946576 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 1 Oct 2024 08:53:57 +0200 Subject: [PATCH 476/624] 86F: Correct the obtaining of the preceding bits in direct writes, fixes bit stream compliance. --- src/floppy/fdd_86f.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/floppy/fdd_86f.c b/src/floppy/fdd_86f.c index 3fe1428a1..cf9e83694 100644 --- a/src/floppy/fdd_86f.c +++ b/src/floppy/fdd_86f.c @@ -1854,6 +1854,7 @@ d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type, uint3 if (type == 0) { /* Byte write. */ encoded_byte = d86f_encode_byte(drive, 0, dbyte, dpbyte); + dev->preceding_bit[side] = encoded_byte & 1; if (!d86f_reverse_bytes(drive)) { mask_data = encoded_byte >> 8; encoded_byte &= 0xFF; @@ -1863,6 +1864,7 @@ d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type, uint3 } else { /* Word write. */ encoded_byte = byte; + dev->preceding_bit[side] = (encoded_byte >> 8) & 1; if (d86f_reverse_bytes(drive)) { mask_data = encoded_byte >> 8; encoded_byte &= 0xFF; @@ -1871,8 +1873,6 @@ d86f_write_direct_common(int drive, int side, uint16_t byte, uint8_t type, uint3 } } - dev->preceding_bit[side] = encoded_byte & 1; - if (d86f_has_surface_desc(drive)) { /* Inverted track data, clear bits are now set. */ mask_data = ~dev->track_encoded_data[side][pos]; From 8899b1411b0377aafb8de584f6697a587677559a Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 1 Oct 2024 09:56:40 +0200 Subject: [PATCH 477/624] AMD K6-2 onwards: EFER write GPF is now correctly on bits 5 onwards, not on bits 1 onwards. --- src/cpu/cpu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 878c67b6a..0c6d36097 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -3705,7 +3705,7 @@ cpu_WRMSR(void) /* Extended Feature Enable Register */ case 0xc0000080: temp = EAX | ((uint64_t) EDX << 32); - if (temp & ~1ULL) + if (temp & ~0x1fULL) x86gpf(NULL, 0); else msr.amd_efer = temp; From f102fee4977a7dc4be25a994436b0f81f2665c15 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Thu, 3 Oct 2024 14:56:23 +0200 Subject: [PATCH 478/624] Major video changes of the day (October 3rd, 2024) 8514/A changes: 1. Correct interlaced display resolution. 2. Added a limit to cursor coordinates. 3. Test/WIP features of the add-on Mach8 side (ATI 8514/A Ultra) such as configurable BIOS. 4. Made the CMD 5 of the acceleration (Polygon Boundary) more accurate per manual (as much as I could regarding the clipping). Cirrus related: 1. Added SUBSYS PCI vendor/device ID of the 5480 (per manual). IBM VGA: 1. Built-in/option rom-less VGA don't need the "available" flag. ATI Mach8/32: 1. As with 8514/A, corrected interlaced display. XGA-1/-2: 1. Moved the XGA R/W memory size tests out of the SVGA R/W routines to reflect the per card basis, although anything that uses its own SVGA mapping would call the tests there (such as Cirrus, Headland and ATI) when not accessing the LFB. This finally puts an end to the XGA MCA mapping enabling bugs. 2. Re-organized the ISA standalone and non-standalone (INMOS) sides of the chips so that they work properly and remove the FILE rom loading hack from init. 3. The Memory Mapped R/W sides now account for instance in their address range. 4. INMOS only: prevent any ROM address access to anything lower than 0xc8000 to not conflict with the main BIOS rom loading. 5. Fixed native pitch by using the correct register, this fixes non 1024x768 resolutions under NT. 6. More logs when enabled to see any future bugs. --- src/include/86box/vid_8514a.h | 2 + src/include/86box/vid_svga.h | 8 +- src/include/86box/vid_vga.h | 6 +- src/include/86box/vid_xga.h | 11 +- src/video/vid_8514a.c | 72 ++-- src/video/vid_ati_mach8.c | 35 +- src/video/vid_cl54xx.c | 31 ++ src/video/vid_et4000.c | 20 +- src/video/vid_ht216.c | 15 +- src/video/vid_svga.c | 94 +---- src/video/vid_vga.c | 5 +- src/video/vid_xga.c | 628 ++++++++++++++++++++-------------- 12 files changed, 513 insertions(+), 414 deletions(-) diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index def3f0f2b..d834a6f42 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -41,6 +41,8 @@ typedef union { typedef struct ibm8514_t { rom_t bios_rom; + rom_t bios_rom2; + rom_t bios_rom3; hwcursor8514_t hwcursor; hwcursor8514_t hwcursor_latch; uint8_t pos_regs[8]; diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index fef9b2122..18b7b672a 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -171,9 +171,11 @@ typedef struct svga_t { pc_timer_t timer; pc_timer_t timer8514; + pc_timer_t timer_xga; double clock; double clock8514; + double clock_xga; double multiplier; @@ -319,9 +321,13 @@ extern void ati8514_pos_write(uint16_t port, uint8_t val, void *priv); extern void ati8514_init(svga_t *svga, void *ext8514, void *dev8514); #endif -extern void xga_poll(void *priv, svga_t *svga); +extern void xga_write_test(uint32_t addr, uint8_t val, void *priv); +extern uint8_t xga_read_test(uint32_t addr, void *priv); +extern void xga_poll(void *priv); extern void xga_recalctimings(svga_t *svga); +extern uint32_t svga_decode_addr(svga_t *svga, uint32_t addr, int write); + extern int svga_init(const device_t *info, svga_t *svga, void *priv, int memsize, void (*recalctimings_ex)(struct svga_t *svga), uint8_t (*video_in)(uint16_t addr, void *priv), diff --git a/src/include/86box/vid_vga.h b/src/include/86box/vid_vga.h index bc552b285..0ffbeb4cd 100644 --- a/src/include/86box/vid_vga.h +++ b/src/include/86box/vid_vga.h @@ -28,9 +28,7 @@ typedef struct vga_t { rom_t bios_rom; } vga_t; -static video_timings_t timing_vga = { VIDEO_ISA, 8, 16, 32, 8, 16, 32 }; - -void vga_out(uint16_t addr, uint8_t val, void *priv); -uint8_t vga_in(uint16_t addr, void *priv); +extern void vga_out(uint16_t addr, uint8_t val, void *priv); +extern uint8_t vga_in(uint16_t addr, void *priv); #endif /*VIDEO_VGA_H*/ diff --git a/src/include/86box/vid_xga.h b/src/include/86box/vid_xga.h index 0686972ca..90a3c69aa 100644 --- a/src/include/86box/vid_xga.h +++ b/src/include/86box/vid_xga.h @@ -31,10 +31,12 @@ typedef struct xga_hwcursor_t { } xga_hwcursor_t; typedef struct xga_t { + mem_mapping_t membios_mapping; mem_mapping_t memio_mapping; mem_mapping_t linear_mapping; mem_mapping_t video_mapping; rom_t bios_rom; + rom_t membios_rom; rom_t vga_bios_rom; xga_hwcursor_t hwcursor; xga_hwcursor_t hwcursor_latch; @@ -47,8 +49,8 @@ typedef struct xga_t { uint8_t pos_regs[8]; uint8_t disp_addr; - uint8_t dac_mask; - uint8_t dac_status; + uint8_t dac_mask; + uint8_t dac_status; uint8_t cfg_reg; uint8_t instance; uint8_t op_mode; @@ -87,6 +89,8 @@ typedef struct xga_t { uint8_t instance_isa; uint8_t instance_num; uint8_t ext_mem_addr; + uint8_t vga_post; + uint8_t addr_test; uint8_t *vram; uint8_t *changedvram; @@ -167,6 +171,9 @@ typedef struct xga_t { uint32_t write_bank; uint32_t px_map_base; uint32_t pallook[512]; + uint32_t bios_diag; + + PALETTE xgapal; uint64_t dispontime; uint64_t dispofftime; diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index e8ae527b5..944a14a88 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -44,8 +44,6 @@ #ifdef ATI_8514_ULTRA #define BIOS_MACH8_ROM_PATH "roms/video/mach8/11301113140.BIN" - -static video_timings_t timing_8514ultra_isa = { .type = VIDEO_ISA, .write_b = 3, .write_w = 3, .write_l = 6, .read_b = 5, .read_w = 5, .read_l = 10 }; #endif static void ibm8514_accel_outb(uint16_t port, uint8_t val, void *priv); @@ -2407,9 +2405,9 @@ rect_fill_pix: dev->accel.sx += (dev->accel.cur_x & 3); } - if (dev->accel.cmd & 0x20) { + if (dev->accel.cmd & 0x20) dev->accel.cx -= (dev->accel.sx) + 1; - } else + else dev->accel.cx += (dev->accel.sx) + 1; if (dev->accel.cmd & 2) { @@ -3006,9 +3004,7 @@ rect_fill: else dev->accel.oldcy = dev->accel.cy - 1; - dev->accel.oldcx = 0; - - 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.cur_x_nolimit, dev->accel.cy, dev->accel.frgd_mix & 0x1f, dev->accel.err_term, dev->accel.clip_left, clip_r, dev->accel.clip_top, clip_b, compare_mode, dev->accel.multifunc[0x0a]); + 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, dev->accel.multifunc[2], dev->accel.multifunc[4], dev->accel.clip_top, clip_b, dev->accel.multifunc[0x0a]); if (ibm8514_cpu_src(svga)) { dev->data_available = 0; @@ -3122,10 +3118,8 @@ rect_fill: } } else { while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx < 0) - dev->accel.cx = 0; - if (dev->accel.cy < 0) - dev->accel.cy = 0; + if (dev->accel.cx < dev->accel.clip_left) + dev->accel.cx = dev->accel.clip_left; if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { @@ -3155,12 +3149,8 @@ rect_fill: if ((dev->accel.cmd & 0x14) == 0x14) { if (dev->accel.sy) { - if (dev->accel.cmd & 0x40) { + if (dev->accel.oldcy != dev->accel.cy) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else { - if (dev->accel.oldcy != dev->accel.cy) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } } } } @@ -3178,6 +3168,7 @@ rect_fill: break; if (dev->accel.cmd & 0x40) { + dev->accel.oldcy = dev->accel.cy; if (dev->accel.cmd & 0x80) dev->accel.cy++; else @@ -4159,12 +4150,12 @@ ibm8514_poll(void *priv) if (dev->on[0] || dev->on[1]) { ibm8514_log("ON!\n"); if (!dev->linepos) { - if ((dev->displine == dev->hwcursor_latch.y) && dev->hwcursor_latch.ena) { + if ((dev->displine == ((dev->hwcursor_latch.y < 0) ? 0 : dev->hwcursor_latch.y)) && dev->hwcursor_latch.ena) { dev->hwcursor_on = dev->hwcursor_latch.cur_ysize - dev->hwcursor_latch.yoff; dev->hwcursor_oddeven = 0; } - if ((dev->displine == (dev->hwcursor_latch.y + 1)) && dev->hwcursor_latch.ena && dev->interlace) { + if ((dev->displine == (((dev->hwcursor_latch.y < 0) ? 0 : dev->hwcursor_latch.y) + 1)) && dev->hwcursor_latch.ena && dev->interlace) { dev->hwcursor_on = dev->hwcursor_latch.cur_ysize - (dev->hwcursor_latch.yoff + 1); dev->hwcursor_oddeven = 1; } @@ -4195,7 +4186,7 @@ ibm8514_poll(void *priv) if (dev->hwcursor_on) { if (svga->hwcursor_draw) - svga->hwcursor_draw(svga, dev->displine + svga->y_add); + svga->hwcursor_draw(svga, (dev->displine + svga->y_add + ((dev->hwcursor_latch.y >= 0) ? 0 : dev->hwcursor_latch.y)) & 2047); dev->hwcursor_on--; if (dev->hwcursor_on && dev->interlace) dev->hwcursor_on--; @@ -4333,15 +4324,15 @@ ibm8514_recalctimings(svga_t *svga) else svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0; - if (dev->interlace) - dev->dispend >>= 1; - if (dev->dispend == 766) dev->dispend += 2; if (dev->dispend == 478) dev->dispend += 2; + if (dev->interlace) + dev->dispend >>= 1; + dev->pitch = 1024; dev->rowoffset = 0x80; svga->map8 = dev->pallook; @@ -4405,6 +4396,10 @@ ibm8514_mca_reset(void *priv) static void * ibm8514_init(const device_t *info) { +#ifdef ATI_8514_ULTRA + uint32_t bios_addr = 0; +#endif + if (svga_get_pri() == NULL) return NULL; @@ -4426,6 +4421,7 @@ ibm8514_init(const device_t *info) #ifdef ATI_8514_ULTRA dev->extensions = device_get_config_int("extensions"); + bios_addr = device_get_config_hex20("bios_addr"); switch (dev->extensions) { case 1: @@ -4446,10 +4442,14 @@ ibm8514_init(const device_t *info) } else { rom_init(&dev->bios_rom, BIOS_MACH8_ROM_PATH, - 0xd0000, 0x2000, 0x1fff, + bios_addr, 0x1000, 0xfff, 0, MEM_MAPPING_EXTERNAL); + rom_init(&dev->bios_rom2, + BIOS_MACH8_ROM_PATH, + bios_addr + 0x1000, 0x800, 0x7ff, + 0x1000, MEM_MAPPING_EXTERNAL); ati_eeprom_load(&mach->eeprom, "ati8514.nvr", 0); - dev->bios_addr = dev->bios_rom.mapping.base; + mach->accel.scratch0 = (((bios_addr >> 7) - 0x1000) >> 4); } ati8514_init(svga, svga->ext8514, svga->dev8514); break; @@ -4538,6 +4538,30 @@ static const device_config_t ext8514_config[] = { } } }, + { + .name = "bios_addr", + .description = "BIOS address", + .type = CONFIG_HEX20, + .default_string = "", + .default_int = 0xc8000, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { .description = "C800h", .value = 0xc8000 }, + { .description = "CA00h", .value = 0xca000 }, + { .description = "CC00h", .value = 0xcc000 }, + { .description = "CE00h", .value = 0xce000 }, + { .description = "D000h", .value = 0xd0000 }, + { .description = "D200h", .value = 0xd2000 }, + { .description = "D400h", .value = 0xd4000 }, + { .description = "D600h", .value = 0xd6000 }, + { .description = "D800h", .value = 0xd8000 }, + { .description = "DA00h", .value = 0xda000 }, + { .description = "DC00h", .value = 0xdc000 }, + { .description = "DE00h", .value = 0xde000 }, + { .description = "" } + }, + }, { .type = CONFIG_END } diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 46d884adf..d41f65ed9 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -37,6 +37,7 @@ #include <86box/i2c.h> #include <86box/vid_ddc.h> #include <86box/vid_8514a.h> +#include <86box/vid_xga.h> #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> #include <86box/vid_ati_eeprom.h> @@ -2478,11 +2479,13 @@ ati8514_recalctimings(svga_t *svga) dev->dispend = dev->vdisp; } - if (dev->accel.advfunc_cntl & 0x04) { + if (dev->accel.advfunc_cntl & 0x04) svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 44900000.0; - } else { + else svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / 25175000.0; - } + + if (dev->interlace) + dev->dispend >>= 1; if (dev->dispend == 766) dev->dispend += 2; @@ -3456,7 +3459,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u static void mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8514_t *dev) { - if (port != 0x7aee && port != 0x7aef && port != 0x42e8 && port != 0x42e9 && port != 0x46e8 && port != 0x46e9) + if (port != 0x7aee && port != 0x7aef && port != 0x42e8 && port != 0x42e9) mach_log("[%04X:%08X]: Port CALL OUT=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); switch (port) { @@ -4290,26 +4293,6 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) case 0x52ee: case 0x52ef: READ8(port, mach->accel.scratch0); -#ifdef ATI_8514_ULTRA - if (mach->mca_bus) { - if (!(port & 1)) { - if (svga->ext8514 != NULL) - temp = dev->pos_regs[4]; - } else { - if (svga->ext8514 != NULL) - temp = dev->pos_regs[5]; - } - } else { - if (svga->ext8514 != NULL) { - temp = ((dev->bios_addr >> 7) - 0x1000) >> 4; - if (port & 1) { - temp &= ~0x80; - temp |= 0x01; - } - } else - temp = 0x00; - } -#endif break; case 0x56ee: @@ -4368,7 +4351,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) default: break; } - if (port != 0x62ee && port != 0x62ef && port != 0x42e8 && port != 0x42e9) + if (port != 0x62ee && port != 0x62ef && port != 0x42e8 && port != 0x42e9 && port != 0x02e8 && port != 0x02e9) mach_log("[%04X:%08X]: Port NORMAL IN=%04x, temp=%04x.\n", CS, cpu_state.pc, port, temp); return temp; @@ -4641,6 +4624,7 @@ mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t dev->vram[addr] = val; return; } else { + xga_write_test(addr, val, svga); addr = mach32_decode_addr(svga, addr, 1); if (addr == 0xffffffff) return; @@ -4858,6 +4842,7 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) if (linear) { return dev->vram[addr & dev->vram_mask]; } else { + (void) xga_read_test(addr, svga); addr = mach32_decode_addr(svga, addr, 0); if (addr == 0xffffffff) return 0xff; diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index bf27a700a..01210a9d9 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -37,6 +37,7 @@ #include <86box/video.h> #include <86box/i2c.h> #include <86box/vid_ddc.h> +#include <86box/vid_xga.h> #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> #include <86box/plat_fallthrough.h> @@ -2195,6 +2196,8 @@ gd54xx_write(uint32_t addr, uint8_t val, void *priv) return; } + xga_write_test(addr, val, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + svga->extra_banks[(addr >> 15) & 1]; svga_write_linear(addr, val, svga); @@ -2212,6 +2215,9 @@ gd54xx_writew(uint32_t addr, uint16_t val, void *priv) return; } + xga_write_test(addr, val, svga); + xga_write_test(addr + 1, val >> 8, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + svga->extra_banks[(addr >> 15) & 1]; @@ -2237,6 +2243,11 @@ gd54xx_writel(uint32_t addr, uint32_t val, void *priv) return; } + xga_write_test(addr, val, svga); + xga_write_test(addr + 1, val >> 8, svga); + xga_write_test(addr + 2, val >> 16, svga); + xga_write_test(addr + 3, val >> 24, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + svga->extra_banks[(addr >> 15) & 1]; @@ -2762,6 +2773,8 @@ gd54xx_read(uint32_t addr, void *priv) if (gd54xx->countminusone && gd54xx->blt.ms_is_dest && !(gd54xx->blt.status & CIRRUS_BLT_PAUSED)) return gd54xx_mem_sys_dest_read(gd54xx, 0); + (void) xga_read_test(addr, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + svga->extra_banks[(addr >> 15) & 1]; return svga_read_linear(addr, svga); @@ -2780,6 +2793,9 @@ gd54xx_readw(uint32_t addr, void *priv) return ret; } + (void) xga_read_test(addr, svga); + (void) xga_read_test(addr + 1, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + svga->extra_banks[(addr >> 15) & 1]; return svga_readw_linear(addr, svga); @@ -2800,6 +2816,11 @@ gd54xx_readl(uint32_t addr, void *priv) return ret; } + (void) xga_read_test(addr, svga); + (void) xga_read_test(addr + 1, svga); + (void) xga_read_test(addr + 2, svga); + (void) xga_read_test(addr + 3, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + svga->extra_banks[(addr >> 15) & 1]; return svga_readl_linear(addr, svga); @@ -3826,6 +3847,16 @@ cl_pci_read(UNUSED(int func), int addr, void *priv) ret = (svga->crtc[0x27] == CIRRUS_ID_CLGD5480) ? ((gd54xx->vgablt_base >> 24) & 0xff) : 0x00; break; + case 0x2c: + ret = (svga->crtc[0x27] == CIRRUS_ID_CLGD5480) ? gd54xx->bios_rom.rom[0x7ffc] : 0x00; + break; + case 0x2d: + ret = (svga->crtc[0x27] == CIRRUS_ID_CLGD5480) ? gd54xx->bios_rom.rom[0x7ffd] : 0x00; + break; + case 0x2e: + ret = (svga->crtc[0x27] == CIRRUS_ID_CLGD5480) ? gd54xx->bios_rom.rom[0x7ffe] : 0x00; + break; + case 0x30: ret = (gd54xx->pci_regs[0x30] & 0x01); /*BIOS ROM address*/ break; diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index c223d37ba..0ac7050f4 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -125,15 +125,6 @@ et4000_in(uint16_t addr, void *priv) addr ^= 0x60; switch (addr) { - case 0x3c2: - if (dev->type == ET4000_TYPE_MCA) { - if ((svga->vgapal[0].r + svga->vgapal[0].g + svga->vgapal[0].b) >= 0x4e) - return 0; - else - return 0x10; - } - break; - case 0x3c5: if ((svga->seqaddr & 0xf) == 7) return svga->seqregs[svga->seqaddr & 0xf] | 4; @@ -770,12 +761,16 @@ et4000_mca_write(int port, uint8_t val, void *priv) /* Save the MCA register value. */ et4000->pos_regs[port & 7] = val; + mem_mapping_disable(&et4000->bios_rom.mapping); + if (et4000->pos_regs[2] & 1) + mem_mapping_enable(&et4000->bios_rom.mapping); } static uint8_t et4000_mca_feedb(UNUSED(void *priv)) { - return 1; + et4000_t *et4000 = (et4000_t *) priv; + return et4000->pos_regs[2] & 1; } static void * @@ -889,7 +884,10 @@ et4000_init(const device_t *info) dev->vram_mask = dev->vram_size - 1; rom_init(&dev->bios_rom, fn, - 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + + if (dev->type == ET4000_TYPE_MCA) + mem_mapping_disable(&dev->bios_rom.mapping); dev->svga.translate_address = get_et4000_addr; diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index 213cf9ed4..7d868a63b 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -33,6 +33,7 @@ #include <86box/rom.h> #include <86box/device.h> #include <86box/video.h> +#include <86box/vid_xga.h> #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> #include <86box/plat_fallthrough.h> @@ -1217,6 +1218,8 @@ ht216_write(uint32_t addr, uint8_t val, void *priv) svga_t *svga = &ht216->svga; uint32_t prev_addr = addr; + xga_write_test(addr, val, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + ht216->write_banks[(addr >> 15) & 1]; @@ -1238,6 +1241,9 @@ ht216_writew(uint32_t addr, uint16_t val, void *priv) svga_t *svga = &ht216->svga; uint32_t prev_addr = addr; + xga_write_test(addr, val, svga); + xga_write_test(addr + 1, val >> 8, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + ht216->write_banks[(addr >> 15) & 1]; @@ -1261,6 +1267,11 @@ ht216_writel(uint32_t addr, uint32_t val, void *priv) svga_t *svga = &ht216->svga; uint32_t prev_addr = addr; + xga_write_test(addr, val, svga); + xga_write_test(addr + 1, val >> 8, svga); + xga_write_test(addr + 2, val >> 16, svga); + xga_write_test(addr + 3, val >> 24, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + ht216->write_banks[(addr >> 15) & 1]; @@ -1422,9 +1433,11 @@ static uint8_t ht216_read(uint32_t addr, void *priv) { ht216_t *ht216 = (ht216_t *) priv; - const svga_t *svga = &ht216->svga; + svga_t *svga = &ht216->svga; uint32_t prev_addr = addr; + (void) xga_read_test(addr, svga); + addr &= svga->banked_mask; addr = (addr & 0x7fff) + ht216->read_banks[(addr >> 15) & 1]; diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index bd31abd23..cecdcf840 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -559,11 +559,12 @@ svga_set_ramdac_type(svga_t *svga, int type) } if (xga_active && xga) { if (svga->ramdac_type == RAMDAC_8BIT) - xga->pallook[c] = makecol32(svga->vgapal[c].r, svga->vgapal[c].g, svga->vgapal[c].b); - else - xga->pallook[c] = makecol32((svga->vgapal[c].r & 0x3f) * 4, - (svga->vgapal[c].g & 0x3f) * 4, - (svga->vgapal[c].b & 0x3f) * 4); + xga->pallook[c] = makecol32(xga->xgapal[c].r, xga->xgapal[c].g, xga->xgapal[c].b); + else { + xga->pallook[c] = makecol32((xga->xgapal[c].r & 0x3f) * 4, + (xga->xgapal[c].g & 0x3f) * 4, + (xga->xgapal[c].b & 0x3f) * 4); + } } if (svga->ramdac_type == RAMDAC_8BIT) svga->pallook[c] = makecol32(svga->vgapal[c].r, svga->vgapal[c].g, svga->vgapal[c].b); @@ -669,11 +670,11 @@ svga_recalctimings(svga_t *svga) } if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/ - if (svga->seqregs[1] & 8) { /*40 column*/ + if (svga->seqregs[1] & 8) { /*40 column*/ svga->render = svga_render_text_40; - } else { + } else svga->render = svga_render_text_80; - } + svga->hdisp_old = svga->hdisp; } else { svga->hdisp_old = svga->hdisp; @@ -1036,7 +1037,7 @@ svga_poll(void *priv) if (!svga->override) { if (xga_active && xga && xga->on) { if ((xga->disp_cntl_2 & 7) >= 2) { - xga_poll(xga, svga); + xga_poll(svga); return; } } @@ -1407,7 +1408,7 @@ svga_close(svga_t *svga) svga_pri = NULL; } -static uint32_t +uint32_t svga_decode_addr(svga_t *svga, uint32_t addr, int write) { int memory_map_mode = (svga->gdcreg[6] >> 2) & 3; @@ -1448,7 +1449,6 @@ static __inline void svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv) { svga_t *svga = (svga_t *) priv; - xga_t *xga = (xga_t *) svga->xga; int writemask2 = svga->writemask; int reset_wm = 0; latch_t vall; @@ -1462,40 +1462,7 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv) cycles -= svga->monitor->mon_video_timing_write_b; if (!linear) { - if (xga_active && xga) { - if (((xga->op_mode & 7) >= 4) && (xga->aperture_cntl >= 1)) { - if (val == 0xa5) { /*Memory size test of XGA*/ - xga->test = val; - if (addr == 0xa0001) - xga->a5_test = 1; - else if (addr == 0xafffe) - xga->a5_test = 2; - - xga->on = 0; - vga_on = 1; - xga->disp_cntl_2 = 0; - svga_log("XGA test1 addr = %05x.\n", addr); - return; - } else if (val == 0x5a) { - xga->test = val; - xga->on = 0; - vga_on = 1; - xga->disp_cntl_2 = 0; - svga_log("XGA test2 addr = %05x.\n", addr); - return; - } else if ((addr == 0xa0000) || (addr == 0xa0010)) { - addr += xga->write_bank; - xga->vram[addr & xga->vram_mask] = val; - svga_log("XGA Linear endian reverse write, val = %02x, addr = %05x, banked mask = %04x.\n", val, addr, svga->banked_mask); - if (!xga->a5_test) - xga->linear_endian_reverse = 1; - return; - } - } else { - xga->on = 0; - vga_on = 1; - } - } + xga_write_test(addr, val, svga); addr = svga_decode_addr(svga, addr, 1); if (addr == 0xffffffff) @@ -1670,12 +1637,11 @@ static __inline uint8_t svga_read_common(uint32_t addr, uint8_t linear, void *priv) { svga_t *svga = (svga_t *) priv; - xga_t *xga = (xga_t *) svga->xga; uint32_t latch_addr = 0; int readplane = svga->readplane; uint8_t count; uint8_t temp; - uint8_t ret; + uint8_t ret = 0x00; if (svga->adv_flags & FLAG_ADDR_BY8) readplane = svga->gdcreg[4] & 7; @@ -1683,39 +1649,7 @@ svga_read_common(uint32_t addr, uint8_t linear, void *priv) cycles -= svga->monitor->mon_video_timing_read_b; if (!linear) { - if (xga_active && xga) { - if (((xga->op_mode & 7) >= 4) && (xga->aperture_cntl >= 1)) { - if (xga->test == 0xa5) { /*Memory size test of XGA*/ - if (addr == 0xa0001) { - ret = xga->test; - xga->on = 1; - vga_on = 0; - } else if ((addr == 0xa0000) && (xga->a5_test == 1)) { /*This is required by XGAKIT to pass the memory test*/ - svga_log("A5 test bank = %x.\n", addr); - addr += xga->read_bank; - ret = xga->vram[addr & xga->vram_mask]; - } else { - ret = xga->test; - xga->on = 1; - vga_on = 0; - } - svga_log("A5 read: XGA ON = %d, addr = %05x, ret = %02x, test1 = %x.\n", xga->on, addr, ret, xga->a5_test); - return ret; - } else if (xga->test == 0x5a) { - ret = xga->test; - xga->on = 1; - vga_on = 0; - svga_log("5A read: XGA ON = %d.\n", xga->on); - return ret; - } else if ((addr == 0xa0000) || (addr == 0xa0010)) { - addr += xga->read_bank; - return xga->vram[addr & xga->vram_mask]; - } - } else { - xga->on = 0; - vga_on = 1; - } - } + (void) xga_read_test(addr, svga); addr = svga_decode_addr(svga, addr, 0); if (addr == 0xffffffff) diff --git a/src/video/vid_vga.c b/src/video/vid_vga.c index 8b2e761a3..881a3c6fd 100644 --- a/src/video/vid_vga.c +++ b/src/video/vid_vga.c @@ -31,6 +31,7 @@ #include <86box/vid_svga.h> #include <86box/vid_vga.h> +static video_timings_t timing_vga = { .type = VIDEO_ISA, .write_b = 8, .write_w = 16, .write_l = 32, .read_b = 8, .read_w = 16, .read_l = 32 }; static video_timings_t timing_ps1_svga_isa = { .type = VIDEO_ISA, .write_b = 6, .write_w = 8, .write_l = 16, .read_b = 6, .read_w = 8, .read_l = 16 }; static video_timings_t timing_ps1_svga_mca = { .type = VIDEO_MCA, .write_b = 6, .write_w = 8, .write_l = 16, .read_b = 6, .read_w = 8, .read_l = 16 }; @@ -207,7 +208,7 @@ const device_t ps1vga_device = { .init = ps1vga_init, .close = vga_close, .reset = NULL, - { .available = vga_available }, + { .available = NULL }, .speed_changed = vga_speed_changed, .force_redraw = vga_force_redraw, .config = NULL @@ -221,7 +222,7 @@ const device_t ps1vga_mca_device = { .init = ps1vga_init, .close = vga_close, .reset = NULL, - { .available = vga_available }, + { .available = NULL }, .speed_changed = vga_speed_changed, .force_redraw = vga_force_redraw, .config = NULL diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index 8946d7122..ff82a834a 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -157,6 +157,14 @@ xga_updatemapping(svga_t *svga) break; case 1: xga_log("XGA: VGA mode address decode enabled.\n"); + if (xga->base_addr_1mb) { + mem_mapping_set_addr(&xga->linear_mapping, xga->base_addr_1mb, 0x100000); + mem_mapping_enable(&xga->linear_mapping); + } else if (xga->linear_base) { + mem_mapping_set_addr(&xga->linear_mapping, xga->linear_base, 0x400000); + mem_mapping_enable(&xga->linear_mapping); + } else + mem_mapping_disable(&xga->linear_mapping); break; case 2: xga_log("XGA: 132-Column mode address decode disabled.\n"); @@ -203,8 +211,8 @@ void xga_recalctimings(svga_t *svga) { xga_t *xga = (xga_t *) svga->xga; - if (xga->on) { + xga->h_total = xga->htotal + 1; xga->v_total = xga->vtotal + 1; xga->dispend = xga->vdispend + 1; xga->v_syncstart = xga->vsyncstart + 1; @@ -213,7 +221,7 @@ xga_recalctimings(svga_t *svga) xga->h_disp = (xga->hdisp + 1) << 3; - xga->rowoffset = xga->hdisp + 1; + xga->rowoffset = xga->pix_map_width; xga->interlace = !!(xga->disp_cntl_1 & 0x08); xga->rowcount = (xga->disp_cntl_2 & 0xc0) >> 6; @@ -228,11 +236,6 @@ xga_recalctimings(svga_t *svga) xga->ma_latch = xga->disp_start_addr; - if ((xga->disp_cntl_2 & 7) == 2) - xga->rowoffset >>= 1; - else if ((xga->disp_cntl_2 & 7) == 4) - xga->rowoffset <<= 1; - xga_log("XGA ClkSel1 = %d, ClkSel2 = %02x.\n", (xga->clk_sel_1 >> 2) & 3, xga->clk_sel_2 & 0x80); switch ((xga->clk_sel_1 >> 2) & 3) { case 0: @@ -373,12 +376,15 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) case 0x40: xga->disp_start_addr = (xga->disp_start_addr & 0x7ff00) | val; + xga_log("DISPSTARTADDR0=%x.\n", xga->disp_start_addr); break; case 0x41: xga->disp_start_addr = (xga->disp_start_addr & 0x700ff) | (val << 8); + xga_log("DISPSTARTADDR8=%x.\n", xga->disp_start_addr); break; case 0x42: xga->disp_start_addr = (xga->disp_start_addr & 0x0ffff) | ((val & 0x07) << 16); + xga_log("DISPSTARTADDR16=%x.\n", xga->disp_start_addr); svga_recalctimings(svga); break; @@ -387,10 +393,11 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) break; case 0x44: xga->pix_map_width = (xga->pix_map_width & 0xff) | ((val & 0x07) << 8); + svga_recalctimings(svga); break; case 0x50: - xga_log("Reg50 write = %02x.\n", val); + xga_log("Reg50 write=%02x.\n", val); xga->disp_cntl_1 = val; svga_recalctimings(svga); break; @@ -430,18 +437,9 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) xga->cursor_data_on, xga->sprite_pal_addr_idx, xga->aperture_cntl); break; - case 0x62: - xga->sprite_pal_addr_idx_prefetch = (xga->sprite_pal_addr_idx_prefetch & 0x3f00) | val; - xga->dac_pos = 0; - xga->dac_addr = val & 0xff; - break; - case 0x63: - xga->sprite_pal_addr_idx_prefetch = (xga->sprite_pal_addr_idx_prefetch & 0xff) | ((val & 0x3f) << 8); - xga->sprite_pos_prefetch = xga->sprite_pal_addr_idx_prefetch & 0x1ff; - break; - case 0x64: xga->dac_mask = val; + xga_log("DAC mask=%02x.\n", val); break; case 0x65: @@ -458,10 +456,11 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) case 2: xga->pal_b = val; index = xga->dac_addr & 0xff; - svga->vgapal[index].r = xga->dac_r; - svga->vgapal[index].g = xga->dac_g; - svga->vgapal[index].b = xga->pal_b; - xga->pallook[index] = makecol32(svga->vgapal[index].r, svga->vgapal[index].g, svga->vgapal[index].b); + xga->xgapal[index].r = xga->dac_r; + xga->xgapal[index].g = xga->dac_g; + xga->xgapal[index].b = xga->pal_b; + xga->pallook[index] = makecol32(xga->xgapal[index].r, xga->xgapal[index].g, xga->xgapal[index].b); + xga_log("XGA Pallook=%06x, idx=%d.\n", xga->pallook[index], index); xga->dac_pos = 0; xga->dac_addr = (xga->dac_addr + 1) & 0xff; break; @@ -472,19 +471,10 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) break; case 0x66: + xga_log("Palette Sequence=%02x.\n", val); xga->pal_seq = val; break; - case 0x67: - xga->dac_r = val; - break; - case 0x68: - xga->pal_b = val; - break; - case 0x69: - xga->dac_g = val; - break; - case 0x6a: xga->sprite_data[xga->sprite_pos] = val; xga->sprite_pos = (xga->sprite_pos + 1) & 0x3ff; @@ -592,6 +582,9 @@ xga_ext_inb(uint16_t addr, void *priv) case 0x0e: case 0x0f: switch (xga->regs_idx) { + case 0: + ret = (xga->bus & DEVICE_MCA) ? 0x02 : 0x01; + break; case 4: if (xga->bus & DEVICE_MCA) ret = 0x01; /*32-bit MCA*/ @@ -724,13 +717,6 @@ xga_ext_inb(uint16_t addr, void *priv) ret = xga->sprite_pal_addr_idx >> 8; break; - case 0x62: - ret = xga->sprite_pal_addr_idx_prefetch & 0xff; - break; - case 0x63: - ret = xga->sprite_pal_addr_idx_prefetch >> 8; - break; - case 0x64: ret = xga->dac_mask; break; @@ -740,16 +726,16 @@ xga_ext_inb(uint16_t addr, void *priv) switch (xga->dac_pos) { case 0: xga->dac_pos++; - ret = svga->vgapal[index].r; + ret = xga->xgapal[index].r; break; case 1: xga->dac_pos++; - ret = svga->vgapal[index].g; + ret = xga->xgapal[index].g; break; case 2: xga->dac_pos = 0; xga->dac_addr = (xga->dac_addr + 1) & 0xff; - ret = svga->vgapal[index].b; + ret = xga->xgapal[index].b; break; default: @@ -761,21 +747,10 @@ xga_ext_inb(uint16_t addr, void *priv) ret = xga->pal_seq; break; - case 0x67: - ret = xga->dac_r; - break; - case 0x68: - ret = xga->pal_b; - break; - case 0x69: - ret = xga->dac_g; - break; - case 0x6a: - xga_log("Sprite POS Read = %d, addr idx = %04x\n", xga->sprite_pos, - xga->sprite_pal_addr_idx_prefetch); - ret = xga->sprite_data[xga->sprite_pos_prefetch]; - xga->sprite_pos_prefetch = (xga->sprite_pos_prefetch + 1) & 0x3ff; + xga_log("Sprite POS Read=%d.\n", xga->sprite_pos); + ret = xga->sprite_data[xga->sprite_pos]; + xga->sprite_pos = (xga->sprite_pos + 1) & 0x3ff; break; case 0x70: @@ -914,7 +889,7 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b uint8_t px; int skip = 0; - if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) + if ((addr < xga->linear_base) || (addr > (xga->linear_base + 0xfffff))) skip = 1; addr += (y * (width >> 3)); @@ -953,7 +928,7 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int uint8_t px; int skip = 0; - if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) + if ((addr < xga->linear_base) || (addr > (xga->linear_base + 0xfffff))) skip = 1; switch (xga->accel.px_map_format[map] & 7) { @@ -1025,7 +1000,7 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui uint8_t mask; int skip = 0; - if (addr < xga->linear_base || (addr > (xga->linear_base + 0xfffff))) + if ((addr < xga->linear_base) || (addr > (xga->linear_base + 0xfffff))) skip = 1; switch (xga->accel.px_map_format[map] & 7) { @@ -1743,9 +1718,12 @@ xga_bitblt(svga_t *svga) static void xga_mem_write(uint32_t addr, uint32_t val, xga_t *xga, svga_t *svga, int len) { + uint32_t min_addr = (0x1c00 + (xga->instance << 7)); + uint32_t max_addr = (0x1c00 + (xga->instance << 7)) + 0x7f; + addr &= 0x1fff; - if (addr >= 0x1800) { + if ((addr >= min_addr) && (addr <= max_addr)) { switch (addr & 0x7f) { case 0x11: xga->accel.control = val; @@ -2255,7 +2233,7 @@ xga_memio_writeb(uint32_t addr, uint8_t val, void *priv) xga_mem_write(addr, val, xga, svga, 1); - xga_log("Write MEMIOB = %04x, val = %02x\n", addr & 0x7f, val); + xga_log("[%04X:%08X]: Write MEMIOB = %04x, val = %02x\n", CS, cpu_state.pc, addr, val); } static void @@ -2266,7 +2244,7 @@ xga_memio_writew(uint32_t addr, uint16_t val, void *priv) xga_mem_write(addr, val, xga, svga, 2); - xga_log("Write MEMIOW = %04x, val = %04x\n", addr & 0x7f, val); + xga_log("[%04X:%08X]: Write MEMIOW = %04x, val = %04x\n", CS, cpu_state.pc, addr, val); } static void @@ -2277,21 +2255,25 @@ xga_memio_writel(uint32_t addr, uint32_t val, void *priv) xga_mem_write(addr, val, xga, svga, 4); - xga_log("Write MEMIOL = %04x, val = %08x\n", addr & 0x7f, val); + xga_log("[%04X:%08X]: Write MEMIOL = %04x, val = %08x\n", CS, cpu_state.pc, addr, val); } static uint8_t xga_mem_read(uint32_t addr, xga_t *xga, UNUSED(svga_t *svga)) { + uint32_t min_addr = (0x1c00 + (xga->instance << 7)); + uint32_t max_addr = (0x1c00 + (xga->instance << 7)) + 0x7f; uint8_t temp = 0; addr &= 0x1fff; - if (addr < 0x1800) { + if (addr < 0x1c00) { if (xga_standalone_enabled) temp = xga->bios_rom.rom[addr]; else temp = xga->vga_bios_rom.rom[addr]; - } else { + } else if ((addr >= 0x1c00) && (addr <= 0x1c7f) && xga->instance) { + temp = 0xff; + } else if ((addr >= min_addr) && (addr <= max_addr)) { switch (addr & 0x7f) { case 0x11: temp = xga->accel.control; @@ -2360,7 +2342,6 @@ xga_mem_read(uint32_t addr, xga_t *xga, UNUSED(svga_t *svga)) break; } } - return temp; } @@ -2479,7 +2460,7 @@ xga_render_overscan_left(xga_t *xga, svga_t *svga) if (svga->scrblank || (xga->h_disp == 0)) return; - uint32_t *line_ptr = svga->monitor->target_buffer->line[xga->displine + svga->y_add]; + uint32_t *line_ptr = buffer32->line[xga->displine + svga->y_add]; for (int i = 0; i < svga->x_add; i++) *line_ptr++ = svga->overscan_color; } @@ -2495,7 +2476,7 @@ xga_render_overscan_right(xga_t *xga, svga_t *svga) if (svga->scrblank || (xga->h_disp == 0)) return; - uint32_t *line_ptr = &svga->monitor->target_buffer->line[xga->displine + svga->y_add][svga->x_add + xga->h_disp]; + uint32_t *line_ptr = &buffer32->line[xga->displine + svga->y_add][svga->x_add + xga->h_disp]; right = (overscan_x >> 1); for (int i = 0; i < right; i++) *line_ptr++ = svga->overscan_color; @@ -2512,10 +2493,11 @@ xga_render_4bpp(svga_t *svga) return; if (xga->changedvram[xga->ma >> 12] || xga->changedvram[(xga->ma >> 12) + 1] || svga->fullchange) { - p = &svga->monitor->target_buffer->line[xga->displine + svga->y_add][svga->x_add]; + p = &buffer32->line[xga->displine + svga->y_add][svga->x_add]; if (xga->firstline_draw == 2000) xga->firstline_draw = xga->displine; + xga->lastline_draw = xga->displine; for (int x = 0; x <= xga->h_disp; x += 16) { @@ -2557,7 +2539,7 @@ xga_render_8bpp(svga_t *svga) return; if (xga->changedvram[xga->ma >> 12] || xga->changedvram[(xga->ma >> 12) + 1] || svga->fullchange) { - p = &svga->monitor->target_buffer->line[xga->displine + svga->y_add][svga->x_add]; + p = &buffer32->line[xga->displine + svga->y_add][svga->x_add]; if (xga->firstline_draw == 2000) xga->firstline_draw = xga->displine; @@ -2595,7 +2577,7 @@ xga_render_16bpp(svga_t *svga) return; if (xga->changedvram[xga->ma >> 12] || xga->changedvram[(xga->ma >> 12) + 1] || svga->fullchange) { - p = &svga->monitor->target_buffer->line[xga->displine + svga->y_add][svga->x_add]; + p = &buffer32->line[xga->displine + svga->y_add][svga->x_add]; if (xga->firstline_draw == 2000) xga->firstline_draw = xga->displine; @@ -2623,17 +2605,51 @@ xga_render_16bpp(svga_t *svga) } } +void +xga_write_test(uint32_t addr, uint8_t val, void *priv) +{ + svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; + + if (xga_active && xga) { + if (((xga->op_mode & 7) >= 1) && (xga->aperture_cntl >= 1)) { + if (val == 0xa5) { /*Memory size test of XGA*/ + xga->test = val; + if (addr == 0xa0001) + xga->a5_test = 1; + else if (addr == 0xafffe) + xga->a5_test = 2; + + xga->on = 0; + vga_on = 1; + xga->disp_cntl_2 = 0; + xga_log("XGA test1 addr=%05x, test=%02x.\n", addr, xga->a5_test); + } else if (val == 0x5a) { + xga->test = val; + xga->on = 0; + vga_on = 1; + xga->disp_cntl_2 = 0; + xga_log("XGA test2 addr = %05x.\n", addr); + } else if ((addr == 0xa0000) || (addr == 0xa0010)) { + addr += xga->write_bank; + xga->vram[addr & xga->vram_mask] = val; + xga_log("XGA Linear endian reverse write, val = %02x, addr = %05x, banked mask = %04x, a5test=%d.\n", val, addr, svga->banked_mask, xga->a5_test); + if (!xga->a5_test) + xga->linear_endian_reverse = 1; + } + } else { + xga->on = 0; + vga_on = 1; + } + } +} + static void xga_write(uint32_t addr, uint8_t val, void *priv) { svga_t *svga = (svga_t *) priv; xga_t *xga = (xga_t *) svga->xga; - if (!xga->on) { - svga_write(addr, val, svga); - return; - } - addr &= xga->banked_mask; addr += xga->write_bank; @@ -2655,12 +2671,6 @@ static void xga_writew(uint32_t addr, uint16_t val, void *priv) { svga_t *svga = (svga_t *) priv; - xga_t *xga = (xga_t *) svga->xga; - - if (!xga->on) { - svga_writew(addr, val, svga); - return; - } xga_write(addr, val & 0xff, svga); xga_write(addr + 1, val >> 8, svga); @@ -2670,12 +2680,6 @@ static void xga_writel(uint32_t addr, uint32_t val, void *priv) { svga_t *svga = (svga_t *) priv; - xga_t *xga = (xga_t *) svga->xga; - - if (!xga->on) { - svga_writel(addr, val, svga); - return; - } xga_write(addr, val & 0xff, svga); xga_write(addr + 1, (val >> 8) & 0xff, svga); @@ -2683,6 +2687,49 @@ xga_writel(uint32_t addr, uint32_t val, void *priv) xga_write(addr + 3, (val >> 24) & 0xff, svga); } +uint8_t +xga_read_test(uint32_t addr, void *priv) +{ + svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; + uint8_t ret = 0x00; + + if (xga_active && xga) { + if (((xga->op_mode & 7) >= 1) && (xga->aperture_cntl >= 1)) { + if (xga->test == 0xa5) { /*Memory size test of XGA*/ + if (addr == 0xa0001) { + ret = xga->test; + xga->on = 1; + vga_on = 0; + } else if ((addr == 0xa0000) && (xga->a5_test == 1)) { /*This is required by XGAKIT to pass the memory test*/ + xga_log("A5 test bank = %x.\n", addr); + addr += xga->read_bank; + ret = xga->vram[addr & xga->vram_mask]; + } else { + ret = xga->test; + xga->on = 1; + vga_on = 0; + } + xga_log("A5 read: XGA ON = %d, addr = %05x, ret = %02x, test1 = %x.\n", xga->on, addr, ret, xga->a5_test); + return ret; + } else if (xga->test == 0x5a) { + ret = xga->test; + xga->on = 1; + vga_on = 0; + xga_log("5A read: XGA ON = %d.\n", xga->on); + return ret; + } else if ((addr == 0xa0000) || (addr == 0xa0010)) { + addr += xga->read_bank; + return xga->vram[addr & xga->vram_mask]; + } + } else { + xga->on = 0; + vga_on = 1; + } + } + return ret; +} + static uint8_t xga_read(uint32_t addr, void *priv) { @@ -2690,11 +2737,6 @@ xga_read(uint32_t addr, void *priv) xga_t *xga = (xga_t *) svga->xga; uint8_t ret = 0xff; - if (!xga->on) { - ret = svga_read(addr, svga); - return ret; - } - addr &= xga->banked_mask; addr += xga->read_bank; @@ -2717,14 +2759,8 @@ static uint16_t xga_readw(uint32_t addr, void *priv) { svga_t *svga = (svga_t *) priv; - xga_t *xga = (xga_t *) svga->xga; uint16_t ret = 0xffff; - if (!xga->on) { - ret = svga_readw(addr, svga); - return ret; - } - ret = xga_read(addr, svga); ret |= (xga_read(addr + 1, svga) << 8); @@ -2735,14 +2771,8 @@ static uint32_t xga_readl(uint32_t addr, void *priv) { svga_t *svga = (svga_t *) priv; - xga_t *xga = (xga_t *) svga->xga; uint32_t ret = 0xffffffff; - if (!xga->on) { - ret = svga_readl(addr, svga); - return ret; - } - ret = xga_read(addr, svga); ret |= (xga_read(addr + 1, svga) << 8); ret |= (xga_read(addr + 2, svga) << 16); @@ -2883,43 +2913,11 @@ xga_readl_linear(uint32_t addr, void *priv) return ret; } -static void -xga_do_render(svga_t *svga) -{ - xga_t *xga = (xga_t *) svga->xga; - - xga_log("DISPCNTL = %d, vga = %d.\n", xga->disp_cntl_2 & 7, vga_on); - switch (xga->disp_cntl_2 & 7) { - case 2: - xga_render_4bpp(svga); - break; - case 3: - xga_render_8bpp(svga); - break; - case 4: - xga_render_16bpp(svga); - break; - default: - break; - } - - svga->x_add = (overscan_x >> 1); - xga_render_overscan_left(xga, svga); - xga_render_overscan_right(xga, svga); - svga->x_add = (overscan_x >> 1); - - if (xga->hwcursor_on) { - xga_hwcursor_draw(svga, xga->displine + svga->y_add); - xga->hwcursor_on--; - if (xga->hwcursor_on && xga->interlace) - xga->hwcursor_on--; - } -} - void -xga_poll(void *priv, svga_t *svga) +xga_poll(void *priv) { - xga_t *xga = (xga_t *) priv; + svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; uint32_t x; int wx; int wy; @@ -2936,6 +2934,7 @@ xga_poll(void *priv, svga_t *svga) } timer_advance_u64(&svga->timer, svga->dispofftime); + svga->cgastat |= 1; xga->linepos = 1; if (xga->dispon) { @@ -2951,7 +2950,32 @@ xga_poll(void *priv, svga_t *svga) if (xga->hwcursor_on) xga->changedvram[xga->ma >> 12] = xga->changedvram[(xga->ma >> 12) + 1] = xga->interlace ? 3 : 2; - xga_do_render(svga); + xga_log("DISPCNTL = %d, vga = %d.\n", xga->disp_cntl_2 & 7, vga_on); + switch (xga->disp_cntl_2 & 7) { + case 2: + xga_render_4bpp(svga); + break; + case 3: + xga_render_8bpp(svga); + break; + case 4: + xga_render_16bpp(svga); + break; + default: + break; + } + + svga->x_add = (overscan_x >> 1); + xga_render_overscan_left(xga, svga); + xga_render_overscan_right(xga, svga); + svga->x_add = (overscan_x >> 1); + + if (xga->hwcursor_on) { + xga_hwcursor_draw(svga, xga->displine + svga->y_add); + xga->hwcursor_on--; + if (xga->hwcursor_on && xga->interlace) + xga->hwcursor_on--; + } if (xga->lastline < xga->displine) xga->lastline = xga->displine; @@ -2960,10 +2984,15 @@ xga_poll(void *priv, svga_t *svga) xga->displine++; if (xga->interlace) xga->displine++; + if ((svga->cgastat & 8) && ((xga->displine & 0x0f) == (svga->crtc[0x11] & 0x0f)) && svga->vslines) + svga->cgastat &= ~8; if (xga->displine > 1500) xga->displine = 0; } else { timer_advance_u64(&svga->timer, svga->dispontime); + if (xga->dispon) + svga->cgastat &= ~1; + xga->h_disp_on = 0; xga->linepos = 0; @@ -2971,6 +3000,7 @@ xga_poll(void *priv, svga_t *svga) if (xga->sc == xga->rowcount) { xga->sc = 0; + xga_log("MA=%08x, MALATCH=%x.\n", xga->ma, xga->ma_latch); xga->maback += (xga->rowoffset << 3); if (xga->interlace) xga->maback += (xga->rowoffset << 3); @@ -3010,6 +3040,7 @@ xga_poll(void *priv, svga_t *svga) } if (xga->vc == xga->v_syncstart) { xga->dispon = 0; + svga->cgastat |= 8; x = xga->h_disp; if (xga->interlace && !xga->oddeven) @@ -3057,13 +3088,10 @@ xga_poll(void *priv, svga_t *svga) static uint8_t xga_mca_read(int port, void *priv) { - const svga_t *svga = (svga_t *) priv; - const xga_t *xga = (xga_t *) svga->xga; + svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; uint8_t ret = xga->pos_regs[port & 7]; - if (((port & 7) == 3) && !(ret & 1)) /*Always enable the mapping.*/ - ret |= 1; - xga_log("[%04X:%08X]: POS Read Port = %x, val = %02x\n", CS, cpu_state.pc, port & 7, xga->pos_regs[port & 7]); @@ -3081,7 +3109,6 @@ xga_mca_write(int port, uint8_t val, void *priv) return; io_removehandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); - mem_mapping_disable(&xga->bios_rom.mapping); mem_mapping_disable(&xga->memio_mapping); xga->on = 0; vga_on = 1; @@ -3090,8 +3117,6 @@ xga_mca_write(int port, uint8_t val, void *priv) /* Save the MCA register value. */ xga->pos_regs[port & 7] = val; - if (!(xga->pos_regs[4] & 1) && (mem_size >= 16384)) /*MCA 4MB addressing on systems with more than 16MB of memory*/ - xga->pos_regs[4] |= 1; if (xga->pos_regs[2] & 1) { xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; @@ -3101,10 +3126,10 @@ xga_mca_write(int port, uint8_t val, void *priv) io_sethandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); - if (xga->pos_regs[3] & 1) - mem_mapping_set_addr(&xga->bios_rom.mapping, xga->rom_addr, 0x2000); - else - mem_mapping_set_addr(&xga->memio_mapping, xga->rom_addr + 0x1c00 + (xga->instance * 0x80), 0x80); + if (xga->rom_addr) { + mem_mapping_set_addr(&xga->memio_mapping, xga->rom_addr, 0x2000); + xga_log("ROM address=%05x.\n", xga->rom_addr); + } } xga_log("[%04X:%08X]: POS Write Port = %x, val = %02x, linear base = %08x, instance = %d, " @@ -3118,6 +3143,7 @@ xga_mca_feedb(void *priv) const svga_t *svga = (svga_t *) priv; const xga_t *xga = (xga_t *) svga->xga; + xga_log("FeedB.\n"); return xga->pos_regs[2] & 1; } @@ -3127,10 +3153,10 @@ xga_mca_reset(void *priv) svga_t *svga = (svga_t *) priv; xga_t *xga = (xga_t *) svga->xga; - mem_mapping_disable(&xga->bios_rom.mapping); mem_mapping_disable(&xga->memio_mapping); xga->on = 0; vga_on = 1; + xga_log("MCA Reset.\n"); xga_mca_write(0x102, 0, svga); xga->linear_endian_reverse = 0; xga->a5_test = 0; @@ -3142,7 +3168,10 @@ xga_reset(void *priv) svga_t *svga = (svga_t *) priv; xga_t *xga = (xga_t *) svga->xga; - mem_mapping_disable(&xga->bios_rom.mapping); + if (!(xga->bus & DEVICE_MCA) && !xga_standalone_enabled) + mem_mapping_disable(&xga->bios_rom.mapping); + + xga_log("Normal Reset.\n"); mem_mapping_disable(&xga->memio_mapping); xga->on = 0; vga_on = 1; @@ -3155,32 +3184,31 @@ xga_pos_in(uint16_t addr, void *priv) { svga_t *svga = (svga_t *) priv; xga_t *xga = (xga_t *) svga->xga; - uint8_t ret = 0xff; + uint8_t ret = 0x00; if (!xga_standalone_enabled) { switch (addr) { case 0x0100: case 0x0101: - if (xga->instance_isa == xga->instance_num) + if (xga->instance == xga->instance_num) ret = xga->pos_regs[addr & 7]; else ret = 0xff; + + xga_log("%03xRead=%02x.\n", addr, ret); break; case 0x0102: + ret = xga->pos_regs[2]; + break; case 0x0105: - ret = xga->pos_regs[addr & 7]; - break; - case 0x0106: - ret = xga->pos_idx >> 8; - break; - case 0x0107: - ret = xga->pos_idx & 0xff; + ret = xga->pos_regs[5]; + xga_log("POS IDX Read 010%x ret = %02x.\n", addr & 7, ret); break; case 0x0103: - if (!(xga->pos_idx & 3)) + if ((xga->pos_idx & 3) == 0) { ret = xga->pos_regs[3]; - else - ret = 0; + ret |= (xga->dma_channel << 3); + } xga_log("POS IDX for 0103 = %d, ret = %02x.\n", xga->pos_idx & 3, ret); break; @@ -3195,31 +3223,25 @@ xga_pos_in(uint16_t addr, void *priv) case 2: ret = xga->pos_regs[1]; break; - case 3: - ret = 0; - break; default: break; } - xga_log("POS IDX for 0104 = %d, ret = %02x.\n", xga->pos_idx & 3, ret); break; - case 0x0108: - case 0x0109: - case 0x010a: - case 0x010b: - case 0x010c: - case 0x010d: - case 0x010e: - case 0x010f: - xga->instance_num = addr & 7; - if (xga->instance_isa == xga->instance_num) - ret = xga->instance_isa; - else - ret = 0; + case 0x0106: + ret = xga->pos_idx >> 8; + break; + case 0x0107: + ret = xga->pos_idx & 0xff; + break; + case 0x0108 ... 0x010f: + xga->instance_num = addr & 0x07; + if (xga->instance == xga->instance_num) + ret = xga->instance; ret |= xga->isa_pos_enable; + xga_log("%03xRead=%02x.\n", addr, ret); break; default: @@ -3227,12 +3249,15 @@ xga_pos_in(uint16_t addr, void *priv) } } else { switch (addr) { + case 0x0096: + ret = xga->vga_post; + break; case 0x0100: case 0x0101: ret = xga->pos_regs[addr & 7]; break; case 0x0103: - ret = xga->pos_regs[3] | 7; + ret = xga->pos_regs[3] | 0x06; ret |= (xga->dma_channel << 3); break; case 0x0102: @@ -3242,26 +3267,11 @@ xga_pos_in(uint16_t addr, void *priv) case 0x0107: ret = (xga_mca_read(addr, svga)); break; - case 0x0108: - case 0x0109: - case 0x010a: - case 0x010b: - case 0x010c: - case 0x010d: - case 0x010e: - case 0x010f: - xga->instance_num = addr & 7; - if (xga->instance_isa == xga->instance_num) - ret = xga->instance_isa; - else - ret = 0; - - ret |= xga->isa_pos_enable; - break; default: break; } + xga_log("XGA Standalone ISA Read Port=%04x, Ret=%02x.\n", addr, ret); } return ret; } @@ -3274,6 +3284,44 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv) if (!xga_standalone_enabled) { switch (addr) { + case 0x0096: + xga->vga_post = val; + xga_log("096Write=%02x.\n", val); + break; + case 0x0102: + xga->pos_regs[2] = (val & 0x01); + xga->pos_regs[2] |= ((xga->instance_isa << 1) | xga->ext_mem_addr); + io_removehandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); + mem_mapping_disable(&xga->memio_mapping); + if (xga->pos_regs[2] & 0x01) { + xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xf0) >> 4) * 0x2000); + xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; + xga->linear_base = ((xga->pos_regs[4] & 0xfe) * 0x1000000) + (xga->instance << 22); + xga->base_addr_1mb = (xga->pos_regs[5] & 0x0f) << 20; + io_sethandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); + xga_log("XGA ISA ROM address=%05x, instance=%d.\n", xga->rom_addr, xga->instance); + if (xga->rom_addr >= 0xc8000) + mem_mapping_set_addr(&xga->memio_mapping, xga->rom_addr, 0x2000); + else + mem_mapping_disable(&xga->memio_mapping); + } + xga_log("102Write=%02x.\n", val); + break; + case 0x0103: + if ((xga->pos_idx & 3) == 0) + xga->pos_regs[3] = val; + + xga_log("[%04X:%08X]: 103Write=%02x.\n", CS, cpu_state.pc, val); + break; + case 0x0104: + xga_log("104Write=%02x.\n", val); + if ((xga->pos_idx & 3) == 0) + xga->pos_regs[4] = val; + break; + case 0x0105: + xga_log("105Write=%02x.\n", val); + xga->pos_regs[5] = val; + break; case 0x0106: xga->pos_idx = (xga->pos_idx & 0x00ff) | (val << 8); break; @@ -3281,15 +3329,9 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv) xga->pos_idx = (xga->pos_idx & 0xff00) | val; xga_log("POS IDX Write = %04x.\n", xga->pos_idx); break; - case 0x0108: - case 0x0109: - case 0x010a: - case 0x010b: - case 0x010c: - case 0x010d: - case 0x010e: - case 0x010f: - xga->instance_num = addr & 7; + case 0x0108 ... 0x010f: + xga_log("%03xWrite=%02x.\n", addr, val); + xga->instance_num = addr & 0x07; xga->isa_pos_enable = val & 0x08; break; @@ -3297,17 +3339,10 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv) break; } } else { + xga_log("XGA Standalone ISA Write Port=%04x, Val=%02x.\n", addr, val); switch (addr) { - case 0x0108: - case 0x0109: - case 0x010a: - case 0x010b: - case 0x010c: - case 0x010d: - case 0x010e: - case 0x010f: - xga->instance_num = addr & 7; - xga->isa_pos_enable = val & 0x08; + case 0x0096: + xga->vga_post = val; break; default: @@ -3324,8 +3359,6 @@ xga_init(const device_t *info) svga_t *svga = svga_get_pri(); xga_t *xga = (xga_t *) calloc(1, sizeof(xga_t)); - FILE *fp; - uint8_t *rom = NULL; svga->xga = xga; @@ -3346,21 +3379,6 @@ xga_init(const device_t *info) xga->linear_endian_reverse = 0; xga->a5_test = 0; - fp = rom_fopen(xga->type ? XGA2_BIOS_PATH : XGA_BIOS_PATH, "rb"); - (void) fseek(fp, 0L, SEEK_END); - (void) fseek(fp, 0L, SEEK_SET); - - rom = malloc(xga->bios_rom.sz); - memset(rom, 0xff, xga->bios_rom.sz); - (void) !fread(rom, xga->bios_rom.sz, 1, fp); - (void) fclose(fp); - - xga->bios_rom.rom = rom; - xga->bios_rom.mask = xga->bios_rom.sz - 1; - if (fp != NULL) { - free(rom); - } - if (info->flags & DEVICE_MCA) { video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_xga_mca); xga->base_addr_1mb = 0; @@ -3368,29 +3386,30 @@ xga_init(const device_t *info) xga->instance = 0; xga->rom_addr = 0; rom_init(&xga->bios_rom, xga->type ? XGA2_BIOS_PATH : XGA_BIOS_PATH, 0xc0000, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); + mem_mapping_disable(&xga->bios_rom.mapping); } else { - if (!xga_standalone_enabled) + xga->pos_regs[4] = 0x02; + if (!xga_standalone_enabled) { rom_init(&xga->vga_bios_rom, INMOS_XGA_BIOS_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - else - video_inform(VIDEO_FLAG_TYPE_SPECIAL, &timing_xga_isa); - - xga->pos_regs[2] = 1 | (xga->instance_isa << 1) | xga->ext_mem_addr; - xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; - xga->pos_regs[4] = 2; - if (mem_size >= 16384) { - xga->pos_regs[4] |= 1; - xga->pos_regs[5] = 0; } else { - xga->pos_regs[5] = ((mem_size * 64) >> 0x10) + 1; - if (xga->pos_regs[5] == 0x10) { + xga->pos_regs[2] = (xga->instance_isa << 1) | xga->ext_mem_addr; + xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xf0) >> 4) * 0x2000); + xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; + xga->pos_regs[2] |= 0x01; + if (mem_size >= 16384) { + xga->pos_regs[4] |= 0x01; xga->pos_regs[5] = 0; - xga->pos_regs[4] |= 1; + } else { + xga->pos_regs[5] = ((mem_size * 64) >> 0x10) + 1; + if (xga->pos_regs[5] == 0x10) { + xga->pos_regs[5] = 0x00; + xga->pos_regs[4] |= 0x01; + } } + xga->base_addr_1mb = (xga->pos_regs[5] & 0x0f) << 20; + xga->linear_base = ((xga->pos_regs[4] & 0xfe) * 0x1000000) + (xga->instance << 22); + rom_init(&xga->bios_rom, xga->type ? XGA2_BIOS_PATH : XGA_BIOS_PATH, xga->rom_addr, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); } - - xga->base_addr_1mb = (xga->pos_regs[5] & 0x0f) << 20; - xga->linear_base = ((xga->pos_regs[4] & 0xfe) * 0x1000000) + (xga->instance << 22); - xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xf0) >> 4) * 0x2000); } mem_mapping_add(&xga->video_mapping, 0, 0, xga_read, xga_readw, xga_readl, @@ -3399,9 +3418,14 @@ xga_init(const device_t *info) mem_mapping_add(&xga->linear_mapping, 0, 0, xga_read_linear, xga_readw_linear, xga_readl_linear, xga_write_linear, xga_writew_linear, xga_writel_linear, NULL, MEM_MAPPING_EXTERNAL, svga); - mem_mapping_add(&xga->memio_mapping, 0, 0, xga_memio_readb, xga_memio_readw, xga_memio_readl, + if (xga_standalone_enabled) + mem_mapping_add(&xga->memio_mapping, 0, 0, xga_memio_readb, xga_memio_readw, xga_memio_readl, xga_memio_writeb, xga_memio_writew, xga_memio_writel, - !xga_standalone_enabled ? xga->vga_bios_rom.rom : xga->bios_rom.rom, MEM_MAPPING_EXTERNAL, svga); + xga->bios_rom.rom, MEM_MAPPING_EXTERNAL, svga); + else + mem_mapping_add(&xga->memio_mapping, 0, 0, xga_memio_readb, xga_memio_readw, xga_memio_readl, + xga_memio_writeb, xga_memio_writew, xga_memio_writel, + xga->vga_bios_rom.rom, MEM_MAPPING_EXTERNAL, svga); mem_mapping_disable(&xga->linear_mapping); mem_mapping_disable(&xga->memio_mapping); @@ -3412,13 +3436,12 @@ xga_init(const device_t *info) if (xga->bus & DEVICE_MCA) { mca_add(xga_mca_read, xga_mca_write, xga_mca_feedb, xga_mca_reset, svga); } else { - io_sethandler(0x0100, 0x0008, xga_pos_in, NULL, NULL, NULL, NULL, NULL, svga); - if (!xga_standalone_enabled) - io_sethandler(0x0106, 0x0002, NULL, NULL, NULL, xga_pos_out, NULL, NULL, svga); - - io_sethandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); - io_sethandler(0x0108, 0x0008, xga_pos_in, NULL, NULL, xga_pos_out, NULL, NULL, svga); - mem_mapping_set_addr(&xga->memio_mapping, xga->rom_addr + 0x1c00 + (xga->instance * 0x80), 0x80); + io_sethandler(0x0096, 0x0001, xga_pos_in, NULL, NULL, xga_pos_out, NULL, NULL, svga); + io_sethandler(0x0100, 0x0010, xga_pos_in, NULL, NULL, xga_pos_out, NULL, NULL, svga); + if (xga_standalone_enabled) { + io_sethandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); + mem_mapping_set_addr(&xga->memio_mapping, xga->rom_addr, 0x2000); + } } return svga; } @@ -3598,6 +3621,83 @@ static const device_config_t xga_isa_configuration[] = { // clang-format on }; +static const device_config_t xga_inmos_isa_configuration[] = { + // clang-format off + { + .name = "type", + .description = "XGA type", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 0, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { + .description = "XGA-1", + .value = 0 + }, + { + .description = "XGA-2", + .value = 1 + }, + { .description = "" } + } + }, + { + .name = "instance", + .description = "Instance", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 6, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { .description = "0 (2100h-210Fh)", .value = 0 }, + { .description = "1 (2110h-211Fh)", .value = 1 }, + { .description = "2 (2120h-212Fh)", .value = 2 }, + { .description = "3 (2130h-213Fh)", .value = 3 }, + { .description = "4 (2140h-214Fh)", .value = 4 }, + { .description = "5 (2150h-215Fh)", .value = 5 }, + { .description = "6 (2160h-216Fh)", .value = 6 }, + { .description = "7 (2170h-217Fh)", .value = 7 }, + { .description = "" } + }, + }, + { + .name = "ext_mem_addr", + .description = "MMIO address", + .type = CONFIG_HEX16, + .default_string = "", + .default_int = 0x0040, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { .description = "C800h", .value = 0x0040 }, + { .description = "CA00h", .value = 0x0050 }, + { .description = "CC00h", .value = 0x0060 }, + { .description = "CE00h", .value = 0x0070 }, + { .description = "" } + }, + }, + { + .name = "dma", + .description = "DMA channel", + .type = CONFIG_SELECTION, + .default_string = "", + .default_int = 7, + .file_filter = "", + .spinner = { 0 }, + .selection = { + { .description = "Disabled", .value = 0 }, + { .description = "DMA 6", .value = 6 }, + { .description = "DMA 7", .value = 7 }, + { .description = "" } + }, + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + const device_t xga_device = { .name = "XGA (MCA)", .internal_name = "xga_mca", @@ -3637,7 +3737,7 @@ const device_t inmos_isa_device = { { .available = inmos_xga_available }, .speed_changed = xga_speed_changed, .force_redraw = xga_force_redraw, - .config = xga_isa_configuration + .config = xga_inmos_isa_configuration }; void From 513572135993f21f6d57d14964f09397010450a9 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 5 Oct 2024 21:24:54 +0200 Subject: [PATCH 479/624] XGA changes of the day (October 5th, 2024) 1. SVGA decode mask shouldn't be used in XGA native mode, fixes wrong locks in LFB access. 2. INMOS XGA only: more accurate emulation per INMOS G201 MCA/ISA manual, including the MMIO access and port 0x96, allowing full BIOS and MMIO access at the same time on 0xc0000. --- src/video/vid_xga.c | 162 +++++++++++++++++++++----------------------- 1 file changed, 78 insertions(+), 84 deletions(-) diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index ff82a834a..e8d6ef715 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -171,6 +171,14 @@ xga_updatemapping(svga_t *svga) break; case 3: xga_log("XGA: 132-Column mode address decode enabled.\n"); + if (xga->base_addr_1mb) { + mem_mapping_set_addr(&xga->linear_mapping, xga->base_addr_1mb, 0x100000); + mem_mapping_enable(&xga->linear_mapping); + } else if (xga->linear_base) { + mem_mapping_set_addr(&xga->linear_mapping, xga->linear_base, 0x400000); + mem_mapping_enable(&xga->linear_mapping); + } else + mem_mapping_disable(&xga->linear_mapping); break; default: xga_log("XGA: Extended Graphics mode.\n"); @@ -506,10 +514,6 @@ xga_ext_outb(uint16_t addr, uint8_t val, void *priv) xga->aperture_cntl = val & 3; xga_updatemapping(svga); break; - case 4: - if ((xga->disp_cntl_2 & 7) == 4) - xga->aperture_cntl = 0; - break; case 8: xga->ap_idx = val; xga_log("Aperture CNTL = %d, val = %02x, up to bit6 = %02x\n", xga->aperture_cntl, @@ -1718,12 +1722,24 @@ xga_bitblt(svga_t *svga) static void xga_mem_write(uint32_t addr, uint32_t val, xga_t *xga, svga_t *svga, int len) { - uint32_t min_addr = (0x1c00 + (xga->instance << 7)); - uint32_t max_addr = (0x1c00 + (xga->instance << 7)) + 0x7f; + uint32_t min_addr; + uint32_t max_addr; + int mmio_addr_enable = 0; - addr &= 0x1fff; + if (xga_standalone_enabled) { + addr &= 0x1fff; + min_addr = (0x1c00 + (xga->instance << 7)); + max_addr = (0x1c00 + (xga->instance << 7)) + 0x7f; + } else { + addr &= 0x7fff; + min_addr = (0x7c00 + (xga->instance << 7)); + max_addr = (0x7c00 + (xga->instance << 7)) + 0x7f; + } - if ((addr >= min_addr) && (addr <= max_addr)) { + if ((addr >= min_addr) && (addr <= max_addr)) + mmio_addr_enable = 1; + + if (mmio_addr_enable) { switch (addr & 0x7f) { case 0x11: xga->accel.control = val; @@ -2166,7 +2182,6 @@ exec_command: xga->accel.px_map_format[xga->accel.src_map] & 0x0f, xga->accel.plane_mask); #endif - switch ((xga->accel.command >> 24) & 0x0f) { case 2: /*Short Stroke Vectors Read */ xga_log("Short Stroke Vectors Read.\n"); @@ -2261,19 +2276,34 @@ xga_memio_writel(uint32_t addr, uint32_t val, void *priv) static uint8_t xga_mem_read(uint32_t addr, xga_t *xga, UNUSED(svga_t *svga)) { - uint32_t min_addr = (0x1c00 + (xga->instance << 7)); - uint32_t max_addr = (0x1c00 + (xga->instance << 7)) + 0x7f; + uint32_t min_addr; + uint32_t max_addr; uint8_t temp = 0; + int mmio_addr_enable = 0; - addr &= 0x1fff; - if (addr < 0x1c00) { - if (xga_standalone_enabled) + if (xga_standalone_enabled) { + addr &= 0x1fff; + min_addr = (0x1c00 + (xga->instance << 7)); + max_addr = (0x1c00 + (xga->instance << 7)) + 0x7f; + if (addr < 0x1c00) temp = xga->bios_rom.rom[addr]; - else - temp = xga->vga_bios_rom.rom[addr]; - } else if ((addr >= 0x1c00) && (addr <= 0x1c7f) && xga->instance) { - temp = 0xff; - } else if ((addr >= min_addr) && (addr <= max_addr)) { + else if ((addr >= 0x1c00) && (addr <= 0x1c7f) && xga->instance) + temp = 0xff; + else if ((addr >= min_addr) && (addr <= max_addr)) + mmio_addr_enable = 1; + } else { + addr &= 0x7fff; + min_addr = (0x7c00 + (xga->instance << 7)); + max_addr = (0x7c00 + (xga->instance << 7)) + 0x7f; + if (addr < 0x7c00) + temp = xga->bios_rom.rom[addr]; + else if ((addr >= 0x7c00) && (addr <= 0x7c7f) && xga->instance) + temp = 0xff; + else if ((addr >= min_addr) && (addr <= max_addr)) + mmio_addr_enable = 1; + } + + if (mmio_addr_enable) { switch (addr & 0x7f) { case 0x11: temp = xga->accel.control; @@ -2341,6 +2371,7 @@ xga_mem_read(uint32_t addr, xga_t *xga, UNUSED(svga_t *svga)) default: break; } + xga_log("MMIO Addr=%02x, ret=%02x.\n", addr & 0x7f, temp); } return temp; } @@ -2740,8 +2771,10 @@ xga_read(uint32_t addr, void *priv) addr &= xga->banked_mask; addr += xga->read_bank; - if (addr >= xga->vram_size) + if (addr >= xga->vram_size) { + xga_log("Over Read ADDR=%x.\n", addr); return ret; + } cycles -= svga->monitor->mon_video_timing_read_b; @@ -2792,7 +2825,7 @@ xga_write_linear(uint32_t addr, uint8_t val, void *priv) return; } - addr &= svga->decode_mask; + addr &= (xga->vram_size - 1); if (addr >= xga->vram_size) { xga_log("Write Linear Over!.\n"); @@ -2857,10 +2890,10 @@ xga_read_linear(uint32_t addr, void *priv) if (!xga->on) return svga_read_linear(addr, svga); - addr &= svga->decode_mask; + addr &= (xga->vram_size - 1); if (addr >= xga->vram_size) { - xga_log("Read Linear Over!.\n"); + xga_log("Read Linear Over ADDR=%x!.\n", addr); return ret; } @@ -3168,11 +3201,10 @@ xga_reset(void *priv) svga_t *svga = (svga_t *) priv; xga_t *xga = (xga_t *) svga->xga; - if (!(xga->bus & DEVICE_MCA) && !xga_standalone_enabled) - mem_mapping_disable(&xga->bios_rom.mapping); - xga_log("Normal Reset.\n"); - mem_mapping_disable(&xga->memio_mapping); + if (xga_standalone_enabled) + mem_mapping_disable(&xga->memio_mapping); + xga->on = 0; vga_on = 1; xga->linear_endian_reverse = 0; @@ -3198,7 +3230,7 @@ xga_pos_in(uint16_t addr, void *priv) xga_log("%03xRead=%02x.\n", addr, ret); break; case 0x0102: - ret = xga->pos_regs[2]; + ret = xga->pos_regs[2] | 0x30; break; case 0x0105: ret = xga->pos_regs[5]; @@ -3271,8 +3303,8 @@ xga_pos_in(uint16_t addr, void *priv) default: break; } - xga_log("XGA Standalone ISA Read Port=%04x, Ret=%02x.\n", addr, ret); } + xga_log("[%04X:%08X]: XGA POS IN addr=%04x, ret=%02x.\n", CS, cpu_state.pc, addr, ret); return ret; } @@ -3282,30 +3314,28 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv) svga_t *svga = (svga_t *) priv; xga_t *xga = (xga_t *) svga->xga; + xga_log("[%04X:%08X]: XGA POS OUT addr=%04x, val=%02x.\n", CS, cpu_state.pc, addr, val); if (!xga_standalone_enabled) { switch (addr) { case 0x0096: - xga->vga_post = val; + xga->instance_num = val & 0x07; + xga->isa_pos_enable = val & 0x08; xga_log("096Write=%02x.\n", val); break; case 0x0102: - xga->pos_regs[2] = (val & 0x01); - xga->pos_regs[2] |= ((xga->instance_isa << 1) | xga->ext_mem_addr); + xga_log("[%04X:%08X]: 102Write=%02x.\n", CS, cpu_state.pc, val); + xga->pos_regs[2] = val | 0x02; /*Instance 0 is not recommended on AT bus/ISA bus systems, so force it to use instance 1.*/ io_removehandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); mem_mapping_disable(&xga->memio_mapping); if (xga->pos_regs[2] & 0x01) { - xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xf0) >> 4) * 0x2000); + xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xc0) >> 6) * 0x8000); xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; xga->linear_base = ((xga->pos_regs[4] & 0xfe) * 0x1000000) + (xga->instance << 22); xga->base_addr_1mb = (xga->pos_regs[5] & 0x0f) << 20; io_sethandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); xga_log("XGA ISA ROM address=%05x, instance=%d.\n", xga->rom_addr, xga->instance); - if (xga->rom_addr >= 0xc8000) - mem_mapping_set_addr(&xga->memio_mapping, xga->rom_addr, 0x2000); - else - mem_mapping_disable(&xga->memio_mapping); + mem_mapping_set_addr(&xga->memio_mapping, xga->rom_addr, 0x8000); } - xga_log("102Write=%02x.\n", val); break; case 0x0103: if ((xga->pos_idx & 3) == 0) @@ -3375,7 +3405,6 @@ xga_init(const device_t *info) xga->on = 0; xga->hwcursor.cur_xsize = 64; xga->hwcursor.cur_ysize = 64; - xga->bios_rom.sz = 0x2000; xga->linear_endian_reverse = 0; xga->a5_test = 0; @@ -3387,10 +3416,16 @@ xga_init(const device_t *info) xga->rom_addr = 0; rom_init(&xga->bios_rom, xga->type ? XGA2_BIOS_PATH : XGA_BIOS_PATH, 0xc0000, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); mem_mapping_disable(&xga->bios_rom.mapping); + mem_mapping_add(&xga->memio_mapping, 0, 0, xga_memio_readb, xga_memio_readw, xga_memio_readl, + xga_memio_writeb, xga_memio_writew, xga_memio_writel, + xga->bios_rom.rom, MEM_MAPPING_EXTERNAL, svga); } else { xga->pos_regs[4] = 0x02; if (!xga_standalone_enabled) { - rom_init(&xga->vga_bios_rom, INMOS_XGA_BIOS_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); + rom_init(&xga->bios_rom, INMOS_XGA_BIOS_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); /*VGA BIOS only*/ + mem_mapping_add(&xga->memio_mapping, 0, 0, xga_memio_readb, xga_memio_readw, xga_memio_readl, + xga_memio_writeb, xga_memio_writew, xga_memio_writel, + xga->bios_rom.rom, MEM_MAPPING_EXTERNAL, svga); } else { xga->pos_regs[2] = (xga->instance_isa << 1) | xga->ext_mem_addr; xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xf0) >> 4) * 0x2000); @@ -3409,6 +3444,9 @@ xga_init(const device_t *info) xga->base_addr_1mb = (xga->pos_regs[5] & 0x0f) << 20; xga->linear_base = ((xga->pos_regs[4] & 0xfe) * 0x1000000) + (xga->instance << 22); rom_init(&xga->bios_rom, xga->type ? XGA2_BIOS_PATH : XGA_BIOS_PATH, xga->rom_addr, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); + mem_mapping_add(&xga->memio_mapping, 0, 0, xga_memio_readb, xga_memio_readw, xga_memio_readl, + xga_memio_writeb, xga_memio_writew, xga_memio_writel, + xga->bios_rom.rom, MEM_MAPPING_EXTERNAL, svga); } } @@ -3418,14 +3456,6 @@ xga_init(const device_t *info) mem_mapping_add(&xga->linear_mapping, 0, 0, xga_read_linear, xga_readw_linear, xga_readl_linear, xga_write_linear, xga_writew_linear, xga_writel_linear, NULL, MEM_MAPPING_EXTERNAL, svga); - if (xga_standalone_enabled) - mem_mapping_add(&xga->memio_mapping, 0, 0, xga_memio_readb, xga_memio_readw, xga_memio_readl, - xga_memio_writeb, xga_memio_writew, xga_memio_writel, - xga->bios_rom.rom, MEM_MAPPING_EXTERNAL, svga); - else - mem_mapping_add(&xga->memio_mapping, 0, 0, xga_memio_readb, xga_memio_readw, xga_memio_readl, - xga_memio_writeb, xga_memio_writew, xga_memio_writel, - xga->vga_bios_rom.rom, MEM_MAPPING_EXTERNAL, svga); mem_mapping_disable(&xga->linear_mapping); mem_mapping_disable(&xga->memio_mapping); @@ -3643,42 +3673,6 @@ static const device_config_t xga_inmos_isa_configuration[] = { { .description = "" } } }, - { - .name = "instance", - .description = "Instance", - .type = CONFIG_SELECTION, - .default_string = "", - .default_int = 6, - .file_filter = "", - .spinner = { 0 }, - .selection = { - { .description = "0 (2100h-210Fh)", .value = 0 }, - { .description = "1 (2110h-211Fh)", .value = 1 }, - { .description = "2 (2120h-212Fh)", .value = 2 }, - { .description = "3 (2130h-213Fh)", .value = 3 }, - { .description = "4 (2140h-214Fh)", .value = 4 }, - { .description = "5 (2150h-215Fh)", .value = 5 }, - { .description = "6 (2160h-216Fh)", .value = 6 }, - { .description = "7 (2170h-217Fh)", .value = 7 }, - { .description = "" } - }, - }, - { - .name = "ext_mem_addr", - .description = "MMIO address", - .type = CONFIG_HEX16, - .default_string = "", - .default_int = 0x0040, - .file_filter = "", - .spinner = { 0 }, - .selection = { - { .description = "C800h", .value = 0x0040 }, - { .description = "CA00h", .value = 0x0050 }, - { .description = "CC00h", .value = 0x0060 }, - { .description = "CE00h", .value = 0x0070 }, - { .description = "" } - }, - }, { .name = "dma", .description = "DMA channel", From b493b41ab2698c895638760721ba8a098716b0c4 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Sun, 6 Oct 2024 01:12:21 +0200 Subject: [PATCH 480/624] Implement touchscreen calibrate extended --- src/device/mouse_microtouch_touchscreen.c | 57 ++++++++++++++++++++--- 1 file changed, 50 insertions(+), 7 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index ce87a4b68..fed1f2d85 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -60,12 +60,13 @@ const char* mtouch_identity[] = { }; typedef struct mouse_microtouch_t { - double baud_rate, abs_x, abs_x_old, abs_y, abs_y_old; + double abs_x, abs_x_old, abs_y, abs_y_old; + double scale_x, scale_y, off_x, off_y; int but, but_old; char cmd[256]; - int cmd_pos; + int baud_rate, cmd_pos; uint8_t format, mode; - bool mode_status; + bool mode_status, cal_ex; uint8_t id, cal_cntr, pen_mode; bool soh; bool in_reset, reset; @@ -92,10 +93,37 @@ microtouch_calibrate_timer(void *priv) { mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; - if (!fifo8_num_used(&mtouch->resp)) { - mtouch->cal_cntr--; - fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x31\x0D", 3); /* 1 */ + if ((mtouch->cal_cntr == 2 && (mtouch->abs_x > 0.25 || mtouch->abs_y < 0.75)) || \ + (mtouch->cal_cntr == 1 && (mtouch->abs_x < 0.75 || mtouch->abs_y > 0.25))) { + return; } + + mtouch->cal_cntr--; + fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x31\x0D", 3); /* 1 */ + + if (mtouch->cal_ex) { + if (!mtouch->cal_cntr) { + double x1_ref = 0.125; + double y1_ref = 0.875; + double x2_ref = 0.875; + double y2_ref = 0.125; + double x1 = mtouch->abs_x_old; + double y1 = mtouch->abs_y_old; + double x2 = mtouch->abs_x; + double y2 = mtouch->abs_y; + + mtouch->scale_x = (x2_ref - x1_ref) / (x2 - x1); + mtouch->off_x = x1_ref - mtouch->scale_x * x1; + mtouch->scale_y = (y2_ref - y1_ref) / (y2 - y1); + mtouch->off_y = y1_ref - mtouch->scale_y * y1; + mtouch->cal_ex = false; + + pclog("CAL: x1=%f, y1=%f, x2=%f, y2=%f\n", x1, y1, x2, y2); + pclog("CAL: scale_x=%f, scale_y=%f, off_x=%f, off_y=%f\n", mtouch->scale_x, mtouch->scale_y, mtouch->off_x, mtouch->off_y); + } + mtouch->abs_x_old = mtouch->abs_x; + mtouch->abs_y_old = mtouch->abs_y; + } } void @@ -104,7 +132,15 @@ microtouch_process_commands(mouse_microtouch_t *mtouch) mtouch->cmd[strcspn(mtouch->cmd, "\r")] = '\0'; pclog("MT Command: %s\n", mtouch->cmd); - if (mtouch->cmd[0] == 'C' && (mtouch->cmd[1] == 'N' || mtouch->cmd[1] == 'X')) { /* Calibrate New/Extended */ + if (mtouch->cmd[0] == 'C' && mtouch->cmd[1] == 'N') { /* Calibrate New */ + mtouch->cal_cntr = 2; + } + else if (mtouch->cmd[0] == 'C' && mtouch->cmd[1] == 'X') { /* Calibrate Extended */ + mtouch->scale_x = 1; + mtouch->scale_y = 1; + mtouch->off_x = 0; + mtouch->off_y = 0; + mtouch->cal_ex = true; mtouch->cal_cntr = 2; } else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ @@ -376,6 +412,9 @@ mtouch_poll(void *priv) dev->abs_y = dev->abs_y / (double) monitors[index].mon_ysize; } + dev->abs_x = dev->scale_x * dev->abs_x + dev->off_x; + dev->abs_y = dev->scale_y * dev->abs_y + dev->off_y; + if (dev->abs_x >= 1.0) dev->abs_x = 1.0; if (dev->abs_y >= 1.0) dev->abs_y = 1.0; if (dev->abs_x <= 0.0) dev->abs_x = 0.0; @@ -408,6 +447,10 @@ mtouch_init(const device_t *info) dev->id = device_get_config_int("identity"); dev->pen_mode = 3; dev->mode = MODE_STREAM; + dev->scale_x = 1; + dev->scale_y = 1; + dev->off_x = 0; + dev->off_y = 0; if (dev->id < 2) { /* legacy controllers */ dev->format = FORMAT_DEC; From 09bbbacede18408a53702b010b85c45692b2a26f Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Tue, 8 Oct 2024 20:42:47 +0200 Subject: [PATCH 481/624] Refer to microtouch struct as dev in all functions --- src/device/mouse_microtouch_touchscreen.c | 208 +++++++++++----------- 1 file changed, 105 insertions(+), 103 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index fed1f2d85..653ed0662 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -81,178 +81,179 @@ static mouse_microtouch_t *mtouch_inst = NULL; void microtouch_reset_complete(void *priv) { - mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; + mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - mtouch->reset = true; - mtouch->in_reset = false; - fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ + dev->reset = true; + dev->in_reset = false; + fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } void microtouch_calibrate_timer(void *priv) { - mouse_microtouch_t *mtouch = (mouse_microtouch_t *) priv; + mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; - if ((mtouch->cal_cntr == 2 && (mtouch->abs_x > 0.25 || mtouch->abs_y < 0.75)) || \ - (mtouch->cal_cntr == 1 && (mtouch->abs_x < 0.75 || mtouch->abs_y > 0.25))) { + if ((dev->cal_cntr == 2 && (dev->abs_x > 0.25 || dev->abs_y < 0.75)) || \ + (dev->cal_cntr == 1 && (dev->abs_x < 0.75 || dev->abs_y > 0.25))) { return; } - mtouch->cal_cntr--; - fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x31\x0D", 3); /* 1 */ + dev->cal_cntr--; + fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x31\x0D", 3); /* 1 */ - if (mtouch->cal_ex) { - if (!mtouch->cal_cntr) { + if (dev->cal_ex) { + if (!dev->cal_cntr) { double x1_ref = 0.125; double y1_ref = 0.875; double x2_ref = 0.875; double y2_ref = 0.125; - double x1 = mtouch->abs_x_old; - double y1 = mtouch->abs_y_old; - double x2 = mtouch->abs_x; - double y2 = mtouch->abs_y; + double x1 = dev->abs_x_old; + double y1 = dev->abs_y_old; + double x2 = dev->abs_x; + double y2 = dev->abs_y; - mtouch->scale_x = (x2_ref - x1_ref) / (x2 - x1); - mtouch->off_x = x1_ref - mtouch->scale_x * x1; - mtouch->scale_y = (y2_ref - y1_ref) / (y2 - y1); - mtouch->off_y = y1_ref - mtouch->scale_y * y1; - mtouch->cal_ex = false; + dev->scale_x = (x2_ref - x1_ref) / (x2 - x1); + dev->off_x = x1_ref - dev->scale_x * x1; + dev->scale_y = (y2_ref - y1_ref) / (y2 - y1); + dev->off_y = y1_ref - dev->scale_y * y1; + dev->cal_ex = false; pclog("CAL: x1=%f, y1=%f, x2=%f, y2=%f\n", x1, y1, x2, y2); - pclog("CAL: scale_x=%f, scale_y=%f, off_x=%f, off_y=%f\n", mtouch->scale_x, mtouch->scale_y, mtouch->off_x, mtouch->off_y); + pclog("CAL: scale_x=%f, scale_y=%f, off_x=%f, off_y=%f\n", dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); } - mtouch->abs_x_old = mtouch->abs_x; - mtouch->abs_y_old = mtouch->abs_y; + dev->abs_x_old = dev->abs_x; + dev->abs_y_old = dev->abs_y; } } void -microtouch_process_commands(mouse_microtouch_t *mtouch) +microtouch_process_commands(mouse_microtouch_t *dev) { - mtouch->cmd[strcspn(mtouch->cmd, "\r")] = '\0'; - pclog("MT Command: %s\n", mtouch->cmd); + dev->cmd[strcspn(dev->cmd, "\r")] = '\0'; + pclog("MT Command: %s\n", dev->cmd); - if (mtouch->cmd[0] == 'C' && mtouch->cmd[1] == 'N') { /* Calibrate New */ - mtouch->cal_cntr = 2; + if (dev->cmd[0] == 'C' && dev->cmd[1] == 'N') { /* Calibrate New */ + dev->cal_cntr = 2; } - else if (mtouch->cmd[0] == 'C' && mtouch->cmd[1] == 'X') { /* Calibrate Extended */ - mtouch->scale_x = 1; - mtouch->scale_y = 1; - mtouch->off_x = 0; - mtouch->off_y = 0; - mtouch->cal_ex = true; - mtouch->cal_cntr = 2; + else if (dev->cmd[0] == 'C' && dev->cmd[1] == 'X') { /* Calibrate Extended */ + dev->scale_x = 1; + dev->scale_y = 1; + dev->off_x = 0; + dev->off_y = 0; + dev->cal_ex = true; + dev->cal_cntr = 2; } - else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'D') { /* Format Decimal */ - mtouch->format = FORMAT_DEC; - mtouch->mode_status = false; + else if (dev->cmd[0] == 'F' && dev->cmd[1] == 'D') { /* Format Decimal */ + dev->format = FORMAT_DEC; + dev->mode_status = false; } - else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'O') { /* Finger Only */ - mtouch->pen_mode = 1; + else if (dev->cmd[0] == 'F' && dev->cmd[1] == 'O') { /* Finger Only */ + dev->pen_mode = 1; } - else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'H') { /* Format Hexadecimal */ - mtouch->format = FORMAT_HEX; - mtouch->mode_status = false; + else if (dev->cmd[0] == 'F' && dev->cmd[1] == 'H') { /* Format Hexadecimal */ + dev->format = FORMAT_HEX; + dev->mode_status = false; } - else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'R') { /* Format Raw */ - mtouch->format = FORMAT_RAW; - mtouch->mode = MODE_INACTIVE; - mtouch->cal_cntr = 0; + else if (dev->cmd[0] == 'F' && dev->cmd[1] == 'R') { /* Format Raw */ + dev->format = FORMAT_RAW; + dev->mode = MODE_INACTIVE; + dev->cal_cntr = 0; } - else if (mtouch->cmd[0] == 'F' && mtouch->cmd[1] == 'T') { /* Format Tablet */ - mtouch->format = FORMAT_TABLET; + else if (dev->cmd[0] == 'F' && dev->cmd[1] == 'T') { /* Format Tablet */ + dev->format = FORMAT_TABLET; } - else if (mtouch->cmd[0] == 'G' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Get Parameter Block 1 */ - fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ - fifo8_push_all(&mtouch->resp, (uint8_t *) "0000000000000000000000000\r", 26); + else if (dev->cmd[0] == 'G' && dev->cmd[1] == 'P' && dev->cmd[2] == '1') { /* Get Parameter Block 1 */ + fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ + fifo8_push_all(&dev->resp, (uint8_t *) "0000000000000000000000000\r", 26); } - else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'D' && mtouch->cmd[2] == 'U') { /* Mode Down/Up */ - mtouch->mode = MODE_DOWNUP; + else if (dev->cmd[0] == 'M' && dev->cmd[1] == 'D' && dev->cmd[2] == 'U') { /* Mode Down/Up */ + dev->mode = MODE_DOWNUP; } - else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'I') { /* Mode Inactive */ - mtouch->mode = MODE_INACTIVE; + else if (dev->cmd[0] == 'M' && dev->cmd[1] == 'I') { /* Mode Inactive */ + dev->mode = MODE_INACTIVE; } - else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'P') { /* Mode Point */ - mtouch->mode = MODE_POINT; + else if (dev->cmd[0] == 'M' && dev->cmd[1] == 'P') { /* Mode Point */ + dev->mode = MODE_POINT; } - else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'T') { /* Mode Status */ - mtouch->mode_status = true; + else if (dev->cmd[0] == 'M' && dev->cmd[1] == 'T') { /* Mode Status */ + dev->mode_status = true; } - else if (mtouch->cmd[0] == 'M' && mtouch->cmd[1] == 'S') { /* Mode Stream */ - mtouch->mode = MODE_STREAM; + else if (dev->cmd[0] == 'M' && dev->cmd[1] == 'S') { /* Mode Stream */ + dev->mode = MODE_STREAM; } - else if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'I') { /* Output Identity */ - fifo8_push(&mtouch->resp, 0x01); - fifo8_push_all(&mtouch->resp, (uint8_t *) mtouch_identity[mtouch->id], 6); - fifo8_push(&mtouch->resp, 0x0D); + else if (dev->cmd[0] == 'O' && dev->cmd[1] == 'I') { /* Output Identity */ + fifo8_push(&dev->resp, 0x01); + fifo8_push_all(&dev->resp, (uint8_t *) mtouch_identity[dev->id], 6); + fifo8_push(&dev->resp, 0x0D); return; } - else if (mtouch->cmd[0] == 'O' && mtouch->cmd[1] == 'S') { /* Output Status */ - if (mtouch->reset) { - fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x40\x60\x0D", 4); + else if (dev->cmd[0] == 'O' && dev->cmd[1] == 'S') { /* Output Status */ + if (dev->reset) { + fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x40\x60\x0D", 4); } else { - fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x40\x40\x0D", 4); + fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x40\x40\x0D", 4); } return; } - else if (mtouch->cmd[0] == 'P') { - if (strlen(mtouch->cmd) == 2) { /* Pen */ - if (mtouch->cmd[1] == 'F') mtouch->pen_mode = 3; /* Pen or Finger */ - else if (mtouch->cmd[1] == 'O') mtouch->pen_mode = 2; /* Pen Only */ + else if (dev->cmd[0] == 'P') { + if (strlen(dev->cmd) == 2) { /* Pen */ + if (dev->cmd[1] == 'F') dev->pen_mode = 3; /* Pen or Finger */ + else if (dev->cmd[1] == 'O') dev->pen_mode = 2; /* Pen Only */ } - else if (strlen(mtouch->cmd) == 5) { /* Serial Options */ - if (mtouch->cmd[4] == 1) mtouch->baud_rate = 19200; - else if (mtouch->cmd[4] == 2) mtouch->baud_rate = 9600; - else if (mtouch->cmd[4] == 3) mtouch->baud_rate = 4600; - else if (mtouch->cmd[4] == 4) mtouch->baud_rate = 2400; - else if (mtouch->cmd[4] == 5) mtouch->baud_rate = 1200; + else if (strlen(dev->cmd) == 5) { /* Serial Options */ + if (dev->cmd[4] == 1) dev->baud_rate = 19200; + else if (dev->cmd[4] == 2) dev->baud_rate = 9600; + else if (dev->cmd[4] == 3) dev->baud_rate = 4600; + else if (dev->cmd[4] == 4) dev->baud_rate = 2400; + else if (dev->cmd[4] == 5) dev->baud_rate = 1200; - timer_stop(&mtouch->host_to_serial_timer); - timer_on_auto(&mtouch->host_to_serial_timer, (1000000. / mtouch->baud_rate) * 10); + timer_stop(&dev->host_to_serial_timer); + timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); } } - else if (mtouch->cmd[0] == 'R') { /* Reset */ - mtouch->in_reset = true; - mtouch->cal_cntr = 0; - mtouch->pen_mode = 3; + else if (dev->cmd[0] == 'R') { /* Reset */ + dev->in_reset = true; + dev->cal_cntr = 0; + dev->pen_mode = 3; - if (mtouch->cmd[0] == 'D') { /* Restore Defaults */ - mtouch->mode = MODE_STREAM; - mtouch->mode_status = false; + if (dev->cmd[0] == 'D') { /* Restore Defaults */ + dev->mode = MODE_STREAM; + dev->mode_status = false; - if (mtouch->id < 2) { - mtouch->format = FORMAT_DEC; + if (dev->id < 2) { + dev->format = FORMAT_DEC; } else { - mtouch->format = FORMAT_TABLET; + dev->format = FORMAT_TABLET; } } - timer_on_auto(&mtouch->reset_timer, 500. * 1000.); + timer_on_auto(&dev->reset_timer, 500. * 1000.); return; } - else if (mtouch->cmd[0] == 'S' && mtouch->cmd[1] == 'P' && mtouch->cmd[2] == '1') { /* Set Parameter Block 1 */ - fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ + else if (dev->cmd[0] == 'S' && dev->cmd[1] == 'P' && dev->cmd[2] == '1') { /* Set Parameter Block 1 */ + fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x41\x0D", 3); /* A */ return; } - else if (mtouch->cmd[0] == 'U' && mtouch->cmd[1] == 'T') { /* Unit Type */ - fifo8_push(&mtouch->resp, 0x01); + else if (dev->cmd[0] == 'U' && dev->cmd[1] == 'T') { /* Unit Type */ + fifo8_push(&dev->resp, 0x01); - if (mtouch->id == 2) { - fifo8_push_all(&mtouch->resp, (uint8_t *) "TP****00", 8); + if (dev->id == 2) { + fifo8_push_all(&dev->resp, (uint8_t *) "TP****00", 8); } else { - fifo8_push_all(&mtouch->resp, (uint8_t *) "QM****00", 8); + fifo8_push_all(&dev->resp, (uint8_t *) "QM****00", 8); } - fifo8_push(&mtouch->resp, 0x0D); + fifo8_push(&dev->resp, 0x0D); return; } - fifo8_push_all(&mtouch->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ + fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } void mtouch_write(serial_t *serial, void *priv, uint8_t data) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + if (data == '\x1') { dev->soh = 1; } @@ -276,9 +277,9 @@ mtouch_write(serial_t *serial, void *priv, uint8_t data) static int mtouch_prepare_transmit(void *priv) { - char buffer[16]; mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + char buffer[16]; double abs_x = dev->abs_x; double abs_y = dev->abs_y; int but = dev->but; @@ -358,6 +359,7 @@ void mtouch_write_to_host(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + if (dev->serial == NULL) goto no_write_to_machine; if ((dev->serial->type >= SERIAL_16550) && dev->serial->fifo_enabled) { From ea5ef55bd13f504c26d075ce73f72867c1d4cea3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Fri, 11 Oct 2024 16:50:12 -0300 Subject: [PATCH 482/624] qt: Fix another media menu string deallocation crash --- src/qt/qt_mediahistorymanager.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/qt/qt_mediahistorymanager.cpp b/src/qt/qt_mediahistorymanager.cpp index cd9be766b..2acdc8e5b 100644 --- a/src/qt/qt_mediahistorymanager.cpp +++ b/src/qt/qt_mediahistorymanager.cpp @@ -336,17 +336,16 @@ MediaHistoryManager::removeMissingImages(device_index_list_t &device_history) continue; } - char *p = checked_path.toUtf8().data(); char temp[MAX_IMAGE_PATH_LEN -1] = { 0 }; - if (path_abs(p)) { - if (strlen(p) > (MAX_IMAGE_PATH_LEN - 1)) - fatal("removeMissingImages(): strlen(p) > 2047\n"); + if (path_abs(checked_path.toUtf8().data())) { + if (checked_path.length() > (MAX_IMAGE_PATH_LEN - 1)) + fatal("removeMissingImages(): checked_path.length() > 2047\n"); else - snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s", p); + snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s", checked_path.toUtf8().constData()); } else snprintf(temp, (MAX_IMAGE_PATH_LEN - 1), "%s%s%s", usr_path, - path_get_slash(usr_path), p); + path_get_slash(usr_path), checked_path.toUtf8().constData()); path_normalize(temp); QString qstr = QString::fromUtf8(temp); From a25892664a71494ba41ce27c0b4a1f4c13952f72 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Fri, 11 Oct 2024 22:33:46 +0200 Subject: [PATCH 483/624] Add NVR saving for calibration data, cleanup --- src/device/mouse_microtouch_touchscreen.c | 104 ++++++++++++++++++---- 1 file changed, 87 insertions(+), 17 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 653ed0662..fa9640eba 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -36,7 +36,10 @@ #include <86box/plat.h> #include <86box/fifo8.h> #include <86box/fifo.h> -#include <86box/video.h> /* Needed to account for overscan. */ +#include <86box/video.h> +#include <86box/nvr.h> + +#define NVR_SIZE 16 enum mtouch_formats { FORMAT_DEC = 1, @@ -60,16 +63,17 @@ const char* mtouch_identity[] = { }; typedef struct mouse_microtouch_t { - double abs_x, abs_x_old, abs_y, abs_y_old; - double scale_x, scale_y, off_x, off_y; - int but, but_old; char cmd[256]; + double abs_x, abs_x_old, abs_y, abs_y_old; + float scale_x, scale_y, off_x, off_y; + int but, but_old; int baud_rate, cmd_pos; uint8_t format, mode; - bool mode_status, cal_ex; uint8_t id, cal_cntr, pen_mode; - bool soh; + bool mode_status, cal_ex, soh; bool in_reset, reset; + uint8_t *nvr; + char nvr_path[64]; serial_t *serial; Fifo8 resp; pc_timer_t host_to_serial_timer; @@ -78,8 +82,68 @@ typedef struct mouse_microtouch_t { static mouse_microtouch_t *mtouch_inst = NULL; -void -microtouch_reset_complete(void *priv) +static void +mtouch_savenvr(void *priv) +{ + mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + + FILE *fp; + + fp = nvr_fopen(dev->nvr_path, "wb"); + if (fp) { + fwrite(dev->nvr, 1, NVR_SIZE, fp); + fclose(fp); + fp = NULL; + } +} + +static void +mtouch_writenvr(void *priv, float scale_x, float scale_y, float off_x, float off_y) +{ + mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + + memcpy(&dev->nvr[0], &scale_x, 4); + memcpy(&dev->nvr[4], &scale_y, 4); + memcpy(&dev->nvr[8], &off_x, 4); + memcpy(&dev->nvr[12], &off_y, 4); + + pclog("NVR WRITE: %f, %f, %f, %f\n", scale_x, scale_y, off_x, off_y); +} + +static void +mtouch_readnvr(void *priv) +{ + mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + memcpy(&dev->scale_x, &dev->nvr[0], 4); + memcpy(&dev->scale_y, &dev->nvr[4], 4); + memcpy(&dev->off_x, &dev->nvr[8], 4); + memcpy(&dev->off_y, &dev->nvr[12], 4); + + pclog("NVR READ: %f, %f, %f, %f\n", dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); +} + +static void +mtouch_initnvr(void *priv) +{ + mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; + FILE *fp; + + /* Allocate and initialize the EEPROM. */ + dev->nvr = (uint8_t *) malloc(NVR_SIZE); + memset(dev->nvr, 0x00, NVR_SIZE); + + fp = nvr_fopen(dev->nvr_path, "rb"); + if (fp) { + if (fread(dev->nvr, 1, NVR_SIZE, fp) != NVR_SIZE) + fatal("mtouch_initnvr(): Error reading data\n"); + fclose(fp); + fp = NULL; + } else + mtouch_writenvr(dev, 1, 1, 0, 0); +} + +static void +mtouch_reset_complete(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; @@ -88,8 +152,8 @@ microtouch_reset_complete(void *priv) fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } -void -microtouch_calibrate_timer(void *priv) +static void +mtouch_calibrate_timer(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; @@ -120,14 +184,16 @@ microtouch_calibrate_timer(void *priv) pclog("CAL: x1=%f, y1=%f, x2=%f, y2=%f\n", x1, y1, x2, y2); pclog("CAL: scale_x=%f, scale_y=%f, off_x=%f, off_y=%f\n", dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); + mtouch_writenvr(dev, dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); + mtouch_savenvr(dev); } dev->abs_x_old = dev->abs_x; dev->abs_y_old = dev->abs_y; } } -void -microtouch_process_commands(mouse_microtouch_t *dev) +static void +mtouch_process_commands(mouse_microtouch_t *dev) { dev->cmd[strcspn(dev->cmd, "\r")] = '\0'; pclog("MT Command: %s\n", dev->cmd); @@ -249,7 +315,7 @@ microtouch_process_commands(mouse_microtouch_t *dev) fifo8_push_all(&dev->resp, (uint8_t *) "\x01\x30\x0D", 3); /* 0 */ } -void +static void mtouch_write(serial_t *serial, void *priv, uint8_t data) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; @@ -269,7 +335,7 @@ mtouch_write(serial_t *serial, void *priv, uint8_t data) dev->cmd[dev->cmd_pos++] = data; dev->cmd_pos = 0; - microtouch_process_commands(dev); + mtouch_process_commands(dev); } } } @@ -290,7 +356,7 @@ mtouch_prepare_transmit(void *priv) if (dev->cal_cntr || (!dev->but && !dev->but_old)) { /* Calibration or no buttonpress */ if (!dev->but && dev->but_old) { - microtouch_calibrate_timer(dev); + mtouch_calibrate_timer(dev); } dev->but_old = but; /* Save buttonpress */ return 0; @@ -355,7 +421,7 @@ mtouch_prepare_transmit(void *priv) return 0; } -void +static void mtouch_write_to_host(void *priv) { mouse_microtouch_t *dev = (mouse_microtouch_t *) priv; @@ -444,7 +510,7 @@ mtouch_init(const device_t *info) fifo8_create(&dev->resp, 256); timer_add(&dev->host_to_serial_timer, mtouch_write_to_host, dev, 0); - timer_add(&dev->reset_timer, microtouch_reset_complete, dev, 0); + timer_add(&dev->reset_timer, mtouch_reset_complete, dev, 0); timer_on_auto(&dev->host_to_serial_timer, (1000000. / dev->baud_rate) * 10); dev->id = device_get_config_int("identity"); dev->pen_mode = 3; @@ -454,6 +520,10 @@ mtouch_init(const device_t *info) dev->off_x = 0; dev->off_y = 0; + sprintf(dev->nvr_path, "mtouch_%s.nvr", mtouch_identity[dev->id]); + mtouch_initnvr(dev); + mtouch_readnvr(dev); + if (dev->id < 2) { /* legacy controllers */ dev->format = FORMAT_DEC; } else { From bc5b6b71c414f6c43bfc99733281ec4bdea9c044 Mon Sep 17 00:00:00 2001 From: Jos van Mourik Date: Fri, 11 Oct 2024 22:44:32 +0200 Subject: [PATCH 484/624] Cleanup --- src/device/mouse_microtouch_touchscreen.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index fa9640eba..1100937ef 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -106,8 +106,6 @@ mtouch_writenvr(void *priv, float scale_x, float scale_y, float off_x, float off memcpy(&dev->nvr[4], &scale_y, 4); memcpy(&dev->nvr[8], &off_x, 4); memcpy(&dev->nvr[12], &off_y, 4); - - pclog("NVR WRITE: %f, %f, %f, %f\n", scale_x, scale_y, off_x, off_y); } static void @@ -119,7 +117,7 @@ mtouch_readnvr(void *priv) memcpy(&dev->off_x, &dev->nvr[8], 4); memcpy(&dev->off_y, &dev->nvr[12], 4); - pclog("NVR READ: %f, %f, %f, %f\n", dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); + pclog("MT NVR CAL: scale_x=%f, scale_y=%f, off_x=%f, off_y=%f\n", dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); } static void @@ -181,9 +179,8 @@ mtouch_calibrate_timer(void *priv) dev->scale_y = (y2_ref - y1_ref) / (y2 - y1); dev->off_y = y1_ref - dev->scale_y * y1; dev->cal_ex = false; - - pclog("CAL: x1=%f, y1=%f, x2=%f, y2=%f\n", x1, y1, x2, y2); - pclog("CAL: scale_x=%f, scale_y=%f, off_x=%f, off_y=%f\n", dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); + + pclog("MT NEW CAL: scale_x=%f, scale_y=%f, off_x=%f, off_y=%f\n", dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); mtouch_writenvr(dev, dev->scale_x, dev->scale_y, dev->off_x, dev->off_y); mtouch_savenvr(dev); } @@ -515,10 +512,6 @@ mtouch_init(const device_t *info) dev->id = device_get_config_int("identity"); dev->pen_mode = 3; dev->mode = MODE_STREAM; - dev->scale_x = 1; - dev->scale_y = 1; - dev->off_x = 0; - dev->off_y = 0; sprintf(dev->nvr_path, "mtouch_%s.nvr", mtouch_identity[dev->id]); mtouch_initnvr(dev); From 0a3f1e32795669758db0075570272a2bcad4acf3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 15 Oct 2024 23:54:57 +0200 Subject: [PATCH 485/624] RDMSR, WRMSR, and WBINVD now correctly GPF when CPL > 0, fixes #4887. --- src/cpu/cpu.c | 8 ++++++-- src/cpu/x86_ops_misc.h | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/cpu/cpu.c b/src/cpu/cpu.c index 0c6d36097..c8c018aed 100644 --- a/src/cpu/cpu.c +++ b/src/cpu/cpu.c @@ -2611,7 +2611,9 @@ cpu_ven_reset(void) void cpu_RDMSR(void) { - switch (cpu_s->cpu_type) { + if (CPL) + x86gpf(NULL, 0); + else switch (cpu_s->cpu_type) { case CPU_IBM386SLC: case CPU_IBM486SLC: case CPU_IBM486BL: @@ -3466,7 +3468,9 @@ cpu_WRMSR(void) cpu_log("WRMSR %08X %08X%08X\n", ECX, EDX, EAX); - switch (cpu_s->cpu_type) { + if (CPL) + x86gpf(NULL, 0); + else switch (cpu_s->cpu_type) { case CPU_IBM386SLC: case CPU_IBM486SLC: case CPU_IBM486BL: diff --git a/src/cpu/x86_ops_misc.h b/src/cpu/x86_ops_misc.h index 073327c9c..f3e4bb353 100644 --- a/src/cpu/x86_ops_misc.h +++ b/src/cpu/x86_ops_misc.h @@ -878,6 +878,10 @@ opINVD(uint32_t fetchdat) static int opWBINVD(uint32_t fetchdat) { + if (CPL) { + x86gpf(NULL, 0); + return 1; + } CLOCK_CYCLES(10000); CPU_BLOCK_END(); return 0; From e8c1dc1bac078fd898acd0667799beb5c2476bb7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 16 Oct 2024 06:56:55 +0200 Subject: [PATCH 486/624] Fix flags on the AAM and AAD instructions. --- src/cpu/808x.c | 7 +++++-- src/cpu/x86_ops_bcd.h | 4 ++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/cpu/808x.c b/src/cpu/808x.c index 990f9ae87..807ae9b6b 100644 --- a/src/cpu/808x.c +++ b/src/cpu/808x.c @@ -3154,8 +3154,10 @@ execx86(int cycs) #else cpu_src = pfq_fetchb(); #endif - if (x86_div(AL, 0)) - set_pzs(16); + if (x86_div(AL, 0)) { + cpu_data = AL; + set_pzs(8); + } break; case 0xD5: /*AAD*/ wait(1, 0); @@ -3169,6 +3171,7 @@ execx86(int cycs) add(8); AL = cpu_data; AH = 0x00; + set_pzs(8); break; case 0xD6: /*SALC*/ wait(1, 0); diff --git a/src/cpu/x86_ops_bcd.h b/src/cpu/x86_ops_bcd.h index b4779ab3e..a04dea65a 100644 --- a/src/cpu/x86_ops_bcd.h +++ b/src/cpu/x86_ops_bcd.h @@ -24,7 +24,7 @@ opAAD(uint32_t fetchdat) base = 10; AL = (AH * base) + AL; AH = 0; - setznp16(AX); + setznp8(AL); CLOCK_CYCLES((is486) ? 14 : 19); PREFETCH_RUN(is486 ? 14 : 19, 2, -1, 0, 0, 0, 0, 0); return 0; @@ -39,7 +39,7 @@ opAAM(uint32_t fetchdat) base = 10; AH = AL / base; AL %= base; - setznp16(AX); + setznp8(AL); CLOCK_CYCLES((is486) ? 15 : 17); PREFETCH_RUN(is486 ? 15 : 17, 2, -1, 0, 0, 0, 0, 0); return 0; From 5edde3fc8755fb9f914a0924c4db37c0cb4d54fa Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 17 Oct 2024 20:23:40 -0400 Subject: [PATCH 487/624] Switch to macos-13 for github actions --- .github/workflows/cmake_macos.yml | 4 ++-- .github/workflows/codeql_macos.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cmake_macos.yml b/.github/workflows/cmake_macos.yml index dc45312f5..146490aa5 100644 --- a/.github/workflows/cmake_macos.yml +++ b/.github/workflows/cmake_macos.yml @@ -25,10 +25,10 @@ on: jobs: - macos12: + macos13: name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64" - runs-on: macos-12 + runs-on: macos-13 env: BUILD_WRAPPER_OUT_DIR: build_wrapper_output_directory # Directory where build-wrapper output will be placed diff --git a/.github/workflows/codeql_macos.yml b/.github/workflows/codeql_macos.yml index 266a1f051..bcfdf13fa 100644 --- a/.github/workflows/codeql_macos.yml +++ b/.github/workflows/codeql_macos.yml @@ -25,11 +25,11 @@ on: jobs: - analyze-macos12: + analyze-macos13: name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64" - runs-on: macos-12 + runs-on: macos-13 permissions: actions: read From 4e5d75d4442ae4abf804cf5772b3824b03b8cccf Mon Sep 17 00:00:00 2001 From: Jasmine Iwanek Date: Thu, 17 Oct 2024 20:38:04 -0400 Subject: [PATCH 488/624] Add libslirp to macos x86_64 --- .github/workflows/cmake_macos.yml | 3 ++- .github/workflows/codeql_macos.yml | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/cmake_macos.yml b/.github/workflows/cmake_macos.yml index 146490aa5..f482c7b69 100644 --- a/.github/workflows/cmake_macos.yml +++ b/.github/workflows/cmake_macos.yml @@ -25,7 +25,7 @@ on: jobs: - macos13: + macos13-x86_64: name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64" runs-on: macos-13 @@ -80,6 +80,7 @@ jobs: rtmidi openal-soft fluidsynth + libslirp ${{ matrix.ui.packages }} - name: Checkout repository diff --git a/.github/workflows/codeql_macos.yml b/.github/workflows/codeql_macos.yml index bcfdf13fa..6947ab6ef 100644 --- a/.github/workflows/codeql_macos.yml +++ b/.github/workflows/codeql_macos.yml @@ -25,7 +25,7 @@ on: jobs: - analyze-macos13: + analyze-macos13-x86_64: name: "${{ matrix.ui.name }}, ${{ matrix.build.name }}, ${{ matrix.dynarec.name }}, x86_64" @@ -74,6 +74,7 @@ jobs: rtmidi openal-soft fluidsynth + libslirp ${{ matrix.ui.packages }} - name: Checkout repository From b6581dab8bbf43e00f31e537833371026afed13b Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 19 Oct 2024 22:38:05 +0200 Subject: [PATCH 489/624] 386: Re-add the INVD and WBINVD instruction - the DataExpert Phoenix 4.03 BIOS uses the latter even when specifically detecting a 386, who knows what it did on an actual 386. --- src/cpu/386_ops.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cpu/386_ops.h b/src/cpu/386_ops.h index 130166344..b8ef9edda 100644 --- a/src/cpu/386_ops.h +++ b/src/cpu/386_ops.h @@ -649,7 +649,7 @@ const OpFn OP_TABLE(386_0f)[1024] = { // clang-format off /*16-bit data, 16-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ -/*00*/ op0F00_a16, op0F01_w_a16, opLAR_w_a16, opLSL_w_a16, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*00*/ op0F00_a16, op0F01_w_a16, opLAR_w_a16, opLSL_w_a16, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*10*/ opMOV_b_r_a16, opMOV_w_r_a16, opMOV_r_b_a16, opMOV_r_w_a16, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -671,7 +671,7 @@ const OpFn OP_TABLE(386_0f)[1024] = { /*32-bit data, 16-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ -/*00*/ op0F00_a16, op0F01_l_a16, opLAR_l_a16, opLSL_l_a16, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*00*/ op0F00_a16, op0F01_l_a16, opLAR_l_a16, opLSL_l_a16, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*10*/ opMOV_b_r_a16, opMOV_l_r_a16, opMOV_r_b_a16, opMOV_r_l_a16, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*20*/ opMOV_r_CRx_a16,opMOV_r_DRx_a16,opMOV_CRx_r_a16,opMOV_DRx_r_a16,opMOV_r_TRx_a16,ILLEGAL, opMOV_TRx_r_a16,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -693,7 +693,7 @@ const OpFn OP_TABLE(386_0f)[1024] = { /*16-bit data, 32-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ -/*00*/ op0F00_a32, op0F01_w_a32, opLAR_w_a32, opLSL_w_a32, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*00*/ op0F00_a32, op0F01_w_a32, opLAR_w_a32, opLSL_w_a32, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*10*/ opMOV_b_r_a32, opMOV_w_r_a32, opMOV_r_b_a32, opMOV_r_w_a32, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, @@ -715,7 +715,7 @@ const OpFn OP_TABLE(386_0f)[1024] = { /*32-bit data, 32-bit addr*/ /* 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f*/ -/*00*/ op0F00_a32, op0F01_l_a32, opLAR_l_a32, opLSL_l_a32, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, +/*00*/ op0F00_a32, op0F01_l_a32, opLAR_l_a32, opLSL_l_a32, ILLEGAL, ILLEGAL, opCLTS, opLOADALL386, opINVD, opWBINVD, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*10*/ opMOV_b_r_a32, opMOV_l_r_a32, opMOV_r_b_a32, opMOV_r_l_a32, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*20*/ opMOV_r_CRx_a32,opMOV_r_DRx_a32,opMOV_CRx_r_a32,opMOV_DRx_r_a32,opMOV_r_TRx_a32,ILLEGAL, opMOV_TRx_r_a32,ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, /*30*/ ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, ILLEGAL, From e2676641c322e7db193f19bbbbcd855e2e6274c2 Mon Sep 17 00:00:00 2001 From: rushieda <185547947+rushieda@users.noreply.github.com> Date: Sun, 20 Oct 2024 14:26:07 +0300 Subject: [PATCH 490/624] Fix errors with P6-based machines in the machine table --- src/machine/machine_table.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index f389ae75a..c019a16dd 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -13545,7 +13545,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, - .max = 524288, + .max = 786432, .step = 8192 }, .nvrmask = 511, @@ -13625,7 +13625,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, .ram = { .min = 8192, - .max = 1048576, + .max = 524288, .step = 8192 }, .nvrmask = 127, @@ -13747,7 +13747,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_SOUND | MACHINE_VIDEO | MACHINE_USB, /* Machine has internal video: S3 ViRGE/DX and sound: Crystal CS4236B */ .ram = { .min = 8192, - .max = 131072, + .max = 524288, .step = 8192 }, .nvrmask = 127, @@ -14069,7 +14069,7 @@ const machine_t machines[] = { .package = CPU_PKG_SLOT1, .block = CPU_BLOCK_NONE, .min_bus = 60000000, - .max_bus = 100000000, + .max_bus = 83333333, .min_voltage = 1500, .max_voltage = 3500, .min_multi = 2.0, @@ -14448,11 +14448,11 @@ const machine_t machines[] = { .min_multi = 1.5, .max_multi = 8.0 }, - .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_GAMEPORT | MACHINE_USB, /* Machine has internal video: Matrox MGA-G200 and sound: Crystal CS4820 */ .ram = { .min = 8192, - .max = 1048576, + .max = 524288, .step = 8192 }, .nvrmask = 255, @@ -14533,7 +14533,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, /* Machine has internal sound: Ensoniq ES1371 */ .ram = { .min = 8192, - .max = 1048576, + .max = 786432, .step = 8192 }, .nvrmask = 255, @@ -14648,7 +14648,7 @@ const machine_t machines[] = { .package = CPU_PKG_SLOT1, .block = CPU_BLOCK_NONE, .min_bus = 66666667, - .max_bus = 66666667, + .max_bus = 100000000, .min_voltage = 1800, .max_voltage = 3500, .min_multi = 1.5, @@ -15079,7 +15079,7 @@ const machine_t machines[] = { .flags = MACHINE_IDE_DUAL | MACHINE_SOUND | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, .ram = { .min = 8192, - .max = 786432, + .max = 1572864, .step = 8192 }, .nvrmask = 255, @@ -15113,7 +15113,7 @@ const machine_t machines[] = { .package = CPU_PKG_SLOT2, .block = CPU_BLOCK_NONE, .min_bus = 100000000, - .max_bus = 133333333, + .max_bus = 100000000, .min_voltage = 1800, .max_voltage = 3500, .min_multi = 1.5, From ed62184d6170e34b92a0d9d4329298e142de24f7 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Sun, 20 Oct 2024 22:18:31 +0500 Subject: [PATCH 491/624] qt: Make the About dialog closeable with Esc key (#4912) --- src/qt/qt_mainwindow.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index b06473a8a..3ee58f23b 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1725,7 +1725,8 @@ MainWindow::on_actionAbout_86Box_triggered() msgBox.setText(QString("%3%1%2").arg(EMU_VERSION_FULL, versioninfo, tr("86Box v"))); msgBox.setInformativeText(tr("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.")); msgBox.setWindowTitle("About 86Box"); - msgBox.addButton("OK", QMessageBox::ButtonRole::AcceptRole); + const auto closeButton = msgBox.addButton("OK", QMessageBox::ButtonRole::AcceptRole); + msgBox.setEscapeButton(closeButton); const auto webSiteButton = msgBox.addButton(EMU_SITE, QMessageBox::ButtonRole::HelpRole); webSiteButton->connect(webSiteButton, &QPushButton::released, []() { QDesktopServices::openUrl(QUrl("https://" EMU_SITE)); From b435dfd5e4f0c56fa229c63258fe4b73d6ed366c Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 24 Oct 2024 22:06:53 +0200 Subject: [PATCH 492/624] PCI: Mask out the strict flag when checking if the added card is not on-board, fixes bridge adding. --- src/pci.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pci.c b/src/pci.c index b4f5eafe5..ab585c456 100644 --- a/src/pci.c +++ b/src/pci.c @@ -790,7 +790,7 @@ pci_add_card(uint8_t add_type, uint8_t (*read)(int func, int addr, void *priv), if (next_pci_card < PCI_CARDS_NUM) { dev = &pci_card_descs[next_pci_card]; - dev->type = add_type | PCI_ADD_STRICT; + dev->type = add_type | PCI_ADD_STRICT; dev->read = read; dev->write = write; dev->priv = priv; @@ -885,7 +885,7 @@ pci_register_cards(void) type = pci_card_descs[i].type; slot = pci_card_descs[i].slot; #endif - normal = (pci_card_descs[i].type == PCI_CARD_NORMAL); + normal = ((pci_card_descs[i].type & ~PCI_ADD_STRICT) == PCI_CARD_NORMAL); /* If this is a normal card, increase the next normal card index. */ if (normal) From e37d12c89f65f7dc2da58b96fcf3d9eb56616e2e Mon Sep 17 00:00:00 2001 From: altiereslima Date: Thu, 24 Oct 2024 18:38:44 -0300 Subject: [PATCH 493/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 642031e9a..930a04deb 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -118,13 +118,13 @@ msgid "Fullscreen &stretch mode" msgstr "Modo de &redimensionamento da tela cheia" msgid "&Full screen stretch" -msgstr "&Tela cheia esticada" +msgstr "&Tela cheia redimensionada" msgid "&4:3" msgstr "&4:3" msgid "&Square pixels (Keep ratio)" -msgstr "Pixel&s quadrados (manter proporção)" +msgstr "Píxeis &quadrados (manter proporção)" msgid "&Integer scale" msgstr "&Redimensionamento com valores inteiros" @@ -202,7 +202,7 @@ msgid "Begin trace\tCtrl+T" msgstr "Inicio do rastreamento\tCtrl+T" msgid "End trace\tCtrl+T" -msgstr "Fim do rastreamento\tCtrl+T" +msgstr "Finalizar rastreamento\tCtrl+T" msgid "&Help" msgstr "&Ajuda" @@ -220,7 +220,7 @@ msgid "&Existing image..." msgstr "&Imagem existente..." msgid "Existing image (&Write-protected)..." -msgstr "Imagem existente (&protegida contra escrita)..." +msgstr "Imagem existente (&protegida contra gravação)..." msgid "&Record" msgstr "&Gravar" @@ -229,7 +229,7 @@ msgid "&Play" msgstr "&Reproduzir" msgid "&Rewind to the beginning" -msgstr "&Rebobinar até o começo" +msgstr "Re&troceder até o começo" msgid "&Fast forward to the end" msgstr "&Avançar até o fim" @@ -244,7 +244,7 @@ msgid "E&xport to 86F..." msgstr "E&xportar para 86F..." msgid "&Mute" -msgstr "&Sem som" +msgstr "&Silenciar" msgid "E&mpty" msgstr "&Vazio" @@ -256,7 +256,7 @@ msgid "&Folder..." msgstr "&Pasta..." msgid "Target &framerate" -msgstr "&Taxa de quadro pretendida" +msgstr "&Taxa de quadros pretendida" msgid "&Sync with video" msgstr "&Sincronizar com vídeo" @@ -307,7 +307,7 @@ msgid "Cancel" msgstr "Cancelar" msgid "Save these settings as &global defaults" -msgstr "Usar estas configurações como &padrões globais" +msgstr "Salvar estas configurações como &padrões globais" msgid "&Default" msgstr "&Padrão" @@ -316,7 +316,7 @@ msgid "Language:" msgstr "Idioma:" msgid "Icon set:" -msgstr "Pacote de ícones:" +msgstr "Conjunto de ícones:" msgid "Gain" msgstr "Ganho" @@ -373,7 +373,7 @@ msgid "Memory:" msgstr "Memória:" msgid "Time synchronization" -msgstr "Sincronização da hora" +msgstr "Sincronização de hora" msgid "Disabled" msgstr "Desativar" @@ -673,7 +673,7 @@ msgid "All images" msgstr "Todas as imagens" msgid "Basic sector images" -msgstr "Imagens de setor básico" +msgstr "Imagens de setores básicos" msgid "Surface images" msgstr "Imagens de superfície" @@ -787,7 +787,7 @@ msgid "None" msgstr "Nada" msgid "%u MB (CHS: %i, %i, %i)" -msgstr "%u MB (CHS: %i, %i, %i)" +msgstr "%u MB (CCS: %i, %i, %i)" msgid "Floppy %i (%s): %ls" msgstr "Disquete %i (%s): %ls" @@ -805,7 +805,7 @@ msgid "Are you sure you want to exit 86Box?" msgstr "Tem certeza de que deseja sair do 86Box?" msgid "Unable to initialize Ghostscript" -msgstr "Não é possível inicializar o Ghostscript" +msgstr "Não foi possível inicializar o Ghostscript" msgid "MO %i (%ls): %ls" msgstr "Magneto-óptico %i (%ls): %ls" @@ -823,7 +823,7 @@ msgid "Exit" msgstr "Sair" msgid "No ROMs found" -msgstr "Nenhum ROM encontrada" +msgstr "Nenhuma ROM encontrada" msgid "Do you want to save the settings?" msgstr "Você deseja salvar as configurações?" @@ -841,7 +841,7 @@ msgid "86Box v" msgstr "86Box versão" 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 "Um emulador de computadores antigos\n\nAutores: 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, e outros.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, e outros.\n\nTraduzido por: Altieres Lima da Silva\n\nLançado sob a Licença Pública Geral GNU versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." +msgstr "Um emulador de computadores antigos\n\nAutores: 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, e outros.\n\nCom contribuições anteriores de Sarah Walker, leilei, JohnElliott, greatpsycho, e outros.\n\nTraduzido por: Altieres Lima da Silva\n\nLançado sob a Licença Pública Geral GNU, versão 2 ou posterior. Veja o arquivo LICENSE para mais informações." msgid "Hardware not available" msgstr "Hardware não disponível" @@ -889,7 +889,7 @@ msgid "You are loading an unsupported configuration" msgstr "Você está carregando uma configuração não suportada" 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 "A filtragem do tipo CPU baseada na máquina selecionada é desativada para esta máquina emulada.\n\nIsto torna possível escolher uma CPU que de outra forma seria incompatível com a máquina selecionada. Entretanto, você pode encontrar incompatibilidades com a BIOS da máquina ou outro software.\n\nA ativação desta configuração não é oficialmente suportada e qualquer relatório de erro arquivado pode ser fechado como inválido." +msgstr "A filtragem do tipo de CPU baseada na máquina selecionada está desativada para esta máquina emulada.\n\nIsto torna possível escolher uma CPU que, de outra forma, seria incompatível com a máquina selecionada. No entanto, você pode encontrar incompatibilidades com a BIOS da máquina ou outro software.\n\nA ativação desta configuração não é oficialmente suportada, e qualquer relatório de erro arquivado pode ser fechado como inválido." msgid "Continue" msgstr "Continuar" @@ -1030,13 +1030,13 @@ msgid "Select the parent VHD" msgstr "Selecione o VHD pai" 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 "Isto pode significar que a imagem de origem foi modificada após a criação da imagem diferencial.\n\nTambém pode acontecer caso os arquivos de imagem tenham sido movidos ou copiados, ou por um erro no programa que criou este disco.\n\nVocê quer consertar os marcadores de tempo?" +msgstr "Isto pode significar que a imagem original foi modificada após a criação da imagem diferencial.\n\nIsso também pode ocorrer se os arquivos de imagem tiverem sido movidos ou copiados, ou por um erro no programa que criou este disco.\n\nVocê deseja corrigir os marcadores de tempo?" msgid "Parent and child disk timestamps do not match" -msgstr "A data/hora dos arquivos de pais e filhos não correspondem" +msgstr "Os marcadores de tempo do disco pai e do disco filho não coincidem" msgid "Could not fix VHD timestamp." -msgstr "Não foi possível consertar o carimbo de data/hora da VHD." +msgstr "Não foi possível corrigir o marcador de tempo do VHD." msgid "MFM/RLL" msgstr "MFM/RLL" @@ -1126,16 +1126,16 @@ msgid "5.25\" 1.3 GB" msgstr "5.25\" 1.3 GB" msgid "Perfect RPM" -msgstr "RPM perfeita" +msgstr "Rotação ideal" msgid "1% below perfect RPM" -msgstr "1% abaixo das RPM perfeita" +msgstr "1% abaixo da rotação ideal" msgid "1.5% below perfect RPM" -msgstr "1.5% abaixo das RPM perfeita" +msgstr "1.5% abaixo da rotação ideal" msgid "2% below perfect RPM" -msgstr "2% abaixo das RPM perfeita" +msgstr "2% abaixo da rotação ideal" msgid "(System Default)" msgstr "(Padrão do sistema)" @@ -1147,7 +1147,7 @@ msgid "The network configuration will be switched to the null driver" msgstr "A configuração de rede será alterada para o driver nulo" msgid "Mouse sensitivity:" -msgstr "Sensibilidade do rato:" +msgstr "Sensibilidade do mouse:" msgid "Select media images from program working directory" msgstr "Selecione imagens de mídia do diretório de trabalho do programa" @@ -1171,4 +1171,4 @@ msgid "WinBox is no longer supported" msgstr "O WinBox não é mais suportado" 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 "O desenvolvimento do gerenciador WinBox foi interrompido em 2022 devido à falta de mantenedores. Conforme direcionamos nossos esforços para tornar o 86Box ainda melhor, tomamos a decisão de não oferecer mais suporte ao WinBox como gerenciador.\n\nAtualizações não serão mais fornecidas através do WinBox, e você poderá encontrar comportamentos incorretos caso continue a usá-lo com versões mais recentes do 86Box. Quaisquer relatórios de bugs relacionados ao comportamento do WinBox serão fechados como inválidos.\n\nAcesse 86box.net para obter uma lista de outros gerenciadores que você pode usar." +msgstr "O desenvolvimento do gerenciador WinBox foi interrompido em 2022 devido à falta de mantenedores. À medida que direcionamos nossos esforços para tornar o 86Box ainda melhor, tomamos a decisão de não oferecer mais suporte ao WinBox como gerenciador.\n\nNão serão mais fornecidas atualizações através do WinBox, e você poderá encontrar comportamentos incorretos caso continue a usá-lo com versões mais recentes do 86Box. Quaisquer relatórios de bugs relacionados ao comportamento do WinBox serão fechados como inválidos.\n\nAcesse 86box.net para obter uma lista de outros gerenciadores que você pode usar." From fd9d880d4d62a6d9b210002ca60857a6a7c02f3a Mon Sep 17 00:00:00 2001 From: altiereslima Date: Thu, 24 Oct 2024 19:00:18 -0300 Subject: [PATCH 494/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 93 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 930a04deb..6fb568114 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -39,6 +39,9 @@ msgstr "&Ocultar barra de status" msgid "Hide &toolbar" msgstr "Ocultar &barra de ferramenta" +msgid "Show non-primary monitors" +msgstr "Mostrar monitores não primários" + msgid "&Resizeable window" msgstr "&Janela redimensionável" @@ -60,6 +63,30 @@ msgstr "Open&GL (Núcleo 3.0)" msgid "&VNC" msgstr "&VNC" +msgid "Renderer options..." +msgstr "Opções de renderização..." + +msgid "OpenGL 3.0 renderer options" +msgstr "Opções de renderização OpenGL 3.0" + +msgid "Render behavior" +msgstr "Comportamento de renderização" + +msgid "Synchronize with video" +msgstr "Sincronizar com vídeo" + +msgid "Use target framerate:" +msgstr "Usar taxa de quadros alvo:" + +msgid "VSync" +msgstr "VSync (sincronização virtual)" + +msgid "Shaders" +msgstr "Shaders" + +msgid "No shader selected" +msgstr "Nenhum shader selecionado" + msgid "Specify dimensions..." msgstr "Especificar as dimensões..." @@ -132,6 +159,9 @@ msgstr "&Redimensionamento com valores inteiros" msgid "4:&3 Integer scale" msgstr "Redimensionamento com valores inteiros 4:&3" +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Aplicar modo de ampliação em tela cheia quando maximizado" + msgid "E&GA/(S)VGA settings" msgstr "Configurações E&GA/(S)VGA" @@ -198,6 +228,9 @@ msgstr "Ativar integração com o &Discord" msgid "Sound &gain..." msgstr "&Ganho de som..." +msgid "Open screenshots folder..." +msgstr "Abrir pasta de capturas de tela..." + msgid "Begin trace\tCtrl+T" msgstr "Inicio do rastreamento\tCtrl+T" @@ -237,6 +270,9 @@ msgstr "&Avançar até o fim" msgid "E&ject" msgstr "E&jetar" +msgid "Eject %s" +msgstr "Ejetar %s" + msgid "&Image..." msgstr "&Imagem..." @@ -246,6 +282,9 @@ msgstr "E&xportar para 86F..." msgid "&Mute" msgstr "&Silenciar" +msgid "&Unmute" +msgstr "&Reativar som" + msgid "E&mpty" msgstr "&Vazio" @@ -390,6 +429,9 @@ msgstr "Recompilador dinâmico" msgid "Video:" msgstr "Vídeo:" +msgid "Video #2:" +msgstr "Vídeo #2:" + msgid "Voodoo Graphics" msgstr "3DFX Voodoo" @@ -459,6 +501,30 @@ msgstr "Dispositivo PCap:" msgid "Network adapter:" msgstr "Adaptador de rede:" +msgid "Network Card #1" +msgstr "Placa de rede #1:" + +msgid "Network Card #2" +msgstr "Placa de rede #2:" + +msgid "Network Card #3" +msgstr "Placa de rede #3:" + +msgid "Network Card #4" +msgstr "Placa de rede #4:" + +msgid "Mode" +msgstr "Modo:" + +msgid "Interface" +msgstr "Interface:" + +msgid "Adapter" +msgstr "Adaptador:" + +msgid "VDE Socket" +msgstr "Socket VDE:" + msgid "COM1 Device:" msgstr "Dispositivo COM1:" @@ -495,6 +561,18 @@ msgstr "Porta serial 3" msgid "Serial port 4" msgstr "Porta serial 4" +msgid "Serial port passthrough 1" +msgstr "Passagem de porta serial 1" + +msgid "Serial port passthrough 2" +msgstr "Passagem de porta serial 2" + +msgid "Serial port passthrough 3" +msgstr "Passagem de porta serial 3" + +msgid "Serial port passthrough 4" +msgstr "Passagem de porta serial 4" + msgid "Parallel port 1" msgstr "Porta paralela 1" @@ -546,9 +624,15 @@ msgstr "&Novo..." msgid "&Existing..." msgstr "&Existente..." +msgid "Browse..." +msgstr "Procurar..." + msgid "&Remove" msgstr "&Remover" +msgid "Remove" +msgstr "Remover" + msgid "Bus:" msgstr "Barramento:" @@ -627,6 +711,9 @@ msgstr "Dispositivo ISABugger" msgid "POST card" msgstr "Placa de diagnóstico" +msgid "86Box Unit Tester" +msgstr "Testador de unidade 86Box" + msgid "86Box" msgstr "86Box" @@ -657,6 +744,9 @@ msgstr "O 86Box não conseguiu encontrar nenhuma imagem de ROM utilizável.\n\nP msgid "(empty)" msgstr "(vazio)" +msgid "Clear image history" +msgstr "Limpar histórico de imagens" + msgid "All files" msgstr "Todos os arquivos" @@ -741,6 +831,9 @@ msgstr "CA" msgid "S" msgstr "SE" +msgid "MiB" +msgstr "MiB" + msgid "KB" msgstr "KB" From a313437f8d1fdc56c8a8e84cc2cd16f114426502 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Thu, 24 Oct 2024 19:04:12 -0300 Subject: [PATCH 495/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 6fb568114..b920226e6 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -438,6 +438,9 @@ msgstr "3DFX Voodoo" msgid "IBM 8514/A Graphics" msgstr "Gráficos IBM 8514/A" +msgid "Voodoo 1 or 2 Graphics" +msgstr "Gráficos Voodoo 1 ou 2" + msgid "XGA Graphics" msgstr "Gráficos XGA" From 5061242e0980b26c462f7b3da3ffec1181425bad Mon Sep 17 00:00:00 2001 From: altiereslima Date: Thu, 24 Oct 2024 19:04:50 -0300 Subject: [PATCH 496/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index b920226e6..9c171de60 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -481,7 +481,7 @@ msgid "MIDI In Device:" msgstr "Disp. de entrada MIDI:" msgid "Standalone MPU-401" -msgstr "MPU-401 autônomo" +msgstr "MPU-401 independente" msgid "Use FLOAT32 sound" msgstr "Usar som FLOAT32" From 0151d886d4a61c3d75e7724a90d4defc740727ff Mon Sep 17 00:00:00 2001 From: altiereslima Date: Thu, 24 Oct 2024 19:05:21 -0300 Subject: [PATCH 497/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 9c171de60..98adc4528 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -430,7 +430,7 @@ msgid "Video:" msgstr "Vídeo:" msgid "Video #2:" -msgstr "Vídeo #2:" +msgstr "Vídeo 2:" msgid "Voodoo Graphics" msgstr "3DFX Voodoo" @@ -505,16 +505,16 @@ msgid "Network adapter:" msgstr "Adaptador de rede:" msgid "Network Card #1" -msgstr "Placa de rede #1:" +msgstr "Placa de rede 1:" msgid "Network Card #2" -msgstr "Placa de rede #2:" +msgstr "Placa de rede 2:" msgid "Network Card #3" -msgstr "Placa de rede #3:" +msgstr "Placa de rede 3:" msgid "Network Card #4" -msgstr "Placa de rede #4:" +msgstr "Placa de rede 4:" msgid "Mode" msgstr "Modo:" From 51e58e94cef47e637af0c21805dc2b7347748081 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Thu, 24 Oct 2024 19:09:45 -0300 Subject: [PATCH 498/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 98adc4528..a416e1e76 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -426,6 +426,12 @@ msgstr "Ativar (UTC)" msgid "Dynamic Recompiler" msgstr "Recompilador dinâmico" +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Alto impacto no desempenho" + msgid "Video:" msgstr "Vídeo:" From b73e3b4830b5b6998f46ae640022c06fd813ccfb Mon Sep 17 00:00:00 2001 From: altiereslima Date: Fri, 25 Oct 2024 06:33:48 -0300 Subject: [PATCH 499/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index a416e1e76..0b26d5ce5 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -624,6 +624,9 @@ msgstr "Controlador 4:" msgid "Cassette" msgstr "Cassete" +msgid "Vision Systems LBA Enhancer" +msgstr "Aprimorador de Sistema Vision para LBA" + msgid "Hard disks:" msgstr "Discos rígidos:" @@ -723,6 +726,9 @@ msgstr "Placa de diagnóstico" msgid "86Box Unit Tester" msgstr "Testador de unidade 86Box" +msgid "Novell NetWare 2.x Key Card" +msgstr "Cartão de Autenticação Novell NetWare 2.x" + msgid "86Box" msgstr "86Box" From 9c111584b5384cfd2e87d0fb7a84185ae01b23ab Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 26 Oct 2024 21:32:47 +0200 Subject: [PATCH 500/624] Big video changes of the day (October 26th, 2024) 8514/A/Mach8/32: Reworked the acceleration a bit as well as the mode switches from VGA to ATI/8514/A mode and viceversa based on the documentation. Fixes the Linux GUI fonts using the Mach32 driver (possibly Mach8 too) and other anomalies (still needs more work on the acceleration though). PVGA: Minor fixes to the banking. S3-based (Pre-ViRGE): 1. Made the chip class use its own banking so that the Enhanced Mode mapping (equivalent to 64K-based A0000) is taken into account (per bit 3 of CRTC31, which forces the mapping to be 64K A0000, regardless of the GDCREG6 bits). Fixes NT 3.1 347.1's S3 driver. 2. Initial rework on 15bpp/16bpp accelerated mode of the 911/924 chips (currently not 100% bug free, I need help with this chips). XGA-1/2: Get rid of the linear endian reverse variable hack used by OS/2 and, instead, use the already declared ones more wisely, fixes OS/2 2.1 reversed fonts and keeps everything else working as it should. Misc: Added the BT481 RAMDAC for future card use. --- src/include/86box/vid_8514a.h | 22 +- src/include/86box/vid_ati_mach8.h | 21 +- src/include/86box/vid_svga.h | 5 + src/include/86box/vid_xga.h | 5 +- src/video/CMakeLists.txt | 2 +- src/video/vid_8514a.c | 2973 ++++++++++++----------------- src/video/vid_ati68860_ramdac.c | 16 +- src/video/vid_ati_mach8.c | 2061 ++++++++++---------- src/video/vid_bt481_ramdac.c | 160 ++ src/video/vid_paradise.c | 22 +- src/video/vid_s3.c | 1466 ++++---------- src/video/vid_svga.c | 64 +- src/video/vid_xga.c | 412 ++-- 13 files changed, 3029 insertions(+), 4200 deletions(-) create mode 100644 src/video/vid_bt481_ramdac.c diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index d834a6f42..39af01fd0 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -52,7 +52,7 @@ typedef struct ibm8514_t { int type; int local; int bpp; - int on[2]; + int on; int accel_bpp; uint32_t vram_size; @@ -102,6 +102,8 @@ typedef struct ibm8514_t { uint16_t frgd_mix; uint16_t multifunc_cntl; uint16_t multifunc[16]; + uint16_t clip_right; + uint16_t clip_bottom; int16_t clip_left; int16_t clip_top; uint8_t pix_trans[2]; @@ -112,8 +114,6 @@ typedef struct ibm8514_t { int x3; int y1; int y2; - int sys_cnt; - int sys_cnt2; int temp_cnt; int16_t cx; int16_t cx_back; @@ -127,20 +127,14 @@ typedef struct ibm8514_t { int16_t err; uint32_t src; uint32_t dest; - uint32_t newsrc_blt; - uint32_t newdest_blt; - uint32_t newdest_in; - uint32_t newdest_out; - uint8_t *writemono; - uint8_t *nibbleset; int x_count; int xx_count; int y_count; int input; + int input2; int output; + int output2; - uint16_t cur_x_bit12; - uint16_t cur_y_bit12; int ssv_len; uint8_t ssv_dir; uint8_t ssv_draw; @@ -156,7 +150,6 @@ typedef struct ibm8514_t { } accel; uint16_t test; - int vendor_mode[2]; int h_blankstart; int h_blank_end_val; int hblankstart; @@ -227,6 +220,11 @@ typedef struct ibm8514_t { int ext_pitch; int ext_crt_pitch; int extensions; + int linear; + int _4bpp; + uint32_t vram_amount; + int vram_512k_8514; + PALETTE _8514pal; latch8514_t latch; } ibm8514_t; diff --git a/src/include/86box/vid_ati_mach8.h b/src/include/86box/vid_ati_mach8.h index a25432920..849446def 100644 --- a/src/include/86box/vid_ati_mach8.h +++ b/src/include/86box/vid_ati_mach8.h @@ -41,8 +41,6 @@ typedef struct mach_t { int ramdac_type; int old_mode; - uint32_t memory; - uint16_t config1; uint16_t config2; @@ -73,9 +71,7 @@ typedef struct mach_t { uint8_t bank_r; uint16_t shadow_set; uint16_t shadow_cntl; - int ext_on[2]; - int extended_mode; - int compat_mode; + int override_resolution; struct { uint8_t line_idx; @@ -84,6 +80,12 @@ typedef struct mach_t { uint8_t patt_len; uint8_t pix_trans[2]; uint8_t eeprom_control; + uint8_t alu_bg_fn; + uint8_t alu_fg_fn; + uint16_t clip_left; + uint16_t clip_right; + uint16_t clip_top; + uint16_t clip_bottom; uint16_t dest_x_end; uint16_t dest_x_start; uint16_t dest_y_end; @@ -102,14 +104,14 @@ typedef struct mach_t { uint16_t ge_offset_hi; uint16_t linedraw_opt; uint16_t max_waitstates; - uint8_t patt_data_idx; - uint8_t patt_data[0x18]; uint16_t scan_to_x; uint16_t scratch0; uint16_t scratch1; uint16_t test; uint16_t pattern; uint16_t test2; + int patt_data_idx_reg; + int patt_data_idx; int src_y_dir; int cmd_type; int block_write_mono_pattern_enable; @@ -144,9 +146,8 @@ typedef struct mach_t { int stepx; int stepy; int src_stepx; - uint8_t color_pattern[16]; - uint8_t color_pattern_full[32]; - uint16_t color_pattern_word[8]; + uint8_t mono_pattern_normal[16]; + uint8_t color_pattern[32]; int mono_pattern[8][8]; uint32_t ge_offset; uint32_t crt_offset; diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 18b7b672a..c91db4fe8 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -369,6 +369,7 @@ uint32_t svga_mask_addr(uint32_t addr, svga_t *svga); uint32_t svga_mask_changedaddr(uint32_t addr, svga_t *svga); void svga_doblit(int wx, int wy, svga_t *svga); +void svga_poll(void *priv); enum { RAMDAC_6BIT = 0, @@ -396,6 +397,9 @@ extern void att498_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv extern uint8_t att498_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga); extern float av9194_getclock(int clock, void *priv); +extern void bt481_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *svga); +extern uint8_t bt481_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga); + extern void bt48x_ramdac_out(uint16_t addr, int rs2, int rs3, uint8_t val, void *priv, svga_t *svga); extern uint8_t bt48x_ramdac_in(uint16_t addr, int rs2, int rs3, void *priv, svga_t *svga); extern void bt48x_recalctimings(void *priv, svga_t *svga); @@ -452,6 +456,7 @@ extern const device_t att491_ramdac_device; extern const device_t att492_ramdac_device; extern const device_t att498_ramdac_device; extern const device_t av9194_device; +extern const device_t bt481_ramdac_device; extern const device_t bt484_ramdac_device; extern const device_t att20c504_ramdac_device; extern const device_t bt485_ramdac_device; diff --git a/src/include/86box/vid_xga.h b/src/include/86box/vid_xga.h index 90a3c69aa..b90b53978 100644 --- a/src/include/86box/vid_xga.h +++ b/src/include/86box/vid_xga.h @@ -31,13 +31,11 @@ typedef struct xga_hwcursor_t { } xga_hwcursor_t; typedef struct xga_t { - mem_mapping_t membios_mapping; mem_mapping_t memio_mapping; mem_mapping_t linear_mapping; mem_mapping_t video_mapping; rom_t bios_rom; - rom_t membios_rom; - rom_t vga_bios_rom; + rom_t bios_rom2; xga_hwcursor_t hwcursor; xga_hwcursor_t hwcursor_latch; PALETTE extpal; @@ -153,6 +151,7 @@ typedef struct xga_t { int a5_test; int type; int bus; + int busy; uint32_t linear_base; uint32_t linear_size; diff --git a/src/video/CMakeLists.txt b/src/video/CMakeLists.txt index 2f7607ad6..bbd329b7e 100644 --- a/src/video/CMakeLists.txt +++ b/src/video/CMakeLists.txt @@ -19,7 +19,7 @@ add_library(vid OBJECT agpgart.c video.c vid_table.c vid_cga.c vid_cga_comp.c vid_sigma.c vid_wy700.c vid_ega.c vid_ega_render.c vid_svga.c vid_8514a.c vid_svga_render.c vid_ddc.c vid_vga.c vid_ati_eeprom.c vid_ati18800.c vid_ati28800.c vid_ati_mach8.c vid_ati_mach64.c vid_ati68875_ramdac.c - vid_ati68860_ramdac.c vid_bt48x_ramdac.c vid_chips_69000.c + vid_ati68860_ramdac.c vid_bt481_ramdac.c vid_bt48x_ramdac.c vid_chips_69000.c vid_av9194.c vid_icd2061.c vid_ics2494.c vid_ics2595.c vid_cl54xx.c vid_et3000.c vid_et4000.c vid_sc1148x_ramdac.c vid_sc1502x_ramdac.c vid_et4000w32.c vid_stg_ramdac.c vid_ht216.c vid_oak_oti.c vid_paradise.c diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 944a14a88..3e758b952 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -106,6 +106,9 @@ ibm8514_log(const char *fmt, ...) dat = (dev->vram[(addr) & (dev->vram_mask)]); \ } +#define READ_HIGH(addr, dat) \ + dat |= (dev->vram[(addr) & (dev->vram_mask)] << 8); + #define MIX(mixmode, dest_dat, src_dat) \ { \ switch ((mixmode) ? (dev->accel.frgd_mix & 0x1f) : (dev->accel.bkgd_mix & 0x1f)) { \ @@ -191,7 +194,10 @@ ibm8514_log(const char *fmt, ...) dest_dat = MAX(0, (src_dat - dest_dat)); \ break; \ case 0x1b: \ - dest_dat = MIN(~0, (dest_dat + src_dat)); \ + if (dev->bpp) \ + dest_dat = MIN(0xffff, (dest_dat + src_dat)); \ + else \ + dest_dat = MIN(0xff, (dest_dat + src_dat)); \ break; \ case 0x1c: \ dest_dat = MAX(0, (dest_dat - src_dat)) / 2; \ @@ -203,7 +209,10 @@ ibm8514_log(const char *fmt, ...) dest_dat = MAX(0, (src_dat - dest_dat)) / 2; \ break; \ case 0x1f: \ - dest_dat = (~0 < (src_dat + dest_dat)) ? ~0 : ((src_dat + dest_dat) >> 1); \ + if (dev->bpp) \ + dest_dat = (0xffff < (src_dat + dest_dat)) ? 0xffff : ((src_dat + dest_dat) / 2); \ + else \ + dest_dat = (0xff < (src_dat + dest_dat)) ? 0xff : ((src_dat + dest_dat) / 2); \ break; \ } \ } @@ -259,10 +268,9 @@ ibm8514_accel_out_pixtrans(svga_t *svga, UNUSED(uint16_t port), uint32_t val, in int frgd_mix = (dev->accel.frgd_mix >> 5) & 3; int bkgd_mix = (dev->accel.bkgd_mix >> 5) & 3; int cmd = dev->accel.cmd >> 13; - int and3 = dev->accel.cur_x & 3; if (dev->accel.cmd & 0x100) { - if (len != 1) { + if (len == 2) { /*Bus size*/ if (dev->accel.cmd & 0x200) /*16-bit*/ pixcnt = 16; @@ -271,200 +279,49 @@ ibm8514_accel_out_pixtrans(svga_t *svga, UNUSED(uint16_t port), uint32_t val, in /*Pixel transfer data mode, can't be the same as Foreground/Background CPU data*/ if (pixcntl == 2) { - if ((frgd_mix == 2) || (bkgd_mix == 2)) { + if ((frgd_mix == 2) || (bkgd_mix == 2)) pixelxfer = val; - } else { - if (dev->accel.cmd & 2) { + else { + if (dev->accel.cmd & 0x02) { if (pixcnt == 16) { if ((cmd >= 2) && (dev->accel.cmd & 0x1000)) val = (val >> 8) | (val << 8); } - if (and3 == 3) { - if (dev->accel.cmd & 0x1000) - goto regular_nibble; - if (val & 0x02) - nibble |= 0x10; - if (val & 0x04) - nibble |= 0x08; - if (val & 0x08) - nibble |= 0x04; - if (val & 0x10) - nibble |= 0x02; - if (val & 0x200) - nibble |= 0x01; - if (val & 0x400) - nibble |= 0x80; - if (val & 0x800) - nibble |= 0x40; - if (val & 0x1000) - nibble |= 0x20; - } else if (and3 == 2) { - if (dev->accel.cmd & 0x1000) - goto regular_nibble; - if (val & 0x02) - nibble |= 0x20; - if (val & 0x04) - nibble |= 0x10; - if (val & 0x08) - nibble |= 0x08; - if (val & 0x10) - nibble |= 0x04; - if (val & 0x200) - nibble |= 0x02; - if (val & 0x400) - nibble |= 0x01; - if (val & 0x800) - nibble |= 0x80; - if (val & 0x1000) - nibble |= 0x40; - } else if (and3 == 1) { - if (dev->accel.cmd & 0x1000) - goto regular_nibble; - if (val & 0x02) - nibble |= 0x40; - if (val & 0x04) - nibble |= 0x20; - if (val & 0x08) - nibble |= 0x10; - if (val & 0x10) - nibble |= 0x08; - if (val & 0x200) - nibble |= 0x04; - if (val & 0x400) - nibble |= 0x02; - if (val & 0x800) - nibble |= 0x01; - if (val & 0x1000) - nibble |= 0x80; - } else { -regular_nibble: - if (val & 0x02) - nibble |= 0x80; - if (val & 0x04) - nibble |= 0x40; - if (val & 0x08) - nibble |= 0x20; - if (val & 0x10) - nibble |= 0x10; - if (val & 0x200) - nibble |= 0x08; - if (val & 0x400) - nibble |= 0x04; - if (val & 0x800) - nibble |= 0x02; - if (val & 0x1000) - nibble |= 0x01; - } - - if ((and3 == 0) || (dev->accel.cmd & 0x1000) || ((dev->accel.cmd & 8) && ibm8514_cpu_src(svga))) { - if ((dev->accel.cmd & 8) && ibm8514_cpu_src(svga)) { + if ((cmd <= 2) || (cmd == 4)) { + if ((dev->accel.cmd & 0x08) && (cmd >= 2)) monoxfer = val; - } else - monoxfer = nibble; - ibm8514_accel_start(pixcnt, 1, monoxfer, pixelxfer, svga, len); - if (dev->accel.nibbleset != NULL) { - free(dev->accel.nibbleset); - dev->accel.nibbleset = NULL; - } - if (dev->accel.writemono != NULL) { - free(dev->accel.writemono); - dev->accel.writemono = NULL; - } - return; - } - - dev->accel.writemono[dev->accel.x_count] = nibble; - if (val & 0x1c00) { - if (and3 == 1) { + else { + if (val & 0x02) + nibble |= 0x80; + if (val & 0x04) + nibble |= 0x40; + if (val & 0x08) + nibble |= 0x20; + if (val & 0x10) + nibble |= 0x10; + if (val & 0x200) + nibble |= 0x08; + if (val & 0x400) + nibble |= 0x04; + if (val & 0x800) + nibble |= 0x02; if (val & 0x1000) - dev->accel.nibbleset[dev->accel.x_count] = 0x80; - else - dev->accel.nibbleset[dev->accel.x_count] = 0; - } else if (and3 == 2) { - if (val & 0x1000) { - if (val & 0x800) - dev->accel.nibbleset[dev->accel.x_count] = 0xc0; - else - dev->accel.nibbleset[dev->accel.x_count] = 0x40; - } else if (val & 0x800) { - if (val & 0x1000) - dev->accel.nibbleset[dev->accel.x_count] = 0xc0; - else - dev->accel.nibbleset[dev->accel.x_count] = 0x80; - } else - dev->accel.nibbleset[dev->accel.x_count] = 0; - } else if (and3 == 3) { - if (val & 0x1000) { - if (val & 0x800) { - if (val & 0x400) - dev->accel.nibbleset[dev->accel.x_count] = 0xe0; - else - dev->accel.nibbleset[dev->accel.x_count] = 0x60; - } else if (val & 0x400) { - if (val & 0x800) - dev->accel.nibbleset[dev->accel.x_count] = 0xe0; - else - dev->accel.nibbleset[dev->accel.x_count] = 0xa0; - } else - dev->accel.nibbleset[dev->accel.x_count] = 0x20; - } else if (val & 0x800) { - if (val & 0x400) { - if (val & 0x1000) - dev->accel.nibbleset[dev->accel.x_count] = 0xe0; - else - dev->accel.nibbleset[dev->accel.x_count] = 0xc0; - } else if (val & 0x1000) { - if (val & 0x400) - dev->accel.nibbleset[dev->accel.x_count] = 0xe0; - else - dev->accel.nibbleset[dev->accel.x_count] = 0x60; - } else - dev->accel.nibbleset[dev->accel.x_count] = 0x40; - } else if (val & 0x400) { - if (val & 0x800) { - if (val & 0x1000) - dev->accel.nibbleset[dev->accel.x_count] = 0xe0; - else - dev->accel.nibbleset[dev->accel.x_count] = 0xc0; - } else if (val & 0x1000) { - if (val & 0x800) - dev->accel.nibbleset[dev->accel.x_count] = 0xe0; - else - dev->accel.nibbleset[dev->accel.x_count] = 0xa0; - } else - dev->accel.nibbleset[dev->accel.x_count] = 0x80; - } else - dev->accel.nibbleset[dev->accel.x_count] = 0; + nibble |= 0x01; + + monoxfer = nibble; } } else - dev->accel.nibbleset[dev->accel.x_count] = 0; - - dev->accel.x_count++; - if (dev->accel.x_count == dev->accel.sys_cnt) { - for (int i = 0; i < dev->accel.x_count; i++) { - dev->accel.writemono[i] &= ~dev->accel.nibbleset[i]; - dev->accel.writemono[i] |= dev->accel.nibbleset[i + 1]; - ibm8514_accel_start(pixcnt, 1, dev->accel.writemono[i], pixelxfer, svga, len); - } - - dev->accel.x_count = 0; - if (dev->accel.nibbleset != NULL) { - free(dev->accel.nibbleset); - dev->accel.nibbleset = NULL; - } - if (dev->accel.writemono != NULL) { - free(dev->accel.writemono); - dev->accel.writemono = NULL; - } - } - return; - } - monoxfer = val; + monoxfer = val; + } else + monoxfer = val; } - } else { + } else pixelxfer = val; - } - ibm8514_accel_start(pixcnt, 1, monoxfer, pixelxfer, svga, len); + + if (dev->accel.input) + ibm8514_accel_start(pixcnt >> 1, 1, monoxfer & 0xff, pixelxfer & 0xff, svga, len); + else + ibm8514_accel_start(pixcnt, 1, monoxfer & 0xffff, pixelxfer & 0xffff, svga, len); } } } @@ -480,115 +337,61 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) switch (port) { case 0x82e8: case 0xc2e8: - if (len == 1) - dev->accel.cur_y = (dev->accel.cur_y & 0x700) | val; - else + if (len == 2) dev->accel.cur_y = val & 0x7ff; break; - case 0x82e9: - case 0xc2e9: - if (len == 1) - dev->accel.cur_y = (dev->accel.cur_y & 0xff) | ((val & 0x07) << 8); - break; case 0x86e8: case 0xc6e8: - if (len == 1) - dev->accel.cur_x = (dev->accel.cur_x & 0x700) | val; - else + if (len == 2) dev->accel.cur_x = val & 0x7ff; break; - case 0x86e9: - case 0xc6e9: - if (len == 1) { - dev->accel.cur_x = (dev->accel.cur_x & 0xff) | ((val & 0x07) << 8); - } - break; case 0x8ae8: case 0xcae8: - if (len == 1) - dev->accel.desty_axstp = (dev->accel.desty_axstp & 0x3f00) | val; - else { - dev->accel.desty = val & 0x07ff; + if (len == 2) { + dev->accel.desty = val & 0x7ff; dev->accel.desty_axstp = val & 0x3fff; if (val & 0x2000) dev->accel.desty_axstp |= ~0x1fff; } break; - case 0x8ae9: - case 0xcae9: - if (len == 1) { - dev->accel.desty_axstp = (dev->accel.desty_axstp & 0xff) | ((val & 0x3f) << 8); - if (val & 0x20) - dev->accel.desty_axstp |= ~0x1fff; - } - break; case 0x8ee8: case 0xcee8: - if (len == 1) - dev->accel.destx_distp = (dev->accel.destx_distp & 0x3f00) | val; - else { - dev->accel.destx = val & 0x07ff; + if (len == 2) { + dev->accel.destx = val & 0x7ff; dev->accel.destx_distp = val & 0x3fff; if (val & 0x2000) dev->accel.destx_distp |= ~0x1fff; } break; - case 0x8ee9: - case 0xcee9: - if (len == 1) { - dev->accel.destx_distp = (dev->accel.destx_distp & 0xff) | ((val & 0x3f) << 8); - if (val & 0x20) - dev->accel.destx_distp |= ~0x1fff; - } - break; case 0x92e8: - if (len != 1) + if (len == 2) dev->test = val; fallthrough; case 0xd2e8: - if (len == 1) - dev->accel.err_term = (dev->accel.err_term & 0x3f00) | val; - else { + if (len == 2) { dev->accel.err_term = val & 0x3fff; if (val & 0x2000) dev->accel.err_term |= ~0x1fff; } break; - case 0x92e9: - case 0xd2e9: - if (len == 1) { - dev->accel.err_term = (dev->accel.err_term & 0xff) | ((val & 0x3f) << 8); - if (val & 0x20) - dev->accel.err_term |= ~0x1fff; - } - break; case 0x96e8: case 0xd6e8: - if (len == 1) - dev->accel.maj_axis_pcnt = (dev->accel.maj_axis_pcnt & 0x700) | val; - else { + if (len == 2) { dev->accel.maj_axis_pcnt = val & 0x7ff; dev->accel.maj_axis_pcnt_no_limit = val; } break; - case 0x96e9: - case 0xd6e9: - if (len == 1) - dev->accel.maj_axis_pcnt = (dev->accel.maj_axis_pcnt & 0xff) | ((val & 0x07) << 8); - break; case 0x9ae8: case 0xdae8: dev->accel.ssv_state = 0; - if (len == 1) - dev->accel.cmd = (dev->accel.cmd & 0xff00) | val; - else { + if (len == 2) { dev->data_available = 0; dev->data_available2 = 0; dev->accel.cmd = val; @@ -596,20 +399,7 @@ 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.\n", dev->accel.cmd); - ibm8514_accel_start(-1, 0, -1, 0, svga, len); - } - break; - case 0x9ae9: - case 0xdae9: - if (len == 1) { - dev->data_available = 0; - dev->data_available2 = 0; - dev->accel.cmd = (dev->accel.cmd & 0xff) | (val << 8); - if (port == 0xdae9) { - if (dev->accel.cmd & 0x100) - dev->accel.cmd_back = 0; - } + ibm8514_log("8514/A CMD=%04x, back=%d.\n", dev->accel.cmd, dev->accel.cmd_back); ibm8514_accel_start(-1, 0, -1, 0, svga, len); } break; @@ -617,35 +407,14 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x9ee8: case 0xdee8: dev->accel.ssv_state = 1; - if (len == 1) - dev->accel.short_stroke = (dev->accel.short_stroke & 0xff00) | val; - else { + if (len == 2) { dev->accel.short_stroke = val; - dev->accel.cx = dev->accel.cur_x; - dev->accel.cy = dev->accel.cur_y; - if (dev->accel.cur_x >= 0x600) - dev->accel.cx |= ~0x5ff; - if (dev->accel.cur_y >= 0x600) - dev->accel.cy |= ~0x5ff; - if (dev->accel.cmd & 0x1000) { - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke & 0xff, len); - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke >> 8, len); - } else { - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke >> 8, len); - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke & 0xff, len); - } - } - break; - case 0x9ee9: - case 0xdee9: - dev->accel.ssv_state = 1; - if (len == 1) { - dev->accel.short_stroke = (dev->accel.short_stroke & 0xff) | (val << 8); - dev->accel.cx = dev->accel.cur_x; - dev->accel.cy = dev->accel.cur_y; + dev->accel.cx = dev->accel.cur_x; if (dev->accel.cur_x >= 0x600) dev->accel.cx |= ~0x5ff; + + dev->accel.cy = dev->accel.cur_y; if (dev->accel.cur_y >= 0x600) dev->accel.cy |= ~0x5ff; @@ -662,93 +431,56 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0xa2e8: case 0xe2e8: if (port == 0xe2e8) { - if (dev->accel.cmd_back) { - if (len == 1) - dev->accel.bkgd_color = (dev->accel.bkgd_color & 0x00ff) | val; - else + if (len == 2) { + if (dev->accel.cmd_back) dev->accel.bkgd_color = val; - } else { - if (ibm8514_cpu_dest(svga)) - break; - ibm8514_accel_out_pixtrans(svga, port, val, len); + else { + if (ibm8514_cpu_dest(svga)) + break; + ibm8514_accel_out_pixtrans(svga, port, val, len); + } } } else { - if (len == 1) - dev->accel.bkgd_color = (dev->accel.bkgd_color & 0x00ff) | val; - else + if (len == 2) dev->accel.bkgd_color = val; } break; - case 0xa2e9: - case 0xe2e9: - if (len == 1) - dev->accel.bkgd_color = (dev->accel.bkgd_color & 0xff00) | (val << 8); - break; case 0xa6e8: case 0xe6e8: if (port == 0xe6e8) { - if (dev->accel.cmd_back) { - if (len == 1) - dev->accel.frgd_color = (dev->accel.frgd_color & 0x00ff) | val; - else + if (len == 2) { + if (dev->accel.cmd_back) dev->accel.frgd_color = val; - } else { - if (ibm8514_cpu_dest(svga)) - break; - ibm8514_accel_out_pixtrans(svga, port, val, len); + else { + if (ibm8514_cpu_dest(svga)) + break; + ibm8514_accel_out_pixtrans(svga, port, val, len); + } } } else { - if (len == 1) - dev->accel.frgd_color = (dev->accel.frgd_color & 0x00ff) | val; - else + if (len == 2) dev->accel.frgd_color = val; } break; - case 0xa6e9: - case 0xe6e9: - if (len == 1) - dev->accel.frgd_color = (dev->accel.frgd_color & 0xff00) | (val << 8); - break; case 0xaae8: case 0xeae8: - if (len == 1) - dev->accel.wrt_mask = (dev->accel.wrt_mask & 0x00ff) | val; - else + if (len == 2) dev->accel.wrt_mask = val; break; - case 0xaae9: - case 0xeae9: - if (len == 1) - dev->accel.wrt_mask = (dev->accel.wrt_mask & 0xff00) | (val << 8); - break; case 0xaee8: case 0xeee8: - if (len == 1) - dev->accel.rd_mask = (dev->accel.rd_mask & 0x00ff) | val; - else + if (len == 2) dev->accel.rd_mask = val; break; - case 0xaee9: - case 0xeee9: - if (len == 1) - dev->accel.rd_mask = (dev->accel.rd_mask & 0xff00) | (val << 8); - break; case 0xb2e8: case 0xf2e8: - if (len == 1) - dev->accel.color_cmp = (dev->accel.color_cmp & 0x00ff) | val; - else + if (len == 2) dev->accel.color_cmp = val; break; - case 0xb2e9: - case 0xf2e9: - if (len == 1) - dev->accel.color_cmp = (dev->accel.color_cmp & 0xff00) | (val << 8); - break; case 0xb6e8: case 0xf6e8: @@ -762,45 +494,10 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0xbee8: case 0xfee8: - if (len == 1) - dev->accel.multifunc_cntl = (dev->accel.multifunc_cntl & 0xff00) | val; - else { + if (len == 2) { dev->accel.multifunc_cntl = val; dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff; - if ((dev->accel.multifunc_cntl >> 12) == 1) - dev->accel.clip_top = val & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 2) - dev->accel.clip_left = val & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 3) - dev->accel.multifunc[3] = val & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 4) - dev->accel.multifunc[4] = val & 0x7ff; - - ibm8514_log("CLIPBOTTOM=%d, CLIPRIGHT=%d, bpp=%d, pitch=%d.\n", dev->accel.multifunc[3], dev->accel.multifunc[4], dev->accel_bpp, dev->pitch); - if (port == 0xfee8) - dev->accel.cmd_back = 1; - else - dev->accel.cmd_back = 0; - } - break; - case 0xbee9: - case 0xfee9: - if (len == 1) { - dev->accel.multifunc_cntl = (dev->accel.multifunc_cntl & 0xff) | (val << 8); - dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff; - if ((dev->accel.multifunc_cntl >> 12) == 1) - dev->accel.clip_top = dev->accel.multifunc_cntl & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 2) - dev->accel.clip_left = dev->accel.multifunc_cntl & 0x7ff; - - if (port == 0xfee9) - dev->accel.cmd_back = 1; - else - dev->accel.cmd_back = 0; + dev->accel.cmd_back = !!(port == 0xfee8); } break; @@ -902,10 +599,8 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len) case 0x6e8: /*In preparation to switch from VGA to 8514/A mode*/ - if (!dev->on[0] || !dev->on[1]) { - dev->hdisped = val; - dev->hdisp = (dev->hdisped + 1) << 3; - } + dev->hdisped = val; + dev->hdisp = (dev->hdisped + 1) << 3; ibm8514_log("[%04X:%08X]: IBM 8514/A: (0x%04x): hdisp=0x%02x.\n", CS, cpu_state.pc, port, val); svga_recalctimings(svga); break; @@ -938,11 +633,9 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len) case 0x16e8: case 0x16e9: /*In preparation to switch from VGA to 8514/A mode*/ - if (!dev->on[0] || !dev->on[1]) { - WRITE8(port, dev->v_disp, val); - dev->v_disp &= 0x1fff; - dev->vdisp = (dev->v_disp + 1) >> 1; - } + WRITE8(port, dev->v_disp, val); + dev->v_disp &= 0x1fff; + dev->vdisp = (dev->v_disp + 1) >> 1; ibm8514_log("IBM 8514/A: V_DISP write 16E8 = %d\n", dev->v_disp); ibm8514_log("IBM 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val); svga_recalctimings(svga); @@ -1000,12 +693,10 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len) break; case 0x4ae8: - case 0x4ae9: WRITE8(port, dev->accel.advfunc_cntl, val); - dev->on[0] = dev->accel.advfunc_cntl & 0x01; - vga_on = !dev->on[0]; - dev->vendor_mode[0] = 0; - ibm8514_log("[%04X:%08X]: IBM 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, dev->on[port & 1], dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); + dev->on = dev->accel.advfunc_cntl & 0x01; + vga_on = !dev->on; + ibm8514_log("[%04X:%08X]: IBM 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, dev->on, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); ibm8514_log("IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); svga_recalctimings(svga); break; @@ -1042,29 +733,29 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) switch (port) { case 0x82e8: case 0xc2e8: - if (len != 1) + if (len == 2) temp = dev->accel.cur_y; break; case 0x86e8: case 0xc6e8: - if (len != 1) + if (len == 2) temp = dev->accel.cur_x; break; case 0x92e8: - if (len != 1) + if (len == 2) temp = dev->test; break; case 0x96e8: - if (len != 1) + if (len == 2) temp = dev->accel.maj_axis_pcnt; break; case 0x9ae8: case 0xdae8: - if (len != 1) { + if (len == 2) { if (dev->force_busy) temp |= 0x200; /*Hardware busy*/ dev->force_busy = 0; @@ -1090,14 +781,19 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) case 0xe2e8: case 0xe6e8: if (ibm8514_cpu_dest(svga)) { - if (len != 1) { + if (len == 2) { cmd = (dev->accel.cmd >> 13); READ_PIXTRANS_WORD(dev->accel.cx, 0); - if (dev->accel.input && !dev->accel.odd_in && !dev->accel.sx) { - temp &= ~0xff00; - temp |= (dev->vram[(dev->accel.newdest_in + dev->accel.cur_x) & dev->vram_mask] << 8); - } - ibm8514_accel_out_pixtrans(svga, port, temp, len); + if (dev->accel.input) { + ibm8514_accel_out_pixtrans(svga, port, temp & 0xff, len); + if (dev->accel.odd_in) { /*WORDs on odd destination scan lengths.*/ + dev->accel.odd_in = 0; + temp &= ~0xff00; + READ_HIGH(dev->accel.dest + dev->accel.cx, temp); + } + ibm8514_accel_out_pixtrans(svga, port, (temp >> 8) & 0xff, len); + } else + ibm8514_accel_out_pixtrans(svga, port, temp, len); } } break; @@ -1113,9 +809,6 @@ ibm8514_accel_in(uint16_t port, svga_t *svga) { ibm8514_t *dev = (ibm8514_t *) svga->dev8514; uint8_t temp = 0; - uint16_t clip_b_ibm = dev->accel.multifunc[3]; - uint16_t clip_r_ibm = dev->accel.multifunc[4]; - int cmd = (dev->accel.cmd >> 13); switch (port) { case 0x2e8: @@ -1150,19 +843,8 @@ ibm8514_accel_in(uint16_t port, svga_t *svga) if (dev->vc == dev->v_syncstart) dev->subsys_stat |= 1; - if (cmd == 6) { - if (((dev->accel.dx) >= dev->accel.clip_left) && ((dev->accel.dx) <= clip_r_ibm) && ((dev->accel.dy) >= dev->accel.clip_top) && ((dev->accel.dy) <= clip_b_ibm)) - temp |= 2; - } else { - if (((dev->accel.cx) >= dev->accel.clip_left) && ((dev->accel.dx) <= clip_r_ibm) && ((dev->accel.cy) >= dev->accel.clip_top) && ((dev->accel.cy) <= clip_b_ibm)) - temp |= 2; - } - - if (!dev->force_busy) - temp |= 8; - if (port & 1) - temp = 0x80; + temp = dev->vram_512k_8514 ? 0x00 : 0x80; else { temp |= (dev->subsys_stat | 0x80); temp |= 0x20; @@ -1232,8 +914,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat uint16_t old_dest_dat; int frgd_mix; int bkgd_mix; - uint16_t clip_b = dev->accel.multifunc[3]; - uint16_t clip_r = dev->accel.multifunc[4]; + int16_t clip_t = dev->accel.multifunc[1] & 0x7ff; + int16_t clip_l = dev->accel.multifunc[2] & 0x7ff; + uint16_t clip_b = dev->accel.multifunc[3] & 0x7ff; + uint16_t clip_r = dev->accel.multifunc[4] & 0x7ff; int pixcntl = (dev->accel.multifunc[0x0a] >> 6) & 3; uint16_t mix_mask = dev->bpp ? 0x8000 : 0x80; uint16_t compare = dev->accel.color_cmp; @@ -1265,11 +949,11 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat bkgd_mix = (dev->accel.bkgd_mix >> 5) & 3; if (cpu_input) { - if ((dev->accel.cmd & 2) || (pixcntl == 2)) { + if ((dev->accel.cmd & 0x02) || (pixcntl == 2)) { if ((frgd_mix == 2) || (bkgd_mix == 2)) count >>= 3; else if (pixcntl == 2) { - if (dev->accel.cmd & 2) + if (dev->accel.cmd & 0x02) count >>= 1; else count >>= 3; @@ -1369,9 +1053,12 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat if (dev->accel.ssv_state == 0) break; - if (dev->accel.cmd & 8) { + if (dev->accel.cmd & 0x08) { while (count-- && dev->accel.ssv_len >= 0) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -1389,17 +1076,24 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat default: break; } + READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { 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.ssv_draw) { - if ((dev->accel.cmd & 4) && dev->accel.ssv_len) { + if ((dev->accel.cmd & 0x04) && dev->accel.ssv_len) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { + } else if (!(dev->accel.cmd & 0x04)) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); } } @@ -1454,8 +1148,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } } else { while (count-- && (dev->accel.ssv_len >= 0)) { - if ((dev->accel.cx >= dev->accel.clip_left) && (dev->accel.cx <= clip_r) && - (dev->accel.cy >= dev->accel.clip_top) && (dev->accel.cy <= clip_b)) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -1476,15 +1172,21 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { 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.ssv_draw) { - if ((dev->accel.cmd & 4) && dev->accel.ssv_len) { + if ((dev->accel.cmd & 0x04) && dev->accel.ssv_len) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { + } else if (!(dev->accel.cmd & 0x04)) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); } } @@ -1576,47 +1278,25 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat case 1: /*Draw line*/ if (!cpu_input) { - dev->accel.xx_count = 0; - dev->accel.cx = dev->accel.cur_x; - dev->accel.cy = dev->accel.cur_y; + dev->accel.output = 0; + dev->accel.x_count = 0; + dev->accel.cx = dev->accel.cur_x; if (dev->accel.cur_x >= 0x600) dev->accel.cx |= ~0x5ff; + dev->accel.cy = dev->accel.cur_y; if (dev->accel.cur_y >= 0x600) dev->accel.cy |= ~0x5ff; dev->accel.sy = dev->accel.maj_axis_pcnt; - ibm8514_log("Line Draw 8514/A, frgdmix=%d, bkgdmix=%d, c(%d,%d), pixcntl=%d, sy=%d, polyfill=%x, selfrmix=%02x, selbkmix=%02x, bkgdcol=%02x, frgdcol=%02x, clipt=%d, clipb=%d.\n", frgd_mix, bkgd_mix, dev->accel.cx, dev->accel.cy, pixcntl, dev->accel.sy, dev->accel.multifunc[0x0a] & 6, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, bkgd_color, frgd_color, dev->accel.clip_top, clip_b); + ibm8514_log("Line Draw 8514/A CMD=%04x, frgdmix=%d, bkgdmix=%d, c(%d,%d), pixcntl=%d, sy=%d, polyfill=%x, selfrmix=%02x, selbkmix=%02x, bkgdcol=%02x, frgdcol=%02x, clipt=%d, clipb=%d.\n", dev->accel.cmd, frgd_mix, bkgd_mix, dev->accel.cx, dev->accel.cy, pixcntl, dev->accel.sy, dev->accel.multifunc[0x0a] & 6, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, bkgd_color, frgd_color, dev->accel.clip_top, clip_b); if (ibm8514_cpu_src(svga)) { - if (dev->accel.cmd & 2) { - if (dev->accel.cmd & 8) { - if (and3 == 1) { - dev->accel.sy += 4; - if (dev->accel.cmd & 0x20) - dev->accel.cx += 4; - else - dev->accel.cx -= 4; - } else if (and3 == 2) { - dev->accel.sy += 5; - if (dev->accel.cmd & 0x20) - dev->accel.cx += 5; - else - dev->accel.cx -= 5; - } else if (and3 == 3) { - dev->accel.sy += 6; - if (dev->accel.cmd & 0x20) - dev->accel.cx += 6; - else - dev->accel.cx -= 6; - } else { - dev->accel.sy += 3; - if (dev->accel.cmd & 0x20) - dev->accel.cx += 3; - else - dev->accel.cx -= 3; - } + if (dev->accel.cmd & 0x02) { + if (!(dev->accel.cmd & 0x1000)) { + if (dev->accel.cmd & 0x08) + dev->accel.output = 1; } } dev->data_available = 0; @@ -1629,12 +1309,18 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } } - if (dev->accel.cmd & 8) { /*Vector Line*/ - if (ibm8514_cpu_dest(svga) && cpu_input && (dev->accel.cmd & 2)) + if (dev->accel.cmd & 0x08) { /*Vector Line*/ + if (ibm8514_cpu_dest(svga) && cpu_input && (dev->accel.cmd & 0x02)) count >>= 1; - dev->accel.xx_count++; + + if (dev->accel.cmd & 0x02) + ibm8514_log("Line Draw Vector Single pixtrans=%04x, count=%d.\n", mix_dat, count); + while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) { mix_dat = mix_mask; /* Mix data = forced to foreground register. */ } else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) { @@ -1649,94 +1335,72 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat if (pixcntl == 3) src_dat = ((src_dat & rd_mask) == rd_mask); } else { - 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 = cpu_dat; - break; - case 3: - src_dat = 0; - break; + if (dev->accel.output) { + switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; - default: - break; + default: + break; + } + } else { + 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 = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } } } READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { old_dest_dat = dest_dat; - MIX(mix_dat & mix_mask, dest_dat, src_dat); + if (dev->accel.output) { + MIX(mix_dat & 0x01, dest_dat, src_dat); + } else { + MIX(mix_dat & mix_mask, dest_dat, src_dat); + } dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - if ((dev->accel.cmd & 2) && ibm8514_cpu_src(svga)) { - if (and3 == 1) { - if (dev->accel.xx_count >= 2) { - if ((dev->accel.cmd & 4) && dev->accel.sy) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } - } - } else if (and3 == 2) { - if (dev->accel.xx_count == 2) { - if (count <= 2) { - if ((dev->accel.cmd & 4) && dev->accel.sy) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } - } - } else if (dev->accel.xx_count >= 3) { - if ((dev->accel.cmd & 4) && dev->accel.sy) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } - } - } else if (and3 == 3) { - if (dev->accel.xx_count == 2) { - if (count <= 1) { - if ((dev->accel.cmd & 4) && dev->accel.sy) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } - } - } else if (dev->accel.xx_count >= 3) { - if ((dev->accel.cmd & 4) && dev->accel.sy) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } - } - } else { - if (dev->accel.xx_count == 1) { - if (!count) { - if ((dev->accel.cmd & 4) && dev->accel.sy) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } - } - } else if (dev->accel.xx_count >= 2) { - if ((dev->accel.cmd & 4) && dev->accel.sy) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } - } + if ((dev->accel.cmd & 0x02) && ibm8514_cpu_src(svga)) { + if ((dev->accel.cmd & 0x04) && dev->accel.sy) { + WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); + } else if (!(dev->accel.cmd & 0x04)) { + WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); } } else { if (ibm8514_cpu_src(svga) || !cpu_input) { - if ((dev->accel.cmd & 4) && dev->accel.sy) { + if ((dev->accel.cmd & 0x04) && dev->accel.sy) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { + } else if (!(dev->accel.cmd & 0x04)) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); } } @@ -1744,17 +1408,21 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } } - mix_dat <<= 1; - mix_dat |= 1; + if (!dev->accel.sy) + break; + + if (dev->accel.output) + mix_dat >>= 1; + else { + mix_dat <<= 1; + mix_dat |= 1; + } + if (dev->bpp) cpu_dat >>= 16; else cpu_dat >>= 8; - if (dev->accel.sy == 0) { - break; - } - switch (dev->accel.cmd & 0xe0) { case 0x00: dev->accel.cx++; @@ -1793,19 +1461,24 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; - } else { /*Bresenham*/ + dev->accel.x_count = 0; + dev->accel.output = 0; + } else { /*Bresenham Line*/ if (pixcntl == 1) { dev->accel.temp_cnt = 8; while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.temp_cnt == 0) { + if (!dev->accel.temp_cnt) { dev->accel.temp_cnt = 8; - mix_dat = old_mix_dat; + mix_dat = old_mix_dat; } - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { if (ibm8514_cpu_dest(svga)) { READ((dev->accel.cy * dev->pitch) + dev->accel.cx, src_dat); } else - switch ((mix_dat & 1) ? frgd_mix : bkgd_mix) { + switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; break; @@ -1825,13 +1498,19 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { old_dest_dat = dest_dat; - MIX(mix_dat & 1, dest_dat, src_dat); + MIX(mix_dat & 0x01, dest_dat, src_dat); dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - if ((dev->accel.cmd & 4) && dev->accel.sy) { + if ((dev->accel.cmd & 0x04) && dev->accel.sy) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { + } else if (!(dev->accel.cmd & 0x04)) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); } } @@ -1844,9 +1523,8 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat else cpu_dat >>= 8; - if (dev->accel.sy == 0) { + if (dev->accel.sy == 0) break; - } if (dev->accel.cmd & 0x40) { if (dev->accel.cmd & 0x80) @@ -1882,7 +1560,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } } else { while (count-- && (dev->accel.sy >= 0)) { - if ((dev->accel.cx) >= dev->accel.clip_left && (dev->accel.cx) <= clip_r && (dev->accel.cy) >= dev->accel.clip_top && (dev->accel.cy) <= clip_b) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) { mix_dat = mix_mask; /* Mix data = forced to foreground register. */ } else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) { @@ -1917,13 +1598,19 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { 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 & 4) && dev->accel.sy) { + if ((dev->accel.cmd & 0x04) && dev->accel.sy) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { + } else if (!(dev->accel.cmd & 0x04)) { WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); } } @@ -1981,79 +1668,60 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat case 3: /*Rectangle fill (Y direction)*/ case 4: /*Rectangle fill (Y direction using nibbles)*/ if (!cpu_input) { - dev->accel.x_count = 0; - dev->accel.xx_count = 0; - dev->accel.odd_out = 0; - dev->accel.odd_in = 0; - dev->accel.input = 0; - dev->accel.output = 0; - dev->accel.newdest_out = 0; - dev->accel.newdest_in = 0; - - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - dev->accel.sy = dev->accel.multifunc[0] & 0x7ff; + dev->accel.x_count = 0; + dev->accel.output = 0; + dev->accel.input = 0; + dev->accel.input2 = 0; + dev->accel.odd_in = 0; dev->accel.cx = dev->accel.cur_x; if (dev->accel.cur_x >= 0x600) dev->accel.cx |= ~0x5ff; + dev->accel.cy = dev->accel.cur_y; if (dev->accel.cur_y >= 0x600) dev->accel.cy |= ~0x5ff; - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) + dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; + dev->accel.sy = dev->accel.multifunc[0] & 0x7ff; + + if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + else if (dev->bpp) + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); else - dev->accel.dest = dev->accel.cy * dev->pitch; + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); if (cmd == 4) - dev->accel.cmd |= 2; + dev->accel.cmd |= 0x02; else if (cmd == 3) - dev->accel.cmd &= ~2; + dev->accel.cmd &= ~0x02; if (ibm8514_cpu_src(svga)) { - if (dev->accel.cmd & 2) { + if (dev->accel.cmd & 0x02) { if (!(dev->accel.cmd & 0x1000)) { - if (!(dev->accel.cmd & 8)) { - dev->accel.sx += and3; - dev->accel.nibbleset = (uint8_t *) calloc(1, (dev->accel.sx >> 3) + 1); - dev->accel.writemono = (uint8_t *) calloc(1, (dev->accel.sx >> 3) + 1); - dev->accel.sys_cnt = (dev->accel.sx >> 3) + 1; + if (dev->accel.cmd & 0x08) { + dev->accel.x_count = dev->accel.cx - (and3 + 3); + dev->accel.sx += (and3 + 3); } else { - if (and3 == 1) { - dev->accel.sx += 4; + dev->accel.x_count = dev->accel.cx; + if (and3) { if (dev->accel.cmd & 0x20) - dev->accel.cx += 4; + dev->accel.x_count -= and3; else - dev->accel.cx -= 4; - } else if (and3 == 2) { - dev->accel.sx += 5; - if (dev->accel.cmd & 0x20) - dev->accel.cx += 5; - else - dev->accel.cx -= 5; - } else if (and3 == 3) { - dev->accel.sx += 6; - if (dev->accel.cmd & 0x20) - dev->accel.cx += 6; - else - dev->accel.cx -= 6; - } else { - dev->accel.sx += 3; - if (dev->accel.cmd & 0x20) - dev->accel.cx += 3; - else - dev->accel.cx -= 3; + dev->accel.x_count += and3; + + dev->accel.sx += 8; } } } } else { - if (!(dev->accel.cmd & 0x40) && (frgd_mix == 2) && (bkgd_mix == 2) && (pixcntl == 0) && (cmd == 2)) { - if (!(dev->accel.sx & 1)) { - dev->accel.output = 1; - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) - dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch); - else - dev->accel.newdest_out = (dev->accel.cy + 1) * dev->pitch; + if (dev->accel.cmd & 0x1000) { + if (dev->accel.cmd & 0x200) { + if (dev->accel.cmd & 0x04) { + dev->accel.output = 1; + dev->accel.sx -= 2; + } } } } @@ -2061,35 +1729,35 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat dev->data_available2 = 0; return; /*Wait for data from CPU*/ } else if (ibm8514_cpu_dest(svga)) { - if (!(dev->accel.cmd & 2) && (frgd_mix == 2) && (pixcntl == 0) && (cmd == 2)) { - if (!(dev->accel.sx & 1)) { - dev->accel.input = 1; - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) - dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch); - else - dev->accel.newdest_in = (dev->accel.cy + 1) * dev->pitch; - } - } else if (dev->accel.cmd & 2) { - if (dev->accel.cmd & 8) { - dev->accel.sx += and3; - dev->accel.nibbleset = (uint8_t *) calloc(1, (dev->accel.sx >> 3) + 1); - dev->accel.writemono = (uint8_t *) calloc(1, (dev->accel.sx >> 3) + 1); - dev->accel.sys_cnt = (dev->accel.sx >> 3) + 1; + if (!(dev->accel.cmd & 0x02)) { + if (dev->accel.cmd & 0x1000) { + if (dev->accel.cmd & 0x200) { + if (!(dev->accel.sx & 1) && !(dev->accel.cmd & 0x04)) { + dev->accel.input = 1; + } else if (dev->accel.cmd & 0x04) { + dev->accel.input2 = 1; + dev->accel.sx -= 2; + } + } } } + ibm8514_log("INPUT=%d.\n", dev->accel.input); dev->data_available = 1; dev->data_available2 = 1; return; /*Wait for data from CPU*/ } } - if (dev->accel.cmd & 2) { + ibm8514_log("Rectangle %d: full=%04x, odd=%d, c(%d,%d), frgdmix=%d, bkgdmix=%d, xcount=%d, and3=%d, len(%d,%d), CURX=%d, Width=%d, pixcntl=%d, mix_dat=%08x, count=%d, cpu_data=%08x, cpu_input=%d.\n", cmd, dev->accel.cmd, dev->accel.input, dev->accel.cx, dev->accel.cy, frgd_mix, bkgd_mix, dev->accel.x_count, and3, dev->accel.sx, dev->accel.sy, dev->accel.cur_x, dev->accel.maj_axis_pcnt, pixcntl, mix_dat, count, cpu_dat, cpu_input); + + if (dev->accel.cmd & 0x08) { /*Vectored Rectangle*/ if (cpu_input) { -rect_fill_pix: - if ((dev->accel.cmd & 8) && ibm8514_cpu_src(svga)) { - dev->accel.xx_count++; + if (ibm8514_cpu_src(svga)) { while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -2110,77 +1778,27 @@ rect_fill_pix: READ(dev->accel.dest + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { 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 (and3 == 1) { - if (dev->accel.xx_count >= 2) { - if ((dev->accel.cmd & 4) && dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } else if (and3 == 2) { - if (dev->accel.xx_count == 2) { - if (count <= 2) { - if ((dev->accel.cmd & 4) && dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } else if (dev->accel.xx_count >= 3) { - if ((dev->accel.cmd & 4) && dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } else if (and3 == 3) { - if (dev->accel.xx_count == 2) { - if (count <= 1) { - if ((dev->accel.cmd & 4) && dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } else if (dev->accel.xx_count >= 3) { - if ((dev->accel.cmd & 4) && dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } else { - if (dev->accel.xx_count == 1) { - if (!count) { - if ((dev->accel.cmd & 4) && dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } else if (dev->accel.xx_count >= 2) { - if ((dev->accel.cmd & 4) && dev->accel.sx) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } else if (!(dev->accel.cmd & 4)) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } + if ((dev->accel.cmd & 0x02) && (dev->accel.x_count != dev->accel.cx)) + goto skip_vector_rect_write; + + if ((dev->accel.cmd & 0x04) && dev->accel.sx) { + WRITE(dev->accel.dest + dev->accel.cx, dest_dat); + } else if (!(dev->accel.cmd & 0x04)) { + WRITE(dev->accel.dest + dev->accel.cx, dest_dat); } } } - mix_dat <<= 1; - mix_dat |= 1; - if (dev->bpp) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - switch (dev->accel.cmd & 0xe0) { case 0x00: dev->accel.cx++; @@ -2205,17 +1823,42 @@ rect_fill_pix: break; } +skip_vector_rect_write: + switch (dev->accel.cmd & 0xe0) { + case 0x00: + dev->accel.x_count++; + break; + case 0x20: + dev->accel.x_count++; + break; + case 0x60: + dev->accel.x_count--; + break; + case 0x80: + dev->accel.x_count--; + break; + case 0xa0: + dev->accel.x_count--; + break; + case 0xe0: + dev->accel.x_count++; + break; + + default: + break; + } + + if (dev->bpp) + cpu_dat >>= 16; + else + cpu_dat >>= 8; + + mix_dat <<= 1; + mix_dat |= 1; + dev->accel.sx--; if (dev->accel.sx < 0) { dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - if (and3 == 1) - dev->accel.sx += 4; - else if (and3 == 2) - dev->accel.sx += 5; - else if (and3 == 3) - dev->accel.sx += 6; - else - dev->accel.sx += 3; if (dev->accel.cmd & 0x20) dev->accel.cx -= (dev->accel.sx + 1); @@ -2246,34 +1889,62 @@ rect_fill_pix: break; } - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) + if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + else if (dev->bpp) + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); else - dev->accel.dest = dev->accel.cy * dev->pitch; + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); dev->accel.sy--; + dev->accel.x_count = 0; return; } } - break; - } - if (count < 8) { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { - if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) { - mix_dat = mix_mask; /* Mix data = forced to foreground register. */ - } else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) { - /* Mix data = current video memory value. */ - READ(dev->accel.dest + dev->accel.cx, mix_dat); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? mix_mask : 0; - } + } else + ibm8514_log("Vectored Rectangle with destination reads (TODO).\n"); + } else + ibm8514_log("Vectored Rectangle with normal processing (TODO).\n"); + } else { /*Normal Rectangle*/ + if (cpu_input) { + while (count-- && (dev->accel.sy >= 0)) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { + if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) { + mix_dat = mix_mask; /* Mix data = forced to foreground register. */ + } else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) { + /* Mix data = current video memory value. */ + READ(dev->accel.dest + dev->accel.cx, mix_dat); + mix_dat = ((mix_dat & rd_mask) == rd_mask); + mix_dat = mix_dat ? mix_mask : 0; + } - if (ibm8514_cpu_dest(svga)) { - READ(dev->accel.dest + dev->accel.cx, src_dat); - if (pixcntl == 3) - src_dat = ((src_dat & rd_mask) == rd_mask); - } else + if (ibm8514_cpu_dest(svga)) { + READ(dev->accel.dest + dev->accel.cx, src_dat); + if (pixcntl == 3) + src_dat = ((src_dat & rd_mask) == rd_mask); + } else { + if (dev->accel.cmd & 0x02) { + switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + src_dat = 0; + break; + + default: + break; + } + } else { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -2291,418 +1962,114 @@ rect_fill_pix: default: break; } + } + } - READ(dev->accel.dest + dev->accel.cx, dest_dat); + READ(dev->accel.dest + dev->accel.cx, dest_dat); + + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { + old_dest_dat = dest_dat; + if (dev->accel.cmd & 0x02) { + MIX(mix_dat & 0x01, dest_dat, src_dat); + if ((dev->accel.x_count != dev->accel.cx) && !(dev->accel.cmd & 0x1000) && and3) + goto skip_nibble_rect_write; - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - 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.cx, dest_dat); - } - } - mix_dat <<= 1; - mix_dat |= 1; - if (dev->bpp) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (dev->accel.cmd & 0x20) - dev->accel.cx++; - else - dev->accel.cx--; - - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 2) { - dev->accel.sx += (dev->accel.cur_x & 3); - } - - if (dev->accel.cmd & 0x20) { - dev->accel.cx -= (dev->accel.sx) + 1; - } else - dev->accel.cx += (dev->accel.sx) + 1; - - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = dev->accel.cy * dev->pitch; - - dev->accel.sy--; - return; - } - } - } else { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { - if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) { - mix_dat = 1; /* Mix data = forced to foreground register. */ - } else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) { - /* Mix data = current video memory value. */ - READ(dev->accel.dest + dev->accel.cx, mix_dat); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? 1 : 0; - } - - if (ibm8514_cpu_dest(svga)) { - READ(dev->accel.dest + dev->accel.cx, src_dat); - if (pixcntl == 3) - src_dat = ((src_dat & rd_mask) == rd_mask); - } else { - switch ((mix_dat & 1) ? frgd_mix : bkgd_mix) { - case 0: - src_dat = bkgd_color; - break; - case 1: - src_dat = frgd_color; - break; - case 2: - src_dat = cpu_dat; - break; - case 3: - src_dat = 0; - break; - - default: - break; - } - } - - READ(dev->accel.dest + dev->accel.cx, dest_dat); - - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - old_dest_dat = dest_dat; - MIX(mix_dat & 1, dest_dat, src_dat); - dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - mix_dat >>= 1; - if (dev->bpp) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (dev->accel.cmd & 0x20) - dev->accel.cx++; - else - dev->accel.cx--; - - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 2) { - if (!(dev->accel.cmd & 0x1000)) - dev->accel.sx += (dev->accel.cur_x & 3); - } - - if (dev->accel.cmd & 0x20) - dev->accel.cx -= (dev->accel.sx) + 1; - else - dev->accel.cx += (dev->accel.sx) + 1; - - if (dev->accel.cmd & 2) { - if (dev->accel.cmd & 0x1000) { - dev->accel.cx = dev->accel.cur_x; - if (dev->accel.cur_x >= 0x600) - dev->accel.cx |= ~0x5ff; - } - } - - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = dev->accel.cy * dev->pitch; - - dev->accel.sy--; - return; - } - } - } - } else { - goto rect_fill; - } - } else { - if (cpu_input) { - if (pixcntl == 2) { - goto rect_fill_pix; - } else { - if (dev->accel.input && !dev->accel.output) { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { - mix_dat = mix_mask; /* Mix data = forced to foreground register. */ - if (!dev->accel.odd_in && !dev->accel.sx) { - READ(dev->accel.newdest_in + dev->accel.cur_x, src_dat); - READ(dev->accel.newdest_in + dev->accel.cur_x, dest_dat); - } else { - READ(dev->accel.dest + dev->accel.cx, src_dat); - READ(dev->accel.dest + dev->accel.cx, dest_dat); - } - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - 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.odd_in && !dev->accel.sx) { - WRITE(dev->accel.newdest_in + dev->accel.cur_x, dest_dat); - } else { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } - - mix_dat <<= 1; - mix_dat |= 1; - - if (dev->accel.cmd & 0x20) - dev->accel.cx++; - else - dev->accel.cx--; - - dev->accel.sx--; - if (dev->accel.odd_in) { - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - dev->accel.odd_in = 0; - dev->accel.cx = dev->accel.cur_x; - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) { - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch); - } else { - dev->accel.dest = dev->accel.cy * dev->pitch; - dev->accel.newdest_in = (dev->accel.cy + 1) * dev->pitch; - } - dev->accel.sy--; - return; + if ((dev->accel.cmd & 0x04) && dev->accel.sx) { + WRITE(dev->accel.dest + dev->accel.cx, dest_dat); + } else if (!(dev->accel.cmd & 0x04)) { + WRITE(dev->accel.dest + dev->accel.cx, dest_dat); } } else { - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - dev->accel.sx--; - dev->accel.cx = dev->accel.cur_x; - dev->accel.odd_in = 1; - if (dev->accel.cmd & 0x20) - dev->accel.cx++; - else - dev->accel.cx--; - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) { - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.newdest_in = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch); - } else { - dev->accel.dest = dev->accel.cy * dev->pitch; - dev->accel.newdest_in = (dev->accel.cy + 1) * dev->pitch; - } - dev->accel.sy--; - return; - } - } - } - } else if (dev->accel.output && !dev->accel.input) { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { - src_dat = cpu_dat; - if (!dev->accel.odd_out && !dev->accel.sx) { - READ(dev->accel.newdest_out + dev->accel.cur_x, dest_dat); - } else { - READ(dev->accel.dest + dev->accel.cx, dest_dat); - } - - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - 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.odd_out && !dev->accel.sx) { - WRITE(dev->accel.newdest_out + dev->accel.cur_x, dest_dat); - } else { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } - - mix_dat <<= 1; - mix_dat |= 1; - if (dev->bpp) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (dev->accel.cmd & 0x20) - dev->accel.cx++; - else - dev->accel.cx--; - - dev->accel.sx--; - if (dev->accel.odd_out) { - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - dev->accel.odd_out = 0; - dev->accel.cx = dev->accel.cur_x; - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) { - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch); - } else { - dev->accel.dest = dev->accel.cy * dev->pitch; - dev->accel.newdest_out = (dev->accel.cy + 1) * dev->pitch; - } - dev->accel.sy--; - return; - } - } else { - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - dev->accel.odd_out = 1; - dev->accel.sx--; - dev->accel.cx = dev->accel.cur_x; - if (dev->accel.cmd & 0x20) - dev->accel.cx++; - else - dev->accel.cx--; - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) { - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - dev->accel.newdest_out = (dev->accel.ge_offset << 2) + ((dev->accel.cy + 1) * dev->pitch); - } else { - dev->accel.dest = dev->accel.cy * dev->pitch; - dev->accel.newdest_out = (dev->accel.cy + 1) * dev->pitch; - } - dev->accel.sy--; - return; - } - } - } - } else { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { - if (ibm8514_cpu_dest(svga) && (pixcntl == 0)) { - mix_dat = mix_mask; /* Mix data = forced to foreground register. */ - } else if (ibm8514_cpu_dest(svga) && (pixcntl == 3)) { - /* Mix data = current video memory value. */ - READ(dev->accel.dest + dev->accel.cx, mix_dat); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? mix_mask : 0; - } - - if (ibm8514_cpu_dest(svga)) { - READ(dev->accel.dest + dev->accel.cx, src_dat); + if (ibm8514_cpu_dest(svga) && (cmd == 2)) { if (pixcntl == 3) { - src_dat = ((src_dat & rd_mask) == rd_mask); - } - } else - 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 = cpu_dat; - break; - case 3: - src_dat = 0; - break; - - default: - break; - } - - READ(dev->accel.dest + dev->accel.cx, dest_dat); - - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - old_dest_dat = dest_dat; - if (ibm8514_cpu_dest(svga)) { - if (pixcntl == 3) { - MIX(mix_dat & mix_mask, dest_dat, src_dat); - } - } else { MIX(mix_dat & mix_mask, dest_dat, src_dat); } - dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); + } else { + 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) && dev->accel.sx) { + WRITE(dev->accel.dest + dev->accel.cx, dest_dat); + } else if (!(dev->accel.cmd & 0x04)) { WRITE(dev->accel.dest + dev->accel.cx, dest_dat); } } - - mix_dat <<= 1; - mix_dat |= 1; - if (dev->bpp) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (dev->accel.cmd & 0x20) - dev->accel.cx++; - else - dev->accel.cx--; - - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 0x20) { - dev->accel.cx -= (dev->accel.sx) + 1; - } else - dev->accel.cx += (dev->accel.sx) + 1; - - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = dev->accel.cy * dev->pitch; - - dev->accel.sy--; - return; - } } } + if (dev->accel.cmd & 0x20) + dev->accel.cx++; + else + dev->accel.cx--; + +skip_nibble_rect_write: + if (dev->accel.cmd & 0x20) + dev->accel.x_count++; + else + dev->accel.x_count--; + + if (dev->accel.cmd & 0x02) + mix_dat >>= 1; + else { + mix_dat <<= 1; + mix_dat |= 1; + } + + if (dev->bpp) + cpu_dat >>= 16; + else + cpu_dat >>= 8; + + dev->accel.sx--; + if (dev->accel.sx < 0) { + dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; + if (dev->accel.input) + dev->accel.odd_in = 1; + if (dev->accel.output || dev->accel.input2) + dev->accel.sx -= 2; + + if (dev->accel.cmd & 0x20) + dev->accel.cx -= (dev->accel.sx + 1); + else + dev->accel.cx += (dev->accel.sx + 1); + + if (dev->accel.cmd & 0x80) + dev->accel.cy++; + else + dev->accel.cy--; + + if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + else if (dev->bpp) + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); + else + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + + dev->accel.sy--; + dev->accel.x_count = 0; + return; + } } } else { -rect_fill: if (pixcntl == 1) { if (dev->accel.cmd & 0x40) { - count = dev->accel.maj_axis_pcnt + 1; + count = (dev->accel.maj_axis_pcnt & 0x7ff) + 1; dev->accel.temp_cnt = 8; while (count-- && dev->accel.sy >= 0) { - if (dev->accel.temp_cnt == 0) { + if (!dev->accel.temp_cnt) { mix_dat >>= 8; dev->accel.temp_cnt = 8; } - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -2711,8 +2078,6 @@ rect_fill: src_dat = frgd_color; break; case 2: - src_dat = 0; - break; case 3: src_dat = 0; break; @@ -2723,11 +2088,16 @@ rect_fill: READ(dev->accel.dest + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { 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.cx, dest_dat); } } @@ -2748,36 +2118,38 @@ rect_fill: dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; if (dev->accel.cmd & 0x20) { - dev->accel.cx -= (dev->accel.sx) + 1; + dev->accel.cx -= (dev->accel.sx + 1); } else - dev->accel.cx += (dev->accel.sx) + 1; + dev->accel.cx += (dev->accel.sx + 1); if (dev->accel.cmd & 0x80) dev->accel.cy++; else dev->accel.cy--; - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) + if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + else if (dev->bpp) + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); else - dev->accel.dest = dev->accel.cy * dev->pitch; + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); dev->accel.sy--; - - dev->accel.cur_x = dev->accel.cx; - dev->accel.cur_y = dev->accel.cy; return; } } } else { dev->accel.temp_cnt = 8; - while (count-- && dev->accel.sy >= 0) { + while (count-- && (dev->accel.sy >= 0)) { if (!dev->accel.temp_cnt) { dev->accel.temp_cnt = 8; - mix_dat = old_mix_dat; + mix_dat = old_mix_dat; } - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { - switch ((mix_dat & 1) ? frgd_mix : bkgd_mix) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { + switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; break; @@ -2785,8 +2157,6 @@ rect_fill: src_dat = frgd_color; break; case 2: - src_dat = 0; - break; case 3: src_dat = 0; break; @@ -2797,11 +2167,16 @@ rect_fill: READ(dev->accel.dest + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { old_dest_dat = dest_dat; - MIX(mix_dat & 1, dest_dat, src_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.cx, dest_dat); } } @@ -2819,167 +2194,193 @@ rect_fill: dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; if (dev->accel.cmd & 0x20) { - dev->accel.cx -= (dev->accel.sx) + 1; + dev->accel.cx -= (dev->accel.sx + 1); } else - dev->accel.cx += (dev->accel.sx) + 1; + dev->accel.cx += (dev->accel.sx + 1); if (dev->accel.cmd & 0x80) dev->accel.cy++; else dev->accel.cy--; - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) + if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + else if (dev->bpp) + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); else - dev->accel.dest = dev->accel.cy * dev->pitch; + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); dev->accel.sy--; if (dev->accel.sy < 0) { - dev->accel.cur_x = dev->accel.cx; - dev->accel.cur_y = dev->accel.cy; + if (cmd != 4) { + dev->accel.cur_x = dev->accel.cx; + dev->accel.cur_y = dev->accel.cy; + } return; } } } } - } else { - if ((dev->accel.multifunc[0x0a] & 6) == 4) { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { - READ(dev->accel.dest + dev->accel.cx, mix_dat); - if ((mix_dat & rd_mask_polygon) == rd_mask_polygon) - dev->accel.fill_state = !dev->accel.fill_state; + } else if ((dev->accel.multifunc[0x0a] & 0x06) == 0x04) { /*Polygon Draw Type A*/ + while (count-- && (dev->accel.sy >= 0)) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { + READ(dev->accel.dest + dev->accel.cx, mix_dat); + if ((mix_dat & rd_mask_polygon) == rd_mask_polygon) + dev->accel.fill_state ^= 1; - READ(dev->accel.dest + dev->accel.cx, dest_dat); - old_dest_dat = dest_dat; - if (dev->accel.fill_state) { - if (!(rd_mask_polygon & 1) && (wrt_mask & 1)) { - MIX(mix_dat ^ rd_mask_polygon, dest_dat, mix_dat); - ibm8514_log("Filling c(%d,%d) without bit 0 of rdmask=%02x, wrtmask=%02x, mixdat=%02x, dest=%02x, old=%02x.\n", dev->accel.cx, dev->accel.cy, rd_mask_polygon, wrt_mask, mix_dat, dest_dat, old_dest_dat); - dest_dat &= ~rd_mask_polygon; - } else if ((rd_mask_polygon & 1) && (wrt_mask & 1)) { - ibm8514_log("Filling c(%d,%d) with bit 0 of rdmask=%02x, wrtmask=%02x.\n", dev->accel.cx, dev->accel.cy, rd_mask_polygon, wrt_mask); - dest_dat &= ~(rd_mask_polygon & wrt_mask); - } - } else { - if (!(rd_mask_polygon & 1) && (wrt_mask & 1)) - dest_dat &= ~rd_mask_polygon; - else if ((rd_mask_polygon & 1) && (wrt_mask & 1)) - dest_dat &= ~(rd_mask_polygon & wrt_mask); + READ(dev->accel.dest + dev->accel.cx, dest_dat); + old_dest_dat = dest_dat; + if (dev->accel.fill_state) { + if (!(rd_mask_polygon & 0x01) && (wrt_mask & 0x01)) { + MIX(mix_dat ^ rd_mask_polygon, dest_dat, mix_dat); + ibm8514_log("Filling c(%d,%d) without bit 0 of rdmask=%02x, wrtmask=%02x, mixdat=%02x, dest=%02x, old=%02x.\n", dev->accel.cx, dev->accel.cy, rd_mask_polygon, wrt_mask, mix_dat, dest_dat, old_dest_dat); + dest_dat &= ~rd_mask_polygon; + } else if ((rd_mask_polygon & 0x01) && (wrt_mask & 0x01)) { + ibm8514_log("Filling c(%d,%d) with bit 0 of rdmask=%02x, wrtmask=%02x.\n", dev->accel.cx, dev->accel.cy, rd_mask_polygon, wrt_mask); + dest_dat &= ~(rd_mask_polygon & wrt_mask); } + } else { + if (!(rd_mask_polygon & 0x01) && (wrt_mask & 0x01)) + dest_dat &= ~rd_mask_polygon; + else if ((rd_mask_polygon & 0x01) && (wrt_mask & 0x01)) + dest_dat &= ~(rd_mask_polygon & wrt_mask); + } + dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); + + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { + ibm8514_log("Results c(%d,%d):rdmask=%02x, wrtmask=%02x, mix=%02x, destdat=%02x, nowrite=%d.\n", dev->accel.cx, dev->accel.cy, rd_mask_polygon, wrt_mask, mix_dat, dest_dat, dev->accel.cx_back); + WRITE(dev->accel.dest + dev->accel.cx, dest_dat); + } + } + + if (dev->accel.cmd & 0x20) + dev->accel.cx++; + else + dev->accel.cx--; + + dev->accel.sx--; + if (dev->accel.sx < 0) { + dev->accel.fill_state = 0; + dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; + + if (dev->accel.cmd & 0x20) + dev->accel.cx -= (dev->accel.sx + 1); + else + dev->accel.cx += (dev->accel.sx + 1); + + if (dev->accel.cmd & 0x80) + dev->accel.cy++; + else + dev->accel.cy--; + + if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + else if (dev->bpp) + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); + else + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + + dev->accel.sy--; + + if (dev->accel.sy < 0) { + ibm8514_log(".\n"); + return; + } + } + } + } else { + ibm8514_log("Polygon Draw Type=%02x, CL=%d, CR=%d.\n", dev->accel.multifunc[0x0a] & 0x06, clip_l, clip_r); + while (count-- && dev->accel.sy >= 0) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { + switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + if (!bkgd_mix && (dev->accel.cmd & 0x40) && ((dev->accel.frgd_mix & 0x1f) == 7) && ((dev->accel.bkgd_mix & 0x1f) == 3) && !dev->bpp && (bkgd_color == 0x00)) /*For some reason, the September 1992 Mach8/32 drivers for Win3.x don't set the background colors properly.*/ + src_dat = frgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + case 3: + src_dat = 0; + break; + + default: + break; + } + + READ(dev->accel.dest + dev->accel.cx, dest_dat); + + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { + 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 ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - ibm8514_log("Results c(%d,%d):rdmask=%02x, wrtmask=%02x, mix=%02x, destdat=%02x, nowrite=%d.\n", dev->accel.cx, dev->accel.cy, rd_mask_polygon, wrt_mask, mix_dat, dest_dat, dev->accel.cx_back); + if (dev->accel.cmd & 0x10) { WRITE(dev->accel.dest + dev->accel.cx, dest_dat); } } + } else + ibm8514_log("Outside clipping.\n"); + + mix_dat <<= 1; + mix_dat |= 1; + + if (dev->accel.cmd & 0x20) + dev->accel.cx++; + else + dev->accel.cx--; + + dev->accel.sx--; + if (dev->accel.sx < 0) { + dev->accel.fill_state = 0; + dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; if (dev->accel.cmd & 0x20) - dev->accel.cx++; + dev->accel.cx -= (dev->accel.sx + 1); else - dev->accel.cx--; + dev->accel.cx += (dev->accel.sx + 1); - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.fill_state = 0; - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 0x20) - dev->accel.cx -= (dev->accel.sx) + 1; - else - dev->accel.cx += (dev->accel.sx) + 1; - - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - dev->accel.dest = dev->accel.cy * dev->pitch; - - dev->accel.sy--; - - if (dev->accel.sy < 0) { - ibm8514_log(".\n"); - return; - } - } - } - } else { - ibm8514_log("Rectangle Fill Normal CMD=%04x, CURRENT(%d,%d), sx=%d, FR(%02x), linedraw=%d.\n", dev->accel.cmd, dev->accel.cx, dev->accel.cy, dev->accel.sx, frgd_color, dev->accel.linedraw); - while (count-- && dev->accel.sy >= 0) { - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { - switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { - case 0: - src_dat = bkgd_color; - if (!bkgd_mix && (dev->accel.cmd & 0x40) && ((dev->accel.frgd_mix & 0x1f) == 7) && ((dev->accel.bkgd_mix & 0x1f) == 3) && !dev->bpp && (bkgd_color == 0x00)) /*For some reason, the September 1992 Mach8/32 drivers for Win3.x don't set the background colors properly.*/ - src_dat = frgd_color; - break; - case 1: - src_dat = frgd_color; - break; - case 2: - src_dat = 0; - break; - case 3: - src_dat = 0; - break; - - default: - break; - } - - - READ(dev->accel.dest + dev->accel.cx, dest_dat); - - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - 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 & 0x10) { - WRITE(dev->accel.dest + dev->accel.cx, dest_dat); - } - } - } - - mix_dat <<= 1; - mix_dat |= 1; - - if (dev->accel.cmd & 0x20) - dev->accel.cx++; + if (dev->accel.cmd & 0x80) + dev->accel.cy++; else - dev->accel.cx--; + dev->accel.cy--; - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.fill_state = 0; - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; + if ((dev->accel_bpp == 24) || (dev->accel_bpp <= 8)) + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); + else if (dev->bpp) + dev->accel.dest = (dev->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); + else + dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - if (dev->accel.cmd & 0x20) - dev->accel.cx -= (dev->accel.sx) + 1; - else - dev->accel.cx += (dev->accel.sx) + 1; - - if (dev->accel.cmd & 0x80) - dev->accel.cy++; - else - dev->accel.cy--; - - if (((dev->local & 0xff) >= 0x02) && dev->accel.ge_offset && ((dev->accel_bpp == 24) || (dev->accel_bpp == 8))) - dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); - else - dev->accel.dest = dev->accel.cy * dev->pitch; - - dev->accel.sy--; - - if (dev->accel.sy < 0) { + dev->accel.sy--; + if (dev->accel.sy < 0) { + if (cmd != 4) { dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; - return; } + return; } } } @@ -2990,15 +2391,16 @@ rect_fill: case 5: /*Draw Polygon Boundary Line*/ { if (!cpu_input) { + dev->accel.sy = dev->accel.maj_axis_pcnt_no_limit; + dev->accel.cx = dev->accel.cur_x; if (dev->accel.cur_x >= 0x600) dev->accel.cx |= ~0x5ff; + dev->accel.cy = dev->accel.cur_y; if (dev->accel.cur_y >= 0x600) dev->accel.cy |= ~0x5ff; - dev->accel.sy = dev->accel.maj_axis_pcnt_no_limit; - if (dev->accel.cmd & 0x80) dev->accel.oldcy = dev->accel.cy + 1; else @@ -3017,14 +2419,15 @@ rect_fill: } } - if (dev->accel.cmd & 8) { + if (dev->accel.cmd & 0x08) { /*Vectored Boundary Line*/ while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx < 0) - dev->accel.cx = 0; - if (dev->accel.cy < 0) - dev->accel.cy = 0; + if (dev->accel.cx < clip_l) + dev->accel.cx = clip_l; - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -3046,16 +2449,22 @@ rect_fill: READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { 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 & 0x10) { - if (dev->accel.sy && (dev->accel.cmd & 4)) { + if (dev->accel.sy && (dev->accel.cmd & 0x04)) { if (dev->accel.oldcy != dev->accel.cy) { WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat); } - } else if (!(dev->accel.cmd & 4)) { + } else if (!(dev->accel.cmd & 0x04)) { if (dev->accel.oldcy != dev->accel.cy) { WRITE((dev->accel.cy * dev->pitch) + (dev->accel.cx), dest_dat); } @@ -3116,12 +2525,15 @@ rect_fill: dev->accel.sy--; } - } else { + } else { /*Vectored Bresenham*/ while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.cx < dev->accel.clip_left) - dev->accel.cx = dev->accel.clip_left; + if (dev->accel.cx < clip_l) + dev->accel.cx = clip_l; - if (dev->accel.cx >= dev->accel.clip_left && dev->accel.cx <= clip_r && dev->accel.cy >= dev->accel.clip_top && dev->accel.cy <= clip_b) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { case 0: src_dat = bkgd_color; @@ -3142,7 +2554,13 @@ rect_fill: READ((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { 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); @@ -3209,38 +2627,50 @@ rect_fill: if (!cpu_input) /*!cpu_input is trigger to start operation*/ { dev->accel.x_count = 0; - dev->accel.output = 0; - - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - dev->accel.sy = dev->accel.multifunc[0] & 0x7ff; dev->accel.dx = dev->accel.destx; - dev->accel.dy = dev->accel.desty; - 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; - dev->accel.cy = dev->accel.cur_y; - if (dev->accel.cur_x >= 0x600) dev->accel.cx |= ~0x5ff; + + dev->accel.cy = dev->accel.cur_y; if (dev->accel.cur_y >= 0x600) dev->accel.cy |= ~0x5ff; - dev->accel.src = dev->accel.cy * dev->pitch; - dev->accel.dest = dev->accel.dy * dev->pitch; + dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; + dev->accel.sy = dev->accel.multifunc[0] & 0x7ff; + + 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 * 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 * 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 * dev->pitch); + } dev->accel.fill_state = 0; if (ibm8514_cpu_src(svga)) { - if (dev->accel.cmd & 2) { + if (dev->accel.cmd & 0x02) { if (!(dev->accel.cmd & 0x1000)) { - dev->accel.sx += (dev->accel.cur_x & 3); - dev->accel.nibbleset = (uint8_t *) calloc(1, (dev->accel.sx >> 3) + 1); - dev->accel.writemono = (uint8_t *) calloc(1, (dev->accel.sx >> 3) + 1); - dev->accel.sys_cnt = (dev->accel.sx >> 3) + 1; + dev->accel.x_count = dev->accel.cx; + if (and3) { + if (dev->accel.cmd & 0x20) + dev->accel.x_count -= and3; + else + dev->accel.x_count += and3; + + dev->accel.sx += 8; + } } } dev->data_available = 0; @@ -3253,495 +2683,389 @@ rect_fill: } } - if (dev->accel.cmd & 2) { - if (cpu_input) { -bitblt_pix: - if (count < 8) { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.dx >= dev->accel.clip_left && dev->accel.dx <= clip_r && dev->accel.dy >= dev->accel.clip_top && 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); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? mix_mask : 0; - } else if (dev->accel.cmd & 0x10) { - READ(dev->accel.src + dev->accel.cx, mix_dat); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? mix_mask : 0; - } - } - 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 = cpu_dat; - break; - case 3: - READ(dev->accel.src + dev->accel.cx, src_dat); - if (pixcntl == 3) { - if (dev->accel.cmd & 0x10) { - src_dat = ((src_dat & rd_mask) == rd_mask); - } - } - break; - - default: - break; - } - - READ(dev->accel.dest + dev->accel.dx, dest_dat); - - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - 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, dest_dat); - } - } - - mix_dat <<= 1; - mix_dat |= 1; - if (dev->bpp) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (dev->accel.cmd & 0x20) { - dev->accel.dx++; - dev->accel.cx++; - } else { - dev->accel.dx--; - dev->accel.cx--; - } - - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 2) { - dev->accel.sx += (dev->accel.cur_x & 3); - } - - if (dev->accel.cmd & 0x20) { - dev->accel.dx -= (dev->accel.sx) + 1; - dev->accel.cx -= (dev->accel.sx) + 1; - } else { - dev->accel.dx += (dev->accel.sx) + 1; - dev->accel.cx += (dev->accel.sx) + 1; - } - - if (dev->accel.cmd & 0x80) { - dev->accel.dy++; - dev->accel.cy++; - } else { - dev->accel.dy--; - dev->accel.cy--; - } - - dev->accel.src = dev->accel.cy * dev->pitch; - dev->accel.dest = dev->accel.dy * dev->pitch; - dev->accel.sy--; - return; + ibm8514_log("BitBLT: full=%04x, odd=%d, c(%d,%d), d(%d,%d), xcount=%d, and3=%d, len(%d,%d), CURX=%d, Width=%d, pixcntl=%d, mix_dat=%08x, count=%d, cpu_data=%08x, cpu_input=%d.\n", dev->accel.cmd, dev->accel.input, dev->accel.cx, dev->accel.cy, dev->accel.dx, dev->accel.dy, dev->accel.x_count, and3, dev->accel.sx, dev->accel.sy, dev->accel.cur_x, dev->accel.maj_axis_pcnt, pixcntl, mix_dat, count, cpu_dat, cpu_input); + if (cpu_input) { + while (count-- && (dev->accel.sy >= 0)) { + 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); + mix_dat = ((mix_dat & rd_mask) == rd_mask); + if (dev->accel.cmd & 0x02) + mix_dat = mix_dat ? 0x01 : 0x00; + else + mix_dat = mix_dat ? mix_mask : 0x00; + } else if (dev->accel.cmd & 0x10) { + READ(dev->accel.src + dev->accel.cx, mix_dat); + mix_dat = ((mix_dat & rd_mask) == rd_mask); + if (dev->accel.cmd & 0x02) + mix_dat = mix_dat ? 0x01 : 0x00; + else + mix_dat = mix_dat ? mix_mask : 0x00; } } - } else { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.dx >= dev->accel.clip_left && dev->accel.dx <= clip_r && dev->accel.dy >= dev->accel.clip_top && 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); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? 1 : 0; - } else if (dev->accel.cmd & 0x10) { - READ(dev->accel.src + dev->accel.cx, mix_dat); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? 1 : 0; + if (dev->accel.cmd & 0x02) { + switch ((mix_dat & 0x01) ? frgd_mix : bkgd_mix) { + case 0: + src_dat = bkgd_color; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = cpu_dat; + break; + case 3: + READ(dev->accel.src + dev->accel.cx, src_dat); + if (pixcntl == 3) { + if (dev->accel.cmd & 0x10) + src_dat = ((src_dat & rd_mask) == rd_mask); } - } - switch ((mix_dat & 1) ? frgd_mix : bkgd_mix) { - case 0: - src_dat = bkgd_color; - break; - case 1: - src_dat = frgd_color; - break; - case 2: - src_dat = cpu_dat; - break; - case 3: - READ(dev->accel.src + dev->accel.cx, src_dat); - if (pixcntl == 3) { - if (dev->accel.cmd & 0x10) { - src_dat = ((src_dat & rd_mask) == rd_mask); - } - } - break; + break; - default: - break; - } - - READ(dev->accel.dest + dev->accel.dx, dest_dat); - - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - old_dest_dat = dest_dat; - MIX(mix_dat & 1, dest_dat, src_dat); - dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); - WRITE(dev->accel.dest + dev->accel.dx, dest_dat); - } - } - - mix_dat >>= 1; - if (dev->bpp) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (dev->accel.cmd & 0x20) { - dev->accel.dx++; - dev->accel.cx++; - } else { - dev->accel.dx--; - dev->accel.cx--; - } - - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 2) { - if (!(dev->accel.cmd & 0x1000)) - dev->accel.sx += (dev->accel.cur_x & 3); - } - - if (dev->accel.cmd & 0x20) { - dev->accel.dx -= (dev->accel.sx) + 1; - dev->accel.cx -= (dev->accel.sx) + 1; - } else { - dev->accel.dx += (dev->accel.sx) + 1; - dev->accel.cx += (dev->accel.sx) + 1; - } - - if (dev->accel.cmd & 2) { - if (dev->accel.cmd & 0x1000) { - dev->accel.cx = dev->accel.cur_x; - if (dev->accel.cur_x >= 0x600) - dev->accel.cx |= ~0x5ff; - dev->accel.dx = dev->accel.destx; - if (dev->accel.destx >= 0x600) - dev->accel.dx |= ~0x5ff; - } - } - - if (dev->accel.cmd & 0x80) { - dev->accel.dy++; - dev->accel.cy++; - } else { - dev->accel.dy--; - dev->accel.cy--; - } - - dev->accel.dest = dev->accel.dy * dev->pitch; - dev->accel.src = dev->accel.cy * dev->pitch; - dev->accel.sy--; - return; - } - } - } - } else { - goto bitblt; - } - } else { - if (cpu_input) { - if (pixcntl == 2) { - goto bitblt_pix; - } else { - while (count-- && (dev->accel.sy >= 0)) { - if (dev->accel.dx >= dev->accel.clip_left && dev->accel.dx <= clip_r && dev->accel.dy >= dev->accel.clip_top && 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); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? mix_mask : 0; - } else if (dev->accel.cmd & 0x10) { - READ(dev->accel.src + dev->accel.cx, mix_dat); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? mix_mask : 0; - } - } - 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 = cpu_dat; - break; - case 3: - READ(dev->accel.src + dev->accel.cx, src_dat); - if (pixcntl == 3) { - if (dev->accel.cmd & 0x10) { - src_dat = ((src_dat & rd_mask) == rd_mask); - } - } - break; - - default: - break; - } - - READ(dev->accel.dest + dev->accel.dx, dest_dat); - - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - 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, dest_dat); - } - } - - mix_dat <<= 1; - mix_dat |= 1; - if (dev->bpp) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (dev->accel.cmd & 0x20) { - dev->accel.dx++; - dev->accel.cx++; - } else { - dev->accel.dx--; - dev->accel.cx--; - } - - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 0x20) { - dev->accel.dx -= (dev->accel.sx) + 1; - dev->accel.cx -= (dev->accel.sx) + 1; - } else { - dev->accel.dx += (dev->accel.sx) + 1; - dev->accel.cx += (dev->accel.sx) + 1; - } - - if (dev->accel.cmd & 0x80) { - dev->accel.dy++; - dev->accel.cy++; - } else { - dev->accel.dy--; - dev->accel.cy--; - } - - dev->accel.dest = dev->accel.dy * dev->pitch; - dev->accel.src = dev->accel.cy * dev->pitch; - dev->accel.sy--; - return; - } - } - } - } else { -bitblt: - if (pixcntl == 1) { - if (dev->accel.cmd & 0x40) { - count = dev->accel.maj_axis_pcnt + 1; - dev->accel.temp_cnt = 8; - while (count-- && dev->accel.sy >= 0) { - if (!dev->accel.temp_cnt) { - mix_dat >>= 8; - dev->accel.temp_cnt = 8; - } - if (dev->accel.dx >= dev->accel.clip_left && dev->accel.dx <= clip_r && dev->accel.dy >= dev->accel.clip_top && dev->accel.dy <= clip_b) { - 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 + dev->accel.cx, src_dat); - break; - - default: - break; - } - - READ(dev->accel.dest + dev->accel.dx, dest_dat); - - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - 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, dest_dat); - } - } - - if (dev->accel.temp_cnt > 0) { - dev->accel.temp_cnt--; - mix_dat <<= 1; - mix_dat |= 1; - } - - if (dev->accel.cmd & 0x20) { - dev->accel.dx++; - dev->accel.cx++; - } else { - dev->accel.dx--; - dev->accel.cx--; - } - - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 0x20) { - dev->accel.dx -= (dev->accel.sx) + 1; - dev->accel.cx -= (dev->accel.sx) + 1; - } else { - dev->accel.dx += (dev->accel.sx) + 1; - dev->accel.cx += (dev->accel.sx) + 1; - } - - if (dev->accel.cmd & 0x80) { - dev->accel.dy++; - dev->accel.cy++; - } else { - dev->accel.dy--; - dev->accel.cy--; - } - - dev->accel.dest = dev->accel.dy * dev->pitch; - dev->accel.src = dev->accel.cy * dev->pitch; - dev->accel.sy--; - return; - } + default: + break; } } else { - dev->accel.temp_cnt = 8; - while (count-- && dev->accel.sy >= 0) { - if (!dev->accel.temp_cnt) { - dev->accel.temp_cnt = 8; - mix_dat = old_mix_dat; - } - if (dev->accel.dx >= dev->accel.clip_left && dev->accel.dx <= clip_r && dev->accel.dy >= dev->accel.clip_top && dev->accel.dy <= clip_b) { - switch ((mix_dat & 1) ? 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 + dev->accel.cx, src_dat); - break; - - default: - break; + 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 = cpu_dat; + break; + case 3: + READ(dev->accel.src + dev->accel.cx, src_dat); + if (pixcntl == 3) { + if (dev->accel.cmd & 0x10) + src_dat = ((src_dat & rd_mask) == rd_mask); } + break; - READ(dev->accel.dest + dev->accel.dx, dest_dat); + default: + break; + } + } - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { - old_dest_dat = dest_dat; - MIX(mix_dat & 1, dest_dat, src_dat); - dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); + READ(dev->accel.dest + dev->accel.dx, dest_dat); - WRITE(dev->accel.dest + dev->accel.dx, dest_dat); - } + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { + old_dest_dat = dest_dat; + if (dev->accel.cmd & 0x02) { + MIX(mix_dat & 0x01, dest_dat, src_dat); + if ((dev->accel.x_count != dev->accel.cx) && !(dev->accel.cmd & 0x1000) && and3) + goto skip_nibble_bitblt_write; + + dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); + 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, dest_dat); + } + } + } + + if (dev->accel.cmd & 0x20) { + dev->accel.dx++; + dev->accel.cx++; + } else { + dev->accel.dx--; + dev->accel.cx--; + } + +skip_nibble_bitblt_write: + if (dev->accel.cmd & 0x20) + dev->accel.x_count++; + else + dev->accel.x_count--; + + if (dev->accel.cmd & 0x02) + mix_dat >>= 1; + else { + mix_dat <<= 1; + mix_dat |= 1; + } + + if (dev->bpp) + cpu_dat >>= 16; + else + cpu_dat >>= 8; + + dev->accel.sx--; + if (dev->accel.sx < 0) { + dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; + + if (dev->accel.cmd & 0x20) { + dev->accel.dx -= (dev->accel.sx + 1); + dev->accel.cx -= (dev->accel.sx + 1); + } else { + dev->accel.dx += (dev->accel.sx + 1); + dev->accel.cx += (dev->accel.sx + 1); + } + + if (dev->accel.cmd & 0x80) { + dev->accel.dy++; + dev->accel.cy++; + } else { + 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 * 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 * 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 * dev->pitch); + } + + dev->accel.sy--; + dev->accel.x_count = 0; + return; + } + } + } else { + if (pixcntl == 1) { + if (dev->accel.cmd & 0x40) { + count = (dev->accel.maj_axis_pcnt & 0x7ff) + 1; + dev->accel.temp_cnt = 8; + while (count-- && (dev->accel.sy >= 0)) { + if (!dev->accel.temp_cnt) { + mix_dat >>= 8; + dev->accel.temp_cnt = 8; + } + 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; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = 0; + break; + case 3: + READ(dev->accel.src + dev->accel.cx, src_dat); + break; + + default: + break; } + READ(dev->accel.dest + dev->accel.dx, dest_dat); + + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { + 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, dest_dat); + } + } + + if (dev->accel.temp_cnt > 0) { dev->accel.temp_cnt--; - mix_dat >>= 1; + mix_dat <<= 1; + mix_dat |= 1; + } + + if (dev->accel.cmd & 0x20) { + dev->accel.dx++; + dev->accel.cx++; + } else { + dev->accel.dx--; + dev->accel.cx--; + } + + dev->accel.sx--; + if (dev->accel.sx < 0) { + dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; if (dev->accel.cmd & 0x20) { - dev->accel.dx++; - dev->accel.cx++; + dev->accel.dx -= (dev->accel.sx + 1); + dev->accel.cx -= (dev->accel.sx + 1); } else { - dev->accel.dx--; - dev->accel.cx--; + dev->accel.dx += (dev->accel.sx + 1); + dev->accel.cx += (dev->accel.sx + 1); } - dev->accel.sx--; - if (dev->accel.sx < 0) { - dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - - if (dev->accel.cmd & 0x20) { - dev->accel.dx -= (dev->accel.sx) + 1; - dev->accel.cx -= (dev->accel.sx) + 1; - } else { - dev->accel.dx += (dev->accel.sx) + 1; - dev->accel.cx += (dev->accel.sx) + 1; - } - - if (dev->accel.cmd & 0x80) { - dev->accel.dy++; - dev->accel.cy++; - } else { - dev->accel.dy--; - dev->accel.cy--; - } - - dev->accel.dest = dev->accel.dy * dev->pitch; - dev->accel.src = dev->accel.cy * dev->pitch; - dev->accel.sy--; - - if (dev->accel.sy < 0) { - return; - } + if (dev->accel.cmd & 0x80) { + dev->accel.dy++; + dev->accel.cy++; + } else { + 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 * 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 * 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 * dev->pitch); + } + + dev->accel.sy--; + return; } } } else { - if ((dev->accel_bpp == 24) && ((dev->local & 0xff) >= 0x02) && (dev->accel.cmd == 0xc2b5)) { - int64_t cx; - int64_t dx; + dev->accel.temp_cnt = 8; + while (count-- && (dev->accel.sy >= 0)) { + if (!dev->accel.temp_cnt) { + dev->accel.temp_cnt = 8; + mix_dat = old_mix_dat; + } + 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; + break; + case 1: + src_dat = frgd_color; + break; + case 2: + src_dat = 0; + break; + case 3: + READ(dev->accel.src + dev->accel.cx, src_dat); + break; - cx = (int64_t) dev->accel.cx; - dx = (int64_t) dev->accel.dx; - - while (1) { - if ((dx >= (((int64_t)dev->accel.clip_left) * 3)) && (dx <= (((uint64_t)clip_r) * 3)) && - (dev->accel.dy >= (dev->accel.clip_top << 1)) && (dev->accel.dy <= (clip_b << 1))) { - - READ(dev->accel.src + (dev->accel.ge_offset << 2) + cx, src_dat); - READ(dev->accel.dest + (dev->accel.ge_offset << 2) + dx, dest_dat); - - dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); - - WRITE(dev->accel.dest + (dev->accel.ge_offset << 2) + dx, dest_dat); + default: + break; } - cx++; - dx++; + READ(dev->accel.dest + dev->accel.dx, dest_dat); - dev->accel.sx--; - if (dev->accel.sx < 0) - return; + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { + 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, dest_dat); + } } - return; - } - ibm8514_log("BitBLT 8514/A=%04x, selfrmix=%d, selbkmix=%d, d(%d,%d), c(%d,%d), pixcntl=%d, sy=%d, frgdmix=%02x, bkgdmix=%02x, rdmask=%02x, wrtmask=%02x, linedraw=%d.\n", dev->accel.cmd, frgd_mix, bkgd_mix, dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy, pixcntl, dev->accel.sy, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, dev->accel.rd_mask, wrt_mask, dev->accel.linedraw); + dev->accel.temp_cnt--; + mix_dat >>= 1; + + if (dev->accel.cmd & 0x20) { + dev->accel.dx++; + dev->accel.cx++; + } else { + dev->accel.dx--; + dev->accel.cx--; + } + + dev->accel.sx--; + if (dev->accel.sx < 0) { + dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; + + if (dev->accel.cmd & 0x20) { + dev->accel.dx -= (dev->accel.sx + 1); + dev->accel.cx -= (dev->accel.sx + 1); + } else { + dev->accel.dx += (dev->accel.sx + 1); + dev->accel.cx += (dev->accel.sx + 1); + } + + if (dev->accel.cmd & 0x80) { + dev->accel.dy++; + dev->accel.cy++; + } else { + 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 * 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 * 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 * dev->pitch); + } + dev->accel.sy--; + + if (dev->accel.sy < 0) { + dev->accel.destx = dev->accel.dx; + dev->accel.desty = dev->accel.dy; + return; + } + } + } + } + } else { + if ((dev->accel_bpp == 24) && (dev->accel.cmd == 0xc2b5)) { + int64_t cx; + int64_t dx; + + cx = (int64_t) dev->accel.cx; + dx = (int64_t) dev->accel.dx; + + while (1) { + if ((dx >= (((int64_t)clip_l) * 3)) && + (dx <= (((uint64_t)clip_r) * 3)) && + (dev->accel.dy >= (clip_t << 1)) && + (dev->accel.dy <= (clip_b << 1))) { + + READ(dev->accel.src + cx, src_dat); + READ(dev->accel.dest + dx, dest_dat); + dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); + WRITE(dev->accel.dest + dx, dest_dat); + } + + cx++; + dx++; + + dev->accel.sx--; + if (dev->accel.sx < 0) + return; + } + } else { while (count-- && dev->accel.sy >= 0) { - if ((dev->accel.dx >= dev->accel.clip_left) && (dev->accel.dx <= clip_r) && - (dev->accel.dy >= dev->accel.clip_top) && (dev->accel.dy <= 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); @@ -3766,9 +3090,8 @@ bitblt: case 3: READ(dev->accel.src + dev->accel.cx, src_dat); if (pixcntl == 3) { - if ((dev->accel.cmd & 0x10) && !(dev->accel.cmd & 0x40)) { + if ((dev->accel.cmd & 0x10) && !(dev->accel.cmd & 0x40)) src_dat = ((src_dat & rd_mask) == rd_mask); - } } break; @@ -3778,12 +3101,18 @@ bitblt: READ(dev->accel.dest + dev->accel.dx, dest_dat); - if ((compare_mode == 0) || ((compare_mode == 0x10) && (dest_dat >= compare)) || ((compare_mode == 0x18) && (dest_dat < compare)) || ((compare_mode == 0x20) && (dest_dat != compare)) || ((compare_mode == 0x28) && (dest_dat == compare)) || ((compare_mode == 0x30) && (dest_dat <= compare)) || ((compare_mode == 0x38) && (dest_dat > compare))) { + if ((compare_mode == 0) || + ((compare_mode == 0x10) && (dest_dat >= compare)) || + ((compare_mode == 0x18) && (dest_dat < compare)) || + ((compare_mode == 0x20) && (dest_dat != compare)) || + ((compare_mode == 0x28) && (dest_dat == compare)) || + ((compare_mode == 0x30) && (dest_dat <= compare)) || + ((compare_mode == 0x38) && (dest_dat > compare))) { 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 & 4) { - if (dev->accel.sx > 0) { + if (dev->accel.cmd & 0x04) { + if (dev->accel.sx) { WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } } else { @@ -3808,15 +3137,13 @@ bitblt: dev->accel.fill_state = 0; dev->accel.sx = dev->accel.maj_axis_pcnt & 0x7ff; - dev->accel.dx = dev->accel.destx; - - if (dev->accel.destx >= 0x600) - dev->accel.dx |= ~0x5ff; - - dev->accel.cx = dev->accel.cur_x; - - if (dev->accel.cur_x >= 0x600) - dev->accel.cx |= ~0x5ff; + if (dev->accel.cmd & 0x20) { + dev->accel.dx -= (dev->accel.sx + 1); + dev->accel.cx -= (dev->accel.sx + 1); + } else { + dev->accel.dx += (dev->accel.sx + 1); + dev->accel.cx += (dev->accel.sx + 1); + } if (dev->accel.cmd & 0x80) { dev->accel.dy++; @@ -3826,12 +3153,23 @@ bitblt: dev->accel.cy--; } - dev->accel.dest = dev->accel.dy * dev->pitch; - dev->accel.src = dev->accel.cy * dev->pitch; + 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 * 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 * 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 * dev->pitch); + } dev->accel.sy--; - if (dev->accel.sy < 0) + if (dev->accel.sy < 0) { + dev->accel.destx = dev->accel.dx; + dev->accel.desty = dev->accel.dy; return; + } } } } @@ -3882,16 +3220,16 @@ ibm8514_render_8bpp(svga_t *svga) for (int x = 0; x <= dev->h_disp; x += 8) { dat = *(uint32_t *) (&dev->vram[dev->ma & dev->vram_mask]); - p[0] = dev->pallook[dat & 0xff]; - p[1] = dev->pallook[(dat >> 8) & 0xff]; - p[2] = dev->pallook[(dat >> 16) & 0xff]; - p[3] = dev->pallook[(dat >> 24) & 0xff]; + p[0] = dev->pallook[dat & dev->dac_mask]; + p[1] = dev->pallook[(dat >> 8) & dev->dac_mask]; + p[2] = dev->pallook[(dat >> 16) & dev->dac_mask]; + p[3] = dev->pallook[(dat >> 24) & dev->dac_mask]; dat = *(uint32_t *) (&dev->vram[(dev->ma + 4) & dev->vram_mask]); - p[4] = dev->pallook[dat & 0xff]; - p[5] = dev->pallook[(dat >> 8) & 0xff]; - p[6] = dev->pallook[(dat >> 16) & 0xff]; - p[7] = dev->pallook[(dat >> 24) & 0xff]; + p[4] = dev->pallook[dat & dev->dac_mask]; + p[5] = dev->pallook[(dat >> 8) & dev->dac_mask]; + p[6] = dev->pallook[(dat >> 16) & dev->dac_mask]; + p[7] = dev->pallook[(dat >> 24) & dev->dac_mask]; dev->ma += 8; p += 8; @@ -4147,7 +3485,7 @@ ibm8514_poll(void *priv) int wy; ibm8514_log("IBM 8514/A poll.\n"); - if (dev->on[0] || dev->on[1]) { + if (dev->on) { ibm8514_log("ON!\n"); if (!dev->linepos) { if ((dev->displine == ((dev->hwcursor_latch.y < 0) ? 0 : dev->hwcursor_latch.y)) && dev->hwcursor_latch.ena) { @@ -4302,7 +3640,7 @@ ibm8514_recalctimings(svga_t *svga) } else #endif { - if (dev->on[0]) { + if (dev->on) { dev->h_total = dev->htotal + 1; dev->rowcount = !!(dev->disp_cntl & 0x08); @@ -4336,6 +3674,11 @@ ibm8514_recalctimings(svga_t *svga) dev->pitch = 1024; dev->rowoffset = 0x80; svga->map8 = dev->pallook; + if (dev->vram_512k_8514) { + if (dev->h_disp == 640) + dev->pitch = 640; + } + dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; ibm8514_log("BPP=%d, Pitch = %d, rowoffset = %d, crtc13 = %02x, highres bit = %02x, has_vga? = %d.\n", dev->bpp, dev->pitch, dev->rowoffset, svga->crtc[0x13], dev->accel.advfunc_cntl & 4, !ibm8514_standalone_enabled); } @@ -4382,8 +3725,7 @@ ibm8514_mca_reset(void *priv) ibm8514_t *dev = (ibm8514_t *) svga->dev8514; ibm8514_log("MCA reset.\n"); - dev->on[0] = 0; - dev->on[1] = 0; + dev->on = 0; vga_on = 1; #ifdef ATI_8514_ULTRA if (dev->extensions) @@ -4391,6 +3733,8 @@ ibm8514_mca_reset(void *priv) else #endif ibm8514_mca_write(0x102, 0, svga); + + timer_set_callback(&svga->timer, svga_poll); } static void * @@ -4409,12 +3753,15 @@ ibm8514_init(const device_t *info) svga->dev8514 = dev; svga->ext8514 = NULL; - dev->vram_size = 1024 << 10; + dev->vram_amount = device_get_config_int("memory"); + dev->vram_512k_8514 = dev->vram_amount == 512; + dev->vram_size = dev->vram_amount << 10; dev->vram = calloc(dev->vram_size, 1); dev->changedvram = calloc((dev->vram_size >> 12) + 1, 1); dev->vram_mask = dev->vram_size - 1; dev->map8 = dev->pallook; dev->local = 0; + dev->accel_bpp = 8; dev->type = info->flags; dev->bpp = 0; @@ -4450,6 +3797,7 @@ ibm8514_init(const device_t *info) 0x1000, MEM_MAPPING_EXTERNAL); ati_eeprom_load(&mach->eeprom, "ati8514.nvr", 0); mach->accel.scratch0 = (((bios_addr >> 7) - 0x1000) >> 4); + mach->accel.scratch1 = mach->accel.scratch0 - 0x80; } ati8514_init(svga, svga->ext8514, svga->dev8514); break; @@ -4519,6 +3867,25 @@ ibm8514_force_redraw(void *priv) #ifdef ATI_8514_ULTRA // clang-format off static const device_config_t ext8514_config[] = { + { + .name = "memory", + .description = "Memory size", + .type = CONFIG_SELECTION, + .default_int = 1024, + .selection = { + { + .description = "512 KB", + .value = 512 + }, + { + .description = "1 MB", + .value = 1024 + }, + { + .description = "" + } + } + }, { .name = "extensions", .description = "Vendor", @@ -4566,6 +3933,32 @@ static const device_config_t ext8514_config[] = { .type = CONFIG_END } }; +#else +// clang-format off +static const device_config_t ext8514_config[] = { + { + .name = "memory", + .description = "Memory size", + .type = CONFIG_SELECTION, + .default_int = 1024, + .selection = { + { + .description = "512 KB", + .value = 512 + }, + { + .description = "1 MB", + .value = 1024 + }, + { + .description = "" + } + } + }, + { + .type = CONFIG_END + } +}; #endif // clang-format off @@ -4580,11 +3973,7 @@ const device_t gen8514_isa_device = { { .available = NULL }, .speed_changed = ibm8514_speed_changed, .force_redraw = ibm8514_force_redraw, -#ifdef ATI_8514_ULTRA .config = ext8514_config -#else - .config = NULL -#endif }; const device_t ibm8514_mca_device = { @@ -4598,11 +3987,7 @@ const device_t ibm8514_mca_device = { { .available = NULL }, .speed_changed = ibm8514_speed_changed, .force_redraw = ibm8514_force_redraw, -#ifdef ATI_8514_ULTRA .config = ext8514_config -#else - .config = NULL -#endif }; diff --git a/src/video/vid_ati68860_ramdac.c b/src/video/vid_ati68860_ramdac.c index ac2a0f7cb..cb6de4353 100644 --- a/src/video/vid_ati68860_ramdac.c +++ b/src/video/vid_ati68860_ramdac.c @@ -74,16 +74,16 @@ ati68860_ramdac_out(uint16_t addr, uint8_t val, void *priv, svga_t *svga) switch (addr) { case 0: - svga_out((dev && (dev->on[0] || dev->on[1])) ? 0x2ec : 0x3c8, val, svga); + svga_out((dev && dev->on) ? 0x2ec : 0x3c8, val, svga); break; case 1: - svga_out((dev && (dev->on[0] || dev->on[1])) ? 0x2ed : 0x3c9, val, svga); + svga_out((dev && dev->on) ? 0x2ed : 0x3c9, val, svga); break; case 2: - svga_out((dev && (dev->on[0] || dev->on[1])) ? 0x2ea : 0x3c6, val, svga); + svga_out((dev && dev->on) ? 0x2ea : 0x3c6, val, svga); break; case 3: - svga_out((dev && (dev->on[0] || dev->on[1])) ? 0x2eb : 0x3c7, val, svga); + svga_out((dev && dev->on) ? 0x2eb : 0x3c7, val, svga); break; default: ramdac->regs[addr & 0xf] = val; @@ -181,16 +181,16 @@ ati68860_ramdac_in(uint16_t addr, void *priv, svga_t *svga) switch (addr) { case 0: - temp = svga_in((dev && (dev->on[0] || dev->on[1])) ? 0x2ec : 0x3c8, svga); + temp = svga_in((dev && dev->on) ? 0x2ec : 0x3c8, svga); break; case 1: - temp = svga_in((dev && (dev->on[0] || dev->on[1])) ? 0x2ed : 0x3c9, svga); + temp = svga_in((dev && dev->on) ? 0x2ed : 0x3c9, svga); break; case 2: - temp = svga_in((dev && (dev->on[0] || dev->on[1])) ? 0x2ea : 0x3c6, svga); + temp = svga_in((dev && dev->on) ? 0x2ea : 0x3c6, svga); break; case 3: - temp = svga_in((dev && (dev->on[0] || dev->on[1])) ? 0x2eb : 0x3c7, svga); + temp = svga_in((dev && dev->on) ? 0x2eb : 0x3c7, svga); break; case 4: case 8: diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index d41f65ed9..7ef0d2475 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -117,9 +117,8 @@ mach_log(const char *fmt, ...) mach->accel.pix_trans[(n)] = vram_w[(dev->accel.dest + (cx) + (n)) & (dev->vram_mask >> 1)] & 0xff; \ else \ mach->accel.pix_trans[(n)] = vram_w[(dev->accel.dest + (cx) + (n)) & (dev->vram_mask >> 1)] >> 8; \ - } else { \ + } else \ mach->accel.pix_trans[(n)] = dev->vram[(dev->accel.dest + (cx) + (n)) & dev->vram_mask]; \ - } \ } #define READ_PIXTRANS_WORD(cx, n) \ @@ -152,6 +151,9 @@ mach_log(const char *fmt, ...) else \ dat = dev->vram[(addr) & (dev->vram_mask)]; +#define READ_HIGH(addr, dat) \ + dat |= (dev->vram[(addr) & (dev->vram_mask)] << 8); + #define MIX(mixmode, dest_dat, src_dat) \ { \ switch ((mixmode) ? (dev->accel.frgd_mix & 0x1f) : (dev->accel.bkgd_mix & 0x1f)) { \ @@ -237,7 +239,10 @@ mach_log(const char *fmt, ...) dest_dat = MAX(0, (src_dat - dest_dat)); \ break; \ case 0x1b: \ - dest_dat = MIN(0xff, (dest_dat + src_dat)); \ + if (dev->bpp) \ + dest_dat = MIN(0xffff, (dest_dat + src_dat)); \ + else \ + dest_dat = MIN(0xff, (dest_dat + src_dat)); \ break; \ case 0x1c: \ dest_dat = MAX(0, (dest_dat - src_dat)) / 2; \ @@ -249,7 +254,10 @@ mach_log(const char *fmt, ...) dest_dat = MAX(0, (src_dat - dest_dat)) / 2; \ break; \ case 0x1f: \ - dest_dat = (0xff < (src_dat + dest_dat)) ? 0xff : ((src_dat + dest_dat) / 2); \ + if (dev->bpp) \ + dest_dat = (0xffff < (src_dat + dest_dat)) ? 0xffff : ((src_dat + dest_dat) / 2); \ + else \ + dest_dat = (0xff < (src_dat + dest_dat)) ? 0xff : ((src_dat + dest_dat) / 2); \ break; \ } \ } @@ -299,12 +307,12 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 uint16_t old_dest_dat; uint16_t *vram_w = (uint16_t *) dev->vram; uint16_t mix = 0; - int16_t clip_l = dev->accel.clip_left & 0x7ff; - int16_t clip_t = dev->accel.clip_top & 0x7ff; - int16_t clip_r = dev->accel.multifunc[4] & 0x7ff; - int16_t clip_b = dev->accel.multifunc[3] & 0x7ff; uint32_t mono_dat0 = 0; uint32_t mono_dat1 = 0; + int16_t clip_t = dev->accel.multifunc[1] & 0x7ff; + int16_t clip_l = dev->accel.multifunc[2] & 0x7ff; + int16_t clip_b = dev->accel.multifunc[3] & 0x7ff; + int16_t clip_r = dev->accel.multifunc[4] & 0x7ff; if (!dev->bpp) { rd_mask &= 0xff; @@ -324,17 +332,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (cpu_input) { if (dev->bpp) { - if ((mach->accel.dp_config & 0x200) && (count == 2)) { + if ((mach->accel.dp_config & 0x200) && (count == 2)) count >>= 1; - } } } - if ((dev->accel_bpp == 8) || (dev->accel_bpp == 15) || (dev->accel_bpp == 16) || (dev->accel_bpp == 24)) { - if ((cmd_type == 2) && cpu_input) { - 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, monpattern = %x.\n", 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); - } - } + 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, monpattern = %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); switch (cmd_type) { case 1: /*Extended Raw Linedraw from bres_count register (0x96ee)*/ @@ -342,6 +346,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.dx = dev->accel.cur_x; if (dev->accel.cur_x >= 0x600) dev->accel.dx |= ~0x5ff; + dev->accel.dy = dev->accel.cur_y; if (dev->accel.cur_y >= 0x600) dev->accel.dy |= ~0x5ff; @@ -349,6 +354,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.cx = dev->accel.destx_distp; if (dev->accel.destx_distp >= 0x600) dev->accel.cx |= ~0x5ff; + dev->accel.cy = dev->accel.desty_axstp; if (dev->accel.desty_axstp >= 0x600) dev->accel.cy |= ~0x5ff; @@ -357,8 +363,6 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.sx = 0; mach->accel.poly_fill = 0; - mach->accel.color_pattern_idx = ((dev->accel.cx + (dev->accel.cy << 3)) & mach->accel.patt_len); - mach->accel.stepx = (mach->accel.linedraw_opt & 0x20) ? 1 : -1; mach->accel.stepy = (mach->accel.linedraw_opt & 0x80) ? 1 : -1; @@ -377,19 +381,9 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } } - if (frgd_sel == 5) { - for (int x = 0; x <= mach->accel.patt_len; x++) { - mach->accel.color_pattern[x] = mach->accel.patt_data[x & mach->accel.patt_len]; - } - - /*The destination coordinates should match the pattern index.*/ - if (mach->accel.color_pattern_idx != mach->accel.patt_idx) - mach->accel.color_pattern_idx = mach->accel.patt_idx; - } - if (mono_src == 1) { - count = mach->accel.width; - mix_dat = mach->accel.patt_data[0x10]; + count = mach->accel.width; + mix_dat = mach->accel.mono_pattern_normal[0]; dev->accel.temp_cnt = 8; } @@ -404,7 +398,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.temp_cnt = 8; mix_dat >>= 8; } - mix = (mix_dat & 0x80); + mix = !!(mix_dat & 0x80); dev->accel.temp_cnt--; mix_dat <<= 1; mix_dat |= 1; @@ -415,10 +409,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mix_dat <<= 1; } else { if (mach->accel.dp_config & 0x200) { - mix = mix_dat & 1; + mix = mix_dat & 0x01; mix_dat >>= 1; } else { - mix = mix_dat & 0x80; + mix = !!(mix_dat & 0x80); mix_dat <<= 1; mix_dat |= 1; } @@ -437,7 +431,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 break; } - if (((dev->accel.dx) >= clip_l) && ((dev->accel.dx) <= clip_r) && ((dev->accel.dy) >= clip_t) && ((dev->accel.dy) <= 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 ? frgd_sel : bkgd_sel) { case 0: src_dat = dev->accel.bkgd_color; @@ -453,20 +450,18 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 src_dat = cpu_dat; else { if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), src_dat); + READ((mach->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch) + dev->accel.cx, src_dat); } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), src_dat); + READ((mach->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch) + dev->accel.cx, src_dat); } - if (mono_src == 3) { + if (mono_src == 3) src_dat = (src_dat & rd_mask) == rd_mask; - } } break; case 5: - if (mix) { - src_dat = mach->accel.color_pattern[((dev->accel.dx) + ((dev->accel.dy) << 3)) & mach->accel.patt_len]; - } else - src_dat = 0; + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; + if (dev->bpp) + src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); break; default: @@ -556,6 +551,14 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; + 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; + switch (mach->accel.linedraw_opt & 0xe0) { case 0x00: dev->accel.cx++; @@ -648,7 +651,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 break; } - if (((dev->accel.dx) >= clip_l) && ((dev->accel.dx) <= clip_r) && ((dev->accel.dy) >= clip_t) && ((dev->accel.dy) <= 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 ? frgd_sel : bkgd_sel) { case 0: src_dat = dev->accel.bkgd_color; @@ -674,10 +680,9 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } break; case 5: - if (mix) { - src_dat = mach->accel.color_pattern[((dev->accel.dx) + ((dev->accel.dy) << 3)) & mach->accel.patt_len]; - } else - src_dat = 0; + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; + if (dev->bpp) + src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); break; default: @@ -767,6 +772,14 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 else cpu_dat >>= 8; + 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 (mach->accel.linedraw_opt & 0x40) { dev->accel.dy += mach->accel.stepy; if ((frgd_sel == 3) || (bkgd_sel == 3)) @@ -817,9 +830,8 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.dy |= ~0x5ff; if (mach->accel.dp_config == 0x5211) { - if (mach->accel.dest_x_end == 1024) { + if (mach->accel.dest_x_end == 1024) goto skip_dx; - } } /*Destination Width*/ if (mach->accel.dest_x_start != dev->accel.dx) @@ -849,14 +861,8 @@ skip_dx: mach_log("BitBLT: Dst Indeterminate X, dpconfig = %04x, destxend = %d, destxstart = %d.\n", mach->accel.dp_config, mach->accel.dest_x_end, mach->accel.dest_x_start); } - dev->accel.sx = 0; - mach->accel.poly_fill = 0; - mach->accel.color_pattern_idx = ((dev->accel.dx + (dev->accel.dy << 3)) & mach->accel.patt_len); - if ((dev->accel_bpp == 24) && (mono_src != 1)) { - if (mach->accel.color_pattern_idx == mach->accel.patt_len) - mach->accel.color_pattern_idx = mach->accel.patt_data_idx; - } else if ((dev->accel_bpp == 24) && (frgd_sel == 5) && (mono_src == 1) && (mach->accel.patt_len_reg & 0x4000)) - mach->accel.color_pattern_idx = 0; + dev->accel.sx = 0; + mach->accel.poly_fill = 0; /*Height*/ mach->accel.dy_start = dev->accel.cur_y; @@ -878,13 +884,16 @@ skip_dx: } dev->accel.sy = 0; - 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 (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); + } mach->accel.src_stepx = 0; - /*Source Width*/ dev->accel.cx = mach->accel.src_x; if (mach->accel.src_x >= 0x600) @@ -918,27 +927,28 @@ skip_dx: mach_log("BitBLT: Src Indeterminate X: width = %d, coordinates: %d,%d px, end: %d px, stepx = %d, dpconfig = %04x, oddwidth = %d.\n", mach->accel.src_width, dev->accel.cx, dev->accel.cy, mach->accel.src_x_end, mach->accel.src_stepx, mach->accel.dp_config, mach->accel.src_width & 1); } mach->accel.sx = 0; - if (dev->bpp) - dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * (dev->pitch)); + if (mach->accel.patt_data_idx < 16) + mach->accel.color_pattern_idx = mach->accel.patt_idx; else - dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch)); + mach->accel.color_pattern_idx = 0; - if ((dev->accel_bpp == 24) && (frgd_sel == 5)) - mach_log("BitBLT=%04x, WH(%d,%d), SRCWidth=%d, c(%d,%d), s(%d,%d).\n", mach->accel.dp_config, mach->accel.width, mach->accel.height, mach->accel.src_width, dev->accel.dx, dev->accel.dy, dev->accel.cx, dev->accel.cy); - else if (mach->accel.dp_config & 0x02) - mach_log("BitBLT=%04x, Pitch=%d, C(%d,%d), D(%d,%d), SRCWidth=%d, SRCXStep=%d, WH(%d,%d), clipt=%d, clipb=%d, geoffset=%08x.\n", mach->accel.dp_config, dev->ext_pitch, mach->accel.src_x, mach->accel.src_y, dev->accel.cur_x, dev->accel.cur_y, mach->accel.src_width, mach->accel.src_stepx, mach->accel.width, mach->accel.height, clip_t, clip_b, (mach->accel.ge_offset << 2)); + if (dev->bpp) + dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); + else + dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); if (mono_src == 1) { - if ((mach->accel.mono_pattern_enable) && !(mach->accel.patt_len_reg & 0x4000)) { - mono_dat0 = mach->accel.patt_data[0x10]; - mono_dat0 |= (mach->accel.patt_data[0x11] << 8); - mono_dat0 |= (mach->accel.patt_data[0x12] << 16); - mono_dat0 |= (mach->accel.patt_data[0x13] << 24); - mono_dat1 = mach->accel.patt_data[0x14]; - mono_dat1 |= (mach->accel.patt_data[0x15] << 8); - mono_dat1 |= (mach->accel.patt_data[0x16] << 16); - mono_dat1 |= (mach->accel.patt_data[0x17] << 24); + if (mach->accel.mono_pattern_enable || mach->accel.block_write_mono_pattern_enable) { + mono_dat0 = mach->accel.mono_pattern_normal[0]; + mono_dat0 |= (mach->accel.mono_pattern_normal[1] << 8); + mono_dat0 |= (mach->accel.mono_pattern_normal[2] << 16); + mono_dat0 |= (mach->accel.mono_pattern_normal[3] << 24); + mono_dat1 = mach->accel.mono_pattern_normal[4]; + mono_dat1 |= (mach->accel.mono_pattern_normal[5] << 8); + mono_dat1 |= (mach->accel.mono_pattern_normal[6] << 16); + mono_dat1 |= (mach->accel.mono_pattern_normal[7] << 24); + mach_log("MonoData0=%x, MonoData1=%x.\n", mono_dat0, mono_dat1); for (uint8_t y = 0; y < 8; y++) { for (uint8_t x = 0; x < 8; x++) { uint32_t temp = (y & 4) ? mono_dat1 : mono_dat0; @@ -962,35 +972,12 @@ skip_dx: } if (mono_src == 1) { - if (!mach->accel.mono_pattern_enable && !(mach->accel.patt_len_reg & 0x4000)) { - count = mach->accel.width; - mix_dat = mach->accel.patt_data[0x10] ^ ((mach->accel.patt_idx & 1) ? 0xff : 0); - dev->accel.temp_cnt = 8; - } - } - - if (frgd_sel == 5) { - if (dev->bpp) { - for (int x = 0; x <= mach->accel.patt_len; x += 2) { - mach->accel.color_pattern_word[x + (mach->accel.color_pattern_idx & 1)] = (mach->accel.patt_data[x & mach->accel.patt_len] & 0xff); - mach->accel.color_pattern_word[x + (mach->accel.color_pattern_idx & 1)] |= (mach->accel.patt_data[(x + 1) & mach->accel.patt_len] << 8); - } - } else { - if ((dev->accel_bpp == 24) && (mach->accel.patt_len < 3)) { - for (int x = 0; x <= mach->accel.patt_len; x++) { - mach->accel.color_pattern[x] = mach->accel.patt_data[x]; - mach_log("BITBLT: Color Pattern 24bpp[%d]=%02x, dataidx=%d, pattlen=%d.\n", x, mach->accel.color_pattern[x], mach->accel.patt_data_idx, mach->accel.patt_len); - } - } else { - for (int x = 0; x <= mach->accel.patt_len; x++) { - mach->accel.color_pattern[x] = mach->accel.patt_data[x & mach->accel.patt_len]; - } + if (!mach->accel.mono_pattern_enable && !mach->accel.block_write_mono_pattern_enable) { + if (((dev->accel_bpp == 24) && (frgd_sel != 5)) || (dev->accel_bpp != 24)) { + mix_dat = mach->accel.mono_pattern_normal[0] ^ ((mach->accel.patt_idx & 0x01) ? 0xff : 0); + dev->accel.temp_cnt = 8; } } - - /*The destination coordinates should match the pattern index.*/ - if (mach->accel.color_pattern_idx != mach->accel.patt_idx) - mach->accel.color_pattern_idx = mach->accel.patt_idx; } if (mach->accel.dy_end == mach->accel.dy_start) { @@ -1016,24 +1003,22 @@ skip_dx: while (count--) { switch (mono_src) { case 0: - mix = 1; + mix = 0x01; break; case 1: - if (mach->accel.mono_pattern_enable) + if (mach->accel.mono_pattern_enable || mach->accel.block_write_mono_pattern_enable) mix = mach->accel.mono_pattern[dev->accel.dy & 7][dev->accel.dx & 7]; + else if ((dev->accel_bpp == 24) && (frgd_sel == 5)) + mix = 0x01; else { - if ((dev->accel_bpp == 24) && (frgd_sel == 5) && (mach->accel.patt_len_reg & 0x4000)) - mix = 1; - else { - if (!dev->accel.temp_cnt) { - dev->accel.temp_cnt = 8; - mix_dat >>= 8; - } - mix = (mix_dat & 0x80); - dev->accel.temp_cnt--; - mix_dat <<= 1; - mix_dat |= 1; + if (!dev->accel.temp_cnt) { + dev->accel.temp_cnt = 8; + mix_dat >>= 8; } + mix = !!(mix_dat & 0x80); + dev->accel.temp_cnt--; + mix_dat <<= 1; + mix_dat |= 1; } break; case 2: @@ -1042,10 +1027,10 @@ skip_dx: mix_dat <<= 1; } else { if (mach->accel.dp_config & 0x200) { - mix = mix_dat & 1; + mix = mix_dat & 0x01; mix_dat >>= 1; } else { - mix = mix_dat & 0x80; + mix = !!(mix_dat & 0x80); mix_dat <<= 1; mix_dat |= 1; } @@ -1060,15 +1045,18 @@ skip_dx: break; } - if (((dev->accel.dx) >= clip_l) && ((dev->accel.dx) <= clip_r) && ((dev->accel.dy) >= clip_t) && ((dev->accel.dy) <= clip_b)) { - if ((mach->accel.dp_config & 0x02) || (mach->accel.linedraw_opt & 0x02)) { + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b)) { + if (mach->accel.dp_config & 0x02) { READ(dev->accel.src + dev->accel.cx, poly_src); poly_src = ((poly_src & rd_mask) == rd_mask); if (poly_src) mach->accel.poly_fill ^= 1; } - if (mach->accel.poly_fill || !(mach->accel.dp_config & 0x02) || !(mach->accel.linedraw_opt & 0x02)) { + if (mach->accel.poly_fill || !(mach->accel.dp_config & 0x02)) { switch (mix ? frgd_sel : bkgd_sel) { case 0: src_dat = dev->accel.bkgd_color; @@ -1089,22 +1077,18 @@ skip_dx: } break; case 5: - if (mix) { - if (dev->bpp) - src_dat = mach->accel.color_pattern_word[mach->accel.color_pattern_idx]; - else - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; - } else - src_dat = 0; + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; + if (dev->bpp) + src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); break; default: break; } - if ((dev->accel_bpp == 24) && (mono_src == 1) && (frgd_sel == 5) && (mach->accel.patt_len_reg & 0x4000)) { + if ((dev->accel_bpp == 24) && (mono_src == 1) && (frgd_sel == 5) && !mach->accel.mono_pattern_enable) { if (dev->accel.sy & 1) { - READ(dev->accel.dest + dev->accel.dx - dev->ext_pitch, dest_dat); + READ(dev->accel.dest + dev->accel.dx - dev->pitch, dest_dat); } else { READ(dev->accel.dest + dev->accel.dx, dest_dat); } @@ -1148,14 +1132,20 @@ skip_dx: } if (mach->accel.dp_config & 0x10) { - if ((dev->accel_bpp == 24) && (mono_src == 1) && (frgd_sel == 5) && (mach->accel.patt_len_reg & 0x4000)) { - if (dev->accel.sy & 1) { - WRITE(dev->accel.dest + dev->accel.dx - dev->ext_pitch, dest_dat); - } else { + if (mach->accel.block_write_mono_pattern_enable) { + if (mix) { WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } } else { - WRITE(dev->accel.dest + dev->accel.dx, dest_dat); + if ((dev->accel_bpp == 24) && (mono_src == 1) && (frgd_sel == 5) && !mach->accel.mono_pattern_enable) { + if (dev->accel.sy & 1) { + WRITE(dev->accel.dest + dev->accel.dx - dev->pitch, dest_dat); + } else { + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); + } + } else { + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); + } } } } @@ -1166,54 +1156,45 @@ skip_dx: else cpu_dat >>= 8; + if (mach->accel.dp_config == 0x2071 || (mach->accel.dp_config == 0x2011)) + mach_log("FontBlit: SX=%d, C(%d,%d), SRCWidth=%d, frgdmix=%d, bkgdmix=%d, rdmask=%04x, D(%d,%d), geoffset=%x, addr=%08x,.\n", mach->accel.sx, dev->accel.cx, dev->accel.cy, mach->accel.src_width, dev->accel.frgd_mix & 0x1f, dev->accel.bkgd_mix & 0x1f, rd_mask, dev->accel.dx, dev->accel.dy, dev->accel.ge_offset, (dev->accel.src + dev->accel.cx) & dev->vram_mask); + if ((mono_src == 3) || (frgd_sel == 3) || (bkgd_sel == 3) || (mach->accel.dp_config & 0x02)) { dev->accel.cx += mach->accel.src_stepx; 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 < 0) dev->accel.cx += mach->accel.src_width; 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)); + dev->accel.src = (mach->accel.ge_offset << 1) + (dev->accel.cy * dev->pitch); else - dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch)); + dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); } } - dev->accel.dx += mach->accel.stepx; - - if ((dev->accel_bpp == 8) || ((dev->accel_bpp == 24) && (mach->accel.patt_len >= 3) && (mono_src != 1))) - mach->accel.color_pattern_idx = (mach->accel.color_pattern_idx + mach->accel.stepx) & mach->accel.patt_len; - - if ((dev->accel_bpp == 24) && (mach->accel.color_pattern_idx == mach->accel.patt_len) && (mach->accel.patt_len >= 3) && (mono_src != 1)) { - mach->accel.color_pattern_idx = mach->accel.patt_data_idx; - } else if ((dev->accel_bpp == 24) && (mach->accel.patt_len < 3)) { - if (mach->accel.patt_len == 2) { - mach->accel.color_pattern_idx++; - if (mach->accel.color_pattern_idx == 3) - mach->accel.color_pattern_idx = 0; - } else - mach->accel.color_pattern_idx = (mach->accel.color_pattern_idx + mach->accel.stepx) & mach->accel.patt_len; - - } else if ((dev->accel_bpp == 24) && (mach->accel.patt_len_reg & 0x4000) && (frgd_sel == 5)) { + if (dev->bpp) + mach->accel.color_pattern_idx += 2; + else mach->accel.color_pattern_idx++; - if (mach->accel.color_pattern_idx == 3) + + if ((mono_src == 1) && !mach->accel.mono_pattern_enable && !mach->accel.block_write_mono_pattern_enable && (frgd_sel == 5) && (dev->accel_bpp == 24)) { + if (mach->accel.color_pattern_idx > 2) + mach->accel.color_pattern_idx = 0; + } else { + if (mach->accel.color_pattern_idx > mach->accel.patt_len) mach->accel.color_pattern_idx = 0; } - if (dev->bpp) { - mach->accel.color_pattern_idx = (mach->accel.color_pattern_idx + mach->accel.stepx) & mach->accel.patt_len; - mach->accel.color_pattern_idx = (mach->accel.color_pattern_idx + mach->accel.stepx) & mach->accel.patt_len; - } - + dev->accel.dx += mach->accel.stepx; dev->accel.sx++; if ((dev->accel.sx >= mach->accel.width) || (dev->accel.dx >= 0x600)) { dev->accel.sx = 0; - if (mach->accel.stepx == -1) + if (mach->accel.stepx < 0) dev->accel.dx += mach->accel.width; else dev->accel.dx -= mach->accel.width; @@ -1222,27 +1203,19 @@ skip_dx: dev->accel.sy++; mach->accel.poly_fill = 0; - 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 ((mono_src == 1) && (dev->accel_bpp == 24) && (frgd_sel == 5)) - mach->accel.color_pattern_idx = 0; - else - mach->accel.color_pattern_idx = ((dev->accel.dx + (dev->accel.dy << 3)) & mach->accel.patt_len); - - if ((dev->accel_bpp == 24) && (mach->accel.color_pattern_idx == mach->accel.patt_len) && (mono_src != 1)) - mach->accel.color_pattern_idx = 0; - if ((mono_src == 1) && !mach->accel.mono_pattern_enable && !(mach->accel.patt_len_reg & 0x4000)) { - dev->accel.cur_x = dev->accel.dx; - dev->accel.cur_y = dev->accel.dy; - return; + 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->accel.sy >= mach->accel.height) { - if ((mono_src == 2) || (mono_src == 3) || (frgd_sel == 3) || (bkgd_sel == 3) || (mach->accel.dp_config & 0x02) || (mach->accel.linedraw_opt & 0x02)) + 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) && (mach->accel.patt_len_reg & 0x4000)) + if ((mono_src == 1) && (frgd_sel == 5) && (dev->accel_bpp == 24)) return; dev->accel.cur_x = dev->accel.dx; dev->accel.cur_y = dev->accel.dy; @@ -1290,18 +1263,12 @@ skip_dx: } } - if (frgd_sel == 5) { - for (int x = 0; x <= mach->accel.patt_len; x++) { - mach->accel.color_pattern[x] = mach->accel.patt_data[x & mach->accel.patt_len]; - } - } - if (mono_src == 1) { - mix_dat = mach->accel.patt_data[0x10]; + mix_dat = mach->accel.mono_pattern_normal[0]; dev->accel.temp_cnt = 8; } - count = (dev->accel.dx > dev->accel.dy) ? (dev->accel.dx >> 1) : (dev->accel.dy >> 1); + count = (dev->accel.dx > dev->accel.dy) ? (dev->accel.dx >> 1) : (dev->accel.dy >> 1); mach->accel.width = count; if (dev->accel.dx > dev->accel.dy) { @@ -1317,7 +1284,10 @@ skip_dx: mix_dat <<= 1; mix_dat |= 1; - if ((dev->accel.cx >= clip_l) && (dev->accel.cx <= clip_r) && (dev->accel.cy >= clip_t) && (dev->accel.cy <= clip_b)) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { mach->accel.clip_overrun = 0; switch (mix ? frgd_sel : bkgd_sel) { case 0: @@ -1336,10 +1306,9 @@ skip_dx: src_dat = 0; break; case 5: - if (mix) - src_dat = mach->accel.color_pattern[((dev->accel.cx) + ((dev->accel.cy) << 3)) & mach->accel.patt_len]; - else - src_dat = 0; + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; + if (dev->bpp) + src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); break; default: @@ -1404,6 +1373,14 @@ skip_dx: else cpu_dat >>= 8; + 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 (mach->accel.err >= 0) { dev->accel.cy += mach->accel.stepy; mach->accel.err -= dev->accel.dx; @@ -1438,12 +1415,19 @@ skip_dx: break; } - if ((dev->accel.cx >= clip_l) && (dev->accel.cx <= clip_r) && (dev->accel.cy >= clip_t) && (dev->accel.cy <= clip_b)) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { mach->accel.clip_overrun = 0; if (mach->accel.linedraw_opt & 0x02) { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); + if (dev->bpp) { + READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); + } else { + READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), poly_src); + } if (poly_src) - mach->accel.poly_fill = !mach->accel.poly_fill; + mach->accel.poly_fill ^= 1; } switch (mix ? frgd_sel : bkgd_sel) { @@ -1464,20 +1448,23 @@ skip_dx: } break; case 5: - if (mix) { - src_dat = mach->accel.color_pattern[((dev->accel.cx) + ((dev->accel.cy) << 3)) & mach->accel.patt_len]; - } else - src_dat = 0; + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; + if (dev->bpp) + src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); break; default: break; } - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + if (mach->accel.linedraw_opt & 0x02) { + if (dev->bpp) { + READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } else { + READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + READ(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } switch (compare_mode) { @@ -1520,17 +1507,25 @@ skip_dx: if ((mach->accel.dp_config & 0x10) && (cmd_type == 3)) { if (mach->accel.linedraw_opt & 0x04) { if (dev->accel.sx < mach->accel.width) { + if (mach->accel.linedraw_opt & 0x02) { + if (dev->bpp) { + WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } else { + WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } + } else { + WRITE(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } + } + } else { + if (mach->accel.linedraw_opt & 0x02) { if (dev->bpp) { WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } else { WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } - } - } else { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + WRITE(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } } } @@ -1545,6 +1540,14 @@ skip_dx: else cpu_dat >>= 8; + 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 (mach->accel.err >= 0) { dev->accel.cy += mach->accel.stepy; mach->accel.err -= dev->accel.dx; @@ -1568,7 +1571,10 @@ skip_dx: mix_dat <<= 1; mix_dat |= 1; - if ((dev->accel.cx >= clip_l) && (dev->accel.cx <= clip_r) && (dev->accel.cy >= clip_t) && (dev->accel.cy <= clip_b)) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { mach->accel.clip_overrun = 0; switch (mix ? frgd_sel : bkgd_sel) { case 0: @@ -1588,10 +1594,9 @@ skip_dx: } break; case 5: - if (mix) { - src_dat = mach->accel.color_pattern[((dev->accel.cx) + ((dev->accel.cy) << 3)) & mach->accel.patt_len]; - } else - src_dat = 0; + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; + if (dev->bpp) + src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); break; default: @@ -1656,6 +1661,14 @@ skip_dx: else cpu_dat >>= 8; + 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 (mach->accel.err >= 0) { dev->accel.cx += mach->accel.stepx; mach->accel.err -= dev->accel.dy; @@ -1690,9 +1703,11 @@ skip_dx: break; } - if ((dev->accel.cx >= clip_l) && (dev->accel.cx <= clip_r) && (dev->accel.cy >= clip_t) && (dev->accel.cy <= clip_b)) { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) { mach->accel.clip_overrun = 0; - switch (mix ? frgd_sel : bkgd_sel) { case 0: src_dat = dev->accel.bkgd_color; @@ -1711,20 +1726,23 @@ skip_dx: } break; case 5: - if (mix) { - src_dat = mach->accel.color_pattern[((dev->accel.cx) + ((dev->accel.cy) << 3)) & mach->accel.patt_len]; - } else - src_dat = 0; + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; + if (dev->bpp) + src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); break; default: break; } - if (dev->bpp) { - READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + if (mach->accel.linedraw_opt & 0x02) { + if (dev->bpp) { + READ((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } else { + READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } } else { - READ((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + READ(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } switch (compare_mode) { @@ -1765,17 +1783,25 @@ skip_dx: if ((mach->accel.dp_config & 0x10) && (cmd_type == 3)) { if (mach->accel.linedraw_opt & 0x04) { if (dev->accel.sx < mach->accel.width) { + if (mach->accel.linedraw_opt & 0x02) { + if (dev->bpp) { + WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } else { + WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + } + } else { + WRITE((dev->accel.cy * dev->pitch) + dev->accel.cx, dest_dat); + } + } + } else { + if (mach->accel.linedraw_opt & 0x02) { if (dev->bpp) { WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } else { WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } - } - } else { - if (dev->bpp) { - WRITE((mach->accel.ge_offset << 1) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } else { - WRITE((mach->accel.ge_offset << 2) + ((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); + WRITE(((dev->accel.cy) * (dev->pitch)) + (dev->accel.cx), dest_dat); } } } @@ -1790,6 +1816,14 @@ skip_dx: else cpu_dat >>= 8; + 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 (mach->accel.err >= 0) { dev->accel.cx += mach->accel.stepx; mach->accel.err -= dev->accel.dy; @@ -1842,8 +1876,6 @@ skip_dx: } dev->accel.sx = 0; - if ((dev->accel_bpp == 24) && (mach->accel.patt_len < 0x17)) - mach->accel.color_pattern_idx = 0; /*Step Y*/ mach->accel.dy_start = dev->accel.cur_y; @@ -1853,13 +1885,12 @@ skip_dx: if (mach->accel.dest_y_end >= 0x600) mach->accel.dy_end |= ~0x5ff; - if (mach->accel.dy_end > mach->accel.dy_start) { + if (mach->accel.dy_end > mach->accel.dy_start) mach->accel.stepy = 1; - } else if (mach->accel.dy_end < mach->accel.dy_start) { + else if (mach->accel.dy_end < mach->accel.dy_start) mach->accel.stepy = -1; - } else { + else mach->accel.stepy = 0; - } if (dev->bpp) dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * (dev->pitch)); @@ -1903,22 +1934,7 @@ skip_dx: else dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch)); - if ((dev->accel_bpp == 24) && (frgd_sel == 5)) { - if (mach->accel.patt_len == 0x17) - mach->accel.color_pattern_idx = 0; - 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; - } else - mach_log("ScanToX=%04x, Pitch=%d, C(%d,%d), SRCWidth=%d, WH(%d,%d), geoffset=%08x.\n", mach->accel.dp_config, dev->ext_pitch, dev->accel.cx, dev->accel.cy, mach->accel.src_width, mach->accel.width, mach->accel.height, (mach->accel.ge_offset << 1)); - - dev->accel.y1 = 0; + mach_log("ScanToX=%04x, MonoSRC=%d, FrgdSel=%d, BkgdSel=%d, Pitch=%d, C(%d,%d), SRCWidth=%d, WH(%d,%d), colorpattidx=%d, pattlen=%d.\n", mach->accel.dp_config, mono_src, frgd_sel, bkgd_sel, dev->ext_pitch, dev->accel.cx, dev->accel.cy, mach->accel.src_width, mach->accel.width, mach->accel.height, mach->accel.color_pattern_idx, mach->accel.patt_len); if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) { if (mach_pixel_write(mach)) { @@ -1935,30 +1951,10 @@ skip_dx: if (mono_src == 1) { count = mach->accel.width; - mix_dat = mach->accel.patt_data[0x10]; + mix_dat = mach->accel.mono_pattern_normal[0]; dev->accel.temp_cnt = 8; } - if (frgd_sel == 5) { - if (dev->accel_bpp != 24) { - for (int x = 0; x <= mach->accel.patt_len; x++) { - mach->accel.color_pattern[x] = mach->accel.patt_data[x & mach->accel.patt_len]; - } - } else { - if (mach->accel.patt_len == 0x17) { - for (int x = 0; x <= mach->accel.patt_len; x++) { - mach->accel.color_pattern_full[x] = mach->accel.patt_data[x]; - mach_log("ScanToX: Color Pattern 24bpp[%d]=%02x, dataidx=%d, pattlen=%d.\n", x, mach->accel.color_pattern_full[x], mach->accel.patt_data_idx, mach->accel.patt_len); - } - } else { - for (int x = 0; x <= mach->accel.patt_len; x++) { - mach->accel.color_pattern[x] = mach->accel.patt_data[x]; - mach_log("ScanToX: Color Pattern 24bpp[%d]=%02x, dataidx=%d, pattlen=%d.\n", x, mach->accel.color_pattern[x], mach->accel.patt_data_idx, mach->accel.patt_len); - } - } - } - } - while (count--) { switch (mono_src) { case 0: @@ -1998,7 +1994,10 @@ skip_dx: break; } - if (((dev->accel.dx) >= clip_l) && ((dev->accel.dx) <= clip_r) && ((dev->accel.dy) >= clip_t) && ((dev->accel.dy) <= 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 ? frgd_sel : bkgd_sel) { case 0: src_dat = dev->accel.bkgd_color; @@ -2019,16 +2018,9 @@ skip_dx: } break; case 5: - if (mix) { - if (dev->accel_bpp == 24) { - if (mach->accel.patt_len == 0x17) - src_dat = mach->accel.color_pattern_full[mach->accel.color_pattern_idx]; - else - src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; - } else - src_dat = mach->accel.color_pattern[(dev->accel.dx + (dev->accel.dy << 3)) & mach->accel.patt_len]; - } else - src_dat = 0; + src_dat = mach->accel.color_pattern[mach->accel.color_pattern_idx]; + if (dev->bpp) + src_dat |= (mach->accel.color_pattern[mach->accel.color_pattern_idx + 1] << 8); break; default: @@ -2073,7 +2065,7 @@ skip_dx: } if (mach->accel.dp_config & 0x10) { - WRITE(dev->accel.dest + (dev->accel.dx), dest_dat); + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } } @@ -2097,23 +2089,15 @@ skip_dx: dev->accel.src = (mach->accel.ge_offset << 2) + (dev->accel.cy * (dev->pitch)); } - dev->accel.dx += mach->accel.stepx; - if ((dev->accel_bpp == 24) && (mach->accel.patt_len == 0x17)) { + if (dev->bpp) + mach->accel.color_pattern_idx += 2; + else mach->accel.color_pattern_idx++; - 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 ((dev->accel_bpp == 24) && (mach->accel.patt_len < 3)) { - mach->accel.color_pattern_idx++; - if (mach->accel.color_pattern_idx == 3) - mach->accel.color_pattern_idx = 0; - } else - mach->accel.color_pattern_idx = (mach->accel.color_pattern_idx + mach->accel.stepx) & mach->accel.patt_len; + 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++; if (dev->accel.sx >= mach->accel.width) { dev->accel.sx = 0; @@ -2142,21 +2126,26 @@ mach_accel_out_pixtrans(mach_t *mach, ibm8514_t *dev, uint16_t val) int frgd_sel; int bkgd_sel; int mono_src; + int swap = 0; frgd_sel = (mach->accel.dp_config >> 13) & 7; bkgd_sel = (mach->accel.dp_config >> 7) & 3; mono_src = (mach->accel.dp_config >> 5) & 3; - if ((mach->accel.dp_config & 4) && (mach->accel.cmd_type != 5)) { + if ((mach->accel.dp_config & 0x04) && (mach->accel.cmd_type != 5)) { + mach_log("Read Host Monochrome Data.\n"); val = (val >> 8) | (val << 8); + swap = 1; } switch (mach->accel.dp_config & 0x200) { case 0x000: /*8-bit size*/ if (mono_src == 2) { if ((frgd_sel != 2) && (bkgd_sel != 2)) { - if (mach->accel.dp_config & 0x1000) + if ((mach->accel.dp_config & 0x1000) && !swap) { + mach_log("8-bit bus size swap.\n"); val = (val >> 8) | (val << 8); + } mach_accel_start(mach->accel.cmd_type, 1, 8, val | (val << 16), 0, mach, dev); } else mach_accel_start(mach->accel.cmd_type, 1, 1, -1, val | (val << 16), mach, dev); @@ -2166,8 +2155,10 @@ mach_accel_out_pixtrans(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) + if ((mach->accel.dp_config & 0x1000) && !swap) { + mach_log("16-bit bus size swap.\n"); val = (val >> 8) | (val << 8); + } mach_accel_start(mach->accel.cmd_type, 1, 16, val | (val << 16), 0, mach, dev); } else mach_accel_start(mach->accel.cmd_type, 1, 2, -1, val | (val << 16), mach, dev); @@ -2231,15 +2222,15 @@ mach_out(uint16_t addr, uint8_t val, void *priv) mach->bank_r |= ((mach->regs[0xae] & 0x0c) << 2); mach->bank_w |= ((mach->regs[0xae] & 3) << 4); } - if (dev->on[0] || dev->on[1]) + if (dev->on) 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 ((dev->local & 0xff) >= 0x02) mach->bank_w |= ((mach->regs[0xae] & 3) << 4); - } + mach->bank_r = mach->bank_w; - if (dev->on[0] || dev->on[1]) + if (dev->on) mach_log("Single B2Bank = %02x, AEbank = %02x.\n", mach->regs[0xb2], mach->regs[0xae]); } svga->read_bank = mach->bank_r << 16; @@ -2356,7 +2347,7 @@ mach_in(uint16_t addr, void *priv) if (((addr & 0xFFF0) == 0x3D0 || (addr & 0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; - if ((addr >= 0x3c6) && (addr <= 0x3c9) && (dev->on[0] || dev->on[1])) + if ((addr >= 0x3c6) && (addr <= 0x3c9) && dev->on) addr -= 0xdc; switch (addr) { @@ -2457,8 +2448,8 @@ ati8514_recalctimings(svga_t *svga) mach_t *mach = (mach_t *) svga->ext8514; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - mach_log("ON0=%d, ON1=%d, vgahdisp=%d.\n", dev->on[0], dev->on[1], svga->hdisp); - if (dev->on[0] || dev->on[1]) { + mach_log("ON=%d, vgahdisp=%d.\n", dev->on, svga->hdisp); + if (dev->on) { mach_log("8514/A ON.\n"); dev->h_total = dev->htotal + 1; dev->rowcount = !!(dev->disp_cntl & 0x08); @@ -2466,17 +2457,18 @@ ati8514_recalctimings(svga_t *svga) mach->accel.ge_offset = dev->accel.ge_offset; mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0xfe); - if (dev->accel.advfunc_cntl & 0x01) { + + if (dev->hdisp) { + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; + } else { if (dev->accel.advfunc_cntl & 0x04) { - dev->h_disp = dev->hdisp; - dev->dispend = dev->vdisp; + dev->h_disp = 1024; + dev->dispend = 768; } else { dev->h_disp = 640; dev->dispend = 480; } - } else { - dev->h_disp = dev->hdisp; - dev->dispend = dev->vdisp; } if (dev->accel.advfunc_cntl & 0x04) @@ -2500,6 +2492,16 @@ ati8514_recalctimings(svga_t *svga) dev->rowoffset = dev->ext_crt_pitch; 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); svga->map8 = dev->pallook; + if (dev->vram_512k_8514) { + if (dev->h_disp == 640) { + dev->ext_pitch = 640; + dev->pitch = dev->ext_pitch; + } else { + dev->ext_pitch = 1024; + dev->pitch = dev->ext_pitch; + } + } + dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; } else { if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/ @@ -2567,17 +2569,39 @@ mach_recalctimings(svga_t *svga) } svga->render8514 = ibm8514_render_blank; - mach_log("ON[0]=%d, ON[1]=%d, exton[0]=%d, exton[1]=%d, vendormode0=%d, vendormode1=%d.\n", dev->on[0], dev->on[1], mach->ext_on[0], mach->ext_on[1], dev->vendor_mode[0], dev->vendor_mode[1]); - if (dev->on[0] || dev->on[1]) { - mach_log("8514/A ON.\n"); + if (dev->on) { + mach_log("8514/A ON, extpitch=%d, devma=%x, vgamalatch=%x.\n", dev->ext_pitch, dev->ma, svga->ma_latch); + dev->pitch = dev->ext_pitch; + dev->rowoffset = dev->ext_crt_pitch; dev->h_total = dev->htotal + 1; 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("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0xfe); - if (!dev->bpp) { - if (dev->accel.advfunc_cntl & 0x01) { + if ((dev->local & 0xff) >= 0x02) { + if (dev->bpp || (dev->accel_bpp >= 24) || (mach->accel.clock_sel & 0x01)) { + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; + } else { + if (dev->interlace) { /*Interlaced displays are only for 800x600 and up.*/ + if (dev->accel.advfunc_cntl & 0x04) { + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; + } else { + dev->h_disp = 640; + dev->dispend = 480; + } + } else { + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; + } + } + } else { + if (mach->accel.clock_sel & 0x01) { + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; + } else { if (dev->accel.advfunc_cntl & 0x04) { dev->h_disp = dev->hdisp; dev->dispend = dev->vdisp; @@ -2585,13 +2609,7 @@ mach_recalctimings(svga_t *svga) dev->h_disp = 640; dev->dispend = 480; } - } else { - dev->h_disp = dev->hdisp; - dev->dispend = dev->vdisp; } - } else { - dev->h_disp = dev->hdisp; - dev->dispend = dev->vdisp; } svga->clock8514 = (cpuclock * (double) (1ULL << 32)) / svga->getclock((mach->accel.clock_sel >> 2) & 0x0f, svga->clock_gen); @@ -2614,9 +2632,7 @@ mach_recalctimings(svga_t *svga) dev->dispend += 2; if ((dev->local & 0xff) >= 0x02) { - mach_log("HDISP=%d.\n", dev->h_disp); - dev->pitch = dev->ext_pitch; - dev->rowoffset = dev->ext_crt_pitch; + mach_log("HDISP=%d, mask=%02x.\n", dev->h_disp, dev->dac_mask); if ((mach->accel.ext_ge_config & 0x800) || (!(mach->accel.ext_ge_config & 0x8000) && !(mach->accel.ext_ge_config & 0x800))) { if ((mach->accel.ext_ge_config & 0x30) == 0x20) { if ((mach->accel.ext_ge_config & 0xc0) == 0x40) @@ -2628,9 +2644,20 @@ mach_recalctimings(svga_t *svga) dev->accel_bpp = 32; else dev->accel_bpp = 24; - } else + } else if ((mach->accel.ext_ge_config & 0x30) == 0x10) dev->accel_bpp = 8; - + else { + if (dev->vram_512k_8514) { + if (dev->h_disp == 640) { + dev->ext_pitch = 640; + dev->pitch = dev->ext_pitch; + } else { + dev->ext_pitch = 1024; + dev->pitch = dev->ext_pitch; + } + } + dev->accel_bpp = 8; + } mach_log("hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, bpp=%d, shadow=%x, vgahdisp=%d.\n", 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); switch (dev->accel_bpp) { case 8: @@ -2662,10 +2689,18 @@ mach_recalctimings(svga_t *svga) } } } else { - dev->pitch = dev->ext_pitch; - dev->rowoffset = dev->ext_crt_pitch; 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); svga->map8 = dev->pallook; + if (dev->vram_512k_8514) { + if (dev->h_disp == 640) { + dev->ext_pitch = 640; + dev->pitch = dev->ext_pitch; + } else { + dev->ext_pitch = 1024; + dev->pitch = dev->ext_pitch; + } + } + dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; } } @@ -2744,155 +2779,63 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u switch (port) { case 0x82e8: - case 0x82e9: case 0x86e8: case 0x86e9: case 0xc2e8: - case 0xc2e9: case 0xc6e8: - case 0xc6e9: ibm8514_accel_out_fifo(svga, port, val, len); break; case 0xf6ee: ibm8514_accel_out_fifo(svga, 0x82e8, val, len); break; - case 0xf6ef: - ibm8514_accel_out_fifo(svga, 0x82e9, val, len); - break; case 0x8ae8: case 0xcae8: ibm8514_accel_out_fifo(svga, port, val, len); - if (len != 1) - mach->accel.src_y = val; - break; - case 0x8ae9: - case 0x8ee9: - case 0xcae9: - case 0xcee9: - ibm8514_accel_out_fifo(svga, port, val, len); + if (len == 2) { + mach_log("SRCY=%d.\n", val & 0x07ff); + mach->accel.src_y = val & 0x07ff; + } break; case 0x8ee8: case 0xcee8: ibm8514_accel_out_fifo(svga, port, val, len); - if (len != 1) - mach->accel.src_x = val; + if (len == 2) { + mach_log("SRCX=%d.\n", val & 0x07ff); + mach->accel.src_x = val & 0x07ff; + } break; case 0x92e8: - case 0x92e9: - case 0x96e9: case 0xd2e8: - case 0xd2e9: - case 0xd6e9: ibm8514_accel_out_fifo(svga, port, val, len); break; case 0x96e8: case 0xd6e8: ibm8514_accel_out_fifo(svga, port, val, len); - if (len != 1) + if (len == 2) mach->accel.test = val & 0x1fff; break; case 0x9ae8: case 0xdae8: - dev->accel.ssv_state = 0; - if (len == 1) - dev->accel.cmd = (dev->accel.cmd & 0xff00) | val; - else { - dev->data_available = 0; - dev->data_available2 = 0; - dev->accel.cmd = val; - mach_log("CMD8514=%04x, len=%d, pixcntl=%02x.\n", val, len, dev->accel.multifunc[0x0a]); - mach->accel.cmd_type = -1; - if (port == 0xdae8) { - if (dev->accel.cmd & 0x100) - dev->accel.cmd_back = 0; - } - ibm8514_accel_start(-1, 0, -1, 0, svga, len); - } - break; - case 0x9ae9: - case 0xdae9: - if (len == 1) { - dev->data_available = 0; - dev->data_available2 = 0; - dev->accel.cmd = (dev->accel.cmd & 0xff) | (val << 8); - mach->accel.cmd_type = -1; - if (port == 0xdae9) { - if (dev->accel.cmd & 0x100) - dev->accel.cmd_back = 0; - } - ibm8514_accel_start(-1, 0, -1, 0, svga, len); - } + mach->accel.cmd_type = -1; + ibm8514_accel_out_fifo(svga, port, val, len); break; case 0x9ee8: case 0xdee8: - dev->accel.ssv_state = 1; - if (len == 1) - dev->accel.short_stroke = (dev->accel.short_stroke & 0xff00) | val; - else { - dev->accel.short_stroke = val; - dev->accel.cx = dev->accel.cur_x; - dev->accel.cy = dev->accel.cur_y; - - if (dev->accel.cur_x >= 0x600) - dev->accel.cx |= ~0x5ff; - - if (dev->accel.cur_y >= 0x600) - dev->accel.cy |= ~0x5ff; - - if (dev->accel.cmd & 0x1000) { - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke & 0xff, len); - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke >> 8, len); - } else { - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke >> 8, len); - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke & 0xff, len); - } - } - break; - case 0x9ee9: - case 0xdee9: - if (len == 1) { - dev->accel.short_stroke = (dev->accel.short_stroke & 0xff) | (val << 8); - dev->accel.cx = dev->accel.cur_x; - dev->accel.cy = dev->accel.cur_y; - - if (dev->accel.cur_x >= 0x600) { - dev->accel.cx |= ~0x5ff; - } - if (dev->accel.cur_y >= 0x600) { - dev->accel.cy |= ~0x5ff; - } - - if (dev->accel.cmd & 0x1000) { - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke & 0xff, len); - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke >> 8, len); - } else { - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke >> 8, len); - ibm8514_short_stroke_start(-1, 0, -1, 0, svga, dev->accel.short_stroke & 0xff, len); - } - } + ibm8514_accel_out_fifo(svga, port, val, len); break; case 0xa2e8: case 0xe2e8: if (port == 0xe2e8) { - if (dev->accel.cmd_back) { - if (len == 1) - dev->accel.bkgd_color = (dev->accel.bkgd_color & 0x00ff) | val; - else + if (len == 2) { + if (dev->accel.cmd_back) { dev->accel.bkgd_color = val; - } else { - if (len == 1) { - if (mach->accel.cmd_type >= 0) { - if (mach_pixel_read(mach)) - break; - mach->accel.pix_trans[1] = val; - } } else { if (mach->accel.cmd_type >= 0) { if (mach_pixel_read(mach)) @@ -2904,80 +2847,25 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u ibm8514_accel_out_pixtrans(svga, port, val, len); } } - } - } else { - if (len == 1) - dev->accel.bkgd_color = (dev->accel.bkgd_color & 0x00ff) | val; - else - dev->accel.bkgd_color = val; - } - break; - case 0xa2e9: - case 0xe2e9: - if (port == 0xe2e9) { - if (dev->accel.cmd_back) { - if (len == 1) - dev->accel.bkgd_color = (dev->accel.bkgd_color & 0xff00) | (val << 8); } else { - if (len == 1) { - 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; - - 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, mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 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, mach, dev); - else - mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); - break; - - default: - break; - } - } + if (mach->accel.cmd_type >= 0) { + if (mach_pixel_read(mach)) + break; + mach->accel.pix_trans[1] = val; } } } else { - if (len == 1) - dev->accel.bkgd_color = (dev->accel.bkgd_color & 0xff00) | (val << 8); + if (len == 2) + dev->accel.bkgd_color = val; } break; case 0xa6e8: case 0xe6e8: if (port == 0xe6e8) { - if (dev->accel.cmd_back) { - if (len == 1) - dev->accel.frgd_color = (dev->accel.frgd_color & 0x00ff) | val; - else + if (len == 2) { + if (dev->accel.cmd_back) { dev->accel.frgd_color = val; - } else { - if (len == 1) { - if (mach->accel.cmd_type >= 0) { - if (mach_pixel_read(mach)) - break; - mach->accel.pix_trans[1] = val; - } } else { if (mach->accel.cmd_type >= 0) { if (mach_pixel_read(mach)) @@ -2989,62 +2877,58 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u ibm8514_accel_out_pixtrans(svga, port, val, len); } } - } - } else { - if (len == 1) - dev->accel.frgd_color = (dev->accel.frgd_color & 0x00ff) | val; - else - dev->accel.frgd_color = val; - } - break; - case 0xa6e9: - case 0xe6e9: - if (port == 0xe6e9) { - if (dev->accel.cmd_back) { - if (len == 1) - dev->accel.frgd_color = (dev->accel.frgd_color & 0xff00) | (val << 8); } else { - if (len == 1) { - 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; - - 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, mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 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, mach, dev); - else - mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); - } else - mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); - break; - - default: - break; - } - } + if (mach->accel.cmd_type >= 0) { + if (mach_pixel_read(mach)) + break; + mach->accel.pix_trans[1] = val; } } } else { - if (len == 1) - dev->accel.frgd_color = (dev->accel.frgd_color & 0xff00) | (val << 8); + if (len == 2) + dev->accel.frgd_color = val; + } + break; + + case 0xe2e9: + 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; + 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, mach, dev); + } else + mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); + } else + mach_accel_start(mach->accel.cmd_type, 1, 1, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 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, mach, dev); + else + mach_accel_start(mach->accel.cmd_type, 1, 16, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), 0, mach, dev); + } else + mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); + } else + mach_accel_start(mach->accel.cmd_type, 1, 2, -1, mach->accel.pix_trans[0] | (mach->accel.pix_trans[1] << 8), mach, dev); + break; + + default: + break; + } + } } break; @@ -3069,118 +2953,47 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xbee8: case 0xfee8: - if (len == 1) - dev->accel.multifunc_cntl = (dev->accel.multifunc_cntl & 0xff00) | val; - else { - dev->accel.multifunc_cntl = val; - dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff; - if ((dev->accel.multifunc_cntl >> 12) == 1) - dev->accel.clip_top = val & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 2) - dev->accel.clip_left = val & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 3) - dev->accel.multifunc[3] = val & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 4) - dev->accel.multifunc[4] = val & 0x7ff; - - mach_log("CLIPBOTTOM=%d, CLIPRIGHT=%d, bpp=%d, pitch=%d.\n", dev->accel.multifunc[3], dev->accel.multifunc[4], dev->accel_bpp, dev->pitch); + ibm8514_accel_out_fifo(svga, port, val, len); + if (len == 2) { if ((dev->accel.multifunc_cntl >> 12) == 5) { if ((dev->local & 0xff) < 0x02) dev->ext_crt_pitch = 128; } - if (port == 0xfee8) - dev->accel.cmd_back = 1; - else - dev->accel.cmd_back = 0; - } - break; - case 0xbee9: - case 0xfee9: - if (len == 1) { - dev->accel.multifunc_cntl = (dev->accel.multifunc_cntl & 0xff) | (val << 8); - dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff; - if ((dev->accel.multifunc_cntl >> 12) == 1) - dev->accel.clip_top = dev->accel.multifunc_cntl & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 2) - dev->accel.clip_left = dev->accel.multifunc_cntl & 0x7ff; - - if ((dev->accel.multifunc_cntl >> 12) == 5) { - if ((dev->local & 0xff) < 0x02) - dev->ext_crt_pitch = 128; - } - if (port == 0xfee9) - dev->accel.cmd_back = 1; - else - dev->accel.cmd_back = 0; } break; /*ATI Mach8/32 specific registers*/ case 0x82ee: - mach->accel.patt_data_idx = val & 0x1f; - mach_log("Pattern Data Index = %d.\n", val & 0x1f); + mach->accel.patt_data_idx_reg = val & 0x1f; + mach->accel.patt_data_idx = mach->accel.patt_data_idx_reg; + + if (mach->accel.patt_data_idx_reg < 0x10) + mach->accel.color_pattern_idx = mach->accel.patt_idx; + else + mach->accel.color_pattern_idx = 0; + + mach_log("Write Port 82ee: Pattern Data Index=%d.\n", val & 0x1f); break; case 0x8eee: - if (len == 1) - mach->accel.patt_data[mach->accel.patt_data_idx] = val; - else { - mach->accel.patt_data[mach->accel.patt_data_idx] = val & 0xff; - mach->accel.patt_data[mach->accel.patt_data_idx + 1] = (val >> 8) & 0xff; - if (mach->accel.mono_pattern_enable) - mach->accel.patt_data_idx = (mach->accel.patt_data_idx + 2) & 0x17; - else { - frgd_sel = (mach->accel.dp_config >> 13) & 7; - mono_src = (mach->accel.dp_config >> 5) & 3; - if ((dev->accel_bpp == 24) && (mach->accel.patt_len == 0x17) && (frgd_sel == 5)) { - mach->accel.patt_data_idx += 2; - dev->accel.y1 = 1; - } else { - if (dev->accel_bpp == 24) - mach->accel.patt_data_idx += 2; - else - mach->accel.patt_data_idx = (mach->accel.patt_data_idx + 2) & mach->accel.patt_len; - } - mach_log("ExtCONFIG = %04x, Pattern Mono = %04x, selidx = %d, dataidx = %d, bit 0 = %02x len = %d.\n", mach->accel.ext_ge_config, val, mach->accel.patt_idx, mach->accel.patt_data_idx, val & 1, mach->accel.patt_len); - } - } - break; - case 0x8eef: - if (len == 1) { - mach->accel.patt_data[mach->accel.patt_data_idx + 1] = val; - if (mach->accel.mono_pattern_enable) - mach->accel.patt_data_idx = (mach->accel.patt_data_idx + 2) & 7; - else { - frgd_sel = (mach->accel.dp_config >> 13) & 7; - if ((dev->accel_bpp == 24) && (mach->accel.patt_len == 0x17) && (frgd_sel == 5)) { - mach->accel.patt_data_idx += 2; - dev->accel.y1 = 1; - } else - mach->accel.patt_data_idx = (mach->accel.patt_data_idx + 2) & mach->accel.patt_len; + if (len == 2) { + 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); + } 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; + mach_log("Write Port 8eee: Mono Pattern Word Data[%d]=%04x.\n", mach->accel.patt_data_idx - 0x10, val); } + mach->accel.patt_data_idx += 2; } break; case 0x96ee: - if (len == 1) - mach->accel.bres_count = (mach->accel.bres_count & 0x700) | val; - else { + if (len == 2) { mach->accel.bres_count = val & 0x7ff; - mach_log("BresenhamDraw = %04x.\n", mach->accel.dp_config); - dev->data_available = 0; - dev->data_available2 = 0; - mach->accel.cmd_type = 1; - mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); - } - break; - case 0x96ef: - if (len == 1) { - mach->accel.bres_count = (mach->accel.bres_count & 0xff) | ((val & 0x07) << 8); - mach_log("96EE (2) line draw.\n"); + mach_log("BresenhamDraw=%04x.\n", mach->accel.dp_config); dev->data_available = 0; dev->data_available2 = 0; mach->accel.cmd_type = 1; @@ -3193,15 +3006,13 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xa2ee: - mach_log("Line OPT = %04x\n", val); - if (len == 1) - mach->accel.linedraw_opt = (mach->accel.linedraw_opt & 0xff00) | val; - else { + mach_log("Line OPT=%04x.\n", val); + if (len == 2) { mach->accel.linedraw_opt = val; - mach->accel.bbottom = dev->accel.multifunc[3] & 0x7ff; - mach->accel.btop = dev->accel.clip_top & 0x7ff; - mach->accel.bleft = dev->accel.clip_left & 0x7ff; - mach->accel.bright = dev->accel.multifunc[4] & 0x7ff; + mach->accel.bbottom = dev->accel.multifunc[3]; + mach->accel.btop = dev->accel.multifunc[1]; + mach->accel.bleft = dev->accel.multifunc[2]; + mach->accel.bright = dev->accel.multifunc[4]; if (mach->accel.linedraw_opt & 0x100) { mach->accel.bbottom = 2047; mach->accel.btop = 0; @@ -3210,88 +3021,50 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u } } break; - case 0xa2ef: - if (len == 1) - mach->accel.linedraw_opt = (mach->accel.linedraw_opt & 0x00ff) | (val << 8); - break; case 0xa6ee: - if (len == 1) - mach->accel.dest_x_start = (mach->accel.dest_x_start & 0x700) | val; - else + if (len == 2) mach->accel.dest_x_start = val & 0x7ff; break; - case 0xa6ef: - if (len == 1) - mach->accel.dest_x_start = (mach->accel.dest_x_start & 0x0ff) | ((val & 0x07) << 8); - break; case 0xaaee: - if (len == 1) - mach->accel.dest_x_end = (mach->accel.dest_x_end & 0x700) | val; - else + if (len == 2) mach->accel.dest_x_end = val & 0x7ff; break; - case 0xaaef: - if (len == 1) - mach->accel.dest_x_end = (mach->accel.dest_x_end & 0x0ff) | ((val & 0x07) << 8); - break; case 0xaeee: - if (len == 1) - mach->accel.dest_y_end = (mach->accel.dest_y_end & 0x700) | val; - else { + if (len == 2) { mach->accel.dest_y_end = val & 0x7ff; if ((val + 1) == 0x10000) { - mach_log("Dest_Y_end overflow val = %04x\n", val); + mach_log("Dest_Y_end overflow val=%04x, DPCONFIG=%04x\n", val, mach->accel.dp_config); mach->accel.dest_y_end = 0; } dev->data_available = 0; dev->data_available2 = 0; - mach_log("BitBLT = %04x.\n", mach->accel.dp_config); + mach_log("BitBLT=%04x.\n", mach->accel.dp_config); + mach_log(".\n"); mach->accel.cmd_type = 2; /*Non-conforming BitBLT from dest_y_end register (0xaeee)*/ mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); } break; - case 0xaeef: - if (len == 1) { - mach->accel.dest_y_end = (mach->accel.dest_y_end & 0x0ff) | ((val & 0x07) << 8); - dev->data_available = 0; - dev->data_available2 = 0; - mach->accel.cmd_type = 2; /*Non-conforming BitBLT from dest_y_end register (0xaeee)*/ - mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); - } - break; case 0xb2ee: - if (len == 1) - mach->accel.src_x_start = (mach->accel.src_x_start & 0x700) | val; - else + if (len == 2) mach->accel.src_x_start = val & 0x7ff; break; - case 0xb2ef: - if (len == 1) - mach->accel.src_x_start = (mach->accel.src_x_start & 0x0ff) | ((val & 0x07) << 8); - break; case 0xb6ee: - dev->accel.bkgd_mix = val & 0xff; + ibm8514_accel_out_fifo(svga, 0xb6e8, val, len); break; case 0xbaee: - dev->accel.frgd_mix = val & 0xff; + ibm8514_accel_out_fifo(svga, 0xbae8, val, len); break; case 0xbeee: - if (len == 1) - mach->accel.src_x_end = (mach->accel.src_x_end & 0x700) | val; - else + if (len == 2) mach->accel.src_x_end = val & 0x7ff; break; - case 0xbeef: - if (len == 1) - mach->accel.src_x_end = (mach->accel.src_x_end & 0x0ff) | ((val & 0x07) << 8); - break; case 0xc2ee: mach->accel.src_y_dir = val & 1; @@ -3303,9 +3076,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xcaee: - if (len == 1) - mach->accel.scan_to_x = (mach->accel.scan_to_x & 0x700) | val; - else { + if (len == 2) { mach->accel.scan_to_x = (val & 0x7ff); if ((val + 1) == 0x10000) { mach_log("Scan_to_X overflow val = %04x\n", val); @@ -3314,128 +3085,74 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u dev->data_available = 0; dev->data_available2 = 0; mach->accel.cmd_type = 5; /*Horizontal Raster Draw from scan_to_x register (0xcaee)*/ - mach_log("ScanToX = %04x.\n", mach->accel.dp_config); - mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); - } - break; - case 0xcaef: - if (len == 1) { - mach->accel.scan_to_x = (mach->accel.scan_to_x & 0x0ff) | ((val & 0x07) << 8); - dev->data_available = 0; - dev->data_available2 = 0; - mach->accel.cmd_type = 5; /*Horizontal Raster Draw from scan_to_x register (0xcaee)*/ + mach_log("ScanToX=%04x.\n", mach->accel.dp_config); + mach_log(".\n"); mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); } break; case 0xceee: mach_log("CEEE write val = %04x.\n", val); - if (len == 1) - mach->accel.dp_config = (mach->accel.dp_config & 0xff00) | val; - else { + if (len == 2) { dev->data_available = 0; dev->data_available2 = 0; mach->accel.dp_config = val; } break; - case 0xceef: - if (len == 1) - mach->accel.dp_config = (mach->accel.dp_config & 0x00ff) | (val << 8); - break; case 0xd2ee: mach->accel.patt_len = val & 0x1f; - mach_log("Pattern Length = %d, val = %04x.\n", val & 0x1f, val); + mach_log("Write Port d2ee: Pattern Length=%d, val=%04x.\n", val & 0x1f, val); mach->accel.mono_pattern_enable = !!(val & 0x80); - if (len != 1) + if (len == 2) { + mach->accel.block_write_mono_pattern_enable = !!(val & 0x8000); mach->accel.patt_len_reg = val; - else - mach->accel.patt_len_reg = (mach->accel.patt_len_reg & 0xff00) | val; - break; - case 0xd2ef: - if (len == 1) - mach->accel.patt_len_reg = (mach->accel.patt_len_reg & 0x00ff) | (val << 8); + } break; case 0xd6ee: mach->accel.patt_idx = val & 0x1f; - mach_log("Pattern Index = %d, val = %02x.\n", val & 0x1f, val); + mach_log("Write Port d6ee: Pattern Index=%d.\n", val & 0x1f); break; case 0xdaee: mach_log("DAEE (extclipl) write val = %d\n", val); - if (len == 1) - dev->accel.clip_left = (dev->accel.clip_left & 0x700) | val; - else - dev->accel.clip_left = val & 0x7ff; - break; - case 0xdaef: - if (len == 1) - dev->accel.clip_left = (dev->accel.clip_left & 0x0ff) | ((val & 0x07) << 8); + if (len == 2) + dev->accel.multifunc[2] = val & 0x7ff; break; case 0xdeee: mach_log("DEEE (extclipt) write val = %d\n", val); - if (len == 1) - dev->accel.clip_top = (dev->accel.clip_top & 0x700) | val; - else - dev->accel.clip_top = val & 0x7ff; - break; - case 0xdeef: - if (len == 1) - dev->accel.clip_top = (dev->accel.clip_top & 0x0ff) | ((val & 0x07) << 8); + if (len == 2) + dev->accel.multifunc[1] = val & 0x7ff; break; case 0xe2ee: mach_log("E2EE (extclipr) write val = %d\n", val); - if (len == 1) - dev->accel.multifunc[4] = (dev->accel.multifunc[4] & 0x700) | val; - else + if (len == 2) dev->accel.multifunc[4] = val & 0x7ff; break; - case 0xe2ef: - if (len == 1) - dev->accel.multifunc[4] = (dev->accel.multifunc[4] & 0x0ff) | ((val & 0x07) << 8); - break; case 0xe6ee: mach_log("E6EE (extclipb) write val = %d\n", val); - if (len == 1) - dev->accel.multifunc[3] = (dev->accel.multifunc[3] & 0x700) | val; - else + if (len == 2) dev->accel.multifunc[3] = val & 0x7ff; break; - case 0xe6ef: - if (len == 1) - dev->accel.multifunc[3] = (dev->accel.multifunc[3] & 0x0ff) | ((val & 0x07) << 8); - break; case 0xeeee: - if (len == 1) - mach->accel.dest_cmp_fn = (mach->accel.dest_cmp_fn & 0xff00) | val; - else + if (len == 2) mach->accel.dest_cmp_fn = val; break; - case 0xeeef: - if (len == 1) - mach->accel.dest_cmp_fn = (mach->accel.dest_cmp_fn & 0x00ff) | (val << 8); - break; case 0xf2ee: mach_log("F2EE.\n"); - if (len == 1) - mach->accel.dst_clr_cmp_mask = (mach->accel.dst_clr_cmp_mask & 0xff00) | val; - else + if (len == 2) mach->accel.dst_clr_cmp_mask = val; break; - case 0xf2ef: - if (len == 1) - mach->accel.dst_clr_cmp_mask = (mach->accel.dst_clr_cmp_mask & 0x00ff) | (val << 8); - break; case 0xfeee: - mach_log("LineDraw = %04x.\n", mach->accel.dp_config); - if (len != 1) { + mach_log("LineDraw=%04x.\n", mach->accel.dp_config); + if (len == 2) { mach->accel.line_array[mach->accel.line_idx] = val; dev->accel.cur_x = mach->accel.line_array[(mach->accel.line_idx == 4) ? 4 : 0]; dev->accel.cur_y = mach->accel.line_array[(mach->accel.line_idx == 5) ? 5 : 1]; @@ -3459,7 +3176,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u static void mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8514_t *dev) { - if (port != 0x7aee && port != 0x7aef && port != 0x42e8 && port != 0x42e9) + if (port != 0x42e8 && port != 0x42e9) mach_log("[%04X:%08X]: Port CALL OUT=%04x, val=%02x.\n", CS, cpu_state.pc, port, val); switch (port) { @@ -3467,10 +3184,6 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x6e9: case 0xae8: case 0xee8: - case 0x12e8: - case 0x12e9: - case 0x1ae8: - case 0x1ae9: case 0x1ee8: case 0x1ee9: case 0x22e8: @@ -3481,9 +3194,27 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x6e8: /*In preparation to switch from VGA to 8514/A mode*/ - if (!dev->on[0] || !dev->on[1] || (mach->accel.clock_sel & 0x01)) { - dev->hdisped = val; - dev->hdisp = (dev->hdisped + 1) << 3; + if (!(mach->shadow_cntl & 0x08)) { + if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01)) { + dev->hdisped = val; + dev->hdisp = (dev->hdisped + 1) << 3; + } + } + mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): hdisp=0x%02x.\n", CS, cpu_state.pc, port, val); + svga_recalctimings(svga); + break; + + case 0x12e8: + case 0x12e9: + /*In preparation to switch from VGA to 8514/A mode*/ + if (!(mach->shadow_cntl & 0x10)) { + if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01)) { + WRITE8(port, dev->v_total_reg, val); + dev->v_total_reg &= 0x1fff; + dev->v_total = dev->v_total_reg + 1; + if (dev->interlace) + dev->v_total >>= 1; + } } mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): hdisp=0x%02x.\n", CS, cpu_state.pc, port, val); svga_recalctimings(svga); @@ -3492,29 +3223,46 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x16e8: case 0x16e9: /*In preparation to switch from VGA to 8514/A mode*/ - if (!dev->on[0] || !dev->on[1] || (mach->accel.clock_sel & 0x01)) { - WRITE8(port, dev->v_disp, val); - dev->v_disp &= 0x1fff; - dev->vdisp = (dev->v_disp + 1) >> 1; + if (!(mach->shadow_cntl & 0x20)) { + if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01)) { + WRITE8(port, dev->v_disp, val); + dev->v_disp &= 0x1fff; + dev->vdisp = (dev->v_disp + 1) >> 1; + } } mach_log("ATI 8514/A: V_DISP write 16E8 = %d\n", dev->v_disp); mach_log("ATI 8514/A: (0x%04x): vdisp=0x%02x.\n", port, val); svga_recalctimings(svga); break; + case 0x1ae8: + case 0x1ae9: + /*In preparation to switch from VGA to 8514/A mode*/ + if (!(mach->shadow_cntl & 0x10)) { + if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01)) { + WRITE8(port, dev->v_sync_start, val); + dev->v_sync_start &= 0x1fff; + dev->v_syncstart = dev->v_sync_start + 1; + if (dev->interlace) + dev->v_syncstart >>= 1; + } + } + 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); + svga_recalctimings(svga); + break; + case 0x4ae8: - case 0x4ae9: WRITE8(port, dev->accel.advfunc_cntl, val); - dev->on[port & 1] = dev->accel.advfunc_cntl & 0x01; + dev->on = dev->accel.advfunc_cntl & 0x01; + vga_on = !dev->on; + if ((dev->local & 0xff) < 0x02) dev->ext_crt_pitch = 128; - vga_on = !dev->on[port & 1]; - mach->ext_on[port & 1] = dev->on[port & 1]; - mach32_updatemapping(mach, svga); - dev->vendor_mode[port & 1] = 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, dev->on[port & 1], dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); - mach_log("IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); + 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("Vendor IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); + svga_recalctimings(svga); break; @@ -3546,6 +3294,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 mach->cursor_offset_hi = mach->cursor_offset_hi_reg & 0x0f; dev->hwcursor.addr = ((mach->cursor_offset_lo | (mach->cursor_offset_hi << 16)) << 2); dev->hwcursor.ena = !!(mach->cursor_offset_hi_reg & 0x8000); + mach_log("HWCursorEnabled=%x.\n", dev->hwcursor.ena); break; case 0x12ee: @@ -3593,6 +3342,8 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 else dev->ext_crt_pitch <<= 1; } + dev->on = 1; + vga_on = 0; mach_log("ATI 8514/A: (0x%04x) val=0x%02x.\n", port, val); svga_recalctimings(svga); break; @@ -3634,18 +3385,20 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x46ef: WRITE8(port, mach->shadow_cntl, val); mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val); + mach32_updatemapping(mach, svga); break; case 0x4aee: case 0x4aef: WRITE8(port, mach->accel.clock_sel, val); - dev->on[port & 1] = mach->accel.clock_sel & 0x01; - mach_log("ATI 8514/A: (0x%04x): ON=%d, val=%04x, hdisp=%d, vdisp=%d, val=0x%02x.\n", port, dev->on[port & 1], val, dev->hdisp, dev->vdisp, val & 0xfe); - mach_log("ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); - mach->ext_on[port & 1] = dev->on[port & 1]; - vga_on = !dev->on[port & 1]; - dev->vendor_mode[port & 1] = 1; + dev->on = mach->accel.clock_sel & 0x01; + mach_log("ATI 8514/A: (0x%04x): ON=%d, val=%04x, hdisp=%d, vdisp=%d, val=0x%02x.\n", port, dev->on, val, dev->hdisp, dev->vdisp, val & 0xfe); + if (!(port & 1)) + mach_log("Vendor ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); + + vga_on = !dev->on; svga_recalctimings(svga); + mach32_updatemapping(mach, svga); break; case 0x52ee: @@ -3670,6 +3423,8 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 mach_log("CRT Shadow Set 1: 640x480.\n"); else if ((mach->shadow_set & 0x03) == 0x02) mach_log("CRT Shadow Set 2: 1024x768.\n"); + + mach32_updatemapping(mach, svga); break; case 0x5eee: @@ -3693,19 +3448,29 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x6aee: case 0x6aef: WRITE8(port, mach->accel.max_waitstates, val); + mach->override_resolution = !!(mach->accel.max_waitstates & 0x400); + if (mach->override_resolution) { + dev->on = 1; + vga_on = !dev->on; + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); + } break; case 0x6eee: case 0x6eef: WRITE8(port, mach->accel.ge_offset_lo, val); svga_recalctimings(svga); + mach_log("ATI 8514/A: (0x%04x) val=0x%02x, geoffset=%04x.\n", port, val, dev->accel.ge_offset); + mach32_updatemapping(mach, svga); break; case 0x72ee: case 0x72ef: WRITE8(port, mach->accel.ge_offset_hi, val); - mach_log("ATI 8514/A: (0x%04x) val=0x%02x, geoffset=%04x.\n", port, val, dev->accel.ge_offset); svga_recalctimings(svga); + mach_log("ATI 8514/A: (0x%04x) val=0x%02x, geoffset=%04x.\n", port, val, dev->accel.ge_offset); + mach32_updatemapping(mach, svga); break; case 0x76ee: @@ -3714,6 +3479,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 dev->ext_pitch = ((mach->accel.ge_pitch & 0xff) << 3); mach_log("ATI 8514/A: (0x%04x) val=0x%02x, extpitch=%d.\n", port, val, dev->ext_pitch); svga_recalctimings(svga); + mach32_updatemapping(mach, svga); break; case 0x7aee: @@ -3722,8 +3488,9 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 if ((dev->local & 0xff) >= 0x02) { if (mach->accel.crt_pitch & 0xff) dev->ext_crt_pitch = mach->accel.crt_pitch & 0xff; + switch (mach->accel.ext_ge_config & 0x30) { - case 0: + case 0x00: case 0x10: dev->bpp = 0; break; @@ -3743,11 +3510,11 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 break; } svga_set_ramdac_type(svga, !!(mach->accel.ext_ge_config & 0x4000)); - dev->vendor_mode[port & 1] = 1; - mach32_updatemapping(mach, svga); mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val); svga_recalctimings(svga); + mach32_updatemapping(mach, svga); } else { + mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val & 0x30); ati_eeprom_write(&mach->eeprom, !!(mach->accel.ext_ge_config & 0x4040), !!(mach->accel.ext_ge_config & 0x2020), !!(mach->accel.ext_ge_config & 0x1010)); } break; @@ -3796,9 +3563,10 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in case 0x9ae8: case 0xdae8: - if (len != 1) { + if (len == 2) { if (dev->force_busy) temp |= 0x200; /*Hardware busy*/ + dev->force_busy = 0; if (dev->data_available) { temp |= 0x100; /*Read Data available*/ @@ -3829,10 +3597,11 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in case 0xdae9: if (len == 1) { if (dev->force_busy2) - temp |= 2; /*Hardware busy*/ + temp |= 0x02; /*Hardware busy*/ + dev->force_busy2 = 0; if (dev->data_available2) { - temp |= 1; /*Read Data available*/ + temp |= 0x01; /*Read Data available*/ if (mach->accel.cmd_type >= 0) { switch (mach->accel.cmd_type) { case 2: @@ -3877,18 +3646,23 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in } else { if (ibm8514_cpu_dest(svga)) { cmd = (dev->accel.cmd >> 13); - if (len != 1) { + if (len == 2) { READ_PIXTRANS_WORD(dev->accel.cx, 0) - if (dev->accel.input && !dev->accel.odd_in && !dev->accel.sx) { - temp &= ~0xff00; - temp |= (dev->vram[(dev->accel.newdest_in + dev->accel.cur_x) & dev->vram_mask] << 8); - } - if (dev->subsys_stat & 1) { + if (dev->subsys_stat & 0x01) { dev->force_busy = 1; dev->data_available = 1; } + if (dev->accel.input) { + ibm8514_accel_out_pixtrans(svga, port, temp & 0xff, len); + if (dev->accel.odd_in) { /*WORDs on odd destination scan lengths.*/ + dev->accel.odd_in = 0; + temp &= ~0xff00; + READ_HIGH(dev->accel.dest + dev->accel.cx, temp); + } + ibm8514_accel_out_pixtrans(svga, port, (temp >> 8) & 0xff, len); + } else + ibm8514_accel_out_pixtrans(svga, port, temp, len); } - ibm8514_accel_out_pixtrans(svga, port, temp, len); } } break; @@ -3937,47 +3711,9 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in } break; - case 0xbee8: - case 0xfee8: - if (len != 1) { - mach_log("Multifunc_cntl = %d.\n", dev->accel.multifunc_cntl >> 12); - switch ((dev->accel.multifunc_cntl >> 12) & 0x0f) { - case 0: - temp = dev->accel.multifunc[0]; - break; - case 1: - temp = dev->accel.clip_top; - break; - case 2: - temp = dev->accel.clip_left; - break; - case 3: - temp = dev->accel.multifunc[3]; - break; - case 4: - temp = dev->accel.multifunc[4]; - break; - case 5: - temp = dev->accel.multifunc[5]; - break; - case 8: - temp = dev->accel.multifunc[8]; - break; - case 9: - temp = dev->accel.multifunc[9]; - break; - case 0x0a: - temp = dev->accel.multifunc[0x0a]; - break; - - default: - break; - } - } - break; - case 0x82ee: - temp = mach->accel.patt_data_idx; + if (len == 2) + temp = mach->accel.patt_data_idx; break; case 0x86ee: @@ -4106,10 +3842,9 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in break; case 0xdaee: - if (len != 1) { - temp = mach->accel.src_x; + if (len == 2) { if ((dev->local & 0xff) >= 0x02) - temp &= 0x7ff; + temp = mach->accel.src_x; } else temp = mach->accel.src_x & 0xff; break; @@ -4119,10 +3854,9 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in break; case 0xdeee: - if (len != 1) { - temp = mach->accel.src_y; + if (len == 2) { if ((dev->local & 0xff) >= 0x02) - temp &= 0x7ff; + temp = mach->accel.src_y; } else temp = mach->accel.src_y & 0xff; break; @@ -4132,7 +3866,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in break; case 0xfaee: - if (len != 1) { + if (len == 2) { if ((dev->local & 0xff) >= 0x02) { if (mach->pci_bus) temp = 0x0017; @@ -4163,7 +3897,8 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in break; } - mach_log("[%04X:%08X]: Port FIFO IN=%04x, temp=%04x, len=%d.\n", CS, cpu_state.pc, port, temp, len); + if (port != 0x9aee && port != 0x62ee) + mach_log("[%04X:%08X]: Port FIFO IN=%04x, temp=%04x, len=%d.\n", CS, cpu_state.pc, port, temp, len); return temp; } @@ -4171,14 +3906,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in static uint8_t mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) { - uint8_t temp = 0; - uint16_t clip_b_ibm = dev->accel.multifunc[3]; - uint16_t clip_r_ibm = dev->accel.multifunc[4]; - int16_t clip_l = dev->accel.clip_left & 0x7ff; - int16_t clip_t = dev->accel.clip_top & 0x7ff; - int16_t clip_r = dev->accel.multifunc[4] & 0x7ff; - int16_t clip_b = dev->accel.multifunc[3] & 0x7ff; - int cmd = (dev->accel.cmd >> 13); + uint8_t temp = 0; switch (port) { case 0x2e8: @@ -4196,24 +3924,8 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) if (dev->vc == dev->v_syncstart) dev->subsys_stat |= 1; - if (mach->accel.cmd_type >= 0) { - if (((dev->accel.dx) >= clip_l) && ((dev->accel.dx) <= clip_r) && ((dev->accel.dy) >= clip_t) && ((dev->accel.dy) <= clip_b)) - temp |= 2; - } else { - if (cmd == 6) { - if (((dev->accel.dx) >= dev->accel.clip_left) && ((dev->accel.dx) <= clip_r_ibm) && ((dev->accel.dy) >= dev->accel.clip_top) && ((dev->accel.dy) <= clip_b_ibm)) - temp |= 2; - } else { - if (((dev->accel.cx) >= dev->accel.clip_left) && ((dev->accel.dx) <= clip_r_ibm) && ((dev->accel.cy) >= dev->accel.clip_top) && ((dev->accel.cy) <= clip_b_ibm)) - temp |= 2; - } - } - - if (!dev->force_busy) - temp |= 8; - if (port & 1) - temp = 0x80; + temp = dev->vram_512k_8514 ? 0x00 : 0x80; else { temp |= (dev->subsys_stat | 0x80); if (mach->accel.ext_ge_config & 0x08) @@ -4256,7 +3968,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) if (!(port & 1)) { temp &= ~0x0c; - switch (mach->memory) { + switch (dev->vram_amount) { case 1024: temp |= 0x04; break; @@ -4268,8 +3980,6 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) break; default: - if ((dev->local & 0xff) < 0x02) - temp |= 0x04; break; } } @@ -4351,7 +4061,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) default: break; } - if (port != 0x62ee && port != 0x62ef && port != 0x42e8 && port != 0x42e9 && port != 0x02e8 && port != 0x02e9) + if (port != 0x42e8 && port != 0x42e9 && port != 0x62ee && port != 0x62ef && port != 0x02e8 && port != 0x02e9) mach_log("[%04X:%08X]: Port NORMAL IN=%04x, temp=%04x.\n", CS, cpu_state.pc, port, temp); return temp; @@ -4568,43 +4278,6 @@ mach_accel_inl(uint16_t port, void *priv) return temp; } -static uint32_t -mach32_decode_addr(svga_t *svga, uint32_t addr, int write) -{ - int memory_map_mode = (svga->gdcreg[6] >> 2) & 3; - - addr &= 0x1ffff; - - switch (memory_map_mode) { - case 0: - break; - case 1: - if (addr >= 0x10000) - return 0xffffffff; - break; - case 2: - addr -= 0x10000; - if (addr >= 0x8000) - return 0xffffffff; - break; - default: - case 3: - addr -= 0x18000; - if (addr >= 0x8000) - return 0xffffffff; - break; - } - - if (memory_map_mode <= 1) { - if (write) - addr = (addr & svga->banked_mask) + svga->write_bank; - else - addr = (addr & svga->banked_mask) + svga->read_bank; - } - - return addr; -} - static __inline void mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t *svga) { @@ -4613,37 +4286,51 @@ mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t int reset_wm = 0; latch8514_t vall; uint8_t wm = svga->writemask; - uint8_t count; uint8_t i; cycles -= svga->monitor->mon_video_timing_write_b; if (linear) { + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + addr <<= 1; + addr &= dev->vram_mask; dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; - dev->vram[addr] = val; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + switch (addr & 0x06) { + case 0x00: + case 0x06: + dev->vram[addr] = val & 0x0f; + dev->vram[addr + 1] = (val >> 4) & 0x0f; + break; + case 0x02: + dev->vram[addr + 2] = val & 0x0f; + dev->vram[addr + 3] = (val >> 4) & 0x0f; + break; + case 0x04: + dev->vram[addr - 2] = val & 0x0f; + dev->vram[addr - 1] = (val >> 4) & 0x0f; + break; + default: + break; + } + } else + dev->vram[addr] = val; + return; - } else { - xga_write_test(addr, val, svga); - addr = mach32_decode_addr(svga, addr, 1); - if (addr == 0xffffffff) - return; } if (!(svga->gdcreg[6] & 1)) svga->fullchange = 2; - if (((svga->chain4 && (svga->packed_chain4 || svga->force_old_addr)) || svga->fb_only) && (svga->writemode < 4)) { + if (svga->chain4) { writemask2 = 1 << (addr & 3); addr &= ~3; - } else if (svga->chain4 && (svga->writemode < 4)) { - writemask2 = 1 << (addr & 3); - addr &= ~3; - addr = ((addr & 0xfffc) << 2) | ((addr & 0x30000) >> 14) | (addr & ~0x3ffff); } else if (svga->chain2_write) { writemask2 &= ~0xa; if (addr & 1) writemask2 <<= 1; + addr &= ~1; addr &= dev->vram_mask; } else { @@ -4660,90 +4347,53 @@ mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; - count = 4; + val = ((val >> (svga->gdcreg[3] & 7)) | (val << (8 - (svga->gdcreg[3] & 7)))); + if ((svga->gdcreg[8] == 0xff) && !(svga->gdcreg[3] & 0x18) && (!svga->gdcreg[1] || svga->set_reset_disabled)) { + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = val; + } + } else { + for (i = 0; i < 4; i++) { + if (svga->gdcreg[1] & (1 << i)) + vall.b[i] = !!(svga->gdcreg[0] & (1 << i)) * 0xff; + else + vall.b[i] = val; + } - switch (svga->writemode) { - case 0: - val = ((val >> (svga->gdcreg[3] & 7)) | (val << (8 - (svga->gdcreg[3] & 7)))); - if ((svga->gdcreg[8] == 0xff) && !(svga->gdcreg[3] & 0x18) && (!svga->gdcreg[1] || svga->set_reset_disabled)) { - for (i = 0; i < count; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = val; - } - return; - } else { - for (i = 0; i < count; i++) { - if (svga->gdcreg[1] & (1 << i)) - vall.b[i] = !!(svga->gdcreg[0] & (1 << i)) * 0xff; - else - vall.b[i] = val; - } - } - break; - case 1: - for (i = 0; i < count; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = dev->latch.b[i]; - } - return; - case 2: - for (i = 0; i < count; i++) - vall.b[i] = !!(val & (1 << i)) * 0xff; - - if (!(svga->gdcreg[3] & 0x18) && (!svga->gdcreg[1] || svga->set_reset_disabled)) { - for (i = 0; i < count; i++) { + switch (svga->gdcreg[3] & 0x18) { + case 0x00: /* Set */ + for (i = 0; i < 4; i++) { if (writemask2 & (1 << i)) dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) | (dev->latch.b[i] & ~svga->gdcreg[8]); } - return; - } - break; - case 3: - val = ((val >> (svga->gdcreg[3] & 7)) | (val << (8 - (svga->gdcreg[3] & 7)))); - wm = svga->gdcreg[8]; - svga->gdcreg[8] &= val; + break; + case 0x08: /* AND */ + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = (vall.b[i] | ~svga->gdcreg[8]) & dev->latch.b[i]; + } + break; + case 0x10: /* OR */ + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) | dev->latch.b[i]; + } + break; + case 0x18: /* XOR */ + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) ^ dev->latch.b[i]; + } + break; - for (i = 0; i < count; i++) - vall.b[i] = !!(svga->gdcreg[0] & (1 << i)) * 0xff; + default: + break; + } - reset_wm = 1; - break; - default: - break; + if (reset_wm) + svga->gdcreg[8] = wm; } - - switch (svga->gdcreg[3] & 0x18) { - case 0x00: /* Set */ - for (i = 0; i < count; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) | (dev->latch.b[i] & ~svga->gdcreg[8]); - } - break; - case 0x08: /* AND */ - for (i = 0; i < count; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = (vall.b[i] | ~svga->gdcreg[8]) & dev->latch.b[i]; - } - break; - case 0x10: /* OR */ - for (i = 0; i < count; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) | dev->latch.b[i]; - } - break; - case 0x18: /* XOR */ - for (i = 0; i < count; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) ^ dev->latch.b[i]; - } - break; - - default: - break; - } - - if (reset_wm) - svga->gdcreg[8] = wm; } #ifdef ATI_8514_ULTRA @@ -4780,25 +4430,90 @@ static void mach32_write(uint32_t addr, uint8_t val, void *priv) { mach_t *mach = (mach_t *) priv; - mach32_write_common(addr, val, 0, mach, &mach->svga); + svga_t *svga = &mach->svga; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + + xga_write_test(addr, val, svga); + addr = (addr & svga->banked_mask) + svga->write_bank; + + if ((((dev->local & 0xff) >= 0x02) && !dev->vram_512k_8514) && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + addr <<= 1; + switch (addr & 0x06) { + case 0x00: + case 0x06: + mach32_write_common(addr, val & 0x0f, 0, mach, svga); + mach32_write_common(addr + 1, (val >> 4) & 0x0f, 0, mach, svga); + break; + case 0x02: + mach32_write_common(addr + 2, val & 0x0f, 0, mach, svga); + mach32_write_common(addr + 3, (val >> 4) & 0x0f, 0, mach, svga); + break; + case 0x04: + mach32_write_common(addr - 2, val & 0x0f, 0, mach, svga); + mach32_write_common(addr - 1, (val >> 4) & 0x0f, 0, mach, svga); + break; + default: + break; + } + } else + mach32_write_common(addr, val, 0, mach, svga); } static void mach32_writew(uint32_t addr, uint16_t val, void *priv) { mach_t *mach = (mach_t *) priv; - mach32_write_common(addr, val & 0xff, 0, mach, &mach->svga); - mach32_write_common(addr + 1, val >> 8, 0, mach, &mach->svga); + svga_t *svga = &mach->svga; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + + xga_write_test(addr, val, svga); + addr = (addr & svga->banked_mask) + svga->write_bank; + + if ((((dev->local & 0xff) >= 0x02) && !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); + mach32_write_common(addr - 1, (val >> 4) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 2, (val >> 8) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 3, (val >> 12) & 0x0f, 0, mach, svga); + } else { + mach32_write_common(addr, val & 0x0f, 0, mach, svga); + mach32_write_common(addr + 1, (val >> 4) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 4, (val >> 8) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 5, (val >> 12) & 0x0f, 0, mach, svga); + } + } else { + mach32_write_common(addr, val & 0xff, 0, mach, svga); + mach32_write_common(addr + 1, val >> 8, 0, mach, svga); + } } static void mach32_writel(uint32_t addr, uint32_t val, void *priv) { mach_t *mach = (mach_t *) priv; - mach32_write_common(addr, val & 0xff, 0, mach, &mach->svga); - mach32_write_common(addr + 1, val >> 8, 0, mach, &mach->svga); - mach32_write_common(addr + 2, val >> 16, 0, mach, &mach->svga); - mach32_write_common(addr + 3, val >> 24, 0, mach, &mach->svga); + svga_t *svga = &mach->svga; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + + xga_write_test(addr, val, svga); + addr = (addr & svga->banked_mask) + svga->write_bank; + + if ((((dev->local & 0xff) >= 0x02) && !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); + mach32_write_common(addr + 4, (val >> 8) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 5, (val >> 12) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 2, (val >> 16) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 3, (val >> 20) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 6, (val >> 24) & 0x0f, 0, mach, svga); + mach32_write_common(addr + 7, (val >> 28) & 0x0f, 0, mach, svga); + } else { + mach32_write_common(addr, val & 0xff, 0, mach, svga); + mach32_write_common(addr + 1, val >> 8, 0, mach, svga); + mach32_write_common(addr + 2, val >> 16, 0, mach, svga); + mach32_write_common(addr + 3, val >> 24, 0, mach, svga); + } } static __inline void @@ -4808,10 +4523,25 @@ mach32_writew_linear(uint32_t addr, uint16_t val, mach_t *mach) ibm8514_t *dev = (ibm8514_t *) svga->dev8514; cycles -= svga->monitor->mon_video_timing_write_w; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + addr <<= 1; addr &= dev->vram_mask; dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; - *(uint16_t *) &dev->vram[addr] = val; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + if (addr & 0x04) { + dev->vram[addr - 2] = val & 0x0f; + dev->vram[addr - 1] = (val >> 4) & 0x0f; + dev->vram[addr + 2] = (val >> 8) & 0x0f; + dev->vram[addr + 3] = (val >> 12) & 0x0f; + } else { + dev->vram[addr] = val & 0x0f; + dev->vram[addr + 1] = (val >> 4) & 0x0f; + dev->vram[addr + 4] = (val >> 8) & 0x0f; + dev->vram[addr + 5] = (val >> 12) & 0x0f; + } + } else + *(uint16_t *) &dev->vram[addr] = val; } static __inline void @@ -4822,9 +4552,22 @@ mach32_writel_linear(uint32_t addr, uint32_t val, mach_t *mach) cycles -= svga->monitor->mon_video_timing_write_l; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + addr <<= 1; + addr &= dev->vram_mask; dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; - *(uint32_t *) &dev->vram[addr] = val; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + dev->vram[addr] = val & 0x0f; + dev->vram[addr + 1] = (val >> 4) & 0x0f; + dev->vram[addr + 4] = (val >> 8) & 0x0f; + dev->vram[addr + 5] = (val >> 12) & 0x0f; + dev->vram[addr + 2] = (val >> 16) & 0x0f; + dev->vram[addr + 3] = (val >> 20) & 0x0f; + dev->vram[addr + 6] = (val >> 24) & 0x0f; + dev->vram[addr + 7] = (val >> 28) & 0x0f; + } else + *(uint32_t *) &dev->vram[addr] = val; } static __inline uint8_t @@ -4835,17 +4578,37 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) int readplane = svga->readplane; uint8_t count; uint8_t temp; - uint8_t ret; + uint8_t ret = 0x00; cycles -= svga->monitor->mon_video_timing_read_b; if (linear) { - return dev->vram[addr & dev->vram_mask]; - } else { - (void) xga_read_test(addr, svga); - addr = mach32_decode_addr(svga, addr, 0); - if (addr == 0xffffffff) - return 0xff; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) + addr <<= 1; + + addr &= dev->vram_mask; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + switch (addr & 0x06) { + case 0x00: + case 0x06: + ret = dev->vram[addr] & 0x0f; + ret |= (dev->vram[addr + 1] << 4); + break; + case 0x02: + ret = dev->vram[addr + 2] & 0x0f; + ret |= (dev->vram[addr + 3] << 4); + break; + case 0x04: + ret = dev->vram[addr - 2] & 0x0f; + ret |= (dev->vram[addr - 1] << 4); + break; + default: + break; + } + } else + ret = dev->vram[addr]; + + return ret; } count = 2; @@ -4853,7 +4616,7 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) latch_addr = (addr << count) & svga->decode_mask; count = (1 << count); - if ((svga->chain4 && (svga->packed_chain4 || svga->force_old_addr)) || svga->fb_only) { + if (svga->chain4) { addr &= svga->decode_mask; if (addr >= dev->vram_size) return 0xff; @@ -4861,9 +4624,6 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) for (uint8_t i = 0; i < count; i++) dev->latch.b[i] = dev->vram[latch_addr | i]; return dev->vram[addr & dev->vram_mask]; - } else if (svga->chain4 && !svga->force_old_addr) { - readplane = addr & 3; - addr = ((addr & 0xfffc) << 2) | ((addr & 0x30000) >> 14) | (addr & ~0x3ffff); } else if (svga->chain2_read) { readplane = (readplane & 2) | (addr & 1); addr &= ~1; @@ -4896,6 +4656,7 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) addr &= dev->vram_mask; + mach_log("ReadMode=%02x.\n", svga->readmode); if (svga->readmode) { temp = 0xff; @@ -4959,9 +4720,35 @@ static uint8_t mach32_read(uint32_t addr, void *priv) { mach_t *mach = (mach_t *) priv; - uint8_t ret; + svga_t *svga = &mach->svga; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + uint8_t ret = 0x00; + + (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)) { + addr <<= 1; + switch (addr & 0x06) { + case 0x00: + case 0x06: + ret = mach32_read_common(addr, 0, mach, svga) & 0x0f; + ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 4); + break; + case 0x02: + ret = mach32_read_common(addr + 2, 0, mach, svga) & 0x0f; + ret |= (mach32_read_common(addr + 3, 0, mach, svga) << 4); + break; + case 0x04: + ret = mach32_read_common(addr - 2, 0, mach, svga) & 0x0f; + ret |= (mach32_read_common(addr - 1, 0, mach, svga) << 4); + break; + default: + break; + } + } else + ret = mach32_read_common(addr, 0, mach, svga); - ret = mach32_read_common(addr, 0, mach, &mach->svga); return ret; } @@ -4969,10 +4756,30 @@ static uint16_t mach32_readw(uint32_t addr, void *priv) { mach_t *mach = (mach_t *) priv; - uint16_t ret; + svga_t *svga = &mach->svga; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + uint16_t ret; - ret = mach32_read_common(addr, 0, mach, &mach->svga); - ret |= (mach32_read_common(addr + 1, 0, mach, &mach->svga) << 8); + (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)) { + addr <<= 1; + if (addr & 0x04) { + ret = mach32_read_common(addr - 2, 0, mach, svga) & 0x0f; + ret |= (mach32_read_common(addr - 1, 0, mach, svga) << 4); + ret |= (mach32_read_common(addr + 2, 0, mach, svga) << 8); + ret |= (mach32_read_common(addr + 3, 0, mach, svga) << 12); + } else { + ret = mach32_read_common(addr, 0, mach, svga) & 0x0f; + ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 4); + ret |= (mach32_read_common(addr + 4, 0, mach, svga) << 8); + ret |= (mach32_read_common(addr + 5, 0, mach, svga) << 12); + } + } else { + ret = mach32_read_common(addr, 0, mach, svga); + ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 8); + } return ret; } @@ -4980,12 +4787,29 @@ static uint32_t mach32_readl(uint32_t addr, void *priv) { mach_t *mach = (mach_t *) priv; - uint32_t ret; + svga_t *svga = &mach->svga; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + uint32_t ret; - ret = mach32_read_common(addr, 0, mach, &mach->svga); - ret |= (mach32_read_common(addr + 1, 0, mach, &mach->svga) << 8); - ret |= (mach32_read_common(addr + 2, 0, mach, &mach->svga) << 16); - ret |= (mach32_read_common(addr + 3, 0, mach, &mach->svga) << 24); + (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)) { + addr <<= 1; + ret = mach32_read_common(addr, 0, mach, svga) & 0x0f; + ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 4); + ret |= (mach32_read_common(addr + 4, 0, mach, svga) << 8); + ret |= (mach32_read_common(addr + 5, 0, mach, svga) << 12); + ret |= (mach32_read_common(addr + 2, 0, mach, svga) << 16); + ret |= (mach32_read_common(addr + 3, 0, mach, svga) << 20); + ret |= (mach32_read_common(addr + 6, 0, mach, svga) << 24); + ret |= (mach32_read_common(addr + 7, 0, mach, svga) << 28); + } else { + ret = mach32_read_common(addr, 0, mach, svga); + ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 8); + ret |= (mach32_read_common(addr + 2, 0, mach, svga) << 16); + ret |= (mach32_read_common(addr + 3, 0, mach, svga) << 24); + } return ret; } @@ -4994,10 +4818,27 @@ mach32_readw_linear(uint32_t addr, mach_t *mach) { svga_t *svga = &mach->svga; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + uint16_t ret; cycles -= svga->monitor->mon_video_timing_read_w; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + addr <<= 1; + addr &= dev->vram_mask; + if (addr & 0x04) { + ret = dev->vram[addr - 2] & 0x0f; + ret |= (dev->vram[addr - 1] << 4); + ret |= (dev->vram[addr + 2] << 8); + ret |= (dev->vram[addr + 3] << 12); + } else { + ret = dev->vram[addr] & 0x0f; + ret |= (dev->vram[addr + 1] << 4); + ret |= (dev->vram[addr + 4] << 8); + ret |= (dev->vram[addr + 5] << 12); + } + } else + ret = *(uint16_t *) &dev->vram[addr & dev->vram_mask]; - return *(uint16_t *) &dev->vram[addr & dev->vram_mask]; + return ret; } static __inline uint32_t @@ -5005,10 +4846,25 @@ mach32_readl_linear(uint32_t addr, mach_t *mach) { svga_t *svga = &mach->svga; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + uint32_t ret; cycles -= svga->monitor->mon_video_timing_read_l; - return *(uint32_t *) &dev->vram[addr & dev->vram_mask]; + if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { + addr <<= 1; + addr &= dev->vram_mask; + ret = dev->vram[addr] & 0x0f; + ret |= (dev->vram[addr + 1] << 4); + ret |= (dev->vram[addr + 4] << 8); + ret |= (dev->vram[addr + 5] << 12); + ret |= (dev->vram[addr + 2] << 16); + ret |= (dev->vram[addr + 3] << 20); + ret |= (dev->vram[addr + 6] << 24); + ret |= (dev->vram[addr + 7] << 28); + } else + ret = *(uint32_t *) &dev->vram[addr & dev->vram_mask]; + + return ret; } static void @@ -5029,10 +4885,10 @@ mach32_ap_writeb(uint32_t addr, uint8_t val, void *priv) mach_accel_outb(0x02e8 + (addr & 1) + (port_dword << 8), val, mach); } } else { - mach_log("Linear WORDB Write=%08x, val=%02x.\n", addr, val); - if (dev->on[0] || dev->on[1]) + if (dev->on) { + mach_log("Linear WORDB Write=%08x, val=%02x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); mach32_write_common(addr, val, 1, mach, svga); - else + } else svga_write_linear(addr, val, svga); } } @@ -5055,8 +4911,8 @@ mach32_ap_writew(uint32_t addr, uint16_t val, void *priv) mach_accel_outw(0x02e8 + (port_dword << 8), val, mach); } } else { - mach_log("Linear WORDW Write=%08x, val=%04x.\n", addr, val); - if (dev->on[0] || dev->on[1]) { + if (dev->on) { + mach_log("Linear WORDW Write=%08x, val=%04x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); mach32_writew_linear(addr, val, mach); } else svga_writew_linear(addr, val, svga); @@ -5083,8 +4939,8 @@ mach32_ap_writel(uint32_t addr, uint32_t val, void *priv) mach_accel_outw(0x02e8 + (port_dword << 8) + 4, val >> 16, mach); } } else { - mach_log("Linear WORDL Write=%08x, val=%08x.\n", addr, val); - if (dev->on[0] || dev->on[1]) { + if (dev->on) { + mach_log("Linear WORDL Write=%08x, val=%08x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); mach32_writel_linear(addr, val, mach); } else svga_writel_linear(addr, val, svga); @@ -5107,7 +4963,7 @@ mach32_ap_readb(uint32_t addr, void *priv) else temp = mach_accel_inb(0x02e8 + (addr & 1) + (port_dword << 8), mach); } else { - if (dev->on[0] || dev->on[1]) + if (dev->on) temp = mach32_read_common(addr, 1, mach, svga); else temp = svga_read_linear(addr, svga); @@ -5134,7 +4990,7 @@ mach32_ap_readw(uint32_t addr, void *priv) else temp = mach_accel_inw(0x02e8 + (port_dword << 8), mach); } else { - if (dev->on[0] || dev->on[1]) { + if (dev->on) { temp = mach32_readw_linear(addr, mach); } else temp = svga_readw_linear(addr, svga); @@ -5164,12 +5020,12 @@ mach32_ap_readl(uint32_t addr, void *priv) temp |= (mach_accel_inw(0x02e8 + (port_dword << 8) + 4, mach) << 8); } } else { - if (dev->on[0] || dev->on[1]) { + if (dev->on) { temp = mach32_readl_linear(addr, mach); } else temp = svga_readl_linear(addr, svga); - mach_log("Linear WORDL Read=%08x, ret=%08x, ON0=%d, ON1=%d.\n", addr, temp, dev->on[0], dev->on[1]); + mach_log("Linear WORDL Read=%08x, ret=%08x, ON%d.\n", addr, temp, dev->on); } return temp; @@ -5186,7 +5042,7 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) return; } - if (mach->regs[0xbd] & 4) { + if (mach->regs[0xbd] & 0x04) { mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); svga->banked_mask = 0xffff; } else { @@ -5218,18 +5074,21 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) if (((mach->memory_aperture & 3) == 1) && !mach->pci_bus) { /*1 MB aperture*/ mach->ap_size = 1; + mach_log("Linear Enabled APSIZE=1.\n"); mem_mapping_set_addr(&mach->mmio_linear_mapping, mach->linear_base, mach->ap_size << 20); } else { /*4 MB aperture*/ mach->ap_size = 4; + mach_log("Linear Enabled APSIZE=4.\n"); mem_mapping_set_addr(&mach->mmio_linear_mapping, mach->linear_base, mach->ap_size << 20); } } else { mach->ap_size = 4; + mach_log("Linear Disabled APSIZE=4.\n"); mem_mapping_disable(&mach->mmio_linear_mapping); } - if ((dev->on[0] || dev->on[1]) && (mach->ext_on[0] || mach->ext_on[1]) && (dev->vendor_mode[0] || dev->vendor_mode[1])) { - mach_log("ExtON.\n"); + if (dev->on && ((dev->local & 0xff) >= 0x02)) { + mach_log("Mach32 banked mapping.\n"); #ifdef ATI_8514_ULTRA if (svga->ext8514 != NULL) { mem_mapping_set_handler(&svga->mapping, ati8514_read, ati8514_readw, ati8514_readl, ati8514_write, ati8514_writew, ati8514_writel); @@ -5241,7 +5100,7 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) mem_mapping_set_p(&svga->mapping, mach); } } else { - mach_log("ExtOFF.\n"); + mach_log("IBM compatible banked mapping.\n"); mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel); mem_mapping_set_p(&svga->mapping, svga); } @@ -5267,6 +5126,7 @@ mach32_hwcursor_draw(svga_t *svga, int displine) case 8: color0 = dev->pallook[mach->cursor_col_0]; color1 = dev->pallook[mach->cursor_col_1]; + mach_log("4/8BPP: Color0=%08x, Color1=%08x.\n", color0, color1); break; case 15: color0 = video_15to32[((mach->ext_cur_col_0_r << 16) | (mach->ext_cur_col_0_g << 8) | mach->cursor_col_0) & 0xffff]; @@ -5288,6 +5148,7 @@ mach32_hwcursor_draw(svga_t *svga, int displine) for (int x = 0; x < 64; x += 8) { dat = dev->vram[dev->hwcursor_latch.addr & dev->vram_mask] | (dev->vram[(dev->hwcursor_latch.addr + 1) & dev->vram_mask] << 8); + for (int xx = 0; xx < 8; xx++) { comb = (dat >> (xx << 1)) & 0x03; @@ -5598,13 +5459,11 @@ mach_mca_reset(void *priv) svga_t *svga = &mach->svga; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - mem_mapping_disable(&mach->bios_rom.mapping); - mem_mapping_disable(&mach->bios_rom2.mapping); mach_log("MCA reset.\n"); - dev->on[0] = 0; - dev->on[1] = 0; + dev->on = 0; vga_on = 1; mach_mca_write(0x102, 0, mach); + timer_set_callback(&svga->timer, svga_poll); } #ifdef ATI_8514_ULTRA @@ -5794,8 +5653,9 @@ mach8_init(const device_t *info) dev->type = info->flags; dev->local = info->local & 0xff; mach->has_bios = !(info->local & 0xff00); - mach->memory = device_get_config_int("memory"); 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; if ((dev->local & 0xff) >= 0x02) { if (mach->pci_bus) { @@ -5833,12 +5693,12 @@ mach8_init(const device_t *info) 0, MEM_MAPPING_EXTERNAL); if ((dev->local & 0xff) >= 0x02) { - svga_init(info, svga, mach, mach->memory << 10, /*default: 2MB for Mach32*/ + svga_init(info, svga, mach, dev->vram_amount << 10, /*default: 2MB for Mach32*/ mach_recalctimings, mach_in, mach_out, mach32_hwcursor_draw, NULL); - dev->vram_size = mach->memory << 10; + dev->vram_size = dev->vram_amount << 10; dev->vram = calloc(dev->vram_size, 1); dev->changedvram = calloc((dev->vram_size >> 12) + 1, 1); dev->vram_mask = dev->vram_size - 1; @@ -5886,20 +5746,22 @@ mach8_init(const device_t *info) mach_in, mach_out, NULL, NULL); - dev->vram_size = (1024 << 10); + dev->vram_size = (dev->vram_amount << 10); dev->vram = calloc(dev->vram_size, 1); dev->changedvram = calloc((dev->vram_size >> 12) + 1, 1); dev->vram_mask = dev->vram_size - 1; video_inform(VIDEO_FLAG_TYPE_8514, &timing_gfxultra_isa); - mach->config1 = 0x01 | 0x02 | 0x20 | 0x08 | 0x80; + mach->config1 = 0x01 | 0x02 | 0x08 | 0x80; + if (dev->vram_amount >= 1024) + mach->config1 |= 0x20; + mach->config2 = 0x02; svga->clock_gen = device_add(&ati18811_0_device); } dev->bpp = 0; svga->getclock = ics2494_getclock; - dev->on[0] = 0; - dev->on[1] = 0; + dev->on = 0; dev->ext_pitch = 1024; dev->ext_crt_pitch = 0x80; dev->accel_bpp = 8; @@ -5915,6 +5777,7 @@ mach8_init(const device_t *info) if ((dev->local & 0xff) >= 0x02) { svga->decode_mask = (4 << 20) - 1; + mach->accel.cmd_type = -1; mach->cursor_col_1 = 0xff; mach->ext_cur_col_1_r = 0xff; mach->ext_cur_col_1_g = 0xff; @@ -5954,23 +5817,25 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) mach_t *mach = (mach_t *) ext8514; ibm8514_t *dev = (ibm8514_t *) dev8514; - dev->on[0] = 0; - dev->on[1] = 0; + 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->hdisp = 0; + dev->vdisp = 0; io_sethandler(0x02ea, 4, ati8514_in, NULL, NULL, ati8514_out, NULL, NULL, svga); ati8514_io_set(svga); mach->mca_bus = !!(dev->type & DEVICE_MCA); if (mach->mca_bus) - mach->config1 = 0x02 | 0x04 | 0x08 | 0x20 | 0x80; + mach->config1 = 0x02 | 0x04; else - mach->config1 = 0x02 | 0x08 | 0x20 | 0x80; + mach->config1 = 0x02 | 0x2000; + + if (dev->vram_amount >= 1024) + mach->config1 |= 0x20; mach->config2 = 0x01 | 0x02; } @@ -6042,6 +5907,32 @@ mach_force_redraw(void *priv) svga->fullchange = svga->monitor->mon_changeframecount; } +// clang-format off +static const device_config_t mach8_config[] = { + { + .name = "memory", + .description = "Memory size", + .type = CONFIG_SELECTION, + .default_int = 1024, + .selection = { + { + .description = "512 KB", + .value = 512 + }, + { + .description = "1 MB", + .value = 1024 + }, + { + .description = "" + } + } + }, + { + .type = CONFIG_END + } +}; + // clang-format off static const device_config_t mach32_config[] = { { @@ -6140,7 +6031,7 @@ const device_t mach8_vga_isa_device = { { .available = mach8_vga_available }, .speed_changed = mach_speed_changed, .force_redraw = mach_force_redraw, - .config = NULL + .config = mach8_config }; const device_t mach32_isa_device = { diff --git a/src/video/vid_bt481_ramdac.c b/src/video/vid_bt481_ramdac.c new file mode 100644 index 000000000..6cf5f2b1b --- /dev/null +++ b/src/video/vid_bt481_ramdac.c @@ -0,0 +1,160 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Emulation of the Brooktree BT481 true colour RAMDAC + * family. + * + * + * + * Authors: TheCollector1995. + * + * Copyright 2024 TheCollector1995. + */ +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/mem.h> +#include <86box/timer.h> +#include <86box/video.h> +#include <86box/vid_svga.h> + +typedef struct bt481_ramdac_t { + int state; + uint8_t cmd; +} bt481_ramdac_t; + +static void +bt481_ramdac_command(uint8_t val, void *priv, svga_t *svga) +{ + bt481_ramdac_t *ramdac = (bt481_ramdac_t *) priv; + ramdac->cmd = val; + pclog("RAMDAC CMD=%02x.\n", val); + switch ((ramdac->cmd >> 4) & 0x0f) { + default: + case 0x00: + svga->bpp = 8; + break; + case 0x08: + case 0x0a: + svga->bpp = 15; + break; + case 0x09: + case 0x0c: + svga->bpp = 16; + break; + case 0x0e: + case 0x0f: + svga->bpp = 24; + break; + } + svga_recalctimings(svga); +} + +void +bt481_ramdac_out(uint16_t addr, int rs2, uint8_t val, void *priv, svga_t *svga) +{ + bt481_ramdac_t *ramdac = (bt481_ramdac_t *) priv; + uint8_t rs = (addr & 0x03) | ((!!rs2) << 2); + + switch (rs) { + case 0x00: + case 0x01: + case 0x03: + case 0x04: + case 0x05: + case 0x07: + svga_out(addr, val, svga); + ramdac->state = 0; + break; + case 0x02: + pclog("RAMDAC Write State=%x.\n", ramdac->state); + switch (ramdac->state) { + case 4: + bt481_ramdac_command(val, ramdac, svga); + break; + default: + svga_out(addr, val, svga); + break; + } + break; + case 0x06: + bt481_ramdac_command(val, ramdac, svga); + ramdac->state = 0; + break; + + default: + break; + } +} + +uint8_t +bt481_ramdac_in(uint16_t addr, int rs2, void *priv, svga_t *svga) +{ + bt481_ramdac_t * ramdac = (bt481_ramdac_t *) priv; + uint8_t temp = 0xff; + uint8_t rs = (addr & 0x03) | ((!!rs2) << 2); + + switch (rs) { + case 0x02: + case 0x06: + switch (ramdac->state) { + case 4: + temp = ramdac->cmd; + break; + default: + temp = svga_in(addr, svga); + ramdac->state++; + break; + } + break; + + default: + temp = svga_in(addr, svga); + ramdac->state = 0; + break; + } + + pclog("RAMDAC IN=%02x, ret=%02x.\n", rs, temp); + return temp; +} + +static void * +bt481_ramdac_init(const device_t *info) +{ + bt481_ramdac_t *ramdac = (bt481_ramdac_t *) malloc(sizeof(bt481_ramdac_t)); + memset(ramdac, 0, sizeof(bt481_ramdac_t)); + + return ramdac; +} + +static void +bt481_ramdac_close(void *priv) +{ + bt481_ramdac_t *ramdac = (bt481_ramdac_t *) priv; + + if (ramdac) + free(ramdac); +} + +const device_t bt481_ramdac_device = { + .name = "Brooktree Bt481 RAMDAC", + .internal_name = "bt481_ramdac", + .flags = 0, + .local = 0, + .init = bt481_ramdac_init, + .close = bt481_ramdac_close, + .reset = NULL, + { .available = NULL }, + .speed_changed = NULL, + .force_redraw = NULL, + .config = NULL +}; diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 73902345d..053ef2651 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -303,7 +303,7 @@ paradise_remap(paradise_t *paradise) void paradise_recalctimings(svga_t *svga) { - const paradise_t *paradise = (paradise_t *) svga->priv; + paradise_t *paradise = (paradise_t *) svga->priv; svga->lowres = !(svga->gdcreg[0x0e] & 0x01); @@ -337,15 +337,11 @@ paradise_recalctimings(svga_t *svga) svga->hdisp >>= 1; if (svga->hdisp == 788) svga->hdisp += 12; - if (svga->hdisp == 800) - svga->ma_latch -= 3; } else if (svga->bpp == 15) { svga->render = svga_render_15bpp_highres; svga->hdisp >>= 1; if (svga->hdisp == 788) svga->hdisp += 12; - if (svga->hdisp == 800) - svga->ma_latch -= 3; } else svga->render = svga_render_8bpp_highres; @@ -366,6 +362,11 @@ paradise_write(uint32_t addr, uint8_t val, void *priv) uint32_t prev_addr; uint32_t prev_addr2; + if (!(svga->attrregs[0x10] & 0x40)) { + svga_write(addr, val, svga); + return; + } + addr = (addr & 0x7fff) + paradise->write_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ @@ -399,6 +400,11 @@ paradise_writew(uint32_t addr, uint16_t val, void *priv) uint32_t prev_addr; uint32_t prev_addr2; + if (!(svga->attrregs[0x10] & 0x40)) { + svga_writew(addr, val, svga); + return; + } + addr = (addr & 0x7fff) + paradise->write_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ @@ -432,6 +438,9 @@ paradise_read(uint32_t addr, void *priv) uint32_t prev_addr; uint32_t prev_addr2; + if (!(svga->attrregs[0x10] & 0x40)) + return svga_read(addr, svga); + addr = (addr & 0x7fff) + paradise->read_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ @@ -465,6 +474,9 @@ paradise_readw(uint32_t addr, void *priv) uint32_t prev_addr; uint32_t prev_addr2; + if (!(svga->attrregs[0x10] & 0x40)) + return svga_readw(addr, svga); + addr = (addr & 0x7fff) + paradise->read_bank[(addr >> 15) & 3]; /*Could be done in a better way but it works.*/ diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 2b14284c7..c91eab589 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -253,6 +253,7 @@ typedef struct s3_t { uint16_t multifunc_cntl; uint16_t multifunc[16]; uint8_t pix_trans[4]; + uint16_t pix_trans_val; int ssv_state; int16_t cx, cy; @@ -278,14 +279,8 @@ typedef struct s3_t { uint8_t frgd_color_actual[2]; uint8_t bkgd_color_actual[2]; uint8_t wrt_mask_actual[2]; - uint8_t rd_mask_actual[2]; - uint8_t *pix_trans_ptr; - int pix_trans_ptr_cnt; - int pix_trans_x_count; - int pix_trans_x_count2; int color_16bit_check; - int color_16bit_check_rectfill; - uint16_t minus, srcminus; + int16_t minus; /*For non-threaded FIFO*/ int setup_fifo_slot; @@ -412,6 +407,7 @@ static uint32_t s3_accel_read_l(uint32_t addr, void *priv); static void s3_out(uint16_t addr, uint8_t val, void *priv); static uint8_t s3_in(uint16_t addr, void *priv); +static void s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val); static void s3_accel_out(uint16_t port, uint8_t val, void *priv); static void s3_accel_out_w(uint16_t port, uint16_t val, void *priv); static void s3_accel_out_l(uint16_t port, uint32_t val, void *priv); @@ -508,11 +504,10 @@ s3_update_irqs(s3_t *s3) if (!s3->pci) return; - if (s3->subsys_cntl & s3->subsys_stat & INT_MASK) { + if (s3->subsys_cntl & s3->subsys_stat & INT_MASK) pci_set_irq(s3->pci_slot, PCI_INTA, &s3->irq_state); - } else { + else pci_clear_irq(s3->pci_slot, PCI_INTA, &s3->irq_state); - } } void s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, void *priv); @@ -536,21 +531,20 @@ static void s3_visionx68_video_engine_op(uint32_t cpu_dat, s3_t *s3); } #define READ_PIXTRANS_BYTE_IO(n) \ - s3->accel.pix_trans[n] = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx + n - s3->accel.minus)) & s3->vram_mask]; + s3->accel.pix_trans[n] = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus + n)) & s3->vram_mask]; #define READ_PIXTRANS_BYTE_MM \ temp = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx)) & s3->vram_mask]; #define READ_PIXTRANS_WORD \ - if ((s3->bpp == 0) && !s3->color_16bit) { \ + if ((s3->bpp == 0) && !s3->color_16bit) { \ temp = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx)) & s3->vram_mask]; \ temp |= (svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx + 1)) & s3->vram_mask] << 8); \ - } else { \ - temp = vram_w[dword_remap_w(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus)) & (s3->vram_mask >> 1)]; \ - } + } else \ + temp = vram_w[dword_remap_w(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus)) & (s3->vram_mask >> 1)]; #define READ_PIXTRANS_LONG \ - if ((s3->bpp == 0) && !s3->color_16bit) { \ + if ((s3->bpp == 0) && !s3->color_16bit) { \ temp = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx)) & s3->vram_mask]; \ temp |= (svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx + 1)) & s3->vram_mask] << 8); \ temp |= (svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx + 2)) & s3->vram_mask] << 16); \ @@ -612,111 +606,62 @@ s3_accel_out_pixtrans_w(s3_t *s3, uint16_t val) s3->accel.frgd_mix, s3->accel.bkgd_mix, s3->accel.cur_x, val); switch (s3->accel.cmd & 0x600) { case 0x000: - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { if (s3->accel.cmd & 0x1000) val = (val >> 8) | (val << 8); s3->accel_start(8, 1, val | (val << 16), 0, s3); + } else { + if ((s3->bpp == 0) && s3->color_16bit) + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); + else + s3->accel_start(1, 1, 0xffffffff, val | (val << 16), s3); + } + } else { + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.cur_x & 0x400) + val = (val >> 8) | (val << 8); + + s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); } else s3->accel_start(1, 1, 0xffffffff, val | (val << 16), s3); - } else { - if (s3->accel.color_16bit_check_rectfill) { - if (s3->accel.color_16bit_check) { - if (s3->accel.pix_trans_x_count < s3->accel.pix_trans_ptr_cnt) { - s3_log("Word: CPU data CMD=%04x, byte write=%02x, " - "cnt=%d, check=%d.\n", s3->accel.cmd, val & 0xff, - s3->accel.pix_trans_x_count, s3->accel.color_16bit_check); - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count] = val & 0xff; - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count + 1] = val >> 8; - s3->accel.pix_trans_x_count += 2; - } - } - break; - } - s3->accel_start(1, 1, 0xffffffff, val | (val << 16), s3); } break; case 0x200: - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { if (s3->accel.cmd & 0x1000) val = (val >> 8) | (val << 8); + s3->accel_start(16, 1, val | (val << 16), 0, s3); } else s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); } else { - if (s3->accel.color_16bit_check_rectfill) { - if (s3->accel.color_16bit_check) { - if (s3->accel.pix_trans_x_count < s3->accel.pix_trans_ptr_cnt) { - s3_log("Word: CPU data CMD=%04x, word write=%04x, cnt=%d, check=%d, " - "totalptrcnt=%d.\n", s3->accel.cmd, val, - s3->accel.pix_trans_x_count, s3->accel.color_16bit_check, - s3->accel.pix_trans_ptr_cnt); - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count] = val & 0xff; - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count + 1] = val >> 8; - s3->accel.pix_trans_x_count += 2; - s3->accel.pix_trans_x_count2 = s3->accel.pix_trans_x_count; - } - } else { - if (s3->accel.pix_trans_x_count < s3->accel.pix_trans_ptr_cnt) { - s3_log("Word: CPU data CMD=%04x, word write=%04x, cnt=%d, check=%d, " - "totalptrcnt=%d.\n", s3->accel.cmd, val, - s3->accel.pix_trans_x_count, s3->accel.color_16bit_check, - s3->accel.pix_trans_ptr_cnt); - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count2] = val & 0xff; - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count2 + 1] = val >> 8; - s3->accel.pix_trans_x_count += 2; - } - if (s3->accel.pix_trans_x_count2 == s3->accel.pix_trans_ptr_cnt) { - for (int i = 0; i < s3->accel.pix_trans_ptr_cnt; i += 2) { - s3_log("Transferring write count=%d, bytes=%08x.\n", i, - s3->accel.pix_trans_ptr[i] | - (s3->accel.pix_trans_ptr[i + 1] << 8) | - (s3->accel.pix_trans_ptr[i + 2] << 16) | - (s3->accel.pix_trans_ptr[i + 3] << 24)); - s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans_ptr[i] | - (s3->accel.pix_trans_ptr[i + 1] << 8), s3); - } - - s3->accel.pix_trans_x_count2 = 0; - s3->accel.color_16bit_check_rectfill = 0; - if (s3->accel.pix_trans_ptr != NULL) { - free(s3->accel.pix_trans_ptr); - s3->accel.pix_trans_ptr = NULL; - } - } - } - break; + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.cur_x & 0x400) + val = (val >> 8) | (val << 8); } s3->accel_start(2, 1, 0xffffffff, val | (val << 16), s3); } break; case 0x400: - if (svga->crtc[0x53] & 0x08) { - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { - if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { - if (s3->accel.cmd & 0x1000) - val = (val >> 8) | (val << 8); + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { + if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { + if (s3->accel.cmd & 0x1000) + val = (val >> 8) | (val << 8); + + if (svga->crtc[0x53] & 0x08) s3->accel_start(32, 1, val | (val << 16), 0, s3); - } else - s3->accel_start(4, 1, 0xffffffff, val | (val << 16), s3); - } else - s3->accel_start(4, 1, 0xffffffff, val | (val << 16), s3); - } else { - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { - if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { - if (s3->accel.cmd & 0x1000) - val = (val >> 8) | (val << 8); + else s3->accel_start(16, 1, val | (val << 16), 0, s3); - } else - s3->accel_start(4, 1, 0xffffffff, val | (val << 16), s3); } else s3->accel_start(4, 1, 0xffffffff, val | (val << 16), s3); - } + } else + s3->accel_start(4, 1, 0xffffffff, val | (val << 16), s3); break; case 0x600: if (s3->chip == S3_TRIO32 || s3->chip == S3_VISION968 || s3->chip == S3_VISION868 || s3->chip >= S3_TRIO64V) { - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { if (s3->accel.cmd & 0x1000) val = (val >> 8) | (val << 8); @@ -805,7 +750,7 @@ s3_accel_out_pixtrans_l(s3_t *s3, uint32_t val) static void s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) { - const svga_t *svga = &s3->svga; + svga_t *svga = &s3->svga; switch (port) { case 0x8148: @@ -840,6 +785,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.cur_x = (s3->accel.cur_x & 0xff) | ((val & 0x0f) << 8); s3->accel.poly_cx = s3->accel.poly_x = s3->accel.cur_x << 20; s3->accel.poly_x = s3->accel.poly_cx >> 20; + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port - 1, s3->accel.cur_x); break; case 0x854a: case 0x86ea: @@ -954,6 +900,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) if (!(s3->accel.multifunc[0xe] & 0x200)) s3->accel.multifunc[0xe] &= ~0x10; } + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%04x.\n", CS, cpu_state.pc, port - 1, s3->accel.cmd); s3->accel_start(-1, 0, 0xffffffff, 0, s3); break; @@ -989,6 +936,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xa148: case 0xa2e8: + s3_log("[%04X:%08X] OUT PORTB=%04x (Background Color), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { if (s3->accel.multifunc[0xe] & 0x10) @@ -1006,6 +954,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa149: case 0xa2e9: + s3_log("[%04X:%08X] OUT PORTB=%04x (Background Color), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { if (s3->accel.multifunc[0xe] & 0x10) @@ -1069,6 +1018,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xa548: case 0xa6e8: + s3_log("[%04X:%08X] OUT PORTB=%04x (Foreground Color), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { if (s3->accel.multifunc[0xe] & 0x10) @@ -1086,6 +1036,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa549: case 0xa6e9: + s3_log("[%04X:%08X] OUT PORTB=%04x (Foreground Color), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { if (s3->accel.multifunc[0xe] & 0x10) @@ -1113,7 +1064,6 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.multifunc[0xe] ^= 0x10; } } - if (s3->accel.color_16bit_check) s3->accel.frgd_color_actual[1] = s3->accel.frgd_color & 0xff; else @@ -1150,6 +1100,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xa948: case 0xaae8: + s3_log("[%04X:%08X] OUT PORTB=%04x (Write Mask), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { if (s3->accel.multifunc[0xe] & 0x10) @@ -1167,6 +1118,7 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xa949: case 0xaae9: + s3_log("[%04X:%08X] OUT PORTB=%04x (Write Mask), val=%02x.\n", CS, cpu_state.pc, port, val); if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { if (s3->accel.multifunc[0xe] & 0x10) @@ -1194,7 +1146,6 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel.multifunc[0xe] ^= 0x10; } } - if (s3->accel.color_16bit_check) s3->accel.wrt_mask_actual[1] = s3->accel.wrt_mask & 0xff; else @@ -1307,7 +1258,8 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xb148: case 0xb2e8: - if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_86C928)) { + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); + if (s3->accel.multifunc[0xe] & 0x100) { s3->accel.b2e8_pix = 0; if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { @@ -1336,48 +1288,8 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) s3->accel_start(8, 1, s3->accel.pix_trans[0], 0, s3); else s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); - } else { - if (s3->accel.color_16bit_check_rectfill) { - if (s3->accel.color_16bit_check) { - if (s3->accel.pix_trans_x_count < s3->accel.pix_trans_ptr_cnt) { - s3_log("Byte: CPU data CMD=%04x, byte write=%02x, cnt=%d, " - "check=%d.\n", s3->accel.cmd, val, - s3->accel.pix_trans_x_count, s3->accel.color_16bit_check); - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count] = val; - s3->accel.pix_trans_x_count++; - s3->accel.pix_trans_x_count2 = s3->accel.pix_trans_x_count; - } - } else { - if (s3->accel.pix_trans_x_count2 < s3->accel.pix_trans_ptr_cnt) { - s3_log("Byte: CPU data CMD=%04x, byte write=%02x, cnt=%d, " - "check=%d.\n", s3->accel.cmd, val, - s3->accel.pix_trans_x_count2, s3->accel.color_16bit_check); - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count2] = val; - s3->accel.pix_trans_x_count2++; - } - s3_log("WriteCNT=%d, TotalCNT=%d.\n", s3->accel.pix_trans_x_count2, - s3->accel.pix_trans_ptr_cnt); - if (s3->accel.pix_trans_x_count2 == s3->accel.pix_trans_ptr_cnt) { - for (int i = 0; i < s3->accel.pix_trans_ptr_cnt; i += 2) { - s3_log("Transferring write count=%d, bytes=%04x.\n", i, - s3->accel.pix_trans_ptr[i] | - (s3->accel.pix_trans_ptr[i + 1] << 8)); - s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans_ptr[i] | - (s3->accel.pix_trans_ptr[i + 1] << 8), s3); - } - - s3->accel.pix_trans_x_count2 = 0; - s3->accel.color_16bit_check_rectfill = 0; - if (s3->accel.pix_trans_ptr != NULL) { - free(s3->accel.pix_trans_ptr); - s3->accel.pix_trans_ptr = NULL; - } - } - } - break; - } + } else s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); - } break; default: @@ -1388,7 +1300,8 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xb149: case 0xb2e9: - if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_86C928)) { + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); + if (s3->accel.multifunc[0xe] & 0x100) { s3->accel.b2e8_pix = 0; if (s3->bpp == 3) { if ((s3->chip >= S3_86C928) && (s3->chip < S3_VISION964)) { @@ -1643,6 +1556,8 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) case 0xe148: case 0xe2e8: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d), WRTMASK=%04x.\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y, s3->accel.wrt_mask); + s3_log(".\n"); s3->accel.b2e8_pix = 0; if (s3_cpu_dest(s3)) break; @@ -1656,46 +1571,17 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) else s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); } else { - if (s3->accel.color_16bit_check_rectfill) { - if (s3->accel.color_16bit_check) { - if (s3->accel.pix_trans_x_count < s3->accel.pix_trans_ptr_cnt) { - s3_log("Byte: CPU data CMD=%04x, byte write=%02x, cnt=%d, " - "check=%d.\n", s3->accel.cmd, val, - s3->accel.pix_trans_x_count, s3->accel.color_16bit_check); - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count] = val; - s3->accel.pix_trans_x_count++; - s3->accel.pix_trans_x_count2 = s3->accel.pix_trans_x_count; - } + if ((s3->bpp == 0) && s3->color_16bit) { + s3->accel.pix_trans[1] = svga->vram[dword_remap(svga, (s3->accel.dest + s3->accel.cx - s3->accel.minus)) & s3->vram_mask]; + if (s3->accel.cur_x & 0x400) { + s3_log("Last Pixel Written=%02x (1024).\n", s3->accel.pix_trans[1]); + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[1] | (s3->accel.pix_trans[0] << 8), s3); } else { - if (s3->accel.pix_trans_x_count2 < s3->accel.pix_trans_ptr_cnt) { - s3_log("Byte: CPU data CMD=%04x, byte write=%02x, cnt=%d, " - "check=%d.\n", s3->accel.cmd, val, - s3->accel.pix_trans_x_count2, s3->accel.color_16bit_check); - s3->accel.pix_trans_ptr[s3->accel.pix_trans_x_count2] = val; - s3->accel.pix_trans_x_count2++; - } - s3_log("WriteCNT=%d, TotalCNT=%d.\n", s3->accel.pix_trans_x_count2, - s3->accel.pix_trans_ptr_cnt); - if (s3->accel.pix_trans_x_count2 == s3->accel.pix_trans_ptr_cnt) { - for (int i = 0; i < s3->accel.pix_trans_ptr_cnt; i += 2) { - s3_log("Transferring write count=%d, bytes=%04x.\n", i, - s3->accel.pix_trans_ptr[i] | - (s3->accel.pix_trans_ptr[i + 1] << 8)); - s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans_ptr[i] | - (s3->accel.pix_trans_ptr[i + 1] << 8), s3); - } - - s3->accel.pix_trans_x_count2 = 0; - s3->accel.color_16bit_check_rectfill = 0; - if (s3->accel.pix_trans_ptr != NULL) { - free(s3->accel.pix_trans_ptr); - s3->accel.pix_trans_ptr = NULL; - } - } + s3_log("Last Pixel Written=%02x (0).\n", s3->accel.pix_trans[1]); + s3->accel_start(2, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), s3); } - break; - } - s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); + } else + s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); } break; @@ -1706,6 +1592,8 @@ s3_accel_out_fifo(s3_t *s3, uint16_t port, uint8_t val) break; case 0xe149: case 0xe2e9: + s3_log("[%04X:%08X] OUT PORTB=%04x, val=%02x, CMD=%04x, C(%d,%d), WRTMASK=%04x.\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y, s3->accel.wrt_mask); + s3_log(".\n"); s3->accel.b2e8_pix = 0; if (s3_cpu_dest(s3)) break; @@ -1859,6 +1747,8 @@ static void s3_accel_out_fifo_w(s3_t *s3, uint16_t port, uint16_t val) { if ((port != 0x9ee8) && (port != 0x9d48)) { + s3_log("[%04X:%08X] OUT PORTW=%04x, val=%04x, CMD=%04x, C(%d,%d), WRTMASK=%04x.\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y, s3->accel.wrt_mask); + s3_log(".\n"); if ((port == 0xb2e8) || (port == 0xb148)) { if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_86C928)) { s3->accel.b2e8_pix = 0; @@ -1869,7 +1759,6 @@ s3_accel_out_fifo_w(s3_t *s3, uint16_t port, uint16_t val) s3_accel_out_pixtrans_w(s3, val); } } else { - s3_log("Port WriteW FIFO=%04x, val=%04x, bussize=%03x.\n", port, val, s3->accel.cmd & 0x600); s3->accel.b2e8_pix = 0; if ((port == 0xe2e8) || (port == 0xe2ea) || (port == 0xe148) || (port == 0xe14a)) s3_accel_out_pixtrans_w(s3, val); @@ -1899,6 +1788,7 @@ static void s3_accel_out_fifo_l(s3_t *s3, uint16_t port, uint32_t val) { if ((port == 0xb2e8) || (port == 0xb148)) { + s3_log("[%04X:%08X] OUT PORTL=%04x, val=%08x, CMD=%04x, C(%d,%d).\n", CS, cpu_state.pc, port, val, s3->accel.cmd, s3->accel.cur_x, s3->accel.cur_y); if ((s3->accel.multifunc[0xe] & 0x100) || (s3->chip >= S3_86C928)) { s3->accel.b2e8_pix = 0; s3_accel_out_fifo(s3, port, val); @@ -1911,7 +1801,6 @@ s3_accel_out_fifo_l(s3_t *s3, uint16_t port, uint32_t val) } } else { s3->accel.b2e8_pix = 0; - s3_log("Port WriteL FIFO=%04x, val=%08x, bussize=%03x.\n", port, val, s3->accel.cmd & 0x600); if ((port == 0xe2e8) || (port == 0xe148)) s3_accel_out_pixtrans_l(s3, val); else { @@ -2867,6 +2756,8 @@ s3_out(uint16_t addr, uint8_t val, void *priv) svga->write_bank = svga->read_bank = s3->bank << 16; else svga->write_bank = svga->read_bank = s3->bank << 14; + + svga_recalctimings(svga); } else if (svga->seqaddr == 9) { svga->seqregs[svga->seqaddr] = val & 0x80; s3_io_set(s3); @@ -2979,6 +2870,8 @@ s3_out(uint16_t addr, uint8_t val, void *priv) svga->write_bank = svga->read_bank = s3->bank << 16; else svga->write_bank = svga->read_bank = s3->bank << 14; + + s3_log("CRTC35 Chain4=%x, Bank=%02x.\n", svga->chain4, s3->bank); break; case 0x51: @@ -3105,21 +2998,9 @@ s3_out(uint16_t addr, uint8_t val, void *priv) case 0x43: if (s3->chip < S3_VISION964) { - if (s3->chip <= S3_86C805) { - s3->color_16bit = !!(val & 8); - if (s3->color_16bit) { - s3->width = 1024; - } else { - if (s3->chip <= S3_86C924) - s3->width = 1024; - else { - if (s3->accel.advfunc_cntl & 4) - s3->width = 1024; - else - s3->width = 640; - } - } - } + if (s3->chip <= S3_86C805) + svga_recalctimings(svga); + s3_io_remove_alt(s3); s3->translate = !!(val & 0x10); s3_io_set_alt(s3); @@ -3332,6 +3213,140 @@ s3_in(uint16_t addr, void *priv) return svga_in(addr, svga); } +uint32_t +s3_decode_addr(svga_t *svga, uint32_t addr, int write) +{ + int memory_map_mode = (svga->gdcreg[6] >> 2) & 3; + + s3_log("CRTC31 bit 3=%x, map=%x, write=%x, wrtbank=%x, chain4=%x.\n", svga->crtc[0x31] & 0x08, memory_map_mode, write, svga->write_bank, svga->chain4); + + if (svga->crtc[0x31] & 0x08) + memory_map_mode = 1; + + addr &= 0x1ffff; + + switch (memory_map_mode) { + case 0: + break; + case 1: + if (addr >= 0x10000) + return 0xffffffff; + break; + case 2: + addr -= 0x10000; + if (addr >= 0x8000) + return 0xffffffff; + break; + default: + case 3: + addr -= 0x18000; + if (addr >= 0x8000) + return 0xffffffff; + break; + } + + if (memory_map_mode <= 1) { + if (write) + addr += svga->write_bank; + else + addr += svga->read_bank; + } + + return addr; +} + +static void +s3_write(uint32_t addr, uint8_t val, void *priv) +{ + s3_t *s3 = (s3_t *) priv; + svga_t *svga = &s3->svga; + + xga_write_test(addr, val, svga); + addr = s3_decode_addr(svga, addr, 1); + if (addr == 0xffffffff) + return; + + svga_write_linear(addr, val, svga); +} + +static void +s3_writew(uint32_t addr, uint16_t val, void *priv) +{ + s3_t *s3 = (s3_t *) priv; + svga_t *svga = &s3->svga; + + xga_write_test(addr, val, svga); + xga_write_test(addr + 1, val >> 8, svga); + addr = s3_decode_addr(svga, addr, 1); + if (addr == 0xffffffff) + return; + + svga_writew_linear(addr, val, svga); +} + +static void +s3_writel(uint32_t addr, uint32_t val, void *priv) +{ + s3_t *s3 = (s3_t *) priv; + svga_t *svga = &s3->svga; + + xga_write_test(addr, val, svga); + xga_write_test(addr + 1, val >> 8, svga); + xga_write_test(addr + 2, val >> 16, svga); + xga_write_test(addr + 3, val >> 24, svga); + addr = s3_decode_addr(svga, addr, 1); + if (addr == 0xffffffff) + return; + + svga_writel_linear(addr, val, svga); +} + +static uint8_t +s3_read(uint32_t addr, void *priv) +{ + s3_t *s3 = (s3_t *) priv; + svga_t *svga = &s3->svga; + + (void) xga_read_test(addr, svga); + addr = s3_decode_addr(svga, addr, 0); + if (addr == 0xffffffff) + return 0xff; + + return svga_read_linear(addr, svga); +} + +static uint16_t +s3_readw(uint32_t addr, void *priv) +{ + s3_t *s3 = (s3_t *) priv; + svga_t *svga = &s3->svga; + + (void) xga_read_test(addr, svga); + (void) xga_read_test(addr + 1, svga); + addr = s3_decode_addr(svga, addr, 0); + if (addr == 0xffffffff) + return 0xffff; + + return svga_readw_linear(addr, svga); +} + +static uint32_t +s3_readl(uint32_t addr, void *priv) +{ + s3_t *s3 = (s3_t *) priv; + svga_t *svga = &s3->svga; + + (void) xga_read_test(addr, svga); + (void) xga_read_test(addr + 1, svga); + (void) xga_read_test(addr + 2, svga); + (void) xga_read_test(addr + 3, svga); + addr = s3_decode_addr(svga, addr, 0); + if (addr == 0xffffffff) + return 0xffffffff; + + return svga_readl_linear(addr, svga); +} + static void s3_recalctimings(svga_t *svga) { @@ -3416,33 +3431,48 @@ s3_recalctimings(svga_t *svga) break; } - if (s3->chip != S3_86C801) - mask |= 0x01; - switch (svga->crtc[0x50] & mask) { - case 0x00: - if (s3->color_16bit) - s3->width = 1024; - else - s3->width = (svga->crtc[0x31] & 2) ? 2048 : 1024; - break; - case 0x01: - s3->width = 1152; - break; - case 0x40: - s3->width = 640; - break; - case 0x80: - s3->width = ((s3->chip > S3_86C805) && (s3->accel.advfunc_cntl & 4)) ? 1600 : 800; - break; - case 0x81: - s3->width = 1600; - break; - case 0xc0: - s3->width = 1280; - break; + if (s3->chip <= S3_86C805) { + s3->color_16bit = !!(svga->crtc[0x43] & 0x08); + if (svga->bpp == 24) + s3->color_16bit = 0; - default: - break; + if (s3->color_16bit) + s3->width = 1024; + else { + if (s3->chip <= S3_86C924) + s3->width = 1024; + } + } + + if (s3->chip >= S3_86C928) { + if (s3->chip != S3_86C801) + mask |= 0x01; + + switch (svga->crtc[0x50] & mask) { + case 0x00: + s3->width = (svga->crtc[0x31] & 0x02) ? 2048 : 1024; + if (s3->color_16bit) + s3->width = 1024; + break; + case 0x01: + s3->width = 1152; + break; + case 0x40: + s3->width = 640; + break; + case 0x80: + s3->width = ((s3->chip > S3_86C805) && (s3->accel.advfunc_cntl & 0x04)) ? 1600 : 800; + break; + case 0x81: + s3->width = 1600; + break; + case 0xc0: + s3->width = 1280; + break; + + default: + break; + } } if (svga->crtc[0x33] & 0x20) { @@ -4275,14 +4305,27 @@ s3_recalctimings(svga_t *svga) /*Enhanced 4bpp mode, just like the 8bpp mode per the spec. */ svga->render = svga_render_8bpp_highres; svga->rowoffset <<= 1; + svga->vram_display_mask = s3->vram_mask; + } else { + svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; + svga->write_bank = 0; + svga->read_bank = svga->write_bank; } - svga->vram_display_mask = s3->vram_mask; - } else + } else { svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; - } else + svga->write_bank = 0; + svga->read_bank = svga->write_bank; + } + } else { svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; - } else + svga->write_bank = 0; + svga->read_bank = svga->write_bank; + } + } else { svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; + svga->write_bank = 0; + svga->read_bank = svga->write_bank; + } } if ((s3->chip == S3_TRIO32) || (s3->chip == S3_TRIO64) || (s3->chip == S3_VISION864)) @@ -4421,8 +4464,11 @@ s3_trio64v_recalctimings(svga_t *svga) break; } svga->vram_display_mask = s3->vram_mask; - } else + } else { svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; + svga->write_bank = 0; + svga->read_bank = svga->write_bank; + } } else /*Streams mode*/ { if (s3->streams.buffer_ctrl & 1) @@ -4724,7 +4770,7 @@ s3_accel_in(uint16_t port, void *priv) s3_t *s3 = (s3_t *) priv; svga_t *svga = &s3->svga; int temp; - uint8_t temp2; + uint8_t temp2 = 0x00; if (!s3->enable_8514) return 0xff; @@ -5605,7 +5651,7 @@ s3_accel_in(uint16_t port, void *priv) if (s3->accel.cmd & 0x100) { switch (s3->accel.cmd & 0x600) { case 0x000: - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) s3->accel_start(8, 1, s3->accel.pix_trans[0], 0, s3); else @@ -5614,7 +5660,7 @@ s3_accel_in(uint16_t port, void *priv) s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0], s3); break; case 0x200: - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) s3->accel_start(16, 1, s3->accel.pix_trans[0], 0, s3); else @@ -5637,7 +5683,7 @@ s3_accel_in(uint16_t port, void *priv) if (s3->accel.cmd & 0x100) { switch (s3->accel.cmd & 0x600) { case 0x000: - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) s3->accel_start(8, 1, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), 0, s3); else @@ -5646,7 +5692,7 @@ s3_accel_in(uint16_t port, void *priv) s3->accel_start(1, 1, 0xffffffff, s3->accel.pix_trans[0] | (s3->accel.pix_trans[1] << 8), s3); break; case 0x200: - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { + if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 0x02)) { if (((s3->accel.frgd_mix & 0x60) != 0x40) || ((s3->accel.bkgd_mix & 0x60) != 0x40)) { if (s3->accel.cmd & 0x1000) s3->accel_start(16, 1, s3->accel.pix_trans[1] | (s3->accel.pix_trans[0] << 8), 0, s3); @@ -5760,10 +5806,21 @@ s3_accel_in_w(uint16_t port, void *priv) if (s3->accel.cmd & 0x1000) temp = (temp >> 8) | (temp << 8); s3->accel_start(8, 1, temp | (temp << 16), 0, s3); + } else { + if ((s3->bpp == 0) && s3->color_16bit) + s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); + else + s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); + } + } else { + if ((s3->bpp == 0) && s3->color_16bit) { + if (s3->accel.cur_x & 0x400) + temp = ((temp >> 8) | (temp << 8)) & 0xffff; + + s3->accel_start(2, 1, 0xffffffff, temp | (temp << 16), s3); } else s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); - } else - s3->accel_start(1, 1, 0xffffffff, temp | (temp << 16), s3); + } break; case 0x200: if (((s3->accel.multifunc[0xa] & 0xc0) == 0x80) || (s3->accel.cmd & 2)) { @@ -6479,15 +6536,11 @@ polygon_setup(s3_t *s3) } #define READ(addr, dat) \ - if ((s3->bpp == 0) && !s3->color_16bit) \ + if (((s3->bpp == 0) && !s3->color_16bit) || (s3->bpp == 2)) \ dat = svga->vram[dword_remap(svga, addr) & s3->vram_mask]; \ - else if ((s3->bpp == 1) || (s3->color_16bit && (svga->bpp < 24))) \ + else if ((s3->bpp == 1) || s3->color_16bit) \ dat = vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)]; \ - else if (s3->bpp == 2) \ - dat = svga->vram[dword_remap(svga, addr) & s3->vram_mask]; \ - else if (s3->color_16bit && (svga->bpp == 24)) { \ - dat = vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)]; \ - } else \ + else \ dat = vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)]; #define MIX_READ \ @@ -6548,7 +6601,7 @@ polygon_setup(s3_t *s3) { \ old_dest_dat = dest_dat; \ MIX_READ \ - dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); \ + dest_dat = (dest_dat & wrt_mask) | (old_dest_dat & ~wrt_mask); \ } #define ROPMIX_READ(D, P, S) \ @@ -7333,20 +7386,14 @@ polygon_setup(s3_t *s3) } #define WRITE(addr, dat) \ - if ((s3->bpp == 0) && !s3->color_16bit) { \ - svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ + if (((s3->bpp == 0) && !s3->color_16bit) || (s3->bpp == 2)) { \ + svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ - } else if ((s3->bpp == 1) || (s3->color_16bit && (svga->bpp < 24))) { \ + } else if ((s3->bpp == 1) || s3->color_16bit) { \ vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)] = dat; \ svga->changedvram[(dword_remap_w(svga, addr) & (s3->vram_mask >> 1)) >> 11] = svga->monitor->mon_changeframecount; \ - } else if (s3->bpp == 2) { \ - svga->vram[dword_remap(svga, addr) & s3->vram_mask] = dat; \ - svga->changedvram[(dword_remap(svga, addr) & s3->vram_mask) >> 12] = svga->monitor->mon_changeframecount; \ - } else if (s3->color_16bit && (svga->bpp == 24)) { \ - vram_w[dword_remap_w(svga, addr) & (s3->vram_mask >> 1)] = dat; \ - svga->changedvram[(dword_remap_w(svga, addr) & (s3->vram_mask >> 1)) >> 11] = svga->monitor->mon_changeframecount; \ } else { \ - vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)] = dat; \ + vram_l[dword_remap_l(svga, addr) & (s3->vram_mask >> 2)] = dat; \ svga->changedvram[(dword_remap_l(svga, addr) & (s3->vram_mask >> 2)) >> 10] = svga->monitor->mon_changeframecount; \ } @@ -7731,745 +7778,6 @@ s3_visionx68_video_engine_op(uint32_t cpu_dat, s3_t *s3) } } -void -s3_911_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, void *priv) -{ - s3_t *s3 = (s3_t *)priv; - svga_t *svga = &s3->svga; - uint32_t src_dat = 0; - uint32_t dest_dat; - uint32_t old_dest_dat; - int frgd_mix; - int bkgd_mix; - int clip_t = s3->accel.multifunc[1] & 0xfff; - int clip_l = s3->accel.multifunc[2] & 0xfff; - int clip_b = s3->accel.multifunc[3] & 0xfff; - int clip_r = s3->accel.multifunc[4] & 0xfff; - int vram_mask = (s3->accel.multifunc[0xa] & 0xc0) == 0xc0; - uint32_t mix_mask = (s3->accel.cmd & 0x200) ? 0x8000 : 0x80; - uint16_t *vram_w = (uint16_t *) svga->vram; - uint32_t *vram_l = (uint32_t *) svga->vram; - uint32_t rd_mask = s3->accel.rd_mask; - uint32_t wrt_mask = s3->accel.wrt_mask; - uint32_t frgd_color = s3->accel.frgd_color; - uint32_t bkgd_color = s3->accel.bkgd_color; - int cmd = s3->accel.cmd >> 13; - - if ((s3->accel.cmd & 0x100) && (s3_cpu_src(s3) || (s3_cpu_dest(s3))) && (!cpu_input || (s3_enable_fifo(s3) == 0))) - s3->force_busy = 1; - - if (cpu_input && (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 2)))) { - if (s3->color_16bit) { - if (count > 1) - count >>= 1; - } - } - - if (s3->color_16bit) - rd_mask &= 0xffff; - else - rd_mask &= 0xff; - - /*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled. - When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on - the NOP command)*/ - - switch (cmd) { - case 0: /*NOP (Short Stroke Vectors)*/ - if (s3->accel.ssv_state == 0) - break; - - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - - if (s3->accel.cmd & 8) { /*Radial*/ - while (count-- && s3->accel.ssv_len >= 0) { - if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { - 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 = cpu_dat; - break; - case 3: - src_dat = 0; - break; - - default: - break; - } - - READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); - - MIX - - if (s3->accel.ssv_draw) { - WRITE((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); - } - } - - mix_dat <<= 1; - mix_dat |= 1; - if (s3->bpp == 0) - cpu_dat >>= 8; - else - cpu_dat >>= 16; - - if (!s3->accel.ssv_len) - break; - - switch (s3->accel.ssv_dir & 0xe0) { - case 0x00: - s3->accel.cx++; - break; - case 0x20: - s3->accel.cx++; - s3->accel.cy--; - break; - case 0x40: - s3->accel.cy--; - break; - case 0x60: - s3->accel.cx--; - s3->accel.cy--; - break; - case 0x80: - s3->accel.cx--; - break; - case 0xa0: - s3->accel.cx--; - s3->accel.cy++; - break; - case 0xc0: - s3->accel.cy++; - break; - case 0xe0: - s3->accel.cx++; - s3->accel.cy++; - break; - - default: - break; - } - - s3->accel.ssv_len--; - s3->accel.cx &= 0xfff; - s3->accel.cy &= 0xfff; - } - - s3->accel.cur_x = s3->accel.cx; - s3->accel.cur_y = s3->accel.cy; - } - break; - - case 1: /*Draw line*/ - if (!cpu_input) { - s3->accel.cx = s3->accel.cur_x & 0xfff; - s3->accel.cy = s3->accel.cur_y & 0xfff; - s3->accel.sy = s3->accel.maj_axis_pcnt & 0x7ff; - - if (s3->color_16bit && (svga->bpp < 24)) { - if (s3->accel.wrt_mask != 0xffff) { - if (s3->accel.cur_x & 0x400) { - s3->accel.color_16bit_check = 0; - s3->accel.minus = 0x400; - } else { - s3->accel.color_16bit_check = 1; - s3->accel.minus = 0; - } - } else { - if (s3->accel.cur_x & 0x400) - s3->accel.color_16bit_check = 1; - else - s3->accel.color_16bit_check = 0; - - s3->accel.minus = 0; - } - } else { - s3->accel.color_16bit_check = 0; - s3->accel.minus = 0; - } - - if (s3_cpu_src(s3)) - return; /*Wait for data from CPU*/ - } - - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - - if (s3->accel.cmd & 8) { /*Radial*/ - if (s3->color_16bit && (svga->bpp < 24)) { - if (s3->accel.color_16bit_check) - return; - if (s3->accel.wrt_mask != 0xffff) - wrt_mask = (s3->accel.wrt_mask_actual[0] | (s3->accel.wrt_mask_actual[1] << 8)); - } - - while (count-- && s3->accel.sy >= 0) { - if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { - switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { - case 0: - src_dat = bkgd_color; - if (s3->color_16bit && (svga->bpp < 24)) - src_dat = s3->accel.bkgd_color_actual[0] | (s3->accel.bkgd_color_actual[1] << 8); - break; - case 1: - src_dat = frgd_color; - if (s3->color_16bit && (svga->bpp < 24)) - src_dat = s3->accel.frgd_color_actual[0] | (s3->accel.frgd_color_actual[1] << 8); - break; - case 2: - src_dat = cpu_dat; - break; - case 3: - src_dat = 0; - break; - - default: - break; - } - - READ((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); - - MIX - - WRITE((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); - } - - mix_dat <<= 1; - mix_dat |= 1; - if ((s3->bpp == 0) && !s3->color_16bit) - cpu_dat >>= 8; - else - cpu_dat >>= 16; - - if (!s3->accel.sy) - break; - - switch (s3->accel.cmd & 0xe0) { - case 0x00: - s3->accel.cx++; - break; - case 0x20: - s3->accel.cx++; - s3->accel.cy--; - break; - case 0x40: - s3->accel.cy--; - break; - case 0x60: - s3->accel.cx--; - s3->accel.cy--; - break; - case 0x80: - s3->accel.cx--; - break; - case 0xa0: - s3->accel.cx--; - s3->accel.cy++; - break; - case 0xc0: - s3->accel.cy++; - break; - case 0xe0: - s3->accel.cx++; - s3->accel.cy++; - break; - - default: - break; - } - s3->accel.sy--; - s3->accel.cx &= 0xfff; - s3->accel.cy &= 0xfff; - } - s3->accel.cur_x = s3->accel.cx; - s3->accel.cur_y = s3->accel.cy; - } else { /*Bresenham*/ - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Stupid undocumented 0xB2E8 on 911/924*/ - count = s3->accel.maj_axis_pcnt + 1; - s3->accel.temp_cnt = 16; - } - - if (s3->color_16bit && (svga->bpp < 24)) { - if (!s3->accel.b2e8_pix) { - if (!s3->accel.color_16bit_check) - wrt_mask = (s3->accel.wrt_mask_actual[0] | (s3->accel.wrt_mask_actual[1] << 8)); - else - return; - } - } - - s3_log("CMD=%04x, curx=%d, lwrtmask=%04x, actual wrtmask=%04x, frgdmix=%d, " - "bkgdmix=%d, input=%d, cnt=%d.\n", s3->accel.cmd, s3->accel.cur_x, - wrt_mask, s3->accel.wrt_mask, frgd_mix, bkgd_mix, cpu_input, count); - while (count-- && s3->accel.sy >= 0) { - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { - mix_dat >>= 16; - s3->accel.temp_cnt = 16; - } - - if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && - (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { - switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { - case 0: - src_dat = bkgd_color; - if (s3->color_16bit && (svga->bpp < 24) && !s3->accel.b2e8_pix) { - if (!s3->accel.color_16bit_check) - src_dat = s3->accel.bkgd_color_actual[0] | - (s3->accel.bkgd_color_actual[1] << 8); - } - break; - case 1: - src_dat = frgd_color; - if (s3->color_16bit && (svga->bpp < 24) && !s3->accel.b2e8_pix) { - if (!s3->accel.color_16bit_check) - src_dat = s3->accel.frgd_color_actual[0] | - (s3->accel.frgd_color_actual[1] << 8); - } - break; - case 2: - src_dat = cpu_dat; - break; - case 3: - src_dat = 0; - break; - - default: - break; - } - - READ((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); - - MIX - - if (s3->accel.cmd & 0x10) { - WRITE((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); - } - } - - if (s3->accel.b2e8_pix && s3_cpu_src(s3)) { - if (s3->accel.temp_cnt > 0) { - s3->accel.temp_cnt--; - mix_dat <<= 1; - mix_dat |= 1; - } - } else { - mix_dat <<= 1; - mix_dat |= 1; - } - - if (s3->color_16bit) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (!s3->accel.sy) - break; - - if (s3->accel.cmd & 0x40) { - if (s3->accel.cmd & 0x80) - s3->accel.cy++; - else - s3->accel.cy--; - - if (s3->accel.err_term >= 0) { - s3->accel.err_term += s3->accel.destx_distp; - if (s3->accel.cmd & 0x20) - s3->accel.cx++; - else - s3->accel.cx--; - } else - s3->accel.err_term += s3->accel.desty_axstp; - } else { - if (s3->accel.cmd & 0x20) - s3->accel.cx++; - else - s3->accel.cx--; - - if (s3->accel.err_term >= 0) { - s3->accel.err_term += s3->accel.destx_distp; - if (s3->accel.cmd & 0x80) - s3->accel.cy++; - else - s3->accel.cy--; - } else - s3->accel.err_term += s3->accel.desty_axstp; - } - - s3->accel.sy--; - s3->accel.cx &= 0xfff; - s3->accel.cy &= 0xfff; - } - s3->accel.cur_x = s3->accel.cx; - s3->accel.cur_y = s3->accel.cy; - } - break; - - case 2: /*Rectangle fill*/ - if (!cpu_input) { /*!cpu_input is trigger to start operation*/ - s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; - s3->accel.sy = s3->accel.multifunc[0] & 0xfff; - s3->accel.cx = s3->accel.cur_x & 0xfff; - s3->accel.cy = s3->accel.cur_y & 0xfff; - s3->accel.pix_trans_x_count = 0; - - s3->accel.dest = s3->accel.cy * s3->width; - - if (s3->color_16bit && (svga->bpp < 24)) { - if (s3->accel.cur_x & 0x400) { - s3->accel.color_16bit_check = 0; - s3->accel.minus = 0x400; - } else { - s3->accel.color_16bit_check = 1; - s3->accel.minus = 0; - } - - if (s3->accel.color_16bit_check) { - if (((s3->accel.multifunc[0xa] & 0xc0) == 0x00) && !(s3->accel.cmd & 2)) - s3->accel.color_16bit_check_rectfill = !!s3_cpu_src(s3); - else - s3->accel.color_16bit_check_rectfill = 0; - } - - if (s3->accel.color_16bit_check_rectfill) { - if (s3->accel.color_16bit_check) { - s3->accel.pix_trans_ptr = (uint8_t *) calloc(1, (s3->accel.sx + 1) << 1); - s3->accel.pix_trans_ptr_cnt = (s3->accel.sx + 1) << 1; - } - } else - s3->accel.pix_trans_x_count = 0; - } else { - s3->accel.pix_trans_x_count = 0; - s3->accel.color_16bit_check = 0; - s3->accel.color_16bit_check_rectfill = 0; - s3->accel.minus = 0; - } - - if (s3_cpu_src(s3)) { - s3->data_available = 0; - return; /*Wait for data from CPU*/ - } else if (s3_cpu_dest(s3)) { - s3->data_available = 1; - return; - } - } - - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && count == 16) { /*Stupid undocumented 0xB2E8 on 911/924*/ - count = s3->accel.maj_axis_pcnt + 1; - s3->accel.temp_cnt = 16; - } - - if (s3->color_16bit && (svga->bpp < 24)) { - if (!s3->accel.b2e8_pix) { - if (!s3->accel.color_16bit_check) { - wrt_mask = (s3->accel.wrt_mask_actual[0] | (s3->accel.wrt_mask_actual[1] << 8)); - } else if (s3->accel.color_16bit_check && (s3->accel.cmd == 0x40f3)) - return; - } - } - - while (count-- && s3->accel.sy >= 0) { - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { - mix_dat >>= 16; - s3->accel.temp_cnt = 16; - } - - if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { - if (s3_cpu_dest(s3) && ((s3->accel.multifunc[0xa] & 0xc0) == 0x00)) { - mix_dat = mix_mask; /* Mix data = forced to foreground register. */ - } else if (s3_cpu_dest(s3) && vram_mask) { - /* Mix data = current video memory value. */ - READ(s3->accel.dest + s3->accel.cx - s3->accel.minus, mix_dat); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? mix_mask : 0; - } - - if (s3_cpu_dest(s3)) { - READ(s3->accel.dest + s3->accel.cx - s3->accel.minus, src_dat); - if (vram_mask) - src_dat = ((src_dat & rd_mask) == rd_mask); - } else { - switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { - case 0: - src_dat = bkgd_color; - if (s3->color_16bit && (svga->bpp < 24) && !s3->accel.b2e8_pix && (s3->accel.cmd != 0x41b3)) { - if (!s3->accel.color_16bit_check) - src_dat = s3->accel.bkgd_color_actual[0] | (s3->accel.bkgd_color_actual[1] << 8); - } - break; - case 1: - src_dat = frgd_color; - if (s3->color_16bit && (svga->bpp < 24) && !s3->accel.b2e8_pix && (s3->accel.cmd != 0x41b3)) { - if (!s3->accel.color_16bit_check) - src_dat = s3->accel.frgd_color_actual[0] | (s3->accel.frgd_color_actual[1] << 8); - } - break; - case 2: - src_dat = cpu_dat; - break; - case 3: - src_dat = 0; - break; - - default: - break; - } - } - - READ(s3->accel.dest + s3->accel.cx - s3->accel.minus, dest_dat); - - MIX - - if (s3->accel.cmd & 0x10) { - WRITE(s3->accel.dest + s3->accel.cx - s3->accel.minus, dest_dat); - } - } - - if (s3->accel.b2e8_pix && s3_cpu_src(s3)) { - if (s3->accel.temp_cnt > 0) { - s3->accel.temp_cnt--; - mix_dat <<= 1; - mix_dat |= 1; - } - } else { - mix_dat <<= 1; - mix_dat |= 1; - } - - if (s3->color_16bit) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (s3->accel.cmd & 0x20) - s3->accel.cx++; - else - s3->accel.cx--; - - s3->accel.cx &= 0xfff; - s3->accel.sx--; - if (s3->accel.sx < 0) { - if (s3->accel.cmd & 0x20) - s3->accel.cx -= (s3->accel.maj_axis_pcnt & 0xfff) + 1; - else - s3->accel.cx += (s3->accel.maj_axis_pcnt & 0xfff) + 1; - - s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; - if (s3->accel.cmd & 0x80) - s3->accel.cy++; - else - s3->accel.cy--; - - s3->accel.cy &= 0xfff; - s3->accel.dest = s3->accel.cy * s3->width; - s3->accel.sy--; - - if (cpu_input) { - if (s3->accel.b2e8_pix) { - s3->accel.cur_x = s3->accel.cx; - s3->accel.cur_y = s3->accel.cy; - } - return; - } - if (s3->accel.sy < 0) { - s3->accel.cur_x = s3->accel.cx; - s3->accel.cur_y = s3->accel.cy; - return; - } - } - } - break; - - case 6: /*BitBlt*/ - if (!cpu_input) { /*!cpu_input is trigger to start operation*/ - s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; - s3->accel.sy = s3->accel.multifunc[0] & 0xfff; - - s3->accel.dx = s3->accel.destx_distp & 0xfff; - s3->accel.dy = s3->accel.desty_axstp & 0xfff; - - s3->accel.cx = s3->accel.cur_x & 0xfff; - s3->accel.cy = s3->accel.cur_y & 0xfff; - - s3->accel.src = s3->accel.cy * s3->width; - s3->accel.dest = s3->accel.dy * s3->width; - - if (s3->color_16bit && (svga->bpp < 24)) { - if (s3->accel.destx_distp & 0x400) { - s3->accel.color_16bit_check = 0; - s3->accel.minus = 0x400; - } else { - s3->accel.color_16bit_check = 1; - s3->accel.minus = 0; - } - s3->accel.srcminus = 0x400; - } else { - s3->accel.color_16bit_check = 0; - s3->accel.minus = 0; - s3->accel.srcminus = 0; - } - } - - if ((s3->accel.cmd & 0x100) && !cpu_input) - return; /*Wait for data from CPU*/ - - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - - if (s3->color_16bit && (svga->bpp < 24)) { - if (!s3->accel.color_16bit_check) - wrt_mask = (s3->accel.wrt_mask_actual[0] | (s3->accel.wrt_mask_actual[1] << 8)); - else - return; - } - - if (!cpu_input && (frgd_mix == 3) && !vram_mask && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { - while (1) { - if ((s3->accel.dx & 0xfff) >= clip_l && (s3->accel.dx & 0xfff) <= clip_r && (s3->accel.dy & 0xfff) >= clip_t && (s3->accel.dy & 0xfff) <= clip_b) { - READ(s3->accel.src + s3->accel.cx - s3->accel.srcminus, src_dat); - READ(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); - - dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); - - WRITE(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); - } - - s3->accel.cx++; - s3->accel.dx++; - s3->accel.sx--; - s3->accel.dx &= 0xfff; - if (s3->accel.sx < 0) { - s3->accel.cx -= (s3->accel.maj_axis_pcnt & 0xfff) + 1; - s3->accel.dx -= (s3->accel.maj_axis_pcnt & 0xfff) + 1; - s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; - - s3->accel.cy++; - s3->accel.dy++; - - s3->accel.dy &= 0xfff; - s3->accel.src = s3->accel.cy * s3->width; - s3->accel.dest = s3->accel.dy * s3->width; - - s3->accel.sy--; - - if (s3->accel.sy < 0) { /*It's evident that this is a clear undocumented difference compared to later chips, per what NT 3.5+ does to DX/DY.*/ - s3->accel.destx_distp = s3->accel.dx; - s3->accel.desty_axstp = s3->accel.dy; - return; - } - } - } - } else { - while (count-- && s3->accel.sy >= 0) { - if ((s3->accel.dx & 0xfff) >= clip_l && (s3->accel.dx & 0xfff) <= clip_r && ((s3->accel.dy & 0xfff) >= clip_t && (s3->accel.dy & 0xfff) <= clip_b)) { - if (vram_mask && (s3->accel.cmd & 0x10)) { - READ(s3->accel.src + s3->accel.cx - s3->accel.srcminus, mix_dat); - mix_dat = ((mix_dat & rd_mask) == rd_mask); - mix_dat = mix_dat ? mix_mask : 0; - } - switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { - case 0: - src_dat = bkgd_color; - if (s3->color_16bit && (svga->bpp < 24)) { - if (!s3->accel.color_16bit_check) - src_dat = s3->accel.bkgd_color_actual[0] | (s3->accel.bkgd_color_actual[1] << 8); - } - break; - case 1: - src_dat = frgd_color; - if (s3->color_16bit && (svga->bpp < 24)) { - if (!s3->accel.color_16bit_check) - src_dat = s3->accel.frgd_color_actual[0] | (s3->accel.frgd_color_actual[1] << 8); - } - break; - case 2: - src_dat = cpu_dat; - break; - case 3: - READ(s3->accel.src + s3->accel.cx - s3->accel.srcminus, src_dat); - if (vram_mask && (s3->accel.cmd & 0x10)) - src_dat = ((src_dat & rd_mask) == rd_mask); - break; - - default: - break; - } - - READ(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); - - MIX - - if ((!(s3->accel.cmd & 0x10) && vram_mask) || (s3->accel.cmd & 0x10)) { - WRITE(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); - } - } - - mix_dat <<= 1; - mix_dat |= 1; - - if (s3->color_16bit) - cpu_dat >>= 16; - else - cpu_dat >>= 8; - - if (s3->accel.cmd & 0x20) { - s3->accel.cx++; - s3->accel.dx++; - } else { - s3->accel.cx--; - s3->accel.dx--; - } - s3->accel.dx &= 0xfff; - s3->accel.sx--; - if (s3->accel.sx < 0) { - if (s3->accel.cmd & 0x20) { - s3->accel.cx -= ((s3->accel.maj_axis_pcnt & 0xfff) + 1); - s3->accel.dx -= ((s3->accel.maj_axis_pcnt & 0xfff) + 1); - } else { - s3->accel.cx += ((s3->accel.maj_axis_pcnt & 0xfff) + 1); - s3->accel.dx += ((s3->accel.maj_axis_pcnt & 0xfff) + 1); - } - s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; - - if (s3->accel.cmd & 0x80) { - s3->accel.cy++; - s3->accel.dy++; - } else { - s3->accel.cy--; - s3->accel.dy--; - } - s3->accel.dy &= 0xfff; - s3->accel.src = s3->accel.cy * s3->width; - s3->accel.dest = s3->accel.dy * s3->width; - - s3->accel.sy--; - - if (cpu_input) - return; - - if (s3->accel.sy < 0) { /*It's evident that this is a clear undocumented difference compared to later chips, per what NT 3.5+ does to DX/DY.*/ - s3->accel.destx_distp = s3->accel.dx; - s3->accel.desty_axstp = s3->accel.dy; - return; - } - } - } - } - break; - - default: - break; - } -} - void s3_short_stroke_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, s3_t *s3, uint8_t ssv) { @@ -8517,20 +7825,17 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi uint32_t srcbase; uint32_t dstbase; - s3->accel.srcminus = 0; - s3->accel.minus = 0; - if ((s3->chip >= S3_TRIO64 || s3->chip == S3_VISION968 || s3->chip == S3_VISION868) && (s3->accel.cmd & (1 << 11))) - cmd |= 8; + cmd |= 0x08; // SRC-BASE/DST-BASE - if ((s3->accel.multifunc[0xd] >> 4) & 7) - srcbase = 0x100000 * ((s3->accel.multifunc[0xd] >> 4) & 3); + if (((s3->accel.multifunc[0xd] >> 4) & 7) && (s3->chip >= S3_VISION964)) + srcbase = 0x100000 * ((s3->accel.multifunc[0xd] >> 4) & 7); else srcbase = 0x100000 * ((s3->accel.multifunc[0xe] >> 2) & 3); - if ((s3->accel.multifunc[0xd] >> 0) & 7) - dstbase = 0x100000 * ((s3->accel.multifunc[0xd] >> 0) & 3); + if (((s3->accel.multifunc[0xd] >> 0) & 7) && (s3->chip >= S3_VISION964)) + dstbase = 0x100000 * ((s3->accel.multifunc[0xd] >> 0) & 7); else dstbase = 0x100000 * ((s3->accel.multifunc[0xe] >> 0) & 3); @@ -8545,10 +7850,36 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && (s3_cpu_src(s3) || (s3_cpu_dest(s3))) && (!cpu_input || (s3_enable_fifo(s3) == 0))) s3->force_busy = 1; + if ((s3->bpp == 0) && s3->color_16bit && !s3->accel.b2e8_pix) { + if (cmd <= 2) { + if (s3->accel.cur_x & 0x400) { + if (s3->accel.cmd != 0x41b3) + wrt_mask = (wrt_mask << 8) & 0xff00; + else + wrt_mask &= 0xff; + + frgd_color = (frgd_color << 8) & 0xff00; + bkgd_color = (bkgd_color << 8) & 0xff00; + } else { + if (clip_r >= 0x400) { + wrt_mask &= 0xff; + frgd_color &= 0xff; + bkgd_color &= 0xff; + } + } + } else if (cmd == 6) { + if (s3->accel.destx_distp & 0x400) { + wrt_mask = (wrt_mask << 8) & 0xff00; + frgd_color = (frgd_color << 8) & 0xff00; + bkgd_color = (bkgd_color << 8) & 0xff00; + } + } + } + if (!cpu_input) s3->accel.dat_count = 0; - if (cpu_input && (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 2)))) { + if (cpu_input && (((s3->accel.multifunc[0xa] & 0xc0) != 0x80) || (!(s3->accel.cmd & 0x02)))) { if ((s3->bpp == 3) && (count == 2)) { if (s3->accel.dat_count) { cpu_dat = ((cpu_dat & 0xffff) << 16) | s3->accel.dat_buf; @@ -8570,9 +7901,9 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi else if ((s3->bpp == 1) || s3->color_16bit) rd_mask &= 0xffff; - if (s3->bpp == 0) + if ((s3->bpp == 0) && !s3->color_16bit) compare &= 0xff; - else if (s3->bpp == 1) + else if ((s3->bpp == 1) || s3->color_16bit) compare &= 0xffff; switch (s3->accel.cmd & 0x600) { @@ -8593,19 +7924,21 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi break; } + frgd_mix = (s3->accel.frgd_mix >> 5) & 3; + bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; + /*Bit 4 of the Command register is the draw yes bit, which enables writing to memory/reading from memory when enabled. When this bit is disabled, no writing to memory/reading from memory is allowed. (This bit is almost meaningless on the NOP command)*/ - s3_log("CMD=%d, full=%04x, s3bpp=%x, multifuncE=%03x, sourcedisplay=%x, mmio=%02x, srcbase=%08x, dstbase=%08x.\n", cmd, s3->accel.cmd, s3->bpp, s3->accel.multifunc[0x0e] & 0x230, vram_mask, svga->crtc[0x53] & 0x18, srcbase, dstbase); + if (s3->accel.cmd == 0x41b3 || (cmd == 6)) + s3_log("CMD=%d, full=%04x, s3bpp=%x, multifuncE=%03x, sourcedisplay=%x, mmio=%02x, srcbase=%08x, dstbase=%08x, cpu=%04x, mix=%04x, count=%d, rd_mask=%04x, wrt_mask=%04x, width=%d, s=%d,%d, c=%d,%d, d=%d,%d, 16bitcolor=%x, frgdcolor=%04x, bkgdcolor=%04x, frgdsel=%d, bkgdsel=%d, frgdmix=%02x, svgabpp=%d.\n", cmd, s3->accel.cmd, s3->bpp, s3->accel.multifunc[0x0e], vram_mask, svga->crtc[0x53] & 0x18, srcbase, dstbase, cpu_dat & 0xffff, mix_dat & 0xffff, count, rd_mask, wrt_mask, s3->width, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy, s3->accel.dx, s3->accel.dy, s3->color_16bit, frgd_color, bkgd_color, frgd_mix, bkgd_mix, s3->accel.frgd_mix & 0x0f, svga->bpp); + switch (cmd) { case 0: /*NOP (Short Stroke Vectors)*/ if (s3->accel.ssv_state == 0) break; - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - - if (s3->accel.cmd & 8) /*Radial*/ + if (s3->accel.cmd & 0x08) /*Radial*/ { while (count-- && s3->accel.ssv_len >= 0) { if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { @@ -8655,7 +7988,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi mix_dat <<= 1; mix_dat |= 1; - if (s3->bpp == 0 && !s3->color_16bit) + if ((s3->bpp == 0) && !s3->color_16bit) cpu_dat >>= 8; else cpu_dat >>= 16; @@ -8709,17 +8042,18 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 1: /*Draw line*/ if (!cpu_input) { + s3->accel.minus = 0; s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; s3->accel.sy = s3->accel.maj_axis_pcnt; + if ((s3->bpp == 0) && s3->color_16bit && (s3->accel.cur_x & 0x400)) + s3->accel.minus = 0x400; if (s3_cpu_src(s3)) return; /*Wait for data from CPU*/ } - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - if (s3->accel.cmd & 8) { /*Radial*/ + if (s3->accel.cmd & 0x08) { /*Radial*/ while (count-- && s3->accel.sy >= 0) { if ((s3->accel.cx & 0xfff) >= clip_l && (s3->accel.cx & 0xfff) <= clip_r && (s3->accel.cy & 0xfff) >= clip_t && (s3->accel.cy & 0xfff) <= clip_b) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { @@ -8756,11 +8090,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi update = 1; if (update) { - READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); + READ((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); MIX - WRITE((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); + WRITE((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); } } @@ -8860,11 +8194,11 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi update = 1; if (update) { - READ((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); + READ((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); MIX - WRITE((s3->accel.cy * s3->width) + s3->accel.cx, dest_dat); + WRITE((s3->accel.cy * s3->width) + s3->accel.cx - s3->accel.minus, dest_dat); } } @@ -8879,7 +8213,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi mix_dat |= 1; } - if (s3->bpp == 0 && !s3->color_16bit) + if ((s3->bpp == 0) && !s3->color_16bit) cpu_dat >>= 8; else cpu_dat >>= 16; @@ -8926,13 +8260,21 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } break; - case 2: /*Rectangle fill*/ + case 2: /*Rectangle fill*/ if (!cpu_input) /*!cpu_input is trigger to start operation*/ { + s3->accel.minus = 0; s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; + if ((s3->bpp == 0) && s3->color_16bit && (s3->accel.cur_x & 0x400)) + s3->accel.minus = 0x400; + + if (s3->accel.cur_x & 0x400) + s3_log("Rectangle Fill + 1024 FULLCMD=%04x: frgdcolor=%04x, s(%d,%d), c(%d,%d).\n", s3->accel.cmd, frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy); + else + s3_log("Rectangle Fill + 0 FULLCMD=%04x: frgdcolor=%04x, s(%d,%d), c(%d,%d).\n", s3->accel.cmd, frgd_color, s3->accel.sx, s3->accel.sy, s3->accel.cx, s3->accel.cy); s3->accel.dest = dstbase + s3->accel.cy * s3->width; @@ -8945,23 +8287,19 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && (count == 16)) { /*Stupid undocumented 0xB2E8 on 911/924*/ count = s3->accel.maj_axis_pcnt + 1; s3->accel.temp_cnt = 16; - s3_log("CMD2: B2E8 pixtrans, frgdmix=%d, bkgdmix=%d.\n", frgd_mix, bkgd_mix); } - while (count-- && s3->accel.sy >= 0) { - if (s3->accel.b2e8_pix && s3_cpu_src(s3) && s3->accel.temp_cnt == 0) { + while (count-- && (s3->accel.sy >= 0)) { + if (s3->accel.b2e8_pix && s3_cpu_src(s3) && !s3->accel.temp_cnt) { mix_dat >>= 16; s3->accel.temp_cnt = 16; } - if ((((s3->accel.cx) >= clip_l && (s3->accel.cx) <= clip_r && (s3->accel.cy) >= clip_t && (s3->accel.cy) <= clip_b) && !(s3->accel.multifunc[0xe] & 0x20)) || - (((s3->accel.cx) < clip_l && (s3->accel.cx) > clip_r && (s3->accel.cy) < clip_t && (s3->accel.cy) > clip_b) && (s3->accel.multifunc[0xe] & 0x20)) ) { + if ((((s3->accel.cx >= clip_l) && (s3->accel.cx <= clip_r) && (s3->accel.cy >= clip_t) && (s3->accel.cy <= clip_b)) && !(s3->accel.multifunc[0xe] & 0x20)) || + (((s3->accel.cx < clip_l) && (s3->accel.cx > clip_r) && (s3->accel.cy < clip_t) && (s3->accel.cy > clip_b)) && (s3->accel.multifunc[0xe] & 0x20)) ) { if (s3_cpu_dest(s3) && ((s3->accel.multifunc[0xa] & 0xc0) == 0x00)) { mix_dat = mix_mask; /* Mix data = forced to foreground register. */ } else if (s3_cpu_dest(s3) && vram_mask) { @@ -8971,8 +8309,8 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi mix_dat = mix_dat ? mix_mask : 0; } - if (s3_cpu_dest(s3)) { - READ(s3->accel.dest + s3->accel.cx, src_dat); + if (s3_cpu_dest(s3) || ((s3_cpu_src(s3)) && s3->color_16bit && (s3->bpp == 0) && (s3->accel.cmd == 0x41b3))) { + READ(s3->accel.dest + s3->accel.cx - s3->accel.minus, src_dat); if (vram_mask) src_dat = ((src_dat & rd_mask) == rd_mask); } else { @@ -9011,12 +8349,15 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi update = 1; if (update) { - READ(s3->accel.dest + s3->accel.cx, dest_dat); + READ(s3->accel.dest + s3->accel.cx - s3->accel.minus, dest_dat); MIX if (s3->accel.cmd & 0x10) { - WRITE(s3->accel.dest + s3->accel.cx, dest_dat); + if (s3->accel.cmd == 0x41b3) + s3_log("Full=%04x: Destination=%04x, OldDest=%04x, c=%d,%d.\n", s3->accel.cmd, dest_dat, old_dest_dat, s3->accel.cx, s3->accel.cy); + + WRITE(s3->accel.dest + s3->accel.cx - s3->accel.minus, dest_dat); } } } @@ -9032,7 +8373,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi mix_dat |= 1; } - if (s3->bpp == 0 && !s3->color_16bit) + if ((s3->bpp == 0) && !s3->color_16bit) cpu_dat >>= 8; else cpu_dat >>= 16; @@ -9045,13 +8386,13 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cx &= 0xfff; s3->accel.sx--; if (s3->accel.sx < 0) { - if (s3->accel.cmd & 0x20) - s3->accel.cx -= ((s3->accel.maj_axis_pcnt & 0xfff) + 1); - else - s3->accel.cx += ((s3->accel.maj_axis_pcnt & 0xfff) + 1); - s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; + if (s3->accel.cmd & 0x20) + s3->accel.cx -= (s3->accel.sx + 1); + else + s3->accel.cx += (s3->accel.sx + 1); + if (s3->accel.cmd & 0x80) s3->accel.cy++; else @@ -9093,8 +8434,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi end_y1 = s3->accel.desty_axstp; end_y2 = s3->accel.desty_axstp2; - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - while ((s3->accel.poly_cy < end_y1) && (s3->accel.poly_cy2 < end_y2)) { int y = s3->accel.poly_cy; int x_count = ABS((s3->accel.poly_cx2 >> 20) - s3->accel.poly_x) + 1; @@ -9177,36 +8516,36 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi case 6: /*BitBlt*/ if (!cpu_input) { /*!cpu_input is trigger to start operation*/ + s3->accel.minus = 0; s3->accel.sx = s3->accel.maj_axis_pcnt & 0xfff; s3->accel.sy = s3->accel.multifunc[0] & 0xfff; s3->accel.dx = s3->accel.destx_distp & 0xfff; s3->accel.dy = s3->accel.desty_axstp & 0xfff; + if ((s3->bpp == 0) && s3->color_16bit && (clip_r > 0x3ff) && (s3->accel.destx_distp & 0x400)) + s3->accel.minus = 0x400; + s3->accel.cx = s3->accel.cur_x & 0xfff; s3->accel.cy = s3->accel.cur_y & 0xfff; s3->accel.src = srcbase + s3->accel.cy * s3->width; s3->accel.dest = dstbase + s3->accel.dy * s3->width; + s3_log("BitBLT: D(%d,%d).\n", s3->accel.dx, s3->accel.dy); } - if ((s3->accel.cmd & 0x100) && !cpu_input) { + if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ - } - - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; if (!cpu_input && (frgd_mix == 3) && !vram_mask && !(s3->accel.multifunc[0xe] & 0x100) && ((s3->accel.cmd & 0xa0) == 0xa0) && ((s3->accel.frgd_mix & 0xf) == 7) && ((s3->accel.bkgd_mix & 0xf) == 7)) { while (1) { - if ((s3->accel.dx) >= clip_l && (s3->accel.dx) <= clip_r && (s3->accel.dy) >= clip_t && (s3->accel.dy) <= clip_b) { - READ(s3->accel.src + s3->accel.cx, src_dat); - READ(s3->accel.dest + s3->accel.dx, dest_dat); - + if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { + READ(s3->accel.src + s3->accel.cx - s3->accel.minus, src_dat); + READ(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); dest_dat = (src_dat & wrt_mask) | (dest_dat & ~wrt_mask); if (s3->accel.cmd & 0x10) { - WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + WRITE(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); } } @@ -9222,8 +8561,8 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi s3->accel.cy++; s3->accel.dy++; - s3->accel.src = srcbase + s3->accel.cy * s3->width; - s3->accel.dest = dstbase + s3->accel.dy * s3->width; + s3->accel.src = srcbase + (s3->accel.cy * s3->width); + s3->accel.dest = dstbase + (s3->accel.dy * s3->width); s3->accel.sy--; @@ -9235,8 +8574,8 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi } } } else { - while (count-- && s3->accel.sy >= 0) { - if ((s3->accel.dx) >= clip_l && (s3->accel.dx) <= clip_r && ((s3->accel.dy) >= clip_t && (s3->accel.dy) <= clip_b)) { + while (count-- && (s3->accel.sy >= 0)) { + if ((s3->accel.dx >= clip_l) && (s3->accel.dx <= clip_r) && (s3->accel.dy >= clip_t) && (s3->accel.dy <= clip_b)) { if (vram_mask && (s3->accel.cmd & 0x10)) { READ(s3->accel.src + s3->accel.cx, mix_dat); mix_dat = ((mix_dat & rd_mask) == rd_mask); @@ -9253,7 +8592,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi src_dat = cpu_dat; break; case 3: - READ(s3->accel.src + s3->accel.cx, src_dat); + READ(s3->accel.src + s3->accel.cx - s3->accel.minus, src_dat); if (vram_mask && (s3->accel.cmd & 0x10)) src_dat = ((src_dat & rd_mask) == rd_mask); break; @@ -9278,12 +8617,12 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi update = 1; if (update) { - READ(s3->accel.dest + s3->accel.dx, dest_dat); + READ(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); MIX if ((!(s3->accel.cmd & 0x10) && vram_mask) || (s3->accel.cmd & 0x10)) { - WRITE(s3->accel.dest + s3->accel.dx, dest_dat); + WRITE(s3->accel.dest + s3->accel.dx - s3->accel.minus, dest_dat); } } } @@ -9291,7 +8630,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi mix_dat <<= 1; mix_dat |= 1; - if (s3->bpp == 0 && !s3->color_16bit) + if ((s3->bpp == 0) && !s3->color_16bit) cpu_dat >>= 8; else cpu_dat >>= 16; @@ -9366,9 +8705,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi return; /*Wait for data from CPU*/ } - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - while (count-- && s3->accel.sy >= 0) { if ((s3->accel.dx) >= clip_l && (s3->accel.dx) <= clip_r && (s3->accel.dy) >= clip_t && (s3->accel.dy) <= clip_b) { if (vram_mask) { @@ -9424,7 +8760,7 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi mix_dat <<= 1; mix_dat |= 1; - if (s3->bpp == 0 && !s3->color_16bit) + if ((s3->bpp == 0) && !s3->color_16bit) cpu_dat >>= 8; else cpu_dat >>= 16; @@ -9616,9 +8952,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi end_y1 = s3->accel.desty_axstp; end_y2 = s3->accel.desty_axstp2; - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - while ((s3->accel.poly_cy < end_y1) && (s3->accel.poly_cy2 < end_y2)) { int y = s3->accel.poly_cy; int x_count = ABS((s3->accel.poly_cx2 >> 20) - s3->accel.poly_x) + 1; @@ -9742,9 +9075,6 @@ s3_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, voi if ((s3->accel.cmd & 0x100) && !cpu_input) return; /*Wait for data from CPU*/ - frgd_mix = (s3->accel.frgd_mix >> 5) & 3; - bkgd_mix = (s3->accel.bkgd_mix >> 5) & 3; - while (count-- && s3->accel.sy >= 0) { if ((s3->accel.dx & 0xfff) >= clip_l && (s3->accel.dx & 0xfff) <= clip_r && (s3->accel.dy & 0xfff) >= clip_t && (s3->accel.dy & 0xfff) <= clip_b) { switch ((mix_dat & mix_mask) ? frgd_mix : bkgd_mix) { @@ -10462,6 +9792,7 @@ s3_init(const device_t *info) s3->pci = !!(info->flags & DEVICE_PCI); s3->vlb = !!(info->flags & DEVICE_VLB); + mem_mapping_add(&s3->linear_mapping, 0, 0, svga_read_linear, svga_readw_linear, svga_readl_linear, svga_write_linear, svga_writew_linear, svga_writel_linear, @@ -10505,6 +9836,8 @@ s3_init(const device_t *info) NULL); } } + mem_mapping_set_handler(&svga->mapping, s3_read, s3_readw, s3_readl, s3_write, s3_writew, s3_writel); + mem_mapping_set_p(&svga->mapping, s3); svga->hwcursor.cur_ysize = 64; @@ -10603,10 +9936,7 @@ s3_init(const device_t *info) svga->force_old_addr = 1; - if (s3->chip <= S3_86C924) - s3->accel_start = s3_911_accel_start; - else - s3->accel_start = s3_accel_start; + s3->accel_start = s3_accel_start; switch (s3->card_type) { case S3_ORCHID_86C911: @@ -10617,7 +9947,6 @@ s3_init(const device_t *info) s3->id_ext = stepping; s3->id_ext_pci = 0; s3->packed_mmio = 0; - s3->width = 1024; svga->ramdac = device_add(&sc11483_ramdac_device); if (s3->card_type == S3_ORCHID_86C911) { @@ -10637,7 +9966,6 @@ s3_init(const device_t *info) s3->id_ext = stepping; s3->id_ext_pci = 0; s3->packed_mmio = 0; - s3->width = 1024; svga->ramdac = device_add(&att490_ramdac_device); svga->clock_gen = device_add(&ics2494an_305_device); diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index cecdcf840..32776f1eb 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -149,13 +149,13 @@ svga_out(uint16_t addr, uint8_t val, void *priv) case 2: index = dev->dac_addr & 0xff; dev->dac_b = val; - svga->vgapal[index].r = dev->dac_r; - svga->vgapal[index].g = dev->dac_g; - svga->vgapal[index].b = dev->dac_b; + dev->_8514pal[index].r = dev->dac_r; + dev->_8514pal[index].g = dev->dac_g; + dev->_8514pal[index].b = dev->dac_b; if (svga->ramdac_type == RAMDAC_8BIT) - dev->pallook[index] = makecol32(svga->vgapal[index].r, svga->vgapal[index].g, svga->vgapal[index].b); + dev->pallook[index] = makecol32(dev->_8514pal[index].r, dev->_8514pal[index].g, dev->_8514pal[index].b); else - dev->pallook[index] = makecol32(video_6to8[svga->vgapal[index].r & 0x3f], video_6to8[svga->vgapal[index].g & 0x3f], video_6to8[svga->vgapal[index].b & 0x3f]); + dev->pallook[index] = makecol32(video_6to8[dev->_8514pal[index].r & 0x3f], video_6to8[dev->_8514pal[index].g & 0x3f], video_6to8[dev->_8514pal[index].b & 0x3f]); dev->dac_pos = 0; dev->dac_addr = (dev->dac_addr + 1) & 0xff; break; @@ -221,11 +221,8 @@ svga_out(uint16_t addr, uint8_t val, void *priv) case 0x3c3: if (xga_active && xga) xga->on = (val & 0x01) ? 0 : 1; - if (ibm8514_active && dev) { - dev->on[0] = (val & 0x01) ? 0 : 1; - if (dev->local & 0xff) - dev->on[1] = dev->on[0]; - } + if (ibm8514_active && dev) + dev->on = (val & 0x01) ? 0 : 1; svga_log("3C3: VGA ON = %d.\n", val & 0x01); vga_on = val & 0x01; @@ -399,24 +396,24 @@ svga_in(uint16_t addr, void *priv) case 0: dev->dac_pos++; if (svga->ramdac_type == RAMDAC_8BIT) - ret = svga->vgapal[index].r; + ret = dev->_8514pal[index].r; else - ret = svga->vgapal[index].r & 0x3f; + ret = dev->_8514pal[index].r & 0x3f; break; case 1: dev->dac_pos++; if (svga->ramdac_type == RAMDAC_8BIT) - ret = svga->vgapal[index].g; + ret = dev->_8514pal[index].g; else - ret = svga->vgapal[index].g & 0x3f; + ret = dev->_8514pal[index].g & 0x3f; break; case 2: dev->dac_pos = 0; dev->dac_addr = (dev->dac_addr + 1) & 0xff; if (svga->ramdac_type == RAMDAC_8BIT) - ret = svga->vgapal[index].b; + ret = dev->_8514pal[index].b; else - ret = svga->vgapal[index].b & 0x3f; + ret = dev->_8514pal[index].b & 0x3f; break; default: @@ -551,11 +548,11 @@ svga_set_ramdac_type(svga_t *svga, int type) for (int c = 0; c < 256; c++) { if (ibm8514_active && dev) { if (svga->ramdac_type == RAMDAC_8BIT) - dev->pallook[c] = makecol32(svga->vgapal[c].r, svga->vgapal[c].g, svga->vgapal[c].b); + dev->pallook[c] = makecol32(dev->_8514pal[c].r, dev->_8514pal[c].g, dev->_8514pal[c].b); else - dev->pallook[c] = makecol32((svga->vgapal[c].r & 0x3f) * 4, - (svga->vgapal[c].g & 0x3f) * 4, - (svga->vgapal[c].b & 0x3f) * 4); + dev->pallook[c] = makecol32((dev->_8514pal[c].r & 0x3f) * 4, + (dev->_8514pal[c].g & 0x3f) * 4, + (dev->_8514pal[c].b & 0x3f) * 4); } if (xga_active && xga) { if (svga->ramdac_type == RAMDAC_8BIT) @@ -829,7 +826,7 @@ svga_recalctimings(svga_t *svga) #ifdef TBD if (ibm8514_active && (svga->dev8514 != NULL)) { - if (dev->on[0] || dev->on[1]) { + if (dev->on) { uint32_t dot8514 = dev->h_blankstart; uint32_t adj_dot8514 = dev->h_blankstart; uint32_t eff_mask8514 = 0x0000003f; @@ -867,7 +864,7 @@ svga_recalctimings(svga_t *svga) crtcconst = svga->clock * svga->char_width; if (ibm8514_active && (svga->dev8514 != NULL)) { - if (dev->on[0] || dev->on[1]) + if (dev->on) crtcconst8514 = svga->clock8514; } @@ -912,7 +909,7 @@ svga_recalctimings(svga_t *svga) _dispontime = svga->hdisp_time; if (ibm8514_active && (svga->dev8514 != NULL)) { - if (dev->on[0] || dev->on[1]) { + if (dev->on) { disptime8514 = dev->h_total ? dev->h_total : TIMER_USEC; _dispontime8514 = dev->hdisped; } @@ -935,7 +932,7 @@ svga_recalctimings(svga_t *svga) svga->dispofftime = TIMER_USEC; if (ibm8514_active && (svga->dev8514 != NULL)) { - if (dev->on[0] || dev->on[1]) { + if (dev->on) { _dispofftime8514 = disptime8514 - _dispontime8514; _dispontime8514 *= crtcconst8514; _dispofftime8514 *= crtcconst8514; @@ -1464,9 +1461,10 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv) if (!linear) { xga_write_test(addr, val, svga); addr = svga_decode_addr(svga, addr, 1); - - if (addr == 0xffffffff) + if (addr == 0xffffffff) { + svga_log("WriteCommon Over.\n"); return; + } } if (!(svga->gdcreg[6] & 1)) @@ -1498,8 +1496,10 @@ svga_write_common(uint32_t addr, uint8_t val, uint8_t linear, void *priv) if (svga->translate_address) addr = svga->translate_address(addr, priv); - if (addr >= svga->vram_max) + if (addr >= svga->vram_max) { + svga_log("WriteBankedOver=%08x, val=%02x.\n", addr & svga->vram_mask, val); return; + } addr &= svga->vram_mask; @@ -1651,7 +1651,6 @@ svga_read_common(uint32_t addr, uint8_t linear, void *priv) if (!linear) { (void) xga_read_test(addr, svga); addr = svga_decode_addr(svga, addr, 0); - if (addr == 0xffffffff) return 0xff; } @@ -1873,6 +1872,8 @@ svga_writew_common(uint32_t addr, uint16_t val, uint8_t linear, void *priv) cycles -= svga->monitor->mon_video_timing_write_w; if (!linear) { + xga_write_test(addr, val & 0xff, svga); + xga_write_test(addr + 1, val >> 8, svga); addr = svga_decode_addr(svga, addr, 1); if (addr == 0xffffffff) @@ -1929,6 +1930,10 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *priv) cycles -= svga->monitor->mon_video_timing_write_l; if (!linear) { + xga_write_test(addr, val & 0xff, svga); + xga_write_test(addr + 1, (val >> 8) & 0xff, svga); + xga_write_test(addr + 2, (val >> 16) & 0xff, svga); + xga_write_test(addr + 3, (val >> 24) & 0xff, svga); addr = svga_decode_addr(svga, addr, 1); if (addr == 0xffffffff) @@ -1961,6 +1966,7 @@ svga_writel_common(uint32_t addr, uint32_t val, uint8_t linear, void *priv) } if (addr >= svga->vram_max) return; + addr &= svga->vram_mask; svga->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; @@ -2006,7 +2012,6 @@ svga_readw_common(uint32_t addr, uint8_t linear, void *priv) if (!linear) { addr = svga_decode_addr(svga, addr, 0); - if (addr == 0xffffffff) return 0xffff; } @@ -2053,7 +2058,6 @@ svga_readl_common(uint32_t addr, uint8_t linear, void *priv) if (!linear) { addr = svga_decode_addr(svga, addr, 0); - if (addr == 0xffffffff) return 0xffffffff; } diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index e8d6ef715..e71ed42a7 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -54,6 +54,13 @@ static void xga_render_4bpp(svga_t *svga); static void xga_render_8bpp(svga_t *svga); static void xga_render_16bpp(svga_t *svga); +static void xga_write(uint32_t addr, uint8_t val, void *priv); +static void xga_writew(uint32_t addr, uint16_t val, void *priv); +static void xga_writel(uint32_t addr, uint32_t val, void *priv); +static uint8_t xga_read(uint32_t addr, void *priv); +static uint16_t xga_readw(uint32_t addr, void *priv); +static uint32_t xga_readl(uint32_t addr, void *priv); + int xga_active = 0; #ifdef ENABLE_XGA_LOG @@ -184,7 +191,7 @@ xga_updatemapping(svga_t *svga) xga_log("XGA: Extended Graphics mode.\n"); switch (xga->aperture_cntl) { case 0: - xga_log("XGA: No 64KB aperture: 1MB=%x, 4MB=%x.\n", xga->base_addr_1mb, xga->linear_base); + xga_log("XGA: No 64KB aperture: 1MB=%x, 4MB=%x, SVGA Mapping Base=%x.\n", xga->base_addr_1mb, xga->linear_base, svga->mapping.base); if (xga->base_addr_1mb) { mem_mapping_set_addr(&xga->linear_mapping, xga->base_addr_1mb, 0x100000); mem_mapping_enable(&xga->linear_mapping); @@ -194,18 +201,39 @@ xga_updatemapping(svga_t *svga) } else mem_mapping_disable(&xga->linear_mapping); - mem_mapping_disable(&xga->video_mapping); + mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel); + switch (svga->gdcreg[6] & 0xc) { + case 0x0: /*128k at A0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x20000); + svga->banked_mask = 0xffff; + break; + case 0x4: /*64k at A0000*/ + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); + svga->banked_mask = 0xffff; + break; + case 0x8: /*32k at B0000*/ + mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x08000); + svga->banked_mask = 0x7fff; + break; + case 0xC: /*32k at B8000*/ + mem_mapping_set_addr(&svga->mapping, 0xb8000, 0x08000); + svga->banked_mask = 0x7fff; + break; + + default: + break; + } break; case 1: xga_log("XGA: 64KB aperture at A0000.\n"); - mem_mapping_set_addr(&xga->video_mapping, 0xa0000, 0x10000); - mem_mapping_enable(&xga->video_mapping); + mem_mapping_set_handler(&svga->mapping, xga_read, xga_readw, xga_readl, xga_write, xga_writew, xga_writel); + mem_mapping_set_addr(&svga->mapping, 0xa0000, 0x10000); xga->banked_mask = 0xffff; break; case 2: xga_log("XGA: 64KB aperture at B0000.\n"); - mem_mapping_set_addr(&xga->video_mapping, 0xb0000, 0x10000); - mem_mapping_enable(&xga->video_mapping); + mem_mapping_set_handler(&svga->mapping, xga_read, xga_readw, xga_readl, xga_write, xga_writew, xga_writel); + mem_mapping_set_addr(&svga->mapping, 0xb0000, 0x10000); xga->banked_mask = 0xffff; break; default: @@ -244,7 +272,7 @@ xga_recalctimings(svga_t *svga) xga->ma_latch = xga->disp_start_addr; - xga_log("XGA ClkSel1 = %d, ClkSel2 = %02x.\n", (xga->clk_sel_1 >> 2) & 3, xga->clk_sel_2 & 0x80); + xga_log("XGA ClkSel1 = %d, ClkSel2 = %02x, dispcntl2=%02x.\n", (xga->clk_sel_1 >> 2) & 3, xga->clk_sel_2 & 0x80, xga->disp_cntl_2 & 0xc0); switch ((xga->clk_sel_1 >> 2) & 3) { case 0: xga_log("HDISP VGA0 = %d, XGA = %d.\n", svga->hdisp, xga->h_disp); @@ -798,19 +826,10 @@ xga_ext_inb(uint16_t addr, void *priv) #define READW(addr, dat) \ dat = *(uint16_t *) &xga->vram[(addr) & (xga->vram_mask)]; -#define READW_INV(addr, dat) \ - dat = xga->vram[(addr + 1) & (xga->vram_mask)]; \ - dat |= (xga->vram[(addr) & (xga->vram_mask)] << 8); - #define WRITEW(addr, dat) \ *(uint16_t *) &xga->vram[((addr)) & (xga->vram_mask)] = dat; \ xga->changedvram[(((addr)) & (xga->vram_mask)) >> 12] = svga->monitor->mon_changeframecount; -#define WRITEW_INV(addr, dat) \ - xga->vram[((addr + 1)) & (xga->vram_mask)] = dat & 0xff; \ - xga->vram[((addr)) & (xga->vram_mask)] = dat >> 8; \ - xga->changedvram[(((addr)) & (xga->vram_mask)) >> 12] = svga->monitor->mon_changeframecount; - #define ROP(mix, d, s) \ { \ switch ((mix) ? (xga->accel.frgd_mix & 0x1f) : (xga->accel.bkgd_mix & 0x1f)) { \ @@ -884,7 +903,7 @@ xga_ext_inb(uint16_t addr, void *priv) } static uint32_t -xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int width) +xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, uint32_t base, int width) { const xga_t *xga = (xga_t *) svga->xga; uint32_t addr = base; @@ -903,27 +922,19 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, int map, uint32_t b } else byte = mem_readb_phys(addr); - if (xga->linear_endian_reverse) - bits = 7 - (x & 7); - else { - if (xga->accel.px_map_format[xga->accel.dst_map] & 8) { - if ((xga->accel.px_map_format[xga->accel.src_map] & 8) && (xga->accel.px_map_format[map] & 8)) - bits = (x & 7); - else - bits = 7 - (x & 7); - } else { - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) - bits = (x & 7); - else - bits = 7 - (x & 7); - } + bits = 7 - (x & 7); + + if (!(xga->accel.px_map_format[xga->accel.src_map] & 0x08) && !(xga->accel.px_map_format[xga->accel.dst_map] & 0x08)) { + if (((xga->accel.px_map_format[xga->accel.src_map] & 0x07) >= 0x02) && ((xga->accel.px_map_format[xga->accel.dst_map] & 0x07) >= 0x02)) + bits ^= 7; } + px = (byte >> bits) & 1; return px; } static uint32_t -xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int width, UNUSED(int usesrc)) +xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int width) { xga_t *xga = (xga_t *) svga->xga; uint32_t addr = base; @@ -935,7 +946,7 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int if ((addr < xga->linear_base) || (addr > (xga->linear_base + 0xfffff))) skip = 1; - switch (xga->accel.px_map_format[map] & 7) { + switch (xga->accel.px_map_format[map] & 0x07) { case 0: /*1-bit*/ addr += (y * (width >> 3)); addr += (x >> 3); @@ -944,14 +955,11 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int } else byte = mem_readb_phys(addr); - if (xga->linear_endian_reverse) + if (xga->accel.px_map_format[map] & 0x08) + bits = (x & 7); + else bits = 7 - (x & 7); - else { - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) - bits = (x & 7); - else - bits = 7 - (x & 7); - } + px = (byte >> bits) & 1; return px; case 2: /*4-bit*/ @@ -975,17 +983,19 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int case 4: /*16-bit*/ addr += (y * (width << 1)); addr += (x << 1); - if (xga->linear_endian_reverse) { - byte = mem_readw_phys(addr); - if ((xga->access_mode & 7) == 4) - byte = ((byte & 0xff00) >> 8) | ((byte & 0x00ff) << 8); - else if (xga->access_mode & 8) - byte = ((byte & 0xff00) >> 8) | ((byte & 0x00ff) << 8); - } else { + if (xga->access_mode & 0x08) { if (!skip) { READW(addr, byte); } else - byte = mem_readb_phys(addr) | (mem_readb_phys(addr + 1) << 8); + byte = mem_readw_phys(addr); + } else { + if (!skip) { + READW(addr, byte); + } else { + byte = mem_readw_phys(addr); + if ((xga->access_mode & 0x07) == 0x04) + byte = ((byte & 0xff00) >> 8) | ((byte & 0x00ff) << 8); + } } return byte; @@ -1007,7 +1017,7 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui if ((addr < xga->linear_base) || (addr > (xga->linear_base + 0xfffff))) skip = 1; - switch (xga->accel.px_map_format[map] & 7) { + switch (xga->accel.px_map_format[map] & 0x07) { case 0: /*1-bit*/ addr += (y * (width >> 3)); addr += (x >> 3); @@ -1016,15 +1026,11 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui } else byte = mem_readb_phys(addr); - if (xga->linear_endian_reverse) { + if ((xga->accel.px_map_format[map] & 0x08) || (xga->accel.px_map_format[xga->accel.src_map] & 0x08)) + mask = 1 << (x & 7); + else mask = 1 << (7 - (x & 7)); - } else { - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) { - mask = 1 << (x & 7); - } else { - mask = 1 << (7 - (x & 7)); - } - } + byte = (byte & ~mask) | ((pixel ? 0xff : 0) & mask); if (pixel & 1) { if (!skip) { @@ -1044,18 +1050,14 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui addr += (x >> 1); if (!skip) { READ(addr, byte); - } else { + } else byte = mem_readb_phys(addr); - } - if (xga->linear_endian_reverse) + if (xga->accel.px_map_format[map] & 0x08) + mask = 0x0f << ((x & 1) << 2); + else mask = 0x0f << ((1 - (x & 1)) << 2); - else { - if ((xga->accel.px_map_format[map] & 8) && !(xga->access_mode & 8)) - mask = 0x0f << ((x & 1) << 2); - else - mask = 0x0f << ((1 - (x & 1)) << 2); - } + byte = (byte & ~mask) | (pixel & mask); if (!skip) { WRITE(addr, byte); @@ -1073,14 +1075,16 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui case 4: /*16-bit*/ addr += (y * width << 1); addr += (x << 1); - if (xga->linear_endian_reverse) { - if ((xga->access_mode & 7) == 4) - pixel = ((pixel & 0xff00) >> 8) | ((pixel & 0x00ff) << 8); - else if (xga->access_mode & 8) - pixel = ((pixel & 0xff00) >> 8) | ((pixel & 0x00ff) << 8); + if (xga->access_mode & 0x08) { + if (!skip) { + WRITEW(addr, pixel); + } } else { if (!skip) { WRITEW(addr, pixel); + } else { + if ((xga->access_mode & 0x07) == 0x04) + pixel = ((pixel & 0xff00) >> 8) | ((pixel & 0x00ff) << 8); } } mem_writew_phys(addr, pixel); @@ -1159,8 +1163,8 @@ xga_short_stroke(svga_t *svga, uint8_t ssv) while (y >= 0) { if (xga->accel.command & 0xc0) { if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1, 1) : xga->accel.frgd_color; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1, 0); + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1) : xga->accel.frgd_color; + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; @@ -1179,8 +1183,8 @@ xga_short_stroke(svga_t *svga, uint8_t ssv) } } } else { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1, 1) : xga->accel.frgd_color; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1, 0); + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1) : xga->accel.frgd_color; + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; @@ -1270,8 +1274,8 @@ xga_line_draw_write(svga_t *svga) if (xga->accel.command & 0xc0) { if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) { if (draw_pixel) { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, cx, cy, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1, 1) : xga->accel.frgd_color; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1, 0); + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, cx, cy, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1) : xga->accel.frgd_color; + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { ROP(1, dest_dat, src_dat); @@ -1281,8 +1285,8 @@ xga_line_draw_write(svga_t *svga) } } else { if (draw_pixel) { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, cx, cy, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1, 1) : xga->accel.frgd_color; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1, 0); + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, cx, cy, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1) : xga->accel.frgd_color; + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { ROP(1, dest_dat, src_dat); @@ -1330,8 +1334,8 @@ xga_line_draw_write(svga_t *svga) while (y >= 0) { if (xga->accel.command & 0xc0) { if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1, 1) : xga->accel.frgd_color; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1, 0); + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1) : xga->accel.frgd_color; + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; @@ -1346,8 +1350,8 @@ xga_line_draw_write(svga_t *svga) } } } else { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1, 1) : xga->accel.frgd_color; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1, 0); + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.src_map_x & 0xfff, xga->accel.src_map_y & 0xfff, xga->accel.src_map, srcbase, xga->accel.px_map_width[xga->accel.src_map] + 1) : xga->accel.frgd_color; + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, xga->accel.px_map_width[xga->accel.dst_map] + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; @@ -1465,7 +1469,7 @@ xga_bitblt(svga_t *svga) else { if ((dstwidth == (xga->h_disp - 1)) && (srcwidth == 1)) { if ((xga->accel.dst_map == 1) && (xga->accel.src_map == 2)) { - if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px_map_format[xga->accel.src_map] >= 0x0b)) + if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0a) && (xga->accel.px_map_format[xga->accel.src_map] >= 0x0a)) xga->accel.pattern = 1; } } @@ -1486,8 +1490,8 @@ xga_bitblt(svga_t *svga) while (xga->accel.y >= 0) { if (xga->accel.command & 0xc0) { if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0); + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1) : frgdcol; + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; ROP(1, dest_dat, src_dat); @@ -1497,8 +1501,8 @@ xga_bitblt(svga_t *svga) } } else { if ((dx >= 0) && (dx <= dstwidth) && (dy >= 0) && (dy <= dstheight)) { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0); + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1) : frgdcol; + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; ROP(1, dest_dat, src_dat); @@ -1549,12 +1553,12 @@ xga_bitblt(svga_t *svga) if (dstwidth == (xga->h_disp - 1)) { if (srcwidth == (xga->h_disp - 1)) { if ((xga->accel.src_map == 1) && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2)) { - if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) + if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0a) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) xga->accel.pattern = 1; } } else { if (!xga->accel.src_map && (xga->accel.dst_map == 1) && (xga->accel.pat_src == 2)) { - if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0b) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) { + if ((xga->accel.px_map_format[xga->accel.dst_map] >= 0x0a) && (xga->accel.px <= 7) && (xga->accel.py <= 3)) { if ((patwidth >= 7) && ((xga->accel.command & 0xc0) == 0x40)) xga->accel.pattern = 0; else @@ -1585,15 +1589,15 @@ xga_bitblt(svga_t *svga) if ((((xga->accel.command >> 24) & 0x0f) == 0x0a) && ((xga->accel.bkgd_mix & 0x1f) == 5)) { while (xga->accel.y >= 0) { - mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, xga->accel.pat_src, patbase, patwidth + 1); + mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, patbase, patwidth + 1); if (mix) xga->accel.filling = !xga->accel.filling; if (xga->accel.command & 0xc0) { if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol; + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1) : frgdcol; if (xga->accel.filling) { - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, 1024, 0); + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, 1024); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; ROP(1, dest_dat, src_dat); @@ -1605,9 +1609,9 @@ xga_bitblt(svga_t *svga) } } else { if ((dx >= 0) && (dx <= dstwidth) && (dy >= 0) && (dy <= dstheight)) { - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol; + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1) : frgdcol; if (xga->accel.filling) { - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0); + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; ROP(1, dest_dat, src_dat); @@ -1647,16 +1651,16 @@ xga_bitblt(svga_t *svga) } } else { while (xga->accel.y >= 0) { - mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, xga->accel.pat_src, patbase, patwidth + 1); + mix = xga_accel_read_pattern_map_pixel(svga, xga->accel.px, xga->accel.py, patbase, patwidth + 1); if (xga->accel.command & 0xc0) { if ((dx >= xga->accel.mask_map_origin_x_off) && (dx <= ((xga->accel.px_map_width[0] & 0xfff) + xga->accel.mask_map_origin_x_off)) && (dy >= xga->accel.mask_map_origin_y_off) && (dy <= ((xga->accel.px_map_height[0] & 0xfff) + xga->accel.mask_map_origin_y_off))) { if (mix) - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol; + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1) : frgdcol; else - src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol; + src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1) : bkgdcol; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0); + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; ROP(mix, dest_dat, src_dat); @@ -1667,11 +1671,11 @@ xga_bitblt(svga_t *svga) } else { if ((dx >= 0) && (dx <= dstwidth) && (dy >= 0) && (dy <= dstheight)) { if (mix) - src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : frgdcol; + src_dat = (((xga->accel.command >> 28) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1) : frgdcol; else - src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1, 1) : bkgdcol; + src_dat = (((xga->accel.command >> 30) & 3) == 2) ? xga_accel_read_map_pixel(svga, xga->accel.sx, xga->accel.sy, xga->accel.src_map, srcbase, srcwidth + 1) : bkgdcol; - dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1, 0); + dest_dat = xga_accel_read_map_pixel(svga, dx, dy, xga->accel.dst_map, dstbase, dstwidth + 1); if ((xga->accel.cc_cond == 4) || ((xga->accel.cc_cond == 1) && (dest_dat > color_cmp)) || ((xga->accel.cc_cond == 2) && (dest_dat == color_cmp)) || ((xga->accel.cc_cond == 3) && (dest_dat < color_cmp)) || ((xga->accel.cc_cond == 5) && (dest_dat >= color_cmp)) || ((xga->accel.cc_cond == 6) && (dest_dat != color_cmp)) || ((xga->accel.cc_cond == 7) && (dest_dat <= color_cmp))) { old_dest_dat = dest_dat; ROP(mix, dest_dat, src_dat); @@ -1800,6 +1804,10 @@ xga_mem_write(uint32_t addr, uint32_t val, xga_t *xga, svga_t *svga, int len) case 0x1c: xga->accel.px_map_format[xga->accel.px_map_idx] = val; + if (val & 0x08) + xga_log("Big Endian Pixel Format=%d, AccessMode=%x.\n", xga->accel.px_map_idx, xga->access_mode & 0x08); + else + xga_log("Little Endian Pixel Format=%d, AccessMode=%x.\n", xga->accel.px_map_idx, xga->access_mode & 0x08); break; case 0x20: @@ -2155,6 +2163,7 @@ exec_command: xga->accel.pat_src = ((xga->accel.command >> 12) & 0x0f); xga->accel.dst_map = ((xga->accel.command >> 16) & 0x0f); xga->accel.src_map = ((xga->accel.command >> 20) & 0x0f); + xga_log("PATMAP=%x, DSTMAP=%x, SRCMAP=%x.\n", xga->accel.px_map_format[xga->accel.pat_src], xga->accel.px_map_format[xga->accel.dst_map], xga->accel.px_map_format[xga->accel.src_map]); #ifdef ENABLE_XGA_LOG if (xga->accel.pat_src) @@ -2531,29 +2540,21 @@ xga_render_4bpp(svga_t *svga) xga->lastline_draw = xga->displine; - for (int x = 0; x <= xga->h_disp; x += 16) { + for (int x = 0; x <= xga->h_disp; x += 8) { dat = *(uint32_t *) (&xga->vram[xga->ma & xga->vram_mask]); p[0] = xga->pallook[dat & 0x0f]; - p[1] = xga->pallook[(dat >> 4) & 0x0f]; - p[2] = xga->pallook[(dat >> 8) & 0x0f]; - p[3] = xga->pallook[(dat >> 12) & 0x0f]; - p[4] = xga->pallook[(dat >> 16) & 0x0f]; - p[5] = xga->pallook[(dat >> 20) & 0x0f]; - p[6] = xga->pallook[(dat >> 24) & 0x0f]; - p[7] = xga->pallook[(dat >> 28) & 0x0f]; + p[1] = xga->pallook[(dat >> 8) & 0x0f]; + p[2] = xga->pallook[(dat >> 16) & 0x0f]; + p[3] = xga->pallook[(dat >> 24) & 0x0f]; - dat = *(uint32_t *) (&xga->vram[(xga->ma + 4) & xga->vram_mask]); - p[8] = xga->pallook[dat & 0x0f]; - p[9] = xga->pallook[(dat >> 4) & 0x0f]; - p[10] = xga->pallook[(dat >> 8) & 0x0f]; - p[11] = xga->pallook[(dat >> 12) & 0x0f]; - p[12] = xga->pallook[(dat >> 16) & 0x0f]; - p[13] = xga->pallook[(dat >> 20) & 0x0f]; - p[14] = xga->pallook[(dat >> 24) & 0x0f]; - p[15] = xga->pallook[(dat >> 28) & 0x0f]; + dat = *(uint32_t *) (&xga->vram[(xga->ma + 2) & xga->vram_mask]); + p[4] = xga->pallook[dat & 0x0f]; + p[5] = xga->pallook[(dat >> 8) & 0x0f]; + p[6] = xga->pallook[(dat >> 16) & 0x0f]; + p[7] = xga->pallook[(dat >> 24) & 0x0f]; xga->ma += 8; - p += 16; + p += 8; } xga->ma &= xga->vram_mask; } @@ -2643,7 +2644,8 @@ xga_write_test(uint32_t addr, uint8_t val, void *priv) xga_t *xga = (xga_t *) svga->xga; if (xga_active && xga) { - if (((xga->op_mode & 7) >= 1) && (xga->aperture_cntl >= 1)) { + if (((xga->op_mode & 7) >= 1) && xga->aperture_cntl) { + xga_log("WriteAddr=%05x.\n", addr); if (val == 0xa5) { /*Memory size test of XGA*/ xga->test = val; if (addr == 0xa0001) @@ -2653,28 +2655,39 @@ xga_write_test(uint32_t addr, uint8_t val, void *priv) xga->on = 0; vga_on = 1; - xga->disp_cntl_2 = 0; xga_log("XGA test1 addr=%05x, test=%02x.\n", addr, xga->a5_test); } else if (val == 0x5a) { xga->test = val; xga->on = 0; vga_on = 1; - xga->disp_cntl_2 = 0; xga_log("XGA test2 addr = %05x.\n", addr); } else if ((addr == 0xa0000) || (addr == 0xa0010)) { addr += xga->write_bank; xga->vram[addr & xga->vram_mask] = val; xga_log("XGA Linear endian reverse write, val = %02x, addr = %05x, banked mask = %04x, a5test=%d.\n", val, addr, svga->banked_mask, xga->a5_test); - if (!xga->a5_test) - xga->linear_endian_reverse = 1; } - } else { + } else if (xga->aperture_cntl) { xga->on = 0; vga_on = 1; } } } +static void +xga_write_banked(uint32_t addr, uint8_t val, void *priv) +{ + svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; + + if (xga->access_mode & 0x08) { + if ((xga->access_mode & 0x07) == 0x04) + addr ^= 1; + } + + xga->changedvram[(addr & xga->vram_mask) >> 12] = svga->monitor->mon_changeframecount; + xga->vram[addr & xga->vram_mask] = val; +} + static void xga_write(uint32_t addr, uint8_t val, void *priv) { @@ -2689,33 +2702,45 @@ xga_write(uint32_t addr, uint8_t val, void *priv) cycles -= svga->monitor->mon_video_timing_write_b; - if (xga->access_mode & 8) { - if ((xga->access_mode & 7) == 4) - addr ^= 1; - } - - xga->changedvram[(addr & xga->vram_mask) >> 12] = svga->monitor->mon_changeframecount; - xga->vram[addr & xga->vram_mask] = val; + xga_write_banked(addr, val, svga); } static void xga_writew(uint32_t addr, uint16_t val, void *priv) { - svga_t *svga = (svga_t *) priv; + svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; - xga_write(addr, val & 0xff, svga); - xga_write(addr + 1, val >> 8, svga); + addr &= xga->banked_mask; + addr += xga->write_bank; + + if (addr >= xga->vram_size) + return; + + cycles -= svga->monitor->mon_video_timing_write_w; + + xga_write_banked(addr, val & 0xff, svga); + xga_write_banked(addr + 1, val >> 8, svga); } static void xga_writel(uint32_t addr, uint32_t val, void *priv) { - svga_t *svga = (svga_t *) priv; + svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; - xga_write(addr, val & 0xff, svga); - xga_write(addr + 1, (val >> 8) & 0xff, svga); - xga_write(addr + 2, (val >> 16) & 0xff, svga); - xga_write(addr + 3, (val >> 24) & 0xff, svga); + addr &= xga->banked_mask; + addr += xga->write_bank; + + if (addr >= xga->vram_size) + return; + + cycles -= svga->monitor->mon_video_timing_write_l; + + xga_write_banked(addr, val & 0xff, svga); + xga_write_banked(addr + 1, val >> 8, svga); + xga_write_banked(addr + 2, val >> 16, svga); + xga_write_banked(addr + 3, val >> 24, svga); } uint8_t @@ -2726,7 +2751,7 @@ xga_read_test(uint32_t addr, void *priv) uint8_t ret = 0x00; if (xga_active && xga) { - if (((xga->op_mode & 7) >= 1) && (xga->aperture_cntl >= 1)) { + if (((xga->op_mode & 7) >= 1) && xga->aperture_cntl) { if (xga->test == 0xa5) { /*Memory size test of XGA*/ if (addr == 0xa0001) { ret = xga->test; @@ -2753,7 +2778,7 @@ xga_read_test(uint32_t addr, void *priv) addr += xga->read_bank; return xga->vram[addr & xga->vram_mask]; } - } else { + } else if (xga->aperture_cntl) { xga->on = 0; vga_on = 1; } @@ -2762,12 +2787,29 @@ xga_read_test(uint32_t addr, void *priv) } static uint8_t -xga_read(uint32_t addr, void *priv) +xga_read_banked(uint32_t addr, void *priv) { svga_t *svga = (svga_t *) priv; xga_t *xga = (xga_t *) svga->xga; uint8_t ret = 0xff; + if (xga->access_mode & 0x08) { + if ((xga->access_mode & 0x07) == 0x04) + addr ^= 1; + } + + ret = xga->vram[addr & xga->vram_mask]; + + return ret; +} + +static uint8_t +xga_read(uint32_t addr, void *priv) +{ + svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; + uint8_t ret = 0xff; + addr &= xga->banked_mask; addr += xga->read_bank; @@ -2778,13 +2820,7 @@ xga_read(uint32_t addr, void *priv) cycles -= svga->monitor->mon_video_timing_read_b; - if (xga->access_mode & 8) { - if ((xga->access_mode & 7) == 4) - addr ^= 1; - } - - ret = xga->vram[addr & xga->vram_mask]; - + ret = xga_read_banked(addr, svga); return ret; } @@ -2792,11 +2828,21 @@ static uint16_t xga_readw(uint32_t addr, void *priv) { svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; uint16_t ret = 0xffff; - ret = xga_read(addr, svga); - ret |= (xga_read(addr + 1, svga) << 8); + addr &= xga->banked_mask; + addr += xga->read_bank; + if (addr >= xga->vram_size) { + xga_log("Over Read ADDR=%x.\n", addr); + return ret; + } + + cycles -= svga->monitor->mon_video_timing_read_w; + + ret = xga_read_banked(addr, svga); + ret |= (xga_read_banked(addr + 1, svga) << 8); return ret; } @@ -2804,13 +2850,23 @@ static uint32_t xga_readl(uint32_t addr, void *priv) { svga_t *svga = (svga_t *) priv; + xga_t *xga = (xga_t *) svga->xga; uint32_t ret = 0xffffffff; - ret = xga_read(addr, svga); - ret |= (xga_read(addr + 1, svga) << 8); - ret |= (xga_read(addr + 2, svga) << 16); - ret |= (xga_read(addr + 3, svga) << 24); + addr &= xga->banked_mask; + addr += xga->read_bank; + if (addr >= xga->vram_size) { + xga_log("Over Read ADDR=%x.\n", addr); + return ret; + } + + cycles -= svga->monitor->mon_video_timing_read_l; + + ret = xga_read_banked(addr, svga); + ret |= (xga_read_banked(addr + 1, svga) << 8); + ret |= (xga_read_banked(addr + 2, svga) << 16); + ret |= (xga_read_banked(addr + 3, svga) << 24); return ret; } @@ -2820,6 +2876,7 @@ xga_write_linear(uint32_t addr, uint8_t val, void *priv) svga_t *svga = (svga_t *) priv; xga_t *xga = (xga_t *) svga->xga; + xga_log("WrtieLL XGA=%d.\n", xga->on); if (!xga->on) { svga_write_linear(addr, val, svga); return; @@ -2834,12 +2891,9 @@ xga_write_linear(uint32_t addr, uint8_t val, void *priv) cycles -= svga->monitor->mon_video_timing_write_b; - if (xga->linear_endian_reverse) { - if ((xga->access_mode & 7) == 4) { - if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) == 4) - addr ^= 1; - } else if (xga->access_mode & 8) { - if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) == 4) + if (!(xga->access_mode & 0x08)) { + if ((xga->access_mode & 0x07) == 0x04) { + if ((xga->accel.px_map_format[xga->accel.dst_map] & 0x07) == 0x04) addr ^= 1; } } @@ -2899,12 +2953,9 @@ xga_read_linear(uint32_t addr, void *priv) cycles -= svga->monitor->mon_video_timing_read_b; - if (xga->linear_endian_reverse) { - if ((xga->access_mode & 7) == 4) { - if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) == 4) - addr ^= 1; - } else if (xga->access_mode & 8) { - if ((xga->accel.px_map_format[xga->accel.dst_map] & 7) == 4) + if (!(xga->access_mode & 0x08)) { + if ((xga->access_mode & 0x07) == 0x04) { + if ((xga->accel.px_map_format[xga->accel.dst_map] & 0x07) == 0x04) addr ^= 1; } } @@ -3145,11 +3196,12 @@ xga_mca_write(int port, uint8_t val, void *priv) mem_mapping_disable(&xga->memio_mapping); xga->on = 0; vga_on = 1; - xga->linear_endian_reverse = 0; xga->a5_test = 0; /* Save the MCA register value. */ xga->pos_regs[port & 7] = val; + if (!(xga->pos_regs[4] & 1) && (mem_size >= 15360)) /*MCA 4MB addressing on systems with more than 16MB of memory*/ + xga->pos_regs[4] |= 1; if (xga->pos_regs[2] & 1) { xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; @@ -3184,15 +3236,10 @@ static void xga_mca_reset(void *priv) { svga_t *svga = (svga_t *) priv; - xga_t *xga = (xga_t *) svga->xga; - mem_mapping_disable(&xga->memio_mapping); - xga->on = 0; - vga_on = 1; xga_log("MCA Reset.\n"); + mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel); xga_mca_write(0x102, 0, svga); - xga->linear_endian_reverse = 0; - xga->a5_test = 0; } static void @@ -3207,8 +3254,8 @@ xga_reset(void *priv) xga->on = 0; vga_on = 1; - xga->linear_endian_reverse = 0; xga->a5_test = 0; + mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel); } static uint8_t @@ -3345,8 +3392,11 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv) break; case 0x0104: xga_log("104Write=%02x.\n", val); - if ((xga->pos_idx & 3) == 0) + if ((xga->pos_idx & 3) == 0) { xga->pos_regs[4] = val; + if (!(xga->pos_regs[4] & 0x01) && (mem_size >= 15360)) /*4MB addressing on systems with more than 15MB of memory*/ + xga->pos_regs[4] |= 0x01; + } break; case 0x0105: xga_log("105Write=%02x.\n", val); @@ -3405,7 +3455,6 @@ xga_init(const device_t *info) xga->on = 0; xga->hwcursor.cur_xsize = 64; xga->hwcursor.cur_ysize = 64; - xga->linear_endian_reverse = 0; xga->a5_test = 0; if (info->flags & DEVICE_MCA) { @@ -3431,7 +3480,7 @@ xga_init(const device_t *info) xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xf0) >> 4) * 0x2000); xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; xga->pos_regs[2] |= 0x01; - if (mem_size >= 16384) { + if (mem_size >= 15360) { xga->pos_regs[4] |= 0x01; xga->pos_regs[5] = 0; } else { @@ -3450,9 +3499,6 @@ xga_init(const device_t *info) } } - mem_mapping_add(&xga->video_mapping, 0, 0, xga_read, xga_readw, xga_readl, - xga_write, xga_writew, xga_writel, - NULL, MEM_MAPPING_EXTERNAL, svga); mem_mapping_add(&xga->linear_mapping, 0, 0, xga_read_linear, xga_readw_linear, xga_readl_linear, xga_write_linear, xga_writew_linear, xga_writel_linear, NULL, MEM_MAPPING_EXTERNAL, svga); From f280a0ee6e3cd5909f3e031a5138af7e1918e0c0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 26 Oct 2024 22:58:38 +0200 Subject: [PATCH 501/624] 3M Microtouch: #include to fix the warnings. --- src/device/mouse_microtouch_touchscreen.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/device/mouse_microtouch_touchscreen.c b/src/device/mouse_microtouch_touchscreen.c index 1100937ef..442b25b91 100644 --- a/src/device/mouse_microtouch_touchscreen.c +++ b/src/device/mouse_microtouch_touchscreen.c @@ -28,6 +28,7 @@ #include #include #include +#include #include <86box/86box.h> #include <86box/device.h> #include <86box/timer.h> From 9109a9d66e50272a8b43b3b258a8963be3c6f325 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Sat, 26 Oct 2024 20:55:26 -0300 Subject: [PATCH 502/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 0b26d5ce5..a9fa7e19b 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -625,7 +625,7 @@ msgid "Cassette" msgstr "Cassete" msgid "Vision Systems LBA Enhancer" -msgstr "Aprimorador de Sistema Vision para LBA" +msgstr "Aprimorador LBA Vision Sistems" msgid "Hard disks:" msgstr "Discos rígidos:" @@ -981,6 +981,12 @@ msgstr "Não reiniciar" msgid "CD-ROM images" msgstr "Imagens de CD-ROM" +msgid "Host CD/DVD Drive (%1)" +msgstr "Unidade de CD/DVD do anfitrião (%1)" + +msgid "CD-ROM images" +msgstr "Imagens de CD-ROM" + msgid "%1 Device Configuration" msgstr "Configuração do dispositivo %1" From f32365395764cde34914022bdbe1d61a6fe4c365 Mon Sep 17 00:00:00 2001 From: altiereslima Date: Sun, 27 Oct 2024 00:00:28 -0300 Subject: [PATCH 503/624] ops --- src/qt/languages/pt-BR.po | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index a9fa7e19b..1062d44a9 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -984,9 +984,6 @@ msgstr "Imagens de CD-ROM" msgid "Host CD/DVD Drive (%1)" msgstr "Unidade de CD/DVD do anfitrião (%1)" -msgid "CD-ROM images" -msgstr "Imagens de CD-ROM" - msgid "%1 Device Configuration" msgstr "Configuração do dispositivo %1" From 6e212fbd957054b4d12b7c1895b91dae0a8130dd Mon Sep 17 00:00:00 2001 From: altiereslima Date: Sun, 27 Oct 2024 00:07:52 -0300 Subject: [PATCH 504/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 1062d44a9..0cadad77c 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -13,7 +13,7 @@ msgid "&Keyboard requires capture" msgstr "&Teclado requer captura" msgid "&Right CTRL is left ALT" -msgstr "CTRL &direito é o ALT esquerdo" +msgstr "&CTRL direito é o ALT esquerdo" msgid "&Hard Reset..." msgstr "&Reinicialização completa..." @@ -163,7 +163,7 @@ msgid "Apply fullscreen stretch mode when maximized" msgstr "Aplicar modo de ampliação em tela cheia quando maximizado" msgid "E&GA/(S)VGA settings" -msgstr "Configurações E&GA/(S)VGA" +msgstr "Configurações de E&GA/(S)VGA" msgid "&Inverted VGA monitor" msgstr "Monitor VGA &invertido" @@ -172,7 +172,7 @@ msgid "VGA screen &type" msgstr "&Tipo de tela VGA" msgid "RGB &Color" -msgstr "&Cores RGB" +msgstr "&Cor RGB" msgid "&RGB Grayscale" msgstr "Tons de cinza &RGB" @@ -337,7 +337,7 @@ msgid "Settings" msgstr "Configurações" msgid "Specify Main Window Dimensions" -msgstr "Especifique as dimensões da janela principal" +msgstr "Especificar dimensões da janela principal" msgid "OK" msgstr "OK" @@ -1282,4 +1282,4 @@ msgid "WinBox is no longer supported" msgstr "O WinBox não é mais suportado" 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 "O desenvolvimento do gerenciador WinBox foi interrompido em 2022 devido à falta de mantenedores. À medida que direcionamos nossos esforços para tornar o 86Box ainda melhor, tomamos a decisão de não oferecer mais suporte ao WinBox como gerenciador.\n\nNão serão mais fornecidas atualizações através do WinBox, e você poderá encontrar comportamentos incorretos caso continue a usá-lo com versões mais recentes do 86Box. Quaisquer relatórios de bugs relacionados ao comportamento do WinBox serão fechados como inválidos.\n\nAcesse 86box.net para obter uma lista de outros gerenciadores que você pode usar." +msgstr "O desenvolvimento do gerenciador WinBox foi interrompido em 2022 devido à falta de mantenedores. À medida que direcionamos nossos esforços para tornar o 86Box ainda melhor, tomamos a decisão de não oferecer mais suporte ao WinBox como gerenciador.\n\nNão serão mais fornecidas atualizações através do WinBox, e você poderá encontrar comportamentos incorretos caso continue a usá-lo com versões mais recentes do 86Box. Quaisquer relatórios de erros relacionados ao comportamento do WinBox serão fechados como inválidos.\n\nAcesse 86box.net para obter uma lista de outros gerenciadores que você pode usar." From 31beadd103e4dde96d2b6977271fd70cd420a521 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 27 Oct 2024 16:55:05 +0100 Subject: [PATCH 505/624] ISA PnP: Return bit 0 of status register set between Wake[0] and Set CSN, fixes Creative ISA PnP sound card drivers installer for Windows 3.1 freezing. --- src/device/isapnp.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/device/isapnp.c b/src/device/isapnp.c index da9e623c1..0139eeb23 100644 --- a/src/device/isapnp.c +++ b/src/device/isapnp.c @@ -110,6 +110,7 @@ typedef struct _isapnp_card_ { } isapnp_card_t; typedef struct { + uint8_t in_isolation; uint8_t reg; uint8_t key_pos : 5; uint16_t read_data_addr; @@ -313,6 +314,8 @@ isapnp_read_common(isapnp_t *dev, isapnp_card_t *card, isapnp_device_t *ld, uint case 0x05: /* Status */ ret = 0x00; + if (dev->in_isolation) + ret = 0x01; CHECK_CURRENT_CARD(); isapnp_log("ISAPnP: Query status for CSN %02X\n", card->csn); @@ -485,15 +488,16 @@ isapnp_write_common(isapnp_t *dev, isapnp_card_t *card, isapnp_device_t *ld, uin case 0x03: /* Wake[CSN] */ isapnp_log("ISAPnP: Wake[%02X]\n", val); card = dev->first_card; + if (val == 0) + dev->in_isolation |= 1; while (card) { if (card->csn == val) { card->rom_pos = 0; card->id_checksum = isapnp_init_key[0]; if (card->state == PNP_STATE_SLEEP) card->state = (val == 0) ? PNP_STATE_ISOLATION : PNP_STATE_CONFIG; - } else { + } else card->state = PNP_STATE_SLEEP; - } card = card->next; } @@ -505,6 +509,7 @@ isapnp_write_common(isapnp_t *dev, isapnp_card_t *card, isapnp_device_t *ld, uin isapnp_set_csn(dev->isolated_card, val); dev->isolated_card->state = PNP_STATE_CONFIG; dev->isolated_card = NULL; + dev->in_isolation = 0; } else { isapnp_log("ISAPnP: Set CSN %02X but no card is isolated\n", val); } From aeaaa09b16fb47c9d805de26bd3ac368a6c9c5ae Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 27 Oct 2024 13:17:55 -0300 Subject: [PATCH 506/624] CD-ROM: Report image backend I/O errors as media CRC errors to the drive --- src/cdrom/cdrom.c | 73 ++++++++++++++++++++------------- src/cdrom/cdrom_image_backend.c | 10 ++--- src/cdrom/cdrom_image_viso.c | 7 +++- src/cdrom/cdrom_mitsumi.c | 2 +- src/include/86box/scsi_device.h | 3 ++ src/qt/dummy_cdrom_ioctl.c | 2 +- src/qt/win_cdrom_ioctl.c | 4 +- src/scsi/scsi_cdrom.c | 13 ++++++ 8 files changed, 75 insertions(+), 39 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 41cc1db98..4dc03885e 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -1520,13 +1520,13 @@ track_type_is_valid(UNUSED(uint8_t id), int type, int flags, int audio, int mode return 1; } -static void +static int read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, int mode2, int len) { uint8_t *bb = rbuf; const int offset = (!!(mode2 & 0x03)) ? 24 : 16; - dev->ops->read_sector(dev, CD_READ_DATA, rbuf + offset, lba); + int ret = dev->ops->read_sector(dev, CD_READ_DATA, rbuf + offset, lba); /* Sync bytes */ bb[0] = 0; @@ -1546,25 +1546,30 @@ read_sector_to_buffer(cdrom_t *dev, uint8_t *rbuf, uint32_t msf, uint32_t lba, i memset(bb, 0, 280); else if (!mode2) memset(bb, 0, 288); + + return ret; } -static void +static int read_audio(cdrom_t *dev, uint32_t lba, uint8_t *b) { - dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); + int ret = dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); memcpy(b, raw_buffer, 2352); cdrom_sector_size = 2352; + + return ret; } -static void +static int read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) { + int ret; if ((dev->cd_status == CD_STATUS_DATA_ONLY) || (dev->ops->sector_size(dev, lba) == 2048)) - read_sector_to_buffer(dev, raw_buffer, msf, lba, mode2, 2048); + ret = read_sector_to_buffer(dev, raw_buffer, msf, lba, mode2, 2048); else - dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); + ret = dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); cdrom_sector_size = 0; @@ -1610,15 +1615,18 @@ read_mode1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int cdrom_sector_size += 288; b += 288; } + + return ret; } -static void +static int read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) { + int ret; if ((dev->cd_status == CD_STATUS_DATA_ONLY) || (dev->ops->sector_size(dev, lba) == 2336)) - read_sector_to_buffer(dev, raw_buffer, msf, lba, mode2, 2336); + ret = read_sector_to_buffer(dev, raw_buffer, msf, lba, mode2, 2336); else - dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); + ret = dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); cdrom_sector_size = 0; @@ -1654,15 +1662,18 @@ read_mode2_non_xa(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t m cdrom_sector_size += 2336; b += 2336; } + + return ret; } -static void +static int read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) { + int ret; if ((dev->cd_status == CD_STATUS_DATA_ONLY) || (dev->ops->sector_size(dev, lba) == 2048)) - read_sector_to_buffer(dev, raw_buffer, msf, lba, mode2, 2048); + ret = read_sector_to_buffer(dev, raw_buffer, msf, lba, mode2, 2048); else - dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); + ret = dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); cdrom_sector_size = 0; @@ -1705,15 +1716,18 @@ read_mode2_xa_form1(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t cdrom_sector_size += 280; b += 280; } + + return ret; } -static void +static int read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t msf, int mode2, uint8_t *b) { + int ret; if ((dev->cd_status == CD_STATUS_DATA_ONLY) || (dev->ops->sector_size(dev, lba) == 2324)) - read_sector_to_buffer(dev, raw_buffer, msf, lba, mode2, 2324); + ret = read_sector_to_buffer(dev, raw_buffer, msf, lba, mode2, 2324); else - dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); + ret = dev->ops->read_sector(dev, CD_READ_RAW, raw_buffer, lba); cdrom_sector_size = 0; @@ -1748,6 +1762,8 @@ read_mode2_xa_form2(cdrom_t *dev, int cdrom_sector_flags, uint32_t lba, uint32_t cdrom_sector_size += 2328; b += 2328; } + + return ret; } int @@ -1763,6 +1779,7 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c int m; int s; int f; + int ret = 0; if (dev->cd_status == CD_STATUS_EMPTY) return 0; @@ -1827,21 +1844,21 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c return 0; } - read_audio(dev, lba, temp_b); + ret = read_audio(dev, lba, temp_b); } else if (cdrom_sector_type == 2) { if (audio || mode2) { cdrom_log("CD-ROM %i: [Mode 1] Attempting to read a sector of another type\n", dev->id); return 0; } - read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); } else if (cdrom_sector_type == 3) { if (audio || !mode2 || (mode2 & 0x03)) { cdrom_log("CD-ROM %i: [Mode 2 Formless] Attempting to read a sector of another type\n", dev->id); return 0; } - read_mode2_non_xa(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode2_non_xa(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); } else if (cdrom_sector_type == 4) { if (audio || !mode2 || ((mode2 & 0x03) != 1)) { cdrom_log("CD-ROM %i: [XA Mode 2 Form 1] Attempting to read a sector of another type\n", dev->id); @@ -1855,7 +1872,7 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c return 0; } - read_mode2_xa_form2(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode2_xa_form2(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); } else if (cdrom_sector_type == 8) { if (audio) { cdrom_log("CD-ROM %i: [Any Data] Attempting to read a data sector from an audio track\n", dev->id); @@ -1863,9 +1880,9 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c } if (mode2 && ((mode2 & 0x03) == 1)) - read_mode2_xa_form1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode2_xa_form1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); else if (!mode2) - read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); else { cdrom_log("CD-ROM %i: [Any Data] Attempting to read a data sector whose cooked size is not 2048 bytes\n", dev->id); return 0; @@ -1873,16 +1890,16 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c } else { if (mode2) { if ((mode2 & 0x03) == 0x01) - read_mode2_xa_form1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode2_xa_form1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); else if ((mode2 & 0x03) == 0x02) - read_mode2_xa_form2(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode2_xa_form2(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); else - read_mode2_non_xa(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode2_non_xa(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); } else { if (audio) - read_audio(dev, lba, temp_b); + ret = read_audio(dev, lba, temp_b); else - read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); + ret = read_mode1(dev, cdrom_sector_flags, lba, msf, mode2, temp_b); } } @@ -1914,7 +1931,7 @@ cdrom_readsector_raw(cdrom_t *dev, uint8_t *buffer, int sector, int ismsf, int c *len = cdrom_sector_size; - return 1; + return ret; } /* Peform a master init on the entire module. */ diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index 7dcde1cdb..a1223bd17 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -181,13 +181,13 @@ bin_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) if (fseeko64(tf->fp, seek, SEEK_SET) == -1) { cdrom_image_backend_log("CDROM: binary_read failed during seek!\n"); - return 0; + return -1; } if (fread(buffer, count, 1, tf->fp) != 1) { cdrom_image_backend_log("CDROM: binary_read failed during read!\n"); - return 0; + return -1; } if (UNLIKELY(tf->motorola)) { @@ -502,8 +502,8 @@ cdi_read_sector(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector) if (raw && !track_is_raw) { memset(buffer, 0x00, 2448); const int ret = trk->file->read(trk->file, buffer + offset, seek, length); - if (!ret) - return 0; + if (ret <= 0) + return ret; /* Construct the rest of the raw sector. */ memset(buffer + 1, 0xff, 10); buffer += 12; @@ -534,7 +534,7 @@ cdi_read_sectors(cd_img_t *cdi, uint8_t *buffer, int raw, uint32_t sector, uint3 for (uint32_t i = 0; i < num; i++) { success = cdi_read_sector(cdi, &buf[i * sector_size], raw, sector + i); - if (!success) + if (success <= 0) break; /* Based on the DOSBox patch, but check all 8 bytes and makes sure it's not an audio track. */ diff --git a/src/cdrom/cdrom_image_viso.c b/src/cdrom/cdrom_image_viso.c index 90bd83cf7..edca09d91 100644 --- a/src/cdrom/cdrom_image_viso.c +++ b/src/cdrom/cdrom_image_viso.c @@ -716,8 +716,11 @@ viso_read(void *priv, uint8_t *buffer, uint64_t seek, size_t count) } /* Read data. */ - if (entry->file && (fseeko64(entry->file, seek - entry->data_offset, SEEK_SET) != -1)) - read = fread(buffer, 1, sector_remain, entry->file); + if (!entry->file || (fseeko64(entry->file, seek - entry->data_offset, SEEK_SET) == -1)) + return -1; + read = fread(buffer, 1, sector_remain, entry->file); + if (sector_remain && !read) + return -1; } /* Fill remainder with 00 bytes if needed. */ diff --git a/src/cdrom/cdrom_mitsumi.c b/src/cdrom/cdrom_mitsumi.c index 01a9cf047..0cebfe7f6 100644 --- a/src/cdrom/cdrom_mitsumi.c +++ b/src/cdrom/cdrom_mitsumi.c @@ -197,7 +197,7 @@ mitsumi_cdrom_read_sector(mcd_t *dev, int first) } cdrom_stop(&cdrom); ret = cdrom_readsector_raw(&cdrom, dev->buf, cdrom.seek_pos, 0, 2, 0x10, (int *) &dev->readcount, 0); - if (!ret) + if (ret <= 0) return 0; if (dev->mode & 0x40) { dev->buf[12] = CD_BCD((dev->readmsf >> 16) & 0xff); diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h index 64d3bc853..abcd415f4 100644 --- a/src/include/86box/scsi_device.h +++ b/src/include/86box/scsi_device.h @@ -189,6 +189,7 @@ /* SCSI Sense Keys */ #define SENSE_NONE 0 #define SENSE_NOT_READY 2 +#define SENSE_MEDIUM_ERROR 3 #define SENSE_ILLEGAL_REQUEST 5 #define SENSE_UNIT_ATTENTION 6 @@ -196,6 +197,7 @@ #define ASC_NONE 0x00 #define ASC_AUDIO_PLAY_OPERATION 0x00 #define ASC_NOT_READY 0x04 +#define ASC_UNRECOVERED_READ_ERROR 0x11 #define ASC_ILLEGAL_OPCODE 0x20 #define ASC_LBA_OUT_OF_RANGE 0x21 #define ASC_INV_FIELD_IN_CMD_PACKET 0x24 @@ -212,6 +214,7 @@ #define ASCQ_NONE 0x00 #define ASCQ_UNIT_IN_PROCESS_OF_BECOMING_READY 0x01 #define ASCQ_INITIALIZING_COMMAND_REQUIRED 0x02 +#define ASCQ_CIRC_UNRECOVERED_ERROR 0x06 #define ASCQ_CAPACITY_DATA_CHANGED 0x09 #define ASCQ_AUDIO_PLAY_OPERATION_IN_PROGRESS 0x11 #define ASCQ_AUDIO_PLAY_OPERATION_PAUSED 0x12 diff --git a/src/qt/dummy_cdrom_ioctl.c b/src/qt/dummy_cdrom_ioctl.c index 5c533b216..fed1444d1 100644 --- a/src/qt/dummy_cdrom_ioctl.c +++ b/src/qt/dummy_cdrom_ioctl.c @@ -207,7 +207,7 @@ plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) plat_cdrom_close(); dummy_cdrom_ioctl_log("ReadSector status=%d, sector=%d, size=%" PRId64 ".\n", status, sector, (long long) size); - return 0; + return -1; } void diff --git a/src/qt/win_cdrom_ioctl.c b/src/qt/win_cdrom_ioctl.c index ff422bcd2..995876c1d 100644 --- a/src/qt/win_cdrom_ioctl.c +++ b/src/qt/win_cdrom_ioctl.c @@ -342,7 +342,7 @@ plat_cdrom_get_sector_size(UNUSED(uint32_t sector)) int plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) { - BOOL status; + int status; long size = 0; int buflen = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE; @@ -370,7 +370,7 @@ plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) plat_cdrom_close(); win_cdrom_ioctl_log("ReadSector status=%d, sector=%d, size=%" PRId64 ".\n", status, sector, (long long) size); - return (size == buflen) && (status > 0); + return (status > 0) ? (size == buflen) : -1; } void diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index d014945a7..c527465fc 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1244,6 +1244,15 @@ scsi_cdrom_not_ready(scsi_cdrom_t *dev) scsi_cdrom_cmd_error(dev); } +static void +scsi_cdrom_circ_error(scsi_cdrom_t *dev) +{ + scsi_cdrom_sense_key = SENSE_MEDIUM_ERROR; + scsi_cdrom_asc = ASC_UNRECOVERED_READ_ERROR; + scsi_cdrom_ascq = ASCQ_CIRC_UNRECOVERED_ERROR; + scsi_cdrom_cmd_error(dev); +} + static void scsi_cdrom_invalid_lun(scsi_cdrom_t *dev) { @@ -1367,6 +1376,10 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *l if (!ret) { scsi_cdrom_illegal_mode(dev); return 0; + } else if (ret < 0) { + pclog("we have a circ\n"); + scsi_cdrom_circ_error(dev); + return -1; } } From b0e8647753c3a981c3cd87de2805354827e2765b Mon Sep 17 00:00:00 2001 From: richardg867 Date: Sun, 27 Oct 2024 14:10:28 -0300 Subject: [PATCH 507/624] scsi_cdrom: Remove debug logging --- src/scsi/scsi_cdrom.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index c527465fc..358901847 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1377,7 +1377,6 @@ scsi_cdrom_read_data(scsi_cdrom_t *dev, int msf, int type, int flags, int32_t *l scsi_cdrom_illegal_mode(dev); return 0; } else if (ret < 0) { - pclog("we have a circ\n"); scsi_cdrom_circ_error(dev); return -1; } From 8a7e0ea5477db180d9013cd8c494056a39f313e3 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 27 Oct 2024 23:36:11 +0100 Subject: [PATCH 508/624] Small but important video changes of the day (October 27th, 2024) 8514/A compatibles: 1. The mode switch (from VGA to 8514/A/ATI and vice-versa) has been fixed again (for the Nth time). 2. Removed a pattern hack used on DPCONFIG = 0x5211 on bitblt, now patterns work properly using the ATI Mach8 3.0 win3.1x drivers. 3. Clipping regs are more accurate for acceleration. XGA 1-2: A picky OS is a picky OS, fixes to the Win95 fonts (which uses the pattern sources) applied. --- src/include/86box/vid_8514a.h | 3 + src/video/vid_8514a.c | 26 ++- src/video/vid_ati_mach8.c | 300 +++++++++++++++++++++------------- src/video/vid_xga.c | 4 +- 4 files changed, 217 insertions(+), 116 deletions(-) diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index 39af01fd0..1c64309cd 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -198,13 +198,16 @@ typedef struct ibm8514_t { int hsync_width; int htotal; int hdisp; + int hdisp2; int hdisped; int sc; int vsyncstart; int vsyncwidth; int vtotal; int v_disp; + int v_disp2; int vdisp; + int vdisp2; int disp_cntl; int interlace; uint8_t subsys_cntl; diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 3e758b952..6d7aa6b94 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -498,6 +498,24 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) dev->accel.multifunc_cntl = val; dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff; dev->accel.cmd_back = !!(port == 0xfee8); + + if ((dev->accel.multifunc_cntl >> 12) == 1) { + dev->accel.clip_top = dev->accel.multifunc[1] & 0x3ff; + if (dev->accel.multifunc[1] & 0x400) + dev->accel.clip_top |= ~0x3ff; + } + + if ((dev->accel.multifunc_cntl >> 12) == 2) { + dev->accel.clip_left = dev->accel.multifunc[2] & 0x3ff; + if (dev->accel.multifunc[2] & 0x400) + dev->accel.clip_left |= ~0x3ff; + } + if ((dev->accel.multifunc_cntl >> 12) == 3) + dev->accel.clip_bottom = dev->accel.multifunc[3] & 0x7ff; + + if ((dev->accel.multifunc_cntl >> 12) == 4) + dev->accel.clip_right = dev->accel.multifunc[4] & 0x7ff; + } break; @@ -914,10 +932,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat uint16_t old_dest_dat; int frgd_mix; int bkgd_mix; - int16_t clip_t = dev->accel.multifunc[1] & 0x7ff; - int16_t clip_l = dev->accel.multifunc[2] & 0x7ff; - uint16_t clip_b = dev->accel.multifunc[3] & 0x7ff; - uint16_t clip_r = dev->accel.multifunc[4] & 0x7ff; + int16_t clip_t = dev->accel.clip_top; + int16_t clip_l = dev->accel.clip_left; + uint16_t clip_b = dev->accel.clip_bottom; + uint16_t clip_r = dev->accel.clip_right; int pixcntl = (dev->accel.multifunc[0x0a] >> 6) & 3; uint16_t mix_mask = dev->bpp ? 0x8000 : 0x80; uint16_t compare = dev->accel.color_cmp; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 7ef0d2475..f39dda6d7 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -309,10 +309,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 uint16_t mix = 0; uint32_t mono_dat0 = 0; uint32_t mono_dat1 = 0; - int16_t clip_t = dev->accel.multifunc[1] & 0x7ff; - int16_t clip_l = dev->accel.multifunc[2] & 0x7ff; - int16_t clip_b = dev->accel.multifunc[3] & 0x7ff; - int16_t clip_r = dev->accel.multifunc[4] & 0x7ff; + int16_t clip_t = dev->accel.clip_top; + int16_t clip_l = dev->accel.clip_left; + int16_t clip_b = dev->accel.clip_bottom; + int16_t clip_r = dev->accel.clip_right; if (!dev->bpp) { rd_mask &= 0xff; @@ -829,15 +829,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (dev->accel.cur_y >= 0x600) dev->accel.dy |= ~0x5ff; - if (mach->accel.dp_config == 0x5211) { - if (mach->accel.dest_x_end == 1024) - goto skip_dx; - } /*Destination Width*/ - if (mach->accel.dest_x_start != dev->accel.dx) - mach->accel.dest_x_start = dev->accel.dx; - -skip_dx: mach->accel.dx_start = mach->accel.dest_x_start; if (mach->accel.dest_x_start >= 0x600) mach->accel.dx_start |= ~0x5ff; @@ -868,6 +860,7 @@ skip_dx: mach->accel.dy_start = dev->accel.cur_y; if (dev->accel.cur_y >= 0x600) mach->accel.dy_start |= ~0x5ff; + mach->accel.dy_end = mach->accel.dest_y_end; if (mach->accel.dest_y_end >= 0x600) mach->accel.dy_end |= ~0x5ff; @@ -995,8 +988,10 @@ skip_dx: if (cpu_input) { if (mach->accel.dp_config == 0x3251) { mach_log("DPCONFIG 3251: monosrc=%d, frgdsel=%d, bkgdsel=%d, pitch=%d.\n", mono_src, frgd_sel, bkgd_sel, dev->pitch); - if (dev->accel.sy == mach->accel.height) + if (dev->accel.sy == mach->accel.height) { + mach_log("No Blit on DPCONFIG=3251.\n"); return; + } } } @@ -2569,6 +2564,7 @@ mach_recalctimings(svga_t *svga) } svga->render8514 = ibm8514_render_blank; + mach_log("ON?=%d.\n", dev->on); if (dev->on) { mach_log("8514/A ON, extpitch=%d, devma=%x, vgamalatch=%x.\n", dev->ext_pitch, dev->ma, svga->ma_latch); dev->pitch = dev->ext_pitch; @@ -2578,7 +2574,7 @@ mach_recalctimings(svga_t *svga) dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); mach->accel.ge_offset = dev->accel.ge_offset; - mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0xfe); + 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, mach->accel.clock_sel & 0xfe, dev->interlace); if ((dev->local & 0xff) >= 0x02) { if (dev->bpp || (dev->accel_bpp >= 24) || (mach->accel.clock_sel & 0x01)) { dev->h_disp = dev->hdisp; @@ -2593,8 +2589,13 @@ mach_recalctimings(svga_t *svga) dev->dispend = 480; } } else { - dev->h_disp = dev->hdisp; - dev->dispend = dev->vdisp; + if (((mach->shadow_set & 0x03) == 0x00) && ((dev->hdisp2 == 640) || (dev->hdisp2 == 1280)) && (dev->hdisp != 800)) { + dev->h_disp = dev->hdisp2; + dev->dispend = dev->vdisp2; + } else { + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; + } } } } else { @@ -2619,18 +2620,6 @@ mach_recalctimings(svga_t *svga) if (dev->interlace) dev->dispend >>= 1; - if (dev->dispend == 478) - dev->dispend += 2; - - if (dev->dispend == 598) - dev->dispend += 2; - - if (dev->dispend == 766) - dev->dispend += 2; - - if (dev->dispend == 1022) - dev->dispend += 2; - if ((dev->local & 0xff) >= 0x02) { mach_log("HDISP=%d, mask=%02x.\n", dev->h_disp, dev->dac_mask); if ((mach->accel.ext_ge_config & 0x800) || (!(mach->accel.ext_ge_config & 0x8000) && !(mach->accel.ext_ge_config & 0x800))) { @@ -3116,27 +3105,43 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xdaee: - mach_log("DAEE (extclipl) write val = %d\n", val); - if (len == 2) + mach_log("DAEE (extclipl) write val = %d\n", val & 0x7ff); + if (len == 2) { dev->accel.multifunc[2] = val & 0x7ff; + dev->accel.clip_left = dev->accel.multifunc[2]; + if (val & 0x800) + dev->accel.clip_left |= ~0x7ff; + } break; case 0xdeee: - mach_log("DEEE (extclipt) write val = %d\n", val); - if (len == 2) + mach_log("DEEE (extclipt) write val = %d\n", val & 0x7ff); + if (len == 2) { dev->accel.multifunc[1] = val & 0x7ff; + dev->accel.clip_top = dev->accel.multifunc[1]; + if (val & 0x800) + dev->accel.clip_top |= ~0x7ff; + } break; case 0xe2ee: - mach_log("E2EE (extclipr) write val = %d\n", val); - if (len == 2) + mach_log("E2EE (extclipr) write val = %d\n", val & 0x7ff); + if (len == 2) { dev->accel.multifunc[4] = val & 0x7ff; + dev->accel.clip_right = dev->accel.multifunc[4]; + if (val & 0x800) + dev->accel.clip_right |= ~0x7ff; + } break; case 0xe6ee: - mach_log("E6EE (extclipb) write val = %d\n", val); - if (len == 2) + mach_log("E6EE (extclipb) write val = %d\n", val & 0x7ff); + if (len == 2) { dev->accel.multifunc[3] = val & 0x7ff; + dev->accel.clip_bottom = dev->accel.multifunc[3]; + if (val & 0x800) + dev->accel.clip_bottom |= ~0x7ff; + } break; case 0xeeee: @@ -3186,7 +3191,6 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0xee8: case 0x1ee8: case 0x1ee9: - case 0x22e8: case 0x42e8: case 0x42e9: ibm8514_accel_out(port, val, svga, 2); @@ -3197,10 +3201,11 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 if (!(mach->shadow_cntl & 0x08)) { if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01)) { dev->hdisped = val; - dev->hdisp = (dev->hdisped + 1) << 3; - } + dev->hdisp = (val + 1) << 3; + } else if (((mach->shadow_set & 0x03) == 0x00) && !(mach->accel.clock_sel & 0x01)) + dev->hdisp2 = (val + 1) << 3; } - mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): hdisp=0x%02x.\n", CS, cpu_state.pc, port, val); + mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): hdisp=0x%02x, shadowcntl=%02x, shadowset=%02x.\n", CS, cpu_state.pc, port, val, mach->shadow_cntl & 0x08, mach->shadow_set & 0x03); svga_recalctimings(svga); break; @@ -3208,7 +3213,8 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x12e9: /*In preparation to switch from VGA to 8514/A mode*/ if (!(mach->shadow_cntl & 0x10)) { - if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01)) { + if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01) || + (((mach->shadow_set & 0x03) == 0x00) && !(mach->accel.clock_sel & 0x01))) { WRITE8(port, dev->v_total_reg, val); dev->v_total_reg &= 0x1fff; dev->v_total = dev->v_total_reg + 1; @@ -3228,9 +3234,17 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 WRITE8(port, dev->v_disp, val); dev->v_disp &= 0x1fff; dev->vdisp = (dev->v_disp + 1) >> 1; + if ((dev->vdisp == 478) || (dev->vdisp == 598) || (dev->vdisp == 766) || (dev->vdisp == 1022)) + dev->vdisp += 2; + } else if (((mach->shadow_set & 0x03) == 0x00) && !(mach->accel.clock_sel & 0x01)) { + WRITE8(port, dev->v_disp2, val); + dev->v_disp2 &= 0x1fff; + dev->vdisp2 = (dev->v_disp2 + 1) >> 1; + if ((dev->vdisp2 == 478) || (dev->vdisp2 == 598) || (dev->vdisp2 == 766) || (dev->vdisp2 == 1022)) + dev->vdisp2 += 2; } } - mach_log("ATI 8514/A: V_DISP write 16E8 = %d\n", dev->v_disp); + 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); svga_recalctimings(svga); break; @@ -3239,7 +3253,8 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x1ae9: /*In preparation to switch from VGA to 8514/A mode*/ if (!(mach->shadow_cntl & 0x10)) { - if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01)) { + if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01) || + (((mach->shadow_set & 0x03) == 0x00) && !(mach->accel.clock_sel & 0x01))) { WRITE8(port, dev->v_sync_start, val); dev->v_sync_start &= 0x1fff; dev->v_syncstart = dev->v_sync_start + 1; @@ -3252,15 +3267,29 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 svga_recalctimings(svga); break; + case 0x22e8: + if (!(mach->shadow_cntl & 0x03)) { + if ((mach->shadow_set & 0x03) || (mach->accel.clock_sel & 0x01) || + (((mach->shadow_set & 0x03) == 0x00) && !(mach->accel.clock_sel & 0x01))) { + dev->disp_cntl = val; + dev->interlace = !!(dev->disp_cntl & 0x10); + } + } + mach_log("ATI 8514/A: DISP_CNTL write %04x=%02x, interlace=%d.\n", port, dev->disp_cntl, dev->interlace); + svga_recalctimings(svga); + break; + case 0x4ae8: - WRITE8(port, dev->accel.advfunc_cntl, val); - dev->on = dev->accel.advfunc_cntl & 0x01; - vga_on = !dev->on; + dev->accel.advfunc_cntl = val; + mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, dev->accel.advfunc_cntl & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); if ((dev->local & 0xff) < 0x02) dev->ext_crt_pitch = 128; - - 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); + break; + case 0x4ae9: + dev->on = dev->accel.advfunc_cntl & 0x01; + vga_on = !dev->on; + mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, dev->accel.advfunc_cntl & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); mach_log("Vendor IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); svga_recalctimings(svga); @@ -3342,8 +3371,6 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 else dev->ext_crt_pitch <<= 1; } - dev->on = 1; - vga_on = 0; mach_log("ATI 8514/A: (0x%04x) val=0x%02x.\n", port, val); svga_recalctimings(svga); break; @@ -3391,7 +3418,9 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x4aee: case 0x4aef: WRITE8(port, mach->accel.clock_sel, val); - dev->on = mach->accel.clock_sel & 0x01; + if (port & 1) + dev->on = mach->accel.clock_sel & 0x01; + mach_log("ATI 8514/A: (0x%04x): ON=%d, val=%04x, hdisp=%d, vdisp=%d, val=0x%02x.\n", port, dev->on, val, dev->hdisp, dev->vdisp, val & 0xfe); if (!(port & 1)) mach_log("Vendor ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); @@ -3449,6 +3478,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x6aef: WRITE8(port, mach->accel.max_waitstates, val); mach->override_resolution = !!(mach->accel.max_waitstates & 0x400); + mach_log("Override=%d.\n", mach->override_resolution); if (mach->override_resolution) { dev->on = 1; vga_on = !dev->on; @@ -3845,12 +3875,16 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in if (len == 2) { if ((dev->local & 0xff) >= 0x02) temp = mach->accel.src_x; - } else - temp = mach->accel.src_x & 0xff; + } else { + if ((dev->local & 0xff) >= 0x02) + temp = mach->accel.src_x & 0xff; + } break; case 0xdaef: - if (len == 1) - temp = mach->accel.src_x >> 8; + if (len == 1) { + if ((dev->local & 0xff) >= 0x02) + temp = mach->accel.src_x >> 8; + } break; case 0xdeee: @@ -4340,60 +4374,97 @@ mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t } addr &= svga->decode_mask; - if (addr >= dev->vram_size) + if (addr >= dev->vram_size) { + mach_log("WriteOver! %x.\n", addr); return; + } addr &= dev->vram_mask; dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; - val = ((val >> (svga->gdcreg[3] & 7)) | (val << (8 - (svga->gdcreg[3] & 7)))); - if ((svga->gdcreg[8] == 0xff) && !(svga->gdcreg[3] & 0x18) && (!svga->gdcreg[1] || svga->set_reset_disabled)) { - for (i = 0; i < 4; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = val; - } - } else { - for (i = 0; i < 4; i++) { - if (svga->gdcreg[1] & (1 << i)) - vall.b[i] = !!(svga->gdcreg[0] & (1 << i)) * 0xff; - else - vall.b[i] = val; - } + switch (svga->writemode) { + case 0: + val = ((val >> (svga->gdcreg[3] & 7)) | (val << (8 - (svga->gdcreg[3] & 7)))); + if ((svga->gdcreg[8] == 0xff) && !(svga->gdcreg[3] & 0x18) && (!svga->gdcreg[1] || svga->set_reset_disabled)) { + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = val; + } + return; + } else { + for (i = 0; i < 4; i++) { + if (svga->gdcreg[1] & (1 << i)) + vall.b[i] = !!(svga->gdcreg[0] & (1 << i)) * 0xff; + else + vall.b[i] = val; + } + } + break; + case 1: + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = dev->latch.b[i]; + } + return; + case 2: + for (i = 0; i < 4; i++) + vall.b[i] = !!(val & (1 << i)) * 0xff; - switch (svga->gdcreg[3] & 0x18) { - case 0x00: /* Set */ + if (!(svga->gdcreg[3] & 0x18) && (!svga->gdcreg[1] || svga->set_reset_disabled)) { for (i = 0; i < 4; i++) { if (writemask2 & (1 << i)) dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) | (dev->latch.b[i] & ~svga->gdcreg[8]); } - break; - case 0x08: /* AND */ - for (i = 0; i < 4; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = (vall.b[i] | ~svga->gdcreg[8]) & dev->latch.b[i]; - } - break; - case 0x10: /* OR */ - for (i = 0; i < 4; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) | dev->latch.b[i]; - } - break; - case 0x18: /* XOR */ - for (i = 0; i < 4; i++) { - if (writemask2 & (1 << i)) - dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) ^ dev->latch.b[i]; - } - break; + return; + } + break; + case 3: + val = ((val >> (svga->gdcreg[3] & 7)) | (val << (8 - (svga->gdcreg[3] & 7)))); + wm = svga->gdcreg[8]; + svga->gdcreg[8] &= val; - default: - break; - } + for (i = 0; i < 4; i++) + vall.b[i] = !!(svga->gdcreg[0] & (1 << i)) * 0xff; - if (reset_wm) - svga->gdcreg[8] = wm; + reset_wm = 1; + break; + default: + break; } + + switch (svga->gdcreg[3] & 0x18) { + case 0x00: /* Set */ + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) | (dev->latch.b[i] & ~svga->gdcreg[8]); + } + break; + case 0x08: /* AND */ + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = (vall.b[i] | ~svga->gdcreg[8]) & dev->latch.b[i]; + } + break; + case 0x10: /* OR */ + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) | dev->latch.b[i]; + } + break; + case 0x18: /* XOR */ + for (i = 0; i < 4; i++) { + if (writemask2 & (1 << i)) + dev->vram[addr | i] = (vall.b[i] & svga->gdcreg[8]) ^ dev->latch.b[i]; + } + break; + + default: + break; + } + + if (reset_wm) + svga->gdcreg[8] = wm; } #ifdef ATI_8514_ULTRA @@ -4618,8 +4689,10 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) if (svga->chain4) { addr &= svga->decode_mask; - if (addr >= dev->vram_size) + if (addr >= dev->vram_size) { + mach_log("ReadOver! (chain4) %x.\n", addr); return 0xff; + } latch_addr = (addr & dev->vram_mask) & ~3; for (uint8_t i = 0; i < count; i++) dev->latch.b[i] = dev->vram[latch_addr | i]; @@ -4630,8 +4703,10 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) addr &= dev->vram_mask; } else { addr &= svga->decode_mask; - if (addr >= dev->vram_size) + if (addr >= dev->vram_size) { + mach_log("ReadOver! (normal) %x.\n", addr); return 0xff; + } latch_addr = (addr & dev->vram_mask) & ~3; for (uint8_t i = 0; i < count; i++) dev->latch.b[i] = dev->vram[latch_addr | i]; @@ -4642,6 +4717,7 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) /* standard VGA latched access */ if (latch_addr >= dev->vram_size) { + mach_log("Over VRAM Latch addr=%x.\n", latch_addr); for (uint8_t i = 0; i < count; i++) dev->latch.b[i] = 0xff; } else { @@ -4651,8 +4727,10 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) dev->latch.b[i] = dev->vram[latch_addr | i]; } - if (addr >= dev->vram_size) + if (addr >= dev->vram_size) { + mach_log("ReadOver! (chain2) %x.\n", addr); return 0xff; + } addr &= dev->vram_mask; @@ -4885,10 +4963,10 @@ mach32_ap_writeb(uint32_t addr, uint8_t val, void *priv) mach_accel_outb(0x02e8 + (addr & 1) + (port_dword << 8), val, mach); } } else { - if (dev->on) { - mach_log("Linear WORDB Write=%08x, val=%02x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); + mach_log("Linear WORDB Write=%08x, val=%02x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); + if (dev->on) mach32_write_common(addr, val, 1, mach, svga); - } else + else svga_write_linear(addr, val, svga); } } @@ -4911,10 +4989,10 @@ mach32_ap_writew(uint32_t addr, uint16_t val, void *priv) mach_accel_outw(0x02e8 + (port_dword << 8), val, mach); } } else { - if (dev->on) { - mach_log("Linear WORDW Write=%08x, val=%04x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); + mach_log("Linear WORDW Write=%08x, val=%04x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); + if (dev->on) mach32_writew_linear(addr, val, mach); - } else + else svga_writew_linear(addr, val, svga); } } @@ -4939,10 +5017,10 @@ mach32_ap_writel(uint32_t addr, uint32_t val, void *priv) mach_accel_outw(0x02e8 + (port_dword << 8) + 4, val >> 16, mach); } } else { - if (dev->on) { - mach_log("Linear WORDL Write=%08x, val=%08x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); + mach_log("Linear WORDL Write=%08x, val=%08x, ON=%x, dpconfig=%04x, apsize=%08x.\n", addr & dev->vram_mask, val, dev->on, mach->accel.dp_config, mach->ap_size << 20); + if (dev->on) mach32_writel_linear(addr, val, mach); - } else + else svga_writel_linear(addr, val, svga); } } @@ -4990,9 +5068,9 @@ mach32_ap_readw(uint32_t addr, void *priv) else temp = mach_accel_inw(0x02e8 + (port_dword << 8), mach); } else { - if (dev->on) { + if (dev->on) temp = mach32_readw_linear(addr, mach); - } else + else temp = svga_readw_linear(addr, svga); mach_log("Linear WORDW Read=%08x, ret=%04x.\n", addr, temp); @@ -5020,9 +5098,9 @@ mach32_ap_readl(uint32_t addr, void *priv) temp |= (mach_accel_inw(0x02e8 + (port_dword << 8) + 4, mach) << 8); } } else { - if (dev->on) { + if (dev->on) temp = mach32_readl_linear(addr, mach); - } else + else temp = svga_readl_linear(addr, svga); mach_log("Linear WORDL Read=%08x, ret=%08x, ON%d.\n", addr, temp, dev->on); diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index e71ed42a7..6687238da 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -925,8 +925,10 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, uint32_t base, int bits = 7 - (x & 7); if (!(xga->accel.px_map_format[xga->accel.src_map] & 0x08) && !(xga->accel.px_map_format[xga->accel.dst_map] & 0x08)) { - if (((xga->accel.px_map_format[xga->accel.src_map] & 0x07) >= 0x02) && ((xga->accel.px_map_format[xga->accel.dst_map] & 0x07) >= 0x02)) + if (((xga->accel.px_map_format[xga->accel.src_map] & 0x07) >= 0x02) && ((xga->accel.px_map_format[xga->accel.dst_map] & 0x07) >= 0x02) && (xga->accel.pat_src <= 2)) { + xga_log("Reverse, access mode=%02x, dstmap=%x, srcmap=%x, pat=%x.\n", xga->access_mode & 0x08, xga->accel.px_map_format[xga->accel.dst_map], xga->accel.px_map_format[xga->accel.src_map], xga->accel.pat_src); bits ^= 7; + } } px = (byte >> bits) & 1; From 9685cdfa925e0d9bd03ed87da128b24f439cc643 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 28 Oct 2024 02:23:43 +0100 Subject: [PATCH 509/624] XGA changes of the early day (October 28th, 2024) 1. Pattern/font fixes for Windows 3.1's third party XGA drivers as well as OS/2's win3.x' box (seamless and full). 2. The 4MB aperture is still used internally even if the 1MB one is in use, fixes OS/2's XGA driver on boot when less than 16MB of memory is used. --- src/video/vid_xga.c | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index 6687238da..f126ba9bd 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -924,11 +924,10 @@ xga_accel_read_pattern_map_pixel(svga_t *svga, int x, int y, uint32_t base, int bits = 7 - (x & 7); + xga_log("0. AccessMode=%02x, SRCMAP=%02x, DSTMAP=%02x, PAT=%02x.\n", xga->access_mode & 0x0f, (xga->accel.px_map_format[xga->accel.src_map] & 0x0f), (xga->accel.px_map_format[xga->accel.dst_map] & 0x0f), (xga->accel.px_map_format[xga->accel.pat_src] & 0x08)); if (!(xga->accel.px_map_format[xga->accel.src_map] & 0x08) && !(xga->accel.px_map_format[xga->accel.dst_map] & 0x08)) { - if (((xga->accel.px_map_format[xga->accel.src_map] & 0x07) >= 0x02) && ((xga->accel.px_map_format[xga->accel.dst_map] & 0x07) >= 0x02) && (xga->accel.pat_src <= 2)) { - xga_log("Reverse, access mode=%02x, dstmap=%x, srcmap=%x, pat=%x.\n", xga->access_mode & 0x08, xga->accel.px_map_format[xga->accel.dst_map], xga->accel.px_map_format[xga->accel.src_map], xga->accel.pat_src); + if (((xga->accel.px_map_format[xga->accel.src_map] & 0x07) >= 0x02) && ((xga->accel.px_map_format[xga->accel.dst_map] & 0x07) >= 0x02) && (xga->accel.pat_src <= 2)) bits ^= 7; - } } px = (byte >> bits) & 1; @@ -957,7 +956,8 @@ xga_accel_read_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, int } else byte = mem_readb_phys(addr); - if (xga->accel.px_map_format[map] & 0x08) + xga_log("1. AccessMode=%02x, SRCMAP=%02x, DSTMAP=%02x, PAT=%02x.\n", xga->access_mode & 0x0f, (xga->accel.px_map_format[xga->accel.src_map] & 0x0f), (xga->accel.px_map_format[xga->accel.dst_map] & 0x0f), xga->accel.pat_src); + if ((xga->accel.px_map_format[xga->accel.src_map] & 0x08) && !(xga->access_mode & 0x08)) bits = (x & 7); else bits = 7 - (x & 7); @@ -1028,10 +1028,15 @@ xga_accel_write_map_pixel(svga_t *svga, int x, int y, int map, uint32_t base, ui } else byte = mem_readb_phys(addr); - if ((xga->accel.px_map_format[map] & 0x08) || (xga->accel.px_map_format[xga->accel.src_map] & 0x08)) - mask = 1 << (x & 7); - else + if (xga->access_mode & 0x08) mask = 1 << (7 - (x & 7)); + else { + if ((xga->accel.px_map_format[map] & 0x08) || (xga->accel.px_map_format[xga->accel.src_map] & 0x08)) { + xga_log("2. AccessMode=%02x, SRCMAP=%02x, DSTMAP=%02x, PAT=%02x.\n", xga->access_mode & 0x0f, (xga->accel.px_map_format[xga->accel.src_map] & 0x0f), (xga->accel.px_map_format[map] & 0x0f), xga->accel.pat_src); + mask = 1 << (x & 7); + } else + mask = 1 << (7 - (x & 7)); + } byte = (byte & ~mask) | ((pixel ? 0xff : 0) & mask); if (pixel & 1) { @@ -1115,11 +1120,11 @@ xga_short_stroke(svga_t *svga, uint8_t ssv) int dirx = 0; int diry = 0; - dx = xga->accel.dst_map_x & 0x1fff; + dx = xga->accel.dst_map_x; if (xga->accel.dst_map_x >= 0x1800) dx |= ~0x17ff; - dy = xga->accel.dst_map_y & 0x1fff; + dy = xga->accel.dst_map_y; if (xga->accel.dst_map_y >= 0x1800) dy |= ~0x17ff; @@ -1243,11 +1248,11 @@ xga_line_draw_write(svga_t *svga) cx = xga->accel.src_map_x & 0xfff; cy = xga->accel.src_map_y & 0xfff; - dx = xga->accel.dst_map_x & 0x1fff; + dx = xga->accel.dst_map_x; if (xga->accel.dst_map_x >= 0x1800) dx |= ~0x17ff; - dy = xga->accel.dst_map_y & 0x1fff; + dy = xga->accel.dst_map_y; if (xga->accel.dst_map_y >= 0x1800) dy |= ~0x17ff; @@ -1443,12 +1448,12 @@ xga_bitblt(svga_t *svga) xga->accel.sy = xga->accel.src_map_y & 0xfff; xga->accel.px = xga->accel.pat_map_x & 0xfff; xga->accel.py = xga->accel.pat_map_y & 0xfff; - dx = xga->accel.dst_map_x & 0x1fff; - dy = xga->accel.dst_map_y & 0x1fff; + dx = xga->accel.dst_map_x; + dy = xga->accel.dst_map_y; if (xga->accel.dst_map_x >= 0x1800) dx |= ~0x17ff; if (xga->accel.dst_map_y >= 0x1800) - dy -= 0x1800; + dy |= ~0x17ff; xga_log("D(%d,%d), SWH(%d,%d), BLT(%d,%d), dstwidth=%d.\n", dx, dy, xga->accel.x, xga->accel.y, srcwidth, srcheight, dstwidth); @@ -1524,7 +1529,7 @@ xga_bitblt(svga_t *svga) if (xga->accel.x < 0) { xga->accel.x = xga->accel.blt_width & 0xfff; - dx = xga->accel.dst_map_x & 0x1fff; + dx = xga->accel.dst_map_x; if (xga->accel.dst_map_x >= 0x1800) dx |= ~0x17ff; xga->accel.sx = xga->accel.src_map_x & 0xfff; @@ -1634,7 +1639,7 @@ xga_bitblt(svga_t *svga) xga->accel.y--; xga->accel.x = xga->accel.blt_width & 0xfff; - dx = xga->accel.dst_map_x & 0x1fff; + dx = xga->accel.dst_map_x; if (xga->accel.dst_map_x >= 0x1800) dx |= ~0x17ff; @@ -1699,7 +1704,7 @@ xga_bitblt(svga_t *svga) xga->accel.y--; xga->accel.x = xga->accel.blt_width & 0xfff; - dx = xga->accel.dst_map_x & 0x1fff; + dx = xga->accel.dst_map_x; if (xga->accel.dst_map_x >= 0x1800) dx |= ~0x17ff; @@ -3202,7 +3207,7 @@ xga_mca_write(int port, uint8_t val, void *priv) /* Save the MCA register value. */ xga->pos_regs[port & 7] = val; - if (!(xga->pos_regs[4] & 1) && (mem_size >= 15360)) /*MCA 4MB addressing on systems with more than 16MB of memory*/ + if (!(xga->pos_regs[4] & 1)) /*MCA 4MB addressing on systems with more than 16MB of memory*/ xga->pos_regs[4] |= 1; if (xga->pos_regs[2] & 1) { @@ -3396,7 +3401,7 @@ xga_pos_out(uint16_t addr, uint8_t val, void *priv) xga_log("104Write=%02x.\n", val); if ((xga->pos_idx & 3) == 0) { xga->pos_regs[4] = val; - if (!(xga->pos_regs[4] & 0x01) && (mem_size >= 15360)) /*4MB addressing on systems with more than 15MB of memory*/ + if (!(xga->pos_regs[4] & 0x01)) /*4MB addressing on systems with more than 15MB of memory*/ xga->pos_regs[4] |= 0x01; } break; From b0fd34749c6322fca3e52c2168e62e915fbc710d Mon Sep 17 00:00:00 2001 From: Nelson Kerber Hennemann Filho <87081197+nelsonhef@users.noreply.github.com> Date: Mon, 28 Oct 2024 08:33:13 -0300 Subject: [PATCH 510/624] Update pt-BR.po Fix some typos --- src/qt/languages/pt-BR.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 0cadad77c..81a9a5a65 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -79,7 +79,7 @@ msgid "Use target framerate:" msgstr "Usar taxa de quadros alvo:" msgid "VSync" -msgstr "VSync (sincronização virtual)" +msgstr "VSync (sincronização vertical)" msgid "Shaders" msgstr "Shaders" @@ -625,7 +625,7 @@ msgid "Cassette" msgstr "Cassete" msgid "Vision Systems LBA Enhancer" -msgstr "Aprimorador LBA Vision Sistems" +msgstr "Aprimorador LBA Vision Systems" msgid "Hard disks:" msgstr "Discos rígidos:" From f0e036811523bb588e96b80152b282d32e53219c Mon Sep 17 00:00:00 2001 From: altiereslima Date: Mon, 28 Oct 2024 15:30:55 -0300 Subject: [PATCH 511/624] Update pt-BR.po --- src/qt/languages/pt-BR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 81a9a5a65..9e6bb4016 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -625,7 +625,7 @@ msgid "Cassette" msgstr "Cassete" msgid "Vision Systems LBA Enhancer" -msgstr "Aprimorador LBA Vision Systems" +msgstr "Vision Systems LBA Enhancer" msgid "Hard disks:" msgstr "Discos rígidos:" From 4f472445f286e783b5f42aa9165de232960cda08 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Mon, 28 Oct 2024 22:14:58 +0100 Subject: [PATCH 512/624] Video and emulator GUI changes of the day (October 28th, 2024) IBM 8514/A (MCA/ISA). Added a configure button to the QT frontend for the amount of memory used by said add-on chips. XGA: Forgot a change about the 4mb aperture. --- src/include/86box/vid_8514a_device.h | 25 +++++++++++++++++++++++++ src/qt/qt_settingsdisplay.cpp | 20 ++++++++++++++++++++ src/qt/qt_settingsdisplay.hpp | 2 ++ src/qt/qt_settingsdisplay.ui | 7 +++++++ src/video/vid_8514a.c | 1 + src/video/vid_xga.c | 10 ++++------ 6 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 src/include/86box/vid_8514a_device.h diff --git a/src/include/86box/vid_8514a_device.h b/src/include/86box/vid_8514a_device.h new file mode 100644 index 000000000..b4102b17a --- /dev/null +++ b/src/include/86box/vid_8514a_device.h @@ -0,0 +1,25 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Emulation of the 8514/A card from IBM for the MCA bus and + * generic ISA bus clones without vendor extensions. + * + * + * + * Authors: TheCollector1995 + * + * Copyright 2024 TheCollector1995. + */ +#ifndef VIDEO_8514A_DEVICE_H +#define VIDEO_8514A_DEVICE_H + +#ifdef EMU_DEVICE_H +extern const device_t ibm8514_mca_device; +extern const device_t gen8514_isa_device; +#endif +#endif /*VIDEO_XGA_DEVICE_H*/ diff --git a/src/qt/qt_settingsdisplay.cpp b/src/qt/qt_settingsdisplay.cpp index db8c30e5d..50489ea61 100644 --- a/src/qt/qt_settingsdisplay.cpp +++ b/src/qt/qt_settingsdisplay.cpp @@ -24,6 +24,7 @@ extern "C" { #include <86box/device.h> #include <86box/machine.h> #include <86box/video.h> +#include <86box/vid_8514a_device.h> #include <86box/vid_xga_device.h> } @@ -53,6 +54,7 @@ SettingsDisplay::save() // TODO for (uint8_t i = 1; i < GFXCARD_MAX; i ++) gfxcard[i] = ui->comboBoxVideoSecondary->currentData().toInt(); + voodoo_enabled = ui->checkBoxVoodoo->isChecked() ? 1 : 0; ibm8514_standalone_enabled = ui->checkBox8514->isChecked() ? 1 : 0; xga_standalone_enabled = ui->checkBoxXga->isChecked() ? 1 : 0; @@ -127,6 +129,16 @@ SettingsDisplay::on_pushButtonConfigureVoodoo_clicked() DeviceConfig::ConfigureDevice(&voodoo_device, 0, qobject_cast(Settings::settings)); } +void +SettingsDisplay::on_pushButtonConfigure8514_clicked() +{ + if (machine_has_bus(machineId, MACHINE_BUS_MCA) > 0) { + DeviceConfig::ConfigureDevice(&ibm8514_mca_device, 0, qobject_cast(Settings::settings)); + } else { + DeviceConfig::ConfigureDevice(&gen8514_isa_device, 0, qobject_cast(Settings::settings)); + } +} + void SettingsDisplay::on_pushButtonConfigureXga_clicked() { @@ -166,6 +178,8 @@ SettingsDisplay::on_comboBoxVideo_currentIndexChanged(int index) ui->checkBox8514->setEnabled(machineSupports8514); ui->checkBox8514->setChecked(ibm8514_standalone_enabled && machineSupports8514); + ui->pushButtonConfigure8514->setEnabled(ui->checkBox8514->isEnabled() && ui->checkBox8514->isChecked()); + ui->checkBoxXga->setEnabled(machineSupportsXga); ui->checkBoxXga->setChecked(xga_standalone_enabled && machineSupportsXga); @@ -238,6 +252,12 @@ SettingsDisplay::on_checkBoxVoodoo_stateChanged(int state) ui->pushButtonConfigureVoodoo->setEnabled(state == Qt::Checked); } +void +SettingsDisplay::on_checkBox8514_stateChanged(int state) +{ + ui->pushButtonConfigure8514->setEnabled(state == Qt::Checked); +} + void SettingsDisplay::on_checkBoxXga_stateChanged(int state) { diff --git a/src/qt/qt_settingsdisplay.hpp b/src/qt/qt_settingsdisplay.hpp index 6297f7eae..3c28c52e0 100644 --- a/src/qt/qt_settingsdisplay.hpp +++ b/src/qt/qt_settingsdisplay.hpp @@ -29,9 +29,11 @@ private slots: private slots: void on_checkBoxVoodoo_stateChanged(int state); + void on_checkBox8514_stateChanged(int state); void on_checkBoxXga_stateChanged(int state); void on_comboBoxVideo_currentIndexChanged(int index); void on_pushButtonConfigureVoodoo_clicked(); + void on_pushButtonConfigure8514_clicked(); void on_pushButtonConfigureXga_clicked(); void on_pushButtonConfigure_clicked(); diff --git a/src/qt/qt_settingsdisplay.ui b/src/qt/qt_settingsdisplay.ui index a9b7e6e2c..f6bbeeae0 100644 --- a/src/qt/qt_settingsdisplay.ui +++ b/src/qt/qt_settingsdisplay.ui @@ -106,6 +106,13 @@ + + + + Configure + + + diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 6d7aa6b94..accedd131 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -35,6 +35,7 @@ #include <86box/thread.h> #include <86box/video.h> #include <86box/vid_8514a.h> +#include <86box/vid_8514a_device.h> #include <86box/vid_xga.h> #include <86box/vid_svga.h> #include <86box/vid_svga_render.h> diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index f126ba9bd..bd18beae2 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -3487,15 +3487,13 @@ xga_init(const device_t *info) xga->rom_addr = 0xc0000 + (((xga->pos_regs[2] & 0xf0) >> 4) * 0x2000); xga->instance = (xga->pos_regs[2] & 0x0e) >> 1; xga->pos_regs[2] |= 0x01; - if (mem_size >= 15360) { - xga->pos_regs[4] |= 0x01; + xga->pos_regs[4] |= 0x01; + if (mem_size >= 15360) xga->pos_regs[5] = 0; - } else { + else { xga->pos_regs[5] = ((mem_size * 64) >> 0x10) + 1; - if (xga->pos_regs[5] == 0x10) { + if (xga->pos_regs[5] == 0x10) xga->pos_regs[5] = 0x00; - xga->pos_regs[4] |= 0x01; - } } xga->base_addr_1mb = (xga->pos_regs[5] & 0x0f) << 20; xga->linear_base = ((xga->pos_regs[4] & 0xfe) * 0x1000000) + (xga->instance << 22); From 451ece0074272093800d92c48addf8545a704d67 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Mon, 28 Oct 2024 19:57:26 -0300 Subject: [PATCH 513/624] scsi_cdrom: Fix reporting of read errors on ATAPI drives --- src/scsi/scsi_cdrom.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/scsi/scsi_cdrom.c b/src/scsi/scsi_cdrom.c index 358901847..103ce3161 100644 --- a/src/scsi/scsi_cdrom.c +++ b/src/scsi/scsi_cdrom.c @@ -1416,7 +1416,7 @@ scsi_cdrom_read_blocks(scsi_cdrom_t *dev, int32_t *len, int first_batch, int ven scsi_cdrom_log("Read %i bytes of blocks...\n", *len); if (ret == -1) - return 0; + return ret; else if (!ret || (!first_batch && (dev->old_len != *len))) { if (!first_batch && (dev->old_len != *len)) scsi_cdrom_illegal_mode(dev); @@ -2219,7 +2219,7 @@ begin: if (ret <= 0) { scsi_cdrom_set_phase(dev, SCSI_PHASE_STATUS); - dev->packet_status = PHASE_COMPLETE; + dev->packet_status = (ret < 0) ? PHASE_ERROR : PHASE_COMPLETE; dev->callback = 20.0 * CDROM_TIME; scsi_cdrom_set_callback(dev); scsi_cdrom_buf_free(dev); From 36e42af7b25151b188f9e47a5657d35c740f0bd2 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 29 Oct 2024 01:16:21 +0100 Subject: [PATCH 514/624] S3 bank update (October 29th, 2024) 1. Simplified 4bpp rendering mode. 2. Implement CRTC31 bit 0 functionality which enables/disables the vendor banks. Fixes Diamond Stealth 64 964 VRAM (VLB/PCI) detection on NT 3.1 (and possibly other cards) while keeping NT 3.1 347.1's full screen Command Prompt test normal without garbage using the 911/924 chips. --- src/video/vid_s3.c | 46 ++++++++++++++++------------------------------ 1 file changed, 16 insertions(+), 30 deletions(-) diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index c91eab589..295c65bd4 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -3218,7 +3218,7 @@ s3_decode_addr(svga_t *svga, uint32_t addr, int write) { int memory_map_mode = (svga->gdcreg[6] >> 2) & 3; - s3_log("CRTC31 bit 3=%x, map=%x, write=%x, wrtbank=%x, chain4=%x.\n", svga->crtc[0x31] & 0x08, memory_map_mode, write, svga->write_bank, svga->chain4); + s3_log("CRTC31 bit 3=%x, map=%x, write=%x, wrtbank=%x, chain4=%x, vrammask=%08x.\n", svga->crtc[0x31] & 0x08, memory_map_mode, write, svga->write_bank, svga->chain4, svga->vram_display_mask); if (svga->crtc[0x31] & 0x08) memory_map_mode = 1; @@ -4295,36 +4295,20 @@ s3_recalctimings(svga_t *svga) } svga->vram_display_mask = s3->vram_mask; } else { - if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { - if ((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1)) { - if (svga->crtc[0x31] & 0x08) { - if (svga->bpp == 8) { - if (!(svga->crtc[0x5e] & 0x04)) - svga->vblankstart = svga->dispend; /*Applies only to Enhanced modes*/ + if (svga->crtc[0x31] & 0x08) { + if (!(svga->crtc[0x5e] & 0x04)) + svga->vblankstart = svga->dispend; /*Applies only to Enhanced modes*/ - /*Enhanced 4bpp mode, just like the 8bpp mode per the spec. */ - svga->render = svga_render_8bpp_highres; - svga->rowoffset <<= 1; - svga->vram_display_mask = s3->vram_mask; - } else { - svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; - svga->write_bank = 0; - svga->read_bank = svga->write_bank; - } - } else { - svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; - svga->write_bank = 0; - svga->read_bank = svga->write_bank; - } - } else { - svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; - svga->write_bank = 0; - svga->read_bank = svga->write_bank; - } + /*Enhanced 4bpp mode, just like the 8bpp mode per the spec. */ + svga->render = svga_render_8bpp_highres; + svga->rowoffset <<= 1; + svga->vram_display_mask = s3->vram_mask; } else { svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; - svga->write_bank = 0; - svga->read_bank = svga->write_bank; + if (!(svga->crtc[0x31] & 0x01)) { /*Bank Enable bit*/ + svga->write_bank = 0; + svga->read_bank = 0; + } } } @@ -4466,8 +4450,10 @@ s3_trio64v_recalctimings(svga_t *svga) svga->vram_display_mask = s3->vram_mask; } else { svga->vram_display_mask = (svga->crtc[0x32] & 0x40) ? 0x3ffff : s3->vram_mask; - svga->write_bank = 0; - svga->read_bank = svga->write_bank; + if (!(svga->crtc[0x31] & 0x01)) { /*Bank Enable bit*/ + svga->write_bank = 0; + svga->read_bank = 0; + } } } else /*Streams mode*/ { From 416125390bf8af07500dc5a98eb4a11ff6864cab Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 11:41:59 -0300 Subject: [PATCH 515/624] hdd_image: Add framework for reporting I/O errors, and stop removing drives with locked images --- src/disk/hdd_image.c | 59 ++++++++++++++++++++++++++++------------- src/include/86box/hdd.h | 8 +++--- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 7c2618969..8b0949c9b 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -184,6 +184,9 @@ hdd_image_calc_chs(uint32_t *c, uint32_t *h, uint32_t *s, uint32_t size) static int prepare_new_hard_disk(uint8_t id, uint64_t full_size) { + if (!hdd_images[id].file) + return -1; + uint64_t target_size = (full_size + hdd_images[id].base) - ftello64(hdd_images[id].file); #ifndef __unix__ @@ -390,7 +393,8 @@ retry_vhd: } else { /* Failed for another reason */ hdd_image_log("Failed for another reason\n"); - return 0; + hdd_images[id].type = HDD_IMAGE_RAW; + return 1; } } else { if (image_is_hdi(fn)) { @@ -500,7 +504,7 @@ retry_vhd: return ret; } -void +int hdd_image_seek(uint8_t id, uint32_t sector) { off64_t addr = sector; @@ -508,12 +512,16 @@ hdd_image_seek(uint8_t id, uint32_t sector) hdd_images[id].pos = sector; if (hdd_images[id].type != HDD_IMAGE_VHD) { - if (fseeko64(hdd_images[id].file, addr + hdd_images[id].base, SEEK_SET) == -1) - fatal("hdd_image_seek(): Error seeking\n"); + if (!hdd_images[id].file || (fseeko64(hdd_images[id].file, addr + hdd_images[id].base, SEEK_SET) == -1)) { + hdd_image_log("hdd_image_seek(): Error seeking\n"); + return -1; + } } + + return 0; } -void +int hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) { int non_transferred_sectors; @@ -523,14 +531,18 @@ hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) non_transferred_sectors = mvhd_read_sectors(hdd_images[id].vhd, sector, count, buffer); hdd_images[id].pos = sector + count - non_transferred_sectors - 1; } else { - if (fseeko64(hdd_images[id].file, ((uint64_t) (sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1) { - fatal("Hard disk image %i: Read error during seek\n", id); - return; + if (!hdd_images[id].file || (fseeko64(hdd_images[id].file, ((uint64_t) (sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1)) { + hdd_image_log("Hard disk image %i: Read error during seek\n", id); + return -1; } num_read = fread(buffer, 512, count, hdd_images[id].file); + if (count && !num_read) + return -1; hdd_images[id].pos = sector + num_read; } + + return 0; } uint32_t @@ -554,14 +566,15 @@ hdd_image_read_ex(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) if ((sectors - sector) < transfer_sectors) transfer_sectors = sectors - sector; - hdd_image_read(id, sector, transfer_sectors, buffer); + if (hdd_image_read(id, sector, transfer_sectors, buffer) < 0) + return -1; if (count != transfer_sectors) return 1; return 0; } -void +int hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) { int non_transferred_sectors; @@ -571,15 +584,19 @@ hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) non_transferred_sectors = mvhd_write_sectors(hdd_images[id].vhd, sector, count, buffer); hdd_images[id].pos = sector + count - non_transferred_sectors - 1; } else { - if (fseeko64(hdd_images[id].file, ((uint64_t) (sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1) { - fatal("Hard disk image %i: Write error during seek\n", id); - return; + if (!hdd_images[id].file || (fseeko64(hdd_images[id].file, ((uint64_t) (sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1)) { + hdd_image_log("Hard disk image %i: Write error during seek\n", id); + return -1; } num_write = fwrite(buffer, 512, count, hdd_images[id].file); + if (count && !num_write) + return -1; fflush(hdd_images[id].file); hdd_images[id].pos = sector + num_write; } + + return 0; } int @@ -591,14 +608,15 @@ hdd_image_write_ex(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) if ((sectors - sector) < transfer_sectors) transfer_sectors = sectors - sector; - hdd_image_write(id, sector, transfer_sectors, buffer); + if (hdd_image_write(id, sector, transfer_sectors, buffer) < 0) + return -1; if (count != transfer_sectors) return 1; return 0; } -void +int hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count) { if (hdd_images[id].type == HDD_IMAGE_VHD) { @@ -607,9 +625,9 @@ hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count) } else { memset(empty_sector, 0, 512); - if (fseeko64(hdd_images[id].file, ((uint64_t) (sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1) { - fatal("Hard disk image %i: Zero error during seek\n", id); - return; + if (!hdd_images[id].file || (fseeko64(hdd_images[id].file, ((uint64_t) (sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1)) { + hdd_image_log("Hard disk image %i: Zero error during seek\n", id); + return -1; } for (uint32_t i = 0; i < count; i++) { @@ -617,11 +635,14 @@ hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count) break; hdd_images[id].pos = sector + i; - fwrite(empty_sector, 512, 1, hdd_images[id].file); + if (!fwrite(empty_sector, 512, 1, hdd_images[id].file)) + return -1; } fflush(hdd_images[id].file); } + + return 0; } int diff --git a/src/include/86box/hdd.h b/src/include/86box/hdd.h index 89a6cf1ff..25c32355e 100644 --- a/src/include/86box/hdd.h +++ b/src/include/86box/hdd.h @@ -197,12 +197,12 @@ extern int hdd_is_valid(int c); extern void hdd_image_init(void); extern int hdd_image_load(int id); -extern void hdd_image_seek(uint8_t id, uint32_t sector); -extern void hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer); +extern int hdd_image_seek(uint8_t id, uint32_t sector); +extern int hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer); extern int hdd_image_read_ex(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer); -extern void hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer); +extern int hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer); extern int hdd_image_write_ex(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer); -extern void hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count); +extern int hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count); extern int hdd_image_zero_ex(uint8_t id, uint32_t sector, uint32_t count); extern uint32_t hdd_image_get_last_sector(uint8_t id); extern uint32_t hdd_image_get_pos(uint8_t id); From d5b0ba9511eb0d03429178fc3537bcd113f3f9bb Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 11:47:47 -0300 Subject: [PATCH 516/624] hdc_ide: Report image read/write errors --- src/disk/hdc_ide.c | 46 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 1ec054de9..660093a8e 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -2214,8 +2214,10 @@ ide_callback(void *priv) if (ide->do_initial_read) { ide->do_initial_read = 0; ide->sector_pos = 0; - hdd_image_read(ide->hdd_num, ide_get_sector(ide), - ide->tf->secount ? ide->tf->secount : 256, ide->sector_buffer); + ret = hdd_image_read(ide->hdd_num, ide_get_sector(ide), + ide->tf->secount ? ide->tf->secount : 256, ide->sector_buffer); + } else { + ret = 0; } memcpy(ide->buffer, &ide->sector_buffer[ide->sector_pos * 512], 512); @@ -2224,6 +2226,10 @@ ide_callback(void *priv) ide->tf->pos = 0; ide->tf->atastat = DRQ_STAT | DRDY_STAT | DSC_STAT; + if (ret < 0) { + ide_log("IDE %i: Read aborted (image read error)\n", ide->channel); + err = UNC_ERR; + } ide_irq_raise(ide); @@ -2245,11 +2251,13 @@ ide_callback(void *priv) ide->sector_pos = ide->tf->secount; else ide->sector_pos = 256; - hdd_image_read(ide->hdd_num, ide_get_sector(ide), ide->sector_pos, ide->sector_buffer); ide->tf->pos = 0; - if (!ide_boards[ide->board]->force_ata3 && bm->dma) { + if (hdd_image_read(ide->hdd_num, ide_get_sector(ide), ide->sector_pos, ide->sector_buffer) < 0) { + ide_log("IDE %i: DMA read aborted (image read error)\n", ide->channel); + err = UNC_ERR; + } else if (!ide_boards[ide->board]->force_ata3 && bm->dma) { /* We should not abort - we should simply wait for the host to start DMA. */ ret = bm->dma(ide->sector_buffer, ide->sector_pos * 512, 0, bm->priv); if (ret == 2) { @@ -2292,8 +2300,10 @@ ide_callback(void *priv) if (ide->do_initial_read) { ide->do_initial_read = 0; ide->sector_pos = 0; - hdd_image_read(ide->hdd_num, ide_get_sector(ide), - ide->tf->secount ? ide->tf->secount : 256, ide->sector_buffer); + ret = hdd_image_read(ide->hdd_num, ide_get_sector(ide), + ide->tf->secount ? ide->tf->secount : 256, ide->sector_buffer); + } else { + ret = 0; } memcpy(ide->buffer, &ide->sector_buffer[ide->sector_pos * 512], 512); @@ -2302,6 +2312,10 @@ ide_callback(void *priv) ide->tf->pos = 0; ide->tf->atastat = DRQ_STAT | DRDY_STAT | DSC_STAT; + if (ret < 0) { + ide_log("IDE %i: Read aborted (image read error)\n", ide->channel); + err = UNC_ERR; + } if (!ide->blockcount) ide_irq_raise(ide); ide->blockcount++; @@ -2320,7 +2334,7 @@ ide_callback(void *priv) else if (!ide->tf->lba && (ide->cfg_spt == 0)) err = IDNF_ERR; else { - hdd_image_write(ide->hdd_num, ide_get_sector(ide), 1, (uint8_t *) ide->buffer); + ret = hdd_image_write(ide->hdd_num, ide_get_sector(ide), 1, (uint8_t *) ide->buffer); ide_irq_raise(ide); ide->tf->secount--; if (ide->tf->secount) { @@ -2332,6 +2346,8 @@ ide_callback(void *priv) ide->tf->atastat = DRDY_STAT | DSC_STAT; ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus, 0); } + if (ret < 0) + err = UNC_ERR; } ide_log("Write: %02X, %i, %08X, %" PRIi64 "\n", err, ide->hdd_num, ide->lba_addr, sector); break; @@ -2360,12 +2376,14 @@ ide_callback(void *priv) return; } else if (ret == 1) { /* DMA successful */ - ide_log("IDE %i: DMA write successful\n", ide->channel); + ret = hdd_image_write(ide->hdd_num, ide_get_sector(ide), + ide->sector_pos, ide->sector_buffer); - hdd_image_write(ide->hdd_num, ide_get_sector(ide), - ide->sector_pos, ide->sector_buffer); + ide_log("IDE %i: DMA write %ssuccessful\n", ide->channel, (ret < 0) ? "un" : ""); ide->tf->atastat = DRDY_STAT | DSC_STAT; + if (ret < 0) + err = UNC_ERR; ide_irq_raise(ide); ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus, 0); @@ -2393,7 +2411,7 @@ ide_callback(void *priv) else if (!ide->tf->lba && (ide->cfg_spt == 0)) err = IDNF_ERR; else { - hdd_image_write(ide->hdd_num, ide_get_sector(ide), 1, (uint8_t *) ide->buffer); + ret = hdd_image_write(ide->hdd_num, ide_get_sector(ide), 1, (uint8_t *) ide->buffer); ide->blockcount++; if (ide->blockcount >= ide->blocksize || ide->tf->secount == 1) { ide->blockcount = 0; @@ -2408,6 +2426,8 @@ ide_callback(void *priv) ide->tf->atastat = DRDY_STAT | DSC_STAT; ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus, 0); } + if (ret < 0) + err = UNC_ERR; } break; @@ -2431,9 +2451,11 @@ ide_callback(void *priv) else if (!ide->tf->lba && (ide->cfg_spt == 0)) err = IDNF_ERR; else { - hdd_image_zero(ide->hdd_num, ide_get_sector_format(ide), ide->tf->secount); + ret = hdd_image_zero(ide->hdd_num, ide_get_sector_format(ide), ide->tf->secount); ide->tf->atastat = DRDY_STAT | DSC_STAT; + if (ret < 0) + err = UNC_ERR; ide_irq_raise(ide); ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus, 1); From 94e5fded317e8e4a4386627cb7726d0eef698e82 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 12:12:01 -0300 Subject: [PATCH 517/624] hdd_image: Populate last sector for failed images --- src/disk/hdd_image.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 8b0949c9b..2b463a23c 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -393,7 +393,8 @@ retry_vhd: } else { /* Failed for another reason */ hdd_image_log("Failed for another reason\n"); - hdd_images[id].type = HDD_IMAGE_RAW; + hdd_images[id].type = HDD_IMAGE_RAW; + hdd_images[id].last_sector = (uint32_t) (((uint64_t) hdd[id].spt) * ((uint64_t) hdd[id].hpc) * ((uint64_t) hdd[id].tracks)) - 1; return 1; } } else { From 7b786a98fa9c0dfc1f573d615898cf8504ebbe3c Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 12:13:04 -0300 Subject: [PATCH 518/624] scsi_disk: Report image read/write errors --- src/include/86box/scsi_device.h | 1 + src/scsi/scsi_disk.c | 38 +++++++++++++++++++++++++++------ 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/include/86box/scsi_device.h b/src/include/86box/scsi_device.h index abcd415f4..e69d3cc93 100644 --- a/src/include/86box/scsi_device.h +++ b/src/include/86box/scsi_device.h @@ -197,6 +197,7 @@ #define ASC_NONE 0x00 #define ASC_AUDIO_PLAY_OPERATION 0x00 #define ASC_NOT_READY 0x04 +#define ASC_WRITE_ERROR 0x0c #define ASC_UNRECOVERED_READ_ERROR 0x11 #define ASC_ILLEGAL_OPCODE 0x20 #define ASC_LBA_OUT_OF_RANGE 0x21 diff --git a/src/scsi/scsi_disk.c b/src/scsi/scsi_disk.c index 792dad31b..10fdf04a6 100644 --- a/src/scsi/scsi_disk.c +++ b/src/scsi/scsi_disk.c @@ -647,6 +647,24 @@ scsi_disk_bus_master_error(scsi_common_t *sc) scsi_disk_cmd_error(dev); } +static void +scsi_disk_write_error(scsi_disk_t *dev) +{ + scsi_disk_sense_key = SENSE_MEDIUM_ERROR; + scsi_disk_asc = ASC_WRITE_ERROR; + scsi_disk_ascq = 0; + scsi_disk_cmd_error(dev); +} + +static void +scsi_disk_read_error(scsi_disk_t *dev) +{ + scsi_disk_sense_key = SENSE_MEDIUM_ERROR; + scsi_disk_asc = ASC_UNRECOVERED_READ_ERROR; + scsi_disk_ascq = 0; + scsi_disk_cmd_error(dev); +} + static void scsi_disk_invalid_lun(scsi_disk_t *dev) { @@ -727,10 +745,17 @@ scsi_disk_blocks(scsi_disk_t *dev, int32_t *len, UNUSED(int first_batch), int ou *len = dev->requested_blocks << 9; for (int i = 0; i < dev->requested_blocks; i++) { - if (out) - hdd_image_write(dev->id, dev->sector_pos + i, 1, dev->temp_buffer + (i << 9)); - else - hdd_image_read(dev->id, dev->sector_pos + i, 1, dev->temp_buffer + (i << 9)); + if (out) { + if (hdd_image_write(dev->id, dev->sector_pos + i, 1, dev->temp_buffer + (i << 9)) < 0) { + scsi_disk_write_error(dev); + return -1; + } + } else { + if (hdd_image_read(dev->id, dev->sector_pos + i, 1, dev->temp_buffer + (i << 9)) < 0) { + scsi_disk_read_error(dev); + return -1; + } + } } scsi_disk_log("%s %i bytes of blocks...\n", out ? "Written" : "Read", *len); @@ -1040,7 +1065,7 @@ scsi_disk_command(scsi_common_t *sc, uint8_t *cdb) ret = scsi_disk_blocks(dev, &alloc_length, 1, 0); if (ret <= 0) { scsi_disk_set_phase(dev, SCSI_PHASE_STATUS); - dev->packet_status = PHASE_COMPLETE; + dev->packet_status = (ret < 0) ? PHASE_ERROR : PHASE_COMPLETE; dev->callback = 20.0 * SCSI_TIME; scsi_disk_set_callback(dev); scsi_disk_buf_free(dev); @@ -1501,7 +1526,8 @@ scsi_disk_phase_data_out(scsi_common_t *sc) dev->temp_buffer[6] = (s >> 8) & 0xff; dev->temp_buffer[7] = s & 0xff; } - hdd_image_write(dev->id, i, 1, dev->temp_buffer); + if (hdd_image_write(dev->id, i, 1, dev->temp_buffer) < 0) + scsi_disk_write_error(dev); } break; case GPCMD_MODE_SELECT_6: From df945636863142f2eb7d4f08e14e82c76d13f1d3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 12:39:35 -0300 Subject: [PATCH 519/624] hdc_esdi_at: Report image read/write errors --- src/disk/hdc_esdi_at.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/src/disk/hdc_esdi_at.c b/src/disk/hdc_esdi_at.c index e16d4d729..c08ec636a 100644 --- a/src/disk/hdc_esdi_at.c +++ b/src/disk/hdc_esdi_at.c @@ -606,12 +606,16 @@ esdi_callback(void *priv) } else { if (get_sector(esdi, &addr)) { esdi->error = ERR_ID_NOT_FOUND; +read_error: esdi->status = STAT_READY | STAT_DSC | STAT_ERR; irq_raise(esdi); break; } - hdd_image_read(drive->hdd_num, addr, 1, (uint8_t *) esdi->buffer); + if (hdd_image_read(drive->hdd_num, addr, 1, (uint8_t *) esdi->buffer) < 0) { + esdi->error = ERR_BAD_BLOCK; + goto read_error; + } esdi->pos = 0; esdi->status = STAT_DRQ | STAT_READY | STAT_DSC; irq_raise(esdi); @@ -628,13 +632,17 @@ esdi_callback(void *priv) } else { if (get_sector(esdi, &addr)) { esdi->error = ERR_ID_NOT_FOUND; +write_error: esdi->status = STAT_READY | STAT_DSC | STAT_ERR; irq_raise(esdi); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); break; } - hdd_image_write(drive->hdd_num, addr, 1, (uint8_t *) esdi->buffer); + if (hdd_image_write(drive->hdd_num, addr, 1, (uint8_t *) esdi->buffer) < 0) { + esdi->error = ERR_BAD_BLOCK; + goto write_error; + } irq_raise(esdi); esdi->secount = (esdi->secount - 1) & 0xff; if (esdi->secount) { @@ -659,13 +667,17 @@ esdi_callback(void *priv) } else { if (get_sector(esdi, &addr)) { esdi->error = ERR_ID_NOT_FOUND; +verify_error: esdi->status = STAT_READY | STAT_DSC | STAT_ERR; irq_raise(esdi); ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); break; } - hdd_image_read(drive->hdd_num, addr, 1, (uint8_t *) esdi->buffer); + if (hdd_image_read(drive->hdd_num, addr, 1, (uint8_t *) esdi->buffer) < 0) { + esdi->error = ERR_BAD_BLOCK; + goto verify_error; + } ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 1); next_sector(esdi); esdi->secount = (esdi->secount - 1) & 0xff; @@ -692,12 +704,16 @@ esdi_callback(void *priv) } else { if (get_sector_format(esdi, &addr)) { esdi->error = ERR_ID_NOT_FOUND; +format_error: esdi->status = STAT_READY | STAT_DSC | STAT_ERR; irq_raise(esdi); break; } - hdd_image_zero(drive->hdd_num, addr, esdi->secount); + if (hdd_image_zero(drive->hdd_num, addr, esdi->secount) < 0) { + esdi->error = ERR_BAD_BLOCK; + goto format_error; + } esdi->status = STAT_READY | STAT_DSC; irq_raise(esdi); } From ed0c571a8e1798a531b5847b9d2c0592dd51f22a Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 12:42:59 -0300 Subject: [PATCH 520/624] hdc_esdi_mca: Report image read/write errors --- src/disk/hdc_esdi_mca.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index 1061cbc78..c63c80721 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -327,6 +327,27 @@ rba_out_of_range(esdi_t *dev) ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); } +static void +defective_block(esdi_t *dev) +{ + dev->status_len = 9; + dev->status_data[0] = dev->command | STATUS_LEN(9) | dev->cmd_dev; + dev->status_data[1] = 0x0e01; /*Command block error, invalid parameter*/ + dev->status_data[2] = 0x0009; /*Defective block*/ + dev->status_data[3] = 0; + dev->status_data[4] = 0; + dev->status_data[5] = 0; + dev->status_data[6] = 0; + dev->status_data[7] = 0; + dev->status_data[8] = 0; + + dev->status = STATUS_IRQ | STATUS_STATUS_OUT_FULL; + dev->irq_status = dev->cmd_dev | IRQ_CMD_COMPLETE_FAILURE; + dev->irq_in_progress = 1; + set_irq(dev); + ui_sb_update_icon(SB_HDD | HDD_BUS_ESDI, 0); +} + static void complete_command_status(esdi_t *dev) { @@ -423,7 +444,10 @@ esdi_callback(void *priv) if (!dev->data_pos) { if (dev->rba >= drive->sectors) fatal("Read past end of drive\n"); - hdd_image_read(drive->hdd_num, dev->rba, 1, (uint8_t *) dev->data); + if (hdd_image_read(drive->hdd_num, dev->rba, 1, (uint8_t *) dev->data) < 0) { + defective_block(dev); + return; + } cmd_time += hdd_timing_read(&hdd[drive->hdd_num], dev->rba, 1); cmd_time += esdi_mca_get_xfer_time(dev, 1); } @@ -512,7 +536,10 @@ esdi_callback(void *priv) if (dev->rba >= drive->sectors) fatal("Write past end of drive\n"); - hdd_image_write(drive->hdd_num, dev->rba, 1, (uint8_t *) dev->data); + if (hdd_image_write(drive->hdd_num, dev->rba, 1, (uint8_t *) dev->data) < 0) { + defective_block(dev); + return; + } cmd_time += hdd_timing_write(&hdd[drive->hdd_num], dev->rba, 1); cmd_time += esdi_mca_get_xfer_time(dev, 1); dev->rba++; From 5734fd9a556ff8c400ebe5b8c1da99e4e64e6bad Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 12:49:21 -0300 Subject: [PATCH 521/624] hdc_st506: Report image read/write errors --- src/disk/hdc_st506_at.c | 12 ++++++++++-- src/disk/hdc_st506_xt.c | 32 ++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/disk/hdc_st506_at.c b/src/disk/hdc_st506_at.c index d5bbf24d0..9e5b82336 100644 --- a/src/disk/hdc_st506_at.c +++ b/src/disk/hdc_st506_at.c @@ -585,12 +585,16 @@ do_callback(void *priv) do_seek(mfm); if (get_sector(mfm, &addr)) { mfm->error = ERR_ID_NOT_FOUND; +read_error: mfm->status = STAT_READY | STAT_DSC | STAT_ERR; irq_raise(mfm); break; } - hdd_image_read(drive->hdd_num, addr, 1, (uint8_t *) mfm->buffer); + if (hdd_image_read(drive->hdd_num, addr, 1, (uint8_t *) mfm->buffer) < 0) { + mfm->error = ERR_BAD_BLOCK; + goto read_error; + } mfm->pos = 0; mfm->status = STAT_DRQ | STAT_READY | STAT_DSC; @@ -604,12 +608,16 @@ do_callback(void *priv) do_seek(mfm); if (get_sector(mfm, &addr)) { mfm->error = ERR_ID_NOT_FOUND; +write_error: mfm->status = STAT_READY | STAT_DSC | STAT_ERR; irq_raise(mfm); break; } - hdd_image_write(drive->hdd_num, addr, 1, (uint8_t *) mfm->buffer); + if (hdd_image_write(drive->hdd_num, addr, 1, (uint8_t *) mfm->buffer) < 0) { + mfm->error = ERR_BAD_BLOCK; + goto write_error; + } irq_raise(mfm); mfm->secount = (mfm->secount - 1) & 0xff; diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index 47e6f045a..b78466c3b 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -715,6 +715,7 @@ st506_callback(void *priv) dev->head, dev->sector, dev->count); if (!get_sector(dev, drive, &addr)) { +read_error_start: st506_error(dev, dev->error); st506_complete(dev); return; @@ -722,8 +723,11 @@ st506_callback(void *priv) ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); /* Read data from the image. */ - hdd_image_read(drive->hdd_num, addr, 1, - (uint8_t *) dev->buff); + if (hdd_image_read(drive->hdd_num, addr, 1, + (uint8_t *) dev->buff) < 0) { + dev->error = ERR_UNC_ERR; + goto read_error_start; + } /* Set up the data transfer. */ dev->buff_pos = 0; @@ -765,6 +769,7 @@ st506_callback(void *priv) next_sector(dev, drive); if (!get_sector(dev, drive, &addr)) { +read_error_sent: ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); st506_error(dev, dev->error); st506_complete(dev); @@ -772,8 +777,11 @@ st506_callback(void *priv) } /* Read data from the image. */ - hdd_image_read(drive->hdd_num, addr, 1, - (uint8_t *) dev->buff); + if (hdd_image_read(drive->hdd_num, addr, 1, + (uint8_t *) dev->buff) < 0) { + dev->error = ERR_UNC_ERR; + goto read_error_sent; + } /* Set up the data transfer. */ dev->buff_pos = 0; @@ -856,6 +864,7 @@ st506_callback(void *priv) case STATE_RECEIVED_DATA: if (!get_sector(dev, drive, &addr)) { +write_error: ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); st506_error(dev, dev->error); st506_complete(dev); @@ -863,8 +872,11 @@ st506_callback(void *priv) } /* Write data to image. */ - hdd_image_write(drive->hdd_num, addr, 1, - (uint8_t *) dev->buff); + if (hdd_image_write(drive->hdd_num, addr, 1, + (uint8_t *) dev->buff) < 0) { + dev->error = ERR_UNC_ERR; + goto write_error; + } if (--dev->count == 0) { ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); @@ -1156,8 +1168,12 @@ st506_callback(void *priv) ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 1); /* Write data to image. */ - hdd_image_write(drive->hdd_num, addr, 1, - (uint8_t *) dev->buff); + if (hdd_image_write(drive->hdd_num, addr, 1, + (uint8_t *) dev->buff) < 0) { + st506_error(dev, ERR_UNC_ERR); + st506_complete(dev); + return; + } if (--dev->count == 0) { ui_sb_update_icon(SB_HDD | HDD_BUS_MFM, 0); From e95b0d1e012fec04f7883eed76b237783eacaf49 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 12:53:54 -0300 Subject: [PATCH 522/624] hdc_xta: Report image read/write errors --- src/disk/hdc_xta.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/disk/hdc_xta.c b/src/disk/hdc_xta.c index ede21caf2..a4ef45c43 100644 --- a/src/disk/hdc_xta.c +++ b/src/disk/hdc_xta.c @@ -408,8 +408,9 @@ do_fmt: break; /* Write the block to the image. */ - hdd_image_write(drive->hdd_num, addr, 1, - (uint8_t *) dev->sector_buf); + if (hdd_image_write(drive->hdd_num, addr, 1, + (uint8_t *) dev->sector_buf) < 0) + dev->sense = ERR_BADTRK; } } @@ -522,6 +523,7 @@ hdc_callback(void *priv) do_send: /* Get address of sector to load. */ if (get_sector(dev, drive, &addr)) { +read_error: /* De-activate the status icon. */ ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); dev->comp |= COMP_ERR; @@ -530,8 +532,11 @@ do_send: } /* Read the block from the image. */ - hdd_image_read(drive->hdd_num, addr, 1, - (uint8_t *) dev->sector_buf); + if (hdd_image_read(drive->hdd_num, addr, 1, + (uint8_t *) dev->sector_buf) < 0) { + dev->sense = ERR_BADTRK; + goto read_error; + } /* Ready to transfer the data out. */ dev->state = STATE_SDATA; @@ -673,6 +678,7 @@ do_recv: /* Get address of sector to write. */ if (get_sector(dev, drive, &addr)) { +write_error: /* De-activate the status icon. */ ui_sb_update_icon(SB_HDD | HDD_BUS_XTA, 0); @@ -682,8 +688,11 @@ do_recv: } /* Write the block to the image. */ - hdd_image_write(drive->hdd_num, addr, 1, - (uint8_t *) dev->sector_buf); + if (hdd_image_write(drive->hdd_num, addr, 1, + (uint8_t *) dev->sector_buf) < 0) { + dev->sense = ERR_BADTRK; + goto write_error; + } dev->buf_idx = 0; if (--dev->count == 0) { From b155c50e96cf76af7857f5834ef1d7891fc0041d Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 13:57:21 -0300 Subject: [PATCH 523/624] zip/mo: Report image read/write errors --- src/disk/mo.c | 45 +++++++++++++++++++++++++++++++++++++-------- src/disk/zip.c | 45 +++++++++++++++++++++++++++++++++++++-------- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/src/disk/mo.c b/src/disk/mo.c index ed1ab2472..5f757c8af 100644 --- a/src/disk/mo.c +++ b/src/disk/mo.c @@ -874,6 +874,24 @@ mo_write_protected(mo_t *dev) mo_cmd_error(dev); } +static void +mo_write_error(mo_t *dev) +{ + mo_sense_key = SENSE_MEDIUM_ERROR; + mo_asc = ASC_WRITE_ERROR; + mo_ascq = 0; + mo_cmd_error(dev); +} + +static void +mo_read_error(mo_t *dev) +{ + mo_sense_key = SENSE_MEDIUM_ERROR; + mo_asc = ASC_UNRECOVERED_READ_ERROR; + mo_ascq = 0; + mo_cmd_error(dev); +} + static void mo_invalid_lun(mo_t *dev) { @@ -928,7 +946,7 @@ mo_blocks(mo_t *dev, int32_t *len, UNUSED(int first_batch), int out) if (!dev->sector_len) { mo_command_complete(dev); - return -1; + return 0; } mo_log("%sing %i blocks starting from %i...\n", out ? "Writ" : "Read", dev->requested_blocks, dev->sector_pos); @@ -942,20 +960,31 @@ mo_blocks(mo_t *dev, int32_t *len, UNUSED(int first_batch), int out) *len = dev->requested_blocks * dev->drv->sector_size; for (int i = 0; i < dev->requested_blocks; i++) { - if (fseek(dev->drv->fp, dev->drv->base + (dev->sector_pos * dev->drv->sector_size) + (i * dev->drv->sector_size), SEEK_SET) == 1) - break; + if (fseek(dev->drv->fp, dev->drv->base + (dev->sector_pos * dev->drv->sector_size) + (i * dev->drv->sector_size), SEEK_SET) == -1) { + if (out) + mo_write_error(dev); + else + mo_read_error(dev); + return -1; + } if (feof(dev->drv->fp)) break; if (out) { - if (fwrite(dev->buffer + (i * dev->drv->sector_size), 1, dev->drv->sector_size, dev->drv->fp) != dev->drv->sector_size) - fatal("mo_blocks(): Error writing data\n"); + if (fwrite(dev->buffer + (i * dev->drv->sector_size), 1, dev->drv->sector_size, dev->drv->fp) != dev->drv->sector_size) { + mo_log("mo_blocks(): Error writing data\n"); + mo_write_error(dev); + return -1; + } fflush(dev->drv->fp); } else { - if (fread(dev->buffer + (i * dev->drv->sector_size), 1, dev->drv->sector_size, dev->drv->fp) != dev->drv->sector_size) - fatal("mo_blocks(): Error reading data\n"); + if (fread(dev->buffer + (i * dev->drv->sector_size), 1, dev->drv->sector_size, dev->drv->fp) != dev->drv->sector_size) { + mo_log("mo_blocks(): Error reading data\n"); + mo_read_error(dev); + return -1; + } } } @@ -1433,7 +1462,7 @@ mo_command(scsi_common_t *sc, uint8_t *cdb) ret = mo_blocks(dev, &alloc_length, 1, 0); if (ret <= 0) { mo_set_phase(dev, SCSI_PHASE_STATUS); - dev->packet_status = PHASE_COMPLETE; + dev->packet_status = (ret < 0) ? PHASE_ERROR : PHASE_COMPLETE; dev->callback = 20.0 * MO_TIME; mo_set_callback(dev); mo_buf_free(dev); diff --git a/src/disk/zip.c b/src/disk/zip.c index a948cab2f..4a5a9b968 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -1048,6 +1048,24 @@ zip_write_protected(zip_t *dev) zip_cmd_error(dev); } +static void +zip_write_error(zip_t *dev) +{ + zip_sense_key = SENSE_MEDIUM_ERROR; + zip_asc = ASC_WRITE_ERROR; + zip_ascq = 0; + zip_cmd_error(dev); +} + +static void +zip_read_error(zip_t *dev) +{ + zip_sense_key = SENSE_MEDIUM_ERROR; + zip_asc = ASC_UNRECOVERED_READ_ERROR; + zip_ascq = 0; + zip_cmd_error(dev); +} + static void zip_invalid_lun(zip_t *dev) { @@ -1111,7 +1129,7 @@ zip_blocks(zip_t *dev, int32_t *len, UNUSED(int first_batch), int out) if (!dev->sector_len) { zip_command_complete(dev); - return -1; + return 0; } zip_log("%sing %i blocks starting from %i...\n", out ? "Writ" : "Read", dev->requested_blocks, dev->sector_pos); @@ -1125,20 +1143,31 @@ zip_blocks(zip_t *dev, int32_t *len, UNUSED(int first_batch), int out) *len = dev->requested_blocks << 9; for (int i = 0; i < dev->requested_blocks; i++) { - if (fseek(dev->drv->fp, dev->drv->base + (dev->sector_pos << 9) + (i << 9), SEEK_SET) == 1) - break; + if (fseek(dev->drv->fp, dev->drv->base + (dev->sector_pos << 9) + (i << 9), SEEK_SET) == -1) { + if (out) + zip_write_error(dev); + else + zip_read_error(dev); + return -1; + } if (feof(dev->drv->fp)) break; if (out) { - if (fwrite(dev->buffer + (i << 9), 1, 512, dev->drv->fp) != 512) - fatal("zip_blocks(): Error writing data\n"); + if (fwrite(dev->buffer + (i << 9), 1, 512, dev->drv->fp) != 512) { + zip_log("zip_blocks(): Error writing data\n"); + zip_write_error(dev); + return -1; + } fflush(dev->drv->fp); } else { - if (fread(dev->buffer + (i << 9), 1, 512, dev->drv->fp) != 512) - fatal("zip_blocks(): Error reading data\n"); + if (fread(dev->buffer + (i << 9), 1, 512, dev->drv->fp) != 512) { + zip_log("zip_blocks(): Error reading data\n"); + zip_read_error(dev); + return -1; + } } } @@ -1551,7 +1580,7 @@ zip_command(scsi_common_t *sc, uint8_t *cdb) ret = zip_blocks(dev, &alloc_length, 1, 0); if (ret <= 0) { zip_set_phase(dev, SCSI_PHASE_STATUS); - dev->packet_status = PHASE_COMPLETE; + dev->packet_status = (ret < 0) ? PHASE_ERROR : PHASE_COMPLETE; dev->callback = 20.0 * ZIP_TIME; zip_set_callback(dev); zip_buf_free(dev); From cc9c48711a036334d2a7effcac86d68d062bc917 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 14:15:08 -0300 Subject: [PATCH 524/624] hdd_image: Improve I/O error detection --- src/disk/hdd_image.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 2b463a23c..4607e2b14 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -538,9 +538,9 @@ hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) } num_read = fread(buffer, 512, count, hdd_images[id].file); - if (count && !num_read) - return -1; hdd_images[id].pos = sector + num_read; + if (num_read < count) + return -1; } return 0; @@ -591,10 +591,10 @@ hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) } num_write = fwrite(buffer, 512, count, hdd_images[id].file); - if (count && !num_write) - return -1; - fflush(hdd_images[id].file); hdd_images[id].pos = sector + num_write; + fflush(hdd_images[id].file); + if (num_write < count) + return -1; } return 0; From 2184a982f83c54dcbb1600fb7c82131e2d270331 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Tue, 29 Oct 2024 15:14:27 -0300 Subject: [PATCH 525/624] MiniVHD: Report read/write errors --- src/disk/hdd_image.c | 17 ++++++-- src/disk/minivhd/internal.h | 3 +- src/disk/minivhd/minivhd_io.c | 80 +++++++++++++++++++++++------------ 3 files changed, 69 insertions(+), 31 deletions(-) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 4607e2b14..402140408 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -529,8 +529,11 @@ hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) size_t num_read; if (hdd_images[id].type == HDD_IMAGE_VHD) { - non_transferred_sectors = mvhd_read_sectors(hdd_images[id].vhd, sector, count, buffer); - hdd_images[id].pos = sector + count - non_transferred_sectors - 1; + hdd_images[id].vhd->error = 0; + non_transferred_sectors = mvhd_read_sectors(hdd_images[id].vhd, sector, count, buffer); + hdd_images[id].pos = sector + count - non_transferred_sectors - 1; + if (hdd_images[id].vhd->error) + return -1; } else { if (!hdd_images[id].file || (fseeko64(hdd_images[id].file, ((uint64_t) (sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1)) { hdd_image_log("Hard disk image %i: Read error during seek\n", id); @@ -582,8 +585,11 @@ hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) size_t num_write; if (hdd_images[id].type == HDD_IMAGE_VHD) { - non_transferred_sectors = mvhd_write_sectors(hdd_images[id].vhd, sector, count, buffer); - hdd_images[id].pos = sector + count - non_transferred_sectors - 1; + hdd_images[id].vhd->error = 0; + non_transferred_sectors = mvhd_write_sectors(hdd_images[id].vhd, sector, count, buffer); + hdd_images[id].pos = sector + count - non_transferred_sectors - 1; + if (hdd_images[id].vhd->error) + return -1; } else { if (!hdd_images[id].file || (fseeko64(hdd_images[id].file, ((uint64_t) (sector) << 9LL) + hdd_images[id].base, SEEK_SET) == -1)) { hdd_image_log("Hard disk image %i: Write error during seek\n", id); @@ -621,8 +627,11 @@ int hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count) { if (hdd_images[id].type == HDD_IMAGE_VHD) { + hdd_images[id].vhd->error = 0; int non_transferred_sectors = mvhd_format_sectors(hdd_images[id].vhd, sector, count); hdd_images[id].pos = sector + count - non_transferred_sectors - 1; + if (hdd_images[id].vhd->error) + return -1; } else { memset(empty_sector, 0, 512); diff --git a/src/disk/minivhd/internal.h b/src/disk/minivhd/internal.h index d3f930110..4caef7c47 100644 --- a/src/disk/minivhd/internal.h +++ b/src/disk/minivhd/internal.h @@ -115,6 +115,7 @@ typedef struct MVHDSparseHeader { struct MVHDMeta { FILE* f; bool readonly; + bool error; char filename[MVHD_MAX_PATH_BYTES]; struct MVHDMeta* parent; MVHDFooter footer; @@ -271,7 +272,7 @@ struct MVHDMeta* mvhd_create_fixed_raw(const char* path, FILE* raw_img, uint64_t * \param [in] f File to write sectors to * \param [in] sector_count The number of sectors to write */ -void mvhd_write_empty_sectors(FILE* f, int sector_count); +bool mvhd_write_empty_sectors(FILE* f, int sector_count); /** * \brief Read a fixed VHD image diff --git a/src/disk/minivhd/minivhd_io.c b/src/disk/minivhd/minivhd_io.c index 1a349dbc4..cdf6694a8 100644 --- a/src/disk/minivhd/minivhd_io.c +++ b/src/disk/minivhd/minivhd_io.c @@ -82,15 +82,18 @@ check_sectors(uint32_t offset, int num_sectors, uint32_t total_sectors, int *tra } } -void +bool mvhd_write_empty_sectors(FILE *f, int sector_count) { uint8_t zero_bytes[MVHD_SECTOR_SIZE] = {0}; - for (int i = 0; i < sector_count; i++) - fwrite(zero_bytes, sizeof zero_bytes, 1, f); + for (int i = 0; i < sector_count; i++) { + if (!fwrite(zero_bytes, sizeof zero_bytes, 1, f)) + return 0; + } fflush(f); + return 1; } /** @@ -107,7 +110,8 @@ read_sect_bitmap(MVHDMeta *vhdm, int blk) { if (vhdm->block_offset[blk] != MVHD_SPARSE_BLK) { mvhd_fseeko64(vhdm->f, (uint64_t)vhdm->block_offset[blk] * MVHD_SECTOR_SIZE, SEEK_SET); - (void) !fread(vhdm->bitmap.curr_bitmap, vhdm->bitmap.sector_count * MVHD_SECTOR_SIZE, 1, vhdm->f); + if (!fread(vhdm->bitmap.curr_bitmap, vhdm->bitmap.sector_count * MVHD_SECTOR_SIZE, 1, vhdm->f)) + vhdm->error = 1; } else memset(vhdm->bitmap.curr_bitmap, 0, vhdm->bitmap.sector_count * MVHD_SECTOR_SIZE); @@ -124,8 +128,10 @@ write_curr_sect_bitmap(MVHDMeta* vhdm) { if (vhdm->bitmap.curr_block >= 0) { int64_t abs_offset = (int64_t)vhdm->block_offset[vhdm->bitmap.curr_block] * MVHD_SECTOR_SIZE; - mvhd_fseeko64(vhdm->f, abs_offset, SEEK_SET); - fwrite(vhdm->bitmap.curr_bitmap, MVHD_SECTOR_SIZE, vhdm->bitmap.sector_count, vhdm->f); + if (mvhd_fseeko64(vhdm->f, abs_offset, SEEK_SET) == -1) + vhdm->error = 1; + if (!fwrite(vhdm->bitmap.curr_bitmap, MVHD_SECTOR_SIZE, vhdm->bitmap.sector_count, vhdm->f)) + vhdm->error = 1; } } @@ -141,8 +147,10 @@ write_bat_entry(MVHDMeta *vhdm, int blk) uint64_t table_offset = vhdm->sparse.bat_offset + ((uint64_t)blk * sizeof *vhdm->block_offset); uint32_t offset = mvhd_to_be32(vhdm->block_offset[blk]); - mvhd_fseeko64(vhdm->f, table_offset, SEEK_SET); - fwrite(&offset, sizeof offset, 1, vhdm->f); + if (mvhd_fseeko64(vhdm->f, table_offset, SEEK_SET) == -1) + vhdm->error = 1; + if (!fwrite(&offset, sizeof offset, 1, vhdm->f)) + vhdm->error = 1; fflush(vhdm->f); } @@ -173,7 +181,8 @@ create_block(MVHDMeta *vhdm, int blk) if (!mvhd_is_conectix_str(footer)) { /* Oh dear. We use the header instead, since something has gone wrong at the footer */ mvhd_fseeko64(vhdm->f, 0, SEEK_SET); - (void) !fread(footer, sizeof footer, 1, vhdm->f); + if (!fread(footer, sizeof footer, 1, vhdm->f)) + vhdm->error = 1; mvhd_fseeko64(vhdm->f, 0, SEEK_END); } @@ -182,20 +191,25 @@ create_block(MVHDMeta *vhdm, int blk) /* Yikes! We're supposed to be on a sector boundary. Add some padding */ int64_t padding_amount = ((int64_t) MVHD_SECTOR_SIZE) - (abs_offset % MVHD_SECTOR_SIZE); uint8_t zero_byte = 0; - for (int i = 0; i < padding_amount; i++) - fwrite(&zero_byte, sizeof zero_byte, 1, vhdm->f); + for (int i = 0; i < padding_amount; i++) { + if (!fwrite(&zero_byte, sizeof zero_byte, 1, vhdm->f)) + vhdm->error = 1; + } abs_offset += padding_amount; } uint32_t sect_offset = (uint32_t)(abs_offset / MVHD_SECTOR_SIZE); int blk_size_sectors = vhdm->sparse.block_sz / MVHD_SECTOR_SIZE; - mvhd_write_empty_sectors(vhdm->f, vhdm->bitmap.sector_count + blk_size_sectors); + if (!mvhd_write_empty_sectors(vhdm->f, vhdm->bitmap.sector_count + blk_size_sectors)) + vhdm->error = 1; /* Add a bit of padding. That's what Windows appears to do, although it's not strictly necessary... */ - mvhd_write_empty_sectors(vhdm->f, 5); + if (!mvhd_write_empty_sectors(vhdm->f, 5)) + vhdm->error = 1; /* And we finish with the footer */ - fwrite(footer, sizeof footer, 1, vhdm->f); + if (!fwrite(footer, sizeof footer, 1, vhdm->f)) + vhdm->error = 1; /* We no longer have a sparse block. Update that BAT! */ vhdm->block_offset[blk] = sect_offset; @@ -214,8 +228,10 @@ mvhd_fixed_read(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *out_buff check_sectors(offset, num_sectors, total_sectors, &transfer_sectors, &truncated_sectors); addr = ((int64_t) offset) * MVHD_SECTOR_SIZE; - mvhd_fseeko64(vhdm->f, addr, SEEK_SET); - (void) !fread(out_buff, transfer_sectors * MVHD_SECTOR_SIZE, 1, vhdm->f); + if (mvhd_fseeko64(vhdm->f, addr, SEEK_SET) == -1) + vhdm->error = 1; + if (!fread(out_buff, transfer_sectors * MVHD_SECTOR_SIZE, 1, vhdm->f)) + vhdm->error = 1; return truncated_sectors; } @@ -245,17 +261,20 @@ mvhd_sparse_read(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *out_buf prev_blk = blk; if (vhdm->bitmap.curr_block != blk) { read_sect_bitmap(vhdm, blk); - mvhd_fseeko64(vhdm->f, (uint64_t)sib * MVHD_SECTOR_SIZE, SEEK_CUR); + if (mvhd_fseeko64(vhdm->f, (uint64_t)sib * MVHD_SECTOR_SIZE, SEEK_CUR) == -1) + vhdm->error = 1; } else { addr = (((int64_t) vhdm->block_offset[blk]) + vhdm->bitmap.sector_count + sib) * MVHD_SECTOR_SIZE; - mvhd_fseeko64(vhdm->f, addr, SEEK_SET); + if (mvhd_fseeko64(vhdm->f, addr, SEEK_SET) == -1) + vhdm->error = 1; } } - if (VHD_TESTBIT(vhdm->bitmap.curr_bitmap, sib)) - (void) !fread(buff, MVHD_SECTOR_SIZE, 1, vhdm->f); - else { + if (VHD_TESTBIT(vhdm->bitmap.curr_bitmap, sib)) { + if (!fread(buff, MVHD_SECTOR_SIZE, 1, vhdm->f)) + vhdm->error = 1; + } else { memset(buff, 0, MVHD_SECTOR_SIZE); mvhd_fseeko64(vhdm->f, MVHD_SECTOR_SIZE, SEEK_CUR); } @@ -301,6 +320,10 @@ mvhd_diff_read(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *out_buff) mvhd_sparse_read(curr_vhdm, s, 1, buff); else mvhd_fixed_read(curr_vhdm, s, 1, buff); + if (curr_vhdm->error) { + curr_vhdm->error = 0; + vhdm->error = 1; + } curr_vhdm = vhdm; buff += MVHD_SECTOR_SIZE; @@ -320,8 +343,10 @@ mvhd_fixed_write(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *in_buff check_sectors(offset, num_sectors, total_sectors, &transfer_sectors, &truncated_sectors); addr = (int64_t)offset * MVHD_SECTOR_SIZE; - mvhd_fseeko64(vhdm->f, addr, SEEK_SET); - fwrite(in_buff, transfer_sectors * MVHD_SECTOR_SIZE, 1, vhdm->f); + if (mvhd_fseeko64(vhdm->f, addr, SEEK_SET) == -1) + vhdm->error = 1; + if (!fwrite(in_buff, transfer_sectors * MVHD_SECTOR_SIZE, 1, vhdm->f)) + vhdm->error = 1; fflush(vhdm->f); return truncated_sectors; @@ -364,16 +389,19 @@ mvhd_sparse_diff_write(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *i if (blk != prev_blk) { if (vhdm->bitmap.curr_block != blk) { read_sect_bitmap(vhdm, blk); - mvhd_fseeko64(vhdm->f, (uint64_t)sib * MVHD_SECTOR_SIZE, SEEK_CUR); + if (mvhd_fseeko64(vhdm->f, (uint64_t)sib * MVHD_SECTOR_SIZE, SEEK_CUR) == -1) + vhdm->error = 1; } else { addr = (((int64_t) vhdm->block_offset[blk]) + vhdm->bitmap.sector_count + sib) * MVHD_SECTOR_SIZE; - mvhd_fseeko64(vhdm->f, addr, SEEK_SET); + if (mvhd_fseeko64(vhdm->f, addr, SEEK_SET) == -1) + vhdm->error = 1; } prev_blk = blk; } - fwrite(buff, MVHD_SECTOR_SIZE, 1, vhdm->f); + if (!fwrite(buff, MVHD_SECTOR_SIZE, 1, vhdm->f)) + vhdm->error = 1; VHD_SETBIT(vhdm->bitmap.curr_bitmap, sib); buff += MVHD_SECTOR_SIZE; } From c17fbfb9c67de27084ece85fc0902a672ba2d6e1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Fri, 1 Nov 2024 19:19:19 +0100 Subject: [PATCH 526/624] Generic NE-x000 Comaptible cards: allow changing the MAC OUI. --- src/network/net_ne2000.c | 48 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 0f3480492..87678c8bf 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -911,8 +911,10 @@ static void * nic_init(const device_t *info) { uint32_t mac; + uint32_t mac_oui; char *rom; nic_t *dev; + int set_oui = 0; dev = malloc(sizeof(nic_t)); memset(dev, 0x00, sizeof(nic_t)); @@ -957,8 +959,8 @@ nic_init(const device_t *info) dev->maclocal[4] = random_generate(); dev->maclocal[5] = random_generate(); mac = (((int) dev->maclocal[3]) << 16); - mac |= (((int) dev->maclocal[4]) << 8); - mac |= ((int) dev->maclocal[5]); + mac |= (((int) dev->maclocal[4]) << 8); + mac |= ((int) dev->maclocal[5]); device_set_config_mac("mac", mac); } else { dev->maclocal[3] = (mac >> 16) & 0xff; @@ -987,6 +989,7 @@ nic_init(const device_t *info) dev->maclocal[2] = 0xB0; dev->is_8bit = 1; rom = NULL; + set_oui = 1; dp8390_set_defaults(dev->dp8390, DP8390_FLAG_CHECK_CR | DP8390_FLAG_CLEAR_IRQ); dp8390_mem_alloc(dev->dp8390, 0x2000, 0x2000); break; @@ -1005,6 +1008,7 @@ nic_init(const device_t *info) dev->maclocal[1] = 0x86; dev->maclocal[2] = 0xB0; rom = ROM_PATH_NE2000; + set_oui = 1; dp8390_set_defaults(dev->dp8390, DP8390_FLAG_EVEN_MAC | DP8390_FLAG_CHECK_CR | DP8390_FLAG_CLEAR_IRQ); dp8390_mem_alloc(dev->dp8390, 0x4000, 0x4000); break; @@ -1015,6 +1019,7 @@ nic_init(const device_t *info) dev->maclocal[2] = 0xB0; dev->is_8bit = 1; rom = ROM_PATH_NE2000; + set_oui = 1; dp8390_set_defaults(dev->dp8390, DP8390_FLAG_EVEN_MAC | DP8390_FLAG_CHECK_CR | DP8390_FLAG_CLEAR_IRQ); dp8390_mem_alloc(dev->dp8390, 0x4000, 0x4000); break; @@ -1059,6 +1064,24 @@ nic_init(const device_t *info) break; } + + if (set_oui) { + /* See if we have a local MAC address configured. */ + mac_oui = device_get_config_mac("mac_oui", -1); + + /* Set up our BIA. */ + if (mac_oui & 0xff000000) { + 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); + } else { + dev->maclocal[1] = (mac_oui >> 16) & 0xff; + dev->maclocal[2] = (mac_oui >> 8) & 0xff; + dev->maclocal[3] = (mac_oui & 0xff); + } + } + memcpy(dev->dp8390->physaddr, dev->maclocal, sizeof(dev->maclocal)); nelog(2, "%s: I/O=%04x, IRQ=%d, MAC=%02x:%02x:%02x:%02x:%02x:%02x\n", @@ -1314,6 +1337,13 @@ static const device_config_t ne1000_compat_config[] = { .default_string = "", .default_int = -1 }, + { + .name = "mac_oui", + .description = "MAC Address OUI", + .type = CONFIG_MAC, + .default_string = "", + .default_int = -1 + }, { .name = "", .description = "", .type = CONFIG_END } }; @@ -1440,6 +1470,13 @@ static const device_config_t ne2000_compat_config[] = { .default_string = "", .default_int = -1 }, + { + .name = "mac_oui", + .description = "MAC Address OUI", + .type = CONFIG_MAC, + .default_string = "", + .default_int = -1 + }, { .name = "bios_addr", .description = "BIOS address", @@ -1514,6 +1551,13 @@ static const device_config_t ne2000_compat_8bit_config[] = { .default_string = "", .default_int = -1 }, + { + .name = "mac_oui", + .description = "MAC Address OUI", + .type = CONFIG_MAC, + .default_string = "", + .default_int = -1 + }, { .name = "bios_addr", .description = "BIOS address", From b44c214cea20986706f3339e99a1a8bc3f28b6d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miran=20Gr=C4=8Da?= Date: Fri, 1 Nov 2024 20:26:24 +0100 Subject: [PATCH 527/624] Fixed a case of off by one in network/net_ne2000.c. --- src/network/net_ne2000.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 87678c8bf..5d8566bb7 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -1076,9 +1076,9 @@ nic_init(const device_t *info) mac_oui |= ((int) dev->maclocal[2]); device_set_config_mac("mac", mac); } else { - dev->maclocal[1] = (mac_oui >> 16) & 0xff; - dev->maclocal[2] = (mac_oui >> 8) & 0xff; - dev->maclocal[3] = (mac_oui & 0xff); + dev->maclocal[0] = (mac_oui >> 16) & 0xff; + dev->maclocal[1] = (mac_oui >> 8) & 0xff; + dev->maclocal[2] = (mac_oui & 0xff); } } From 12a57ffeac61760f395614d923ddd40a76fcb479 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 2 Nov 2024 20:50:06 +0100 Subject: [PATCH 528/624] Changes to 8514/A compatible stuff (November 2nd, 2024) 1. vga_on global variable removed, as it didn't play well with 2 subsystems at once (8514/A and XGA both enabled). 2. Emulate the Foreground/Background Color aliases of PIX_TRANS properly when not executing a command. 3. Voodoo 3D override now works properly (again) with Mach32 PCI cards and others by turning the 8514/A timer off and on accordingly. --- src/cpu/x86.c | 3 - src/include/86box/vid_8514a.h | 2 +- src/include/86box/vid_svga.h | 5 +- src/video/vid_8514a.c | 118 ++++-- src/video/vid_ati_mach8.c | 740 +++++++++++++++++++--------------- src/video/vid_svga.c | 76 ++-- 6 files changed, 561 insertions(+), 383 deletions(-) diff --git a/src/cpu/x86.c b/src/cpu/x86.c index 5eb16b98f..8a0bd830f 100644 --- a/src/cpu/x86.c +++ b/src/cpu/x86.c @@ -384,9 +384,6 @@ softresetx86(void) if (soft_reset_mask) return; - if (ibm8514_active || xga_active) - vga_on = 1; - reset_common(0); } diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index 1c64309cd..ec8c5e168 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -42,7 +42,6 @@ typedef union { typedef struct ibm8514_t { rom_t bios_rom; rom_t bios_rom2; - rom_t bios_rom3; hwcursor8514_t hwcursor; hwcursor8514_t hwcursor_latch; uint8_t pos_regs[8]; @@ -228,6 +227,7 @@ typedef struct ibm8514_t { uint32_t vram_amount; int vram_512k_8514; PALETTE _8514pal; + int vendor_mode; latch8514_t latch; } ibm8514_t; diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index c91db4fe8..8a9f1fdbe 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -79,6 +79,7 @@ typedef struct svga_t { uint8_t fcr; uint8_t hblank_overscan; uint8_t vidsys_ena; + uint8_t sleep; int dac_addr; int dac_pos; @@ -297,8 +298,6 @@ typedef struct svga_t { void * xga; } svga_t; -extern int vga_on; - extern void ibm8514_poll(void *priv); extern void ibm8514_recalctimings(svga_t *svga); extern uint8_t ibm8514_ramdac_in(uint16_t port, void *priv); @@ -314,6 +313,8 @@ extern void ibm8514_short_stroke_start(int count, int cpu_input, uint32_t mi extern void ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, svga_t *svga, int len); #ifdef ATI_8514_ULTRA +extern void ati8514_out(uint16_t addr, uint8_t val, void *priv); +extern uint8_t ati8514_in(uint16_t addr, void *priv); extern void ati8514_recalctimings(svga_t *svga); extern uint8_t ati8514_mca_read(int port, void *priv); extern void ati8514_mca_write(int port, uint8_t val, void *priv); diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index accedd131..8742c3b32 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -98,14 +98,13 @@ ibm8514_log(const char *fmt, ...) } else { \ temp = dev->vram[(dev->accel.dest + (cx) + (n)) & dev->vram_mask]; \ temp |= (dev->vram[(dev->accel.dest + (cx) + (n + 1)) & dev->vram_mask] << 8); \ - } + } \ #define READ(addr, dat) \ - if (dev->bpp) { \ + if (dev->bpp) \ dat = vram_w[(addr) & (dev->vram_mask >> 1)]; \ - } else { \ + else \ dat = (dev->vram[(addr) & (dev->vram_mask)]); \ - } #define READ_HIGH(addr, dat) \ dat |= (dev->vram[(addr) & (dev->vram_mask)] << 8); @@ -396,10 +395,10 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) dev->data_available = 0; dev->data_available2 = 0; dev->accel.cmd = val; - if (port == 0xdae8) { - if (dev->accel.cmd & 0x100) - dev->accel.cmd_back = 0; - } + dev->accel.cmd_back = 1; + if (dev->accel.cmd & 0x100) + dev->accel.cmd_back = 0; + ibm8514_log("8514/A CMD=%04x, back=%d.\n", dev->accel.cmd, dev->accel.cmd_back); ibm8514_accel_start(-1, 0, -1, 0, svga, len); } @@ -498,7 +497,6 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) if (len == 2) { dev->accel.multifunc_cntl = val; dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff; - dev->accel.cmd_back = !!(port == 0xfee8); if ((dev->accel.multifunc_cntl >> 12) == 1) { dev->accel.clip_top = dev->accel.multifunc[1] & 0x3ff; @@ -714,7 +712,6 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len) case 0x4ae8: WRITE8(port, dev->accel.advfunc_cntl, val); dev->on = dev->accel.advfunc_cntl & 0x01; - vga_on = !dev->on; ibm8514_log("[%04X:%08X]: IBM 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, dev->on, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); ibm8514_log("IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); svga_recalctimings(svga); @@ -788,10 +785,10 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) case 0xdae9: if (len == 1) { if (dev->force_busy2) - temp |= 2; /*Hardware busy*/ + temp |= 0x02; /*Hardware busy*/ dev->force_busy2 = 0; if (dev->data_available2) { - temp |= 1; /*Read Data available*/ + temp |= 0x01; /*Read Data available*/ dev->data_available2 = 0; } } @@ -826,13 +823,18 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) uint8_t ibm8514_accel_in(uint16_t port, svga_t *svga) { - ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - uint8_t temp = 0; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + uint8_t temp = 0; + int16_t clip_t = dev->accel.clip_top; + int16_t clip_l = dev->accel.clip_left; + uint16_t clip_b_ibm = dev->accel.clip_bottom; + uint16_t clip_r_ibm = dev->accel.clip_right; + int cmd = dev->accel.cmd >> 13; switch (port) { case 0x2e8: if (dev->vc == dev->v_syncstart) - temp |= 2; + temp |= 0x02; ibm8514_log("0x2E8 read: Display Status=%02x.\n", temp); break; @@ -860,7 +862,21 @@ ibm8514_accel_in(uint16_t port, svga_t *svga) case 0x42e8: case 0x42e9: if (dev->vc == dev->v_syncstart) - dev->subsys_stat |= 1; + dev->subsys_stat |= 0x01; + + if (cmd == 6) { + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r_ibm) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b_ibm)) + dev->subsys_stat |= 0x02; + } else { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r_ibm) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b_ibm)) + dev->subsys_stat |= 0x02; + } if (port & 1) temp = dev->vram_512k_8514 ? 0x00 : 0x80; @@ -1126,8 +1142,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat else cpu_dat >>= 8; - if (!dev->accel.ssv_len) + if (!dev->accel.ssv_len) { + dev->accel.cmd_back = 1; break; + } switch (dev->accel.ssv_dir & 0xe0) { case 0x00: @@ -1219,8 +1237,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat else cpu_dat >>= 8; - if (!dev->accel.ssv_len) + if (!dev->accel.ssv_len) { + dev->accel.cmd_back = 1; break; + } if (dev->accel.err_term >= dev->accel.maj_axis_pcnt) { dev->accel.err_term += dev->accel.destx_distp; @@ -1427,8 +1447,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat } } - if (!dev->accel.sy) + if (!dev->accel.sy) { + dev->accel.cmd_back = 1; break; + } if (dev->accel.output) mix_dat >>= 1; @@ -1542,8 +1564,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat else cpu_dat >>= 8; - if (dev->accel.sy == 0) + if (!dev->accel.sy) { + dev->accel.cmd_back = 1; break; + } if (dev->accel.cmd & 0x40) { if (dev->accel.cmd & 0x80) @@ -1642,8 +1666,10 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat else cpu_dat >>= 8; - if (dev->accel.sy == 0) + if (!dev->accel.sy) { + dev->accel.cmd_back = 1; break; + } if (dev->accel.cmd & 0x40) { if (dev->accel.cmd & 0x80) @@ -1917,6 +1943,9 @@ skip_vector_rect_write: dev->accel.sy--; dev->accel.x_count = 0; + + if (dev->accel.sy < 0) + dev->accel.cmd_back = 1; return; } } @@ -2072,6 +2101,9 @@ skip_nibble_rect_write: dev->accel.sy--; dev->accel.x_count = 0; + + if (dev->accel.sy < 0) + dev->accel.cmd_back = 1; return; } } @@ -2154,6 +2186,9 @@ skip_nibble_rect_write: dev->accel.dest = (dev->accel.ge_offset << 2) + (dev->accel.cy * dev->pitch); dev->accel.sy--; + + if (dev->accel.sy < 0) + dev->accel.cmd_back = 1; return; } } @@ -2236,6 +2271,7 @@ skip_nibble_rect_write: dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; } + dev->accel.cmd_back = 1; return; } } @@ -2314,6 +2350,7 @@ skip_nibble_rect_write: if (dev->accel.sy < 0) { ibm8514_log(".\n"); + dev->accel.cmd_back = 1; return; } } @@ -2399,6 +2436,7 @@ skip_nibble_rect_write: dev->accel.cur_x = dev->accel.cx; dev->accel.cur_y = dev->accel.cy; } + dev->accel.cmd_back = 1; return; } } @@ -2499,8 +2537,10 @@ skip_nibble_rect_write: else cpu_dat >>= 8; - if (!dev->accel.sy) + if (!dev->accel.sy) { + dev->accel.cmd_back = 1; break; + } switch (dev->accel.cmd & 0xe0) { case 0x00: @@ -2601,8 +2641,10 @@ skip_nibble_rect_write: else cpu_dat >>= 8; - if (!dev->accel.sy) + if (!dev->accel.sy) { + dev->accel.cmd_back = 1; break; + } if (dev->accel.cmd & 0x40) { dev->accel.oldcy = dev->accel.cy; @@ -2856,6 +2898,9 @@ skip_nibble_bitblt_write: dev->accel.sy--; dev->accel.x_count = 0; + + if (dev->accel.sy < 0) + dev->accel.cmd_back = 1; return; } } @@ -2953,6 +2998,9 @@ skip_nibble_bitblt_write: } dev->accel.sy--; + + if (dev->accel.sy < 0) + dev->accel.cmd_back = 1; return; } } @@ -3047,6 +3095,7 @@ skip_nibble_bitblt_write: if (dev->accel.sy < 0) { dev->accel.destx = dev->accel.dx; dev->accel.desty = dev->accel.dy; + dev->accel.cmd_back = 1; return; } } @@ -3076,8 +3125,10 @@ skip_nibble_bitblt_write: dx++; dev->accel.sx--; - if (dev->accel.sx < 0) + if (dev->accel.sx < 0) { + dev->accel.cmd_back = 1; return; + } } } else { while (count-- && dev->accel.sy >= 0) { @@ -3187,6 +3238,7 @@ skip_nibble_bitblt_write: if (dev->accel.sy < 0) { dev->accel.destx = dev->accel.dx; dev->accel.desty = dev->accel.dy; + dev->accel.cmd_back = 1; return; } } @@ -3265,9 +3317,8 @@ ibm8514_render_15bpp(svga_t *svga) uint32_t *p; uint32_t dat; - if ((dev->displine + svga->y_add) < 0) { + if ((dev->displine + svga->y_add) < 0) return; - } if (dev->changedvram[dev->ma >> 12] || dev->changedvram[(dev->ma >> 12) + 1] || svga->fullchange) { p = &buffer32->line[dev->displine + svga->y_add][svga->x_add]; @@ -3306,9 +3357,8 @@ ibm8514_render_16bpp(svga_t *svga) uint32_t *p; uint32_t dat; - if ((dev->displine + svga->y_add) < 0) { + if ((dev->displine + svga->y_add) < 0) return; - } if (dev->changedvram[dev->ma >> 12] || dev->changedvram[(dev->ma >> 12) + 1] || svga->fullchange) { p = &buffer32->line[dev->displine + svga->y_add][svga->x_add]; @@ -3745,7 +3795,6 @@ ibm8514_mca_reset(void *priv) ibm8514_log("MCA reset.\n"); dev->on = 0; - vga_on = 1; #ifdef ATI_8514_ULTRA if (dev->extensions) ati8514_mca_write(0x102, 0, svga); @@ -3803,20 +3852,15 @@ ibm8514_init(const device_t *info) dev->pos_regs[0] = 0x88; dev->pos_regs[1] = 0x80; mca_add(ati8514_mca_read, ati8514_mca_write, ibm8514_mca_feedb, ibm8514_mca_reset, svga); - ati_eeprom_load(&mach->eeprom, "ati8514_mca.nvr", 0); + ati_eeprom_load_mach8(&mach->eeprom, "ati8514_mca.nvr"); mem_mapping_disable(&dev->bios_rom.mapping); } else { rom_init(&dev->bios_rom, BIOS_MACH8_ROM_PATH, - bios_addr, 0x1000, 0xfff, + bios_addr, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); - rom_init(&dev->bios_rom2, - BIOS_MACH8_ROM_PATH, - bios_addr + 0x1000, 0x800, 0x7ff, - 0x1000, MEM_MAPPING_EXTERNAL); - ati_eeprom_load(&mach->eeprom, "ati8514.nvr", 0); mach->accel.scratch0 = (((bios_addr >> 7) - 0x1000) >> 4); - mach->accel.scratch1 = mach->accel.scratch0 - 0x80; + ati_eeprom_load_mach8(&mach->eeprom, "ati8514.nvr"); } ati8514_init(svga, svga->ext8514, svga->dev8514); break; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index f39dda6d7..cc0441f63 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -113,12 +113,14 @@ mach_log(const char *fmt, ...) #define READ_PIXTRANS_BYTE_IO(cx, n) \ if ((mach->accel.cmd_type == 2) || (mach->accel.cmd_type == 5)) { \ if (dev->bpp) { \ - if (n == 0) \ + if (n == 0)\ mach->accel.pix_trans[(n)] = vram_w[(dev->accel.dest + (cx) + (n)) & (dev->vram_mask >> 1)] & 0xff; \ else \ mach->accel.pix_trans[(n)] = vram_w[(dev->accel.dest + (cx) + (n)) & (dev->vram_mask >> 1)] >> 8; \ + \ } else \ mach->accel.pix_trans[(n)] = dev->vram[(dev->accel.dest + (cx) + (n)) & dev->vram_mask]; \ + \ } #define READ_PIXTRANS_WORD(cx, n) \ @@ -146,13 +148,13 @@ mach_log(const char *fmt, ...) } #define READ(addr, dat) \ - if (dev->bpp) \ - dat = vram_w[(addr) & (dev->vram_mask >> 1)]; \ - else \ - dat = dev->vram[(addr) & (dev->vram_mask)]; + if (dev->bpp) \ + dat = vram_w[(addr) & (dev->vram_mask >> 1)]; \ + else \ + dat = (dev->vram[(addr) & (dev->vram_mask)]); #define READ_HIGH(addr, dat) \ - dat |= (dev->vram[(addr) & (dev->vram_mask)] << 8); + dat |= (dev->vram[(addr) & (dev->vram_mask)] << 8); #define MIX(mixmode, dest_dat, src_dat) \ { \ @@ -265,7 +267,7 @@ mach_log(const char *fmt, ...) #define WRITE(addr, dat) \ if (dev->bpp) { \ - vram_w[((addr)) & (dev->vram_mask >> 1)] = dat; \ + vram_w[((addr)) & (dev->vram_mask >> 1)] = dat; \ dev->changedvram[(((addr)) & (dev->vram_mask >> 1)) >> 11] = changeframecount; \ } else { \ dev->vram[((addr)) & (dev->vram_mask)] = dat; \ @@ -291,7 +293,7 @@ mach_pixel_read(mach_t *mach) } static void -mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint32_t cpu_dat, mach_t *mach, ibm8514_t *dev) +mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint32_t cpu_dat, svga_t *svga, mach_t *mach, ibm8514_t *dev) { int compare_mode; uint16_t poly_src = 0; @@ -309,10 +311,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 uint16_t mix = 0; uint32_t mono_dat0 = 0; uint32_t mono_dat1 = 0; - int16_t clip_t = dev->accel.clip_top; - int16_t clip_l = dev->accel.clip_left; - int16_t clip_b = dev->accel.clip_bottom; - int16_t clip_r = dev->accel.clip_right; + int16_t clip_t = dev->accel.clip_top; + int16_t clip_l = dev->accel.clip_left; + int16_t clip_b = dev->accel.clip_bottom; + int16_t clip_r = dev->accel.clip_right; if (!dev->bpp) { rd_mask &= 0xff; @@ -541,10 +543,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } } - if ((mono_src == 1) && !count) + if ((mono_src == 1) && !count) { + dev->accel.cmd_back = 1; break; - else if ((mono_src != 1) && (dev->accel.sx >= mach->accel.width)) + } else if ((mono_src != 1) && (dev->accel.sx >= mach->accel.width)) { + dev->accel.cmd_back = 1; break; + } if (dev->bpp) cpu_dat >>= 16; @@ -762,10 +767,13 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } } - if ((mono_src == 1) && !count) + if ((mono_src == 1) && !count) { + dev->accel.cmd_back = 1; break; - else if ((mono_src != 1) && (dev->accel.sx >= mach->accel.width)) + } else if ((mono_src != 1) && (dev->accel.sx >= mach->accel.width)) { + dev->accel.cmd_back = 1; break; + } if (dev->bpp) cpu_dat >>= 16; @@ -834,6 +842,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 if (mach->accel.dest_x_start >= 0x600) mach->accel.dx_start |= ~0x5ff; + mach_log("DXStart=%d, CURX=%d.\n", mach->accel.dx_start, dev->accel.dx); mach->accel.dx_end = mach->accel.dest_x_end; if (mach->accel.dest_x_end >= 0x600) mach->accel.dx_end |= ~0x5ff; @@ -975,12 +984,14 @@ 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; return; } if ((mono_src == 3) || (bkgd_sel == 3) || (frgd_sel == 3)) { if (mach->accel.sx_end == mach->accel.sx_start) { mach_log("No SRC.\n"); + dev->accel.cmd_back = 1; return; } } @@ -990,6 +1001,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 mach_log("DPCONFIG 3251: monosrc=%d, frgdsel=%d, bkgdsel=%d, pitch=%d.\n", 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; return; } } @@ -1127,20 +1139,14 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } if (mach->accel.dp_config & 0x10) { - if (mach->accel.block_write_mono_pattern_enable) { - if (mix) { - WRITE(dev->accel.dest + dev->accel.dx, dest_dat); - } - } else { - if ((dev->accel_bpp == 24) && (mono_src == 1) && (frgd_sel == 5) && !mach->accel.mono_pattern_enable) { - if (dev->accel.sy & 1) { - WRITE(dev->accel.dest + dev->accel.dx - dev->pitch, dest_dat); - } else { - WRITE(dev->accel.dest + dev->accel.dx, dest_dat); - } + if ((dev->accel_bpp == 24) && (mono_src == 1) && (frgd_sel == 5) && !mach->accel.mono_pattern_enable) { + if (dev->accel.sy & 1) { + WRITE(dev->accel.dest + dev->accel.dx - dev->pitch, dest_dat); } else { WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } + } else { + WRITE(dev->accel.dest + dev->accel.dx, dest_dat); } } } @@ -1208,9 +1214,10 @@ 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 ((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)) + if ((mono_src == 1) && (frgd_sel == 5) && (dev->accel_bpp == 24)) return; dev->accel.cur_x = dev->accel.dx; dev->accel.cur_y = dev->accel.dy; @@ -1360,8 +1367,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } else mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); - if (!count) + if (!count) { + dev->accel.cmd_back = 1; break; + } if (dev->bpp) cpu_dat >>= 16; @@ -1527,8 +1536,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } else mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); - if (dev->accel.sx >= mach->accel.width) + if (dev->accel.sx >= mach->accel.width) { + dev->accel.cmd_back = 1; break; + } if (dev->bpp) cpu_dat >>= 16; @@ -1648,8 +1659,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } else mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); - if (!count) + if (!count) { + dev->accel.cmd_back = 1; break; + } if (dev->bpp) cpu_dat >>= 16; @@ -1803,8 +1816,10 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } else mach->accel.clip_overrun = ((mach->accel.clip_overrun + 1) & 0x0f); - if (dev->accel.sx >= mach->accel.width) + if (dev->accel.sx >= mach->accel.width) { + dev->accel.cmd_back = 1; break; + } if (dev->bpp) cpu_dat >>= 16; @@ -2098,13 +2113,14 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 dev->accel.sx = 0; dev->accel.dy += mach->accel.stepy; if (dev->bpp) - dev->accel.dest = (mach->accel.ge_offset << 1) + (dev->accel.dy * (dev->pitch)); + 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)); + dev->accel.dest = (mach->accel.ge_offset << 2) + (dev->accel.dy * dev->pitch); if (mach->accel.line_idx == 2) { mach->accel.line_array[0] = dev->accel.dx; mach->accel.line_array[4] = dev->accel.dx; } + dev->accel.cmd_back = 1; return; } } @@ -2116,7 +2132,7 @@ mach_accel_start(int cmd_type, int cpu_input, int count, uint32_t mix_dat, uint3 } static void -mach_accel_out_pixtrans(mach_t *mach, ibm8514_t *dev, uint16_t val) +mach_accel_out_pixtrans(svga_t *svga, mach_t *mach, ibm8514_t *dev, uint16_t val) { int frgd_sel; int bkgd_sel; @@ -2141,11 +2157,11 @@ mach_accel_out_pixtrans(mach_t *mach, ibm8514_t *dev, uint16_t val) mach_log("8-bit bus size swap.\n"); val = (val >> 8) | (val << 8); } - mach_accel_start(mach->accel.cmd_type, 1, 8, val | (val << 16), 0, mach, dev); + mach_accel_start(mach->accel.cmd_type, 1, 8, val | (val << 16), 0, svga, mach, dev); } else - mach_accel_start(mach->accel.cmd_type, 1, 1, -1, val | (val << 16), mach, dev); + mach_accel_start(mach->accel.cmd_type, 1, 1, -1, val | (val << 16), svga, mach, dev); } else - mach_accel_start(mach->accel.cmd_type, 1, 1, -1, val | (val << 16), mach, dev); + mach_accel_start(mach->accel.cmd_type, 1, 1, -1, val | (val << 16), svga, mach, dev); break; case 0x200: /*16-bit size*/ if (mono_src == 2) { @@ -2154,11 +2170,11 @@ mach_accel_out_pixtrans(mach_t *mach, ibm8514_t *dev, uint16_t val) mach_log("16-bit bus size swap.\n"); val = (val >> 8) | (val << 8); } - mach_accel_start(mach->accel.cmd_type, 1, 16, val | (val << 16), 0, mach, dev); + mach_accel_start(mach->accel.cmd_type, 1, 16, val | (val << 16), 0, svga, mach, dev); } else - mach_accel_start(mach->accel.cmd_type, 1, 2, -1, val | (val << 16), mach, dev); + mach_accel_start(mach->accel.cmd_type, 1, 2, -1, val | (val << 16), svga, mach, dev); } else - mach_accel_start(mach->accel.cmd_type, 1, 2, -1, val | (val << 16), mach, dev); + mach_accel_start(mach->accel.cmd_type, 1, 2, -1, val | (val << 16), svga, mach, dev); break; default: @@ -2171,7 +2187,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) { mach_t *mach = (mach_t *) priv; svga_t *svga = &mach->svga; - const ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; uint8_t old; uint8_t rs2; uint8_t rs3; @@ -2179,6 +2195,16 @@ 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 ((addr >= 0x3c7) && (addr <= 0x3c9)) { + if (dev->bpp && !(svga->attrregs[0x10] & 0x40)) + addr -= 0xdc; + + 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); + } else if ((addr >= 0x2eb) && (addr <= 0x2ed)) + mach_log("8514/A 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); + } + switch (addr) { case 0x1ce: mach->index = val; @@ -2186,25 +2212,33 @@ mach_out(uint16_t addr, uint8_t val, void *priv) case 0x1cf: old = mach->regs[mach->index]; mach->regs[mach->index] = val; - mach_log("ATI VGA write reg=0x%02X, val=0x%02X\n", mach->index, val); + mach_log("ATI VGA write reg=%02x, val=%02x.\n", mach->index, val); switch (mach->index) { case 0xa3: - if ((old ^ val) & 0x10) + if ((old ^ val) & 0x10) { + mach_log("ATI A3 bit 7.\n"); svga_recalctimings(svga); + } break; case 0xa7: - if ((old ^ val) & 0x80) + if ((old ^ val) & 0x80) { + mach_log("ATI A7 bit 7.\n"); svga_recalctimings(svga); + } break; case 0xad: if ((dev->local & 0xff) >= 0x02) { - if ((old ^ val) & 0x0c) + if ((old ^ val) & 0x0c) { + mach_log("ATI AD bits 2-3.\n"); svga_recalctimings(svga); + } } break; case 0xb0: - if ((old ^ val) & 0x60) + if ((old ^ val) & 0x60) { + mach_log("ATI B0 bits 5-6: old=%02x, val=%02x.\n", old & 0x60, val & 0x60); svga_recalctimings(svga); + } break; case 0xae: case 0xb2: @@ -2232,34 +2266,41 @@ mach_out(uint16_t addr, uint8_t val, void *priv) svga->write_bank = mach->bank_w << 16; if (mach->index == 0xbe) { - if ((old ^ val) & 0x10) + if ((old ^ val) & 0x10) { + mach_log("ATI BE bit 4.\n"); svga_recalctimings(svga); + } } break; case 0xbd: - if ((old ^ val) & 4) { + if ((old ^ val) & 0x04) mach32_updatemapping(mach, svga); - } break; case 0xb3: - ati_eeprom_write(&mach->eeprom, val & 8, val & 2, val & 1); + ati_eeprom_write(&mach->eeprom, val & 0x08, val & 0x02, val & 0x01); break; case 0xb6: - if ((old ^ val) & 0x10) + if ((old ^ val) & 0x10) { + mach_log("ATI B6 bit 4.\n"); svga_recalctimings(svga); + } break; case 0xb8: if ((dev->local & 0xff) >= 0x02) { - if ((old ^ val) & 0x40) + if ((old ^ val) & 0x40) { + mach_log("ATI B8 bit 6.\n"); svga_recalctimings(svga); + } } else { if ((old ^ val) & 0xc0) svga_recalctimings(svga); } break; case 0xb9: - if ((old ^ val) & 2) + if ((old ^ val) & 0x02) { + mach_log("ATI B9 bit 1.\n"); svga_recalctimings(svga); + } break; default: @@ -2274,10 +2315,20 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs2 = !!(mach->accel.ext_ge_config & 0x1000); rs3 = !!(mach->accel.ext_ge_config & 0x2000); if ((dev->local & 0xff) >= 0x02) { + if (addr != 0x2ea) { + if (!(dev->accel.advfunc_cntl & 0x01) && !(mach->accel.clock_sel & 0x01) && ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01))) + dev->on |= 0x01; + } + if (mach->pci_bus && !mach->ramdac_type) - ati68860_ramdac_out((addr & 3) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); + ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); else ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); + + if (addr != 0x2ea) { + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); + } } else svga_out(addr, val, svga); return; @@ -2289,10 +2340,20 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs2 = !!(mach->regs[0xa0] & 0x20); rs3 = !!(mach->regs[0xa0] & 0x40); if ((dev->local & 0xff) >= 0x02) { + if (addr != 0x3C6) { + if (!(dev->accel.advfunc_cntl & 0x01) && ((mach->accel.clock_sel & 0x01) || (svga->attrregs[0x10] & 0x40))) + dev->on &= ~0x01; + } + if (mach->pci_bus && !mach->ramdac_type) - ati68860_ramdac_out((addr & 3) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); + ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); else ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); + + if (addr != 0x3C6) { + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); + } } else svga_out(addr, val, svga); return; @@ -2334,7 +2395,7 @@ mach_in(uint16_t addr, void *priv) { mach_t *mach = (mach_t *) priv; svga_t *svga = &mach->svga; - const ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; uint8_t temp = 0xff; uint8_t rs2; uint8_t rs3; @@ -2342,8 +2403,11 @@ mach_in(uint16_t addr, void *priv) if (((addr & 0xFFF0) == 0x3D0 || (addr & 0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; - if ((addr >= 0x3c6) && (addr <= 0x3c9) && dev->on) + if ((addr >= 0x3c6) && (addr <= 0x3c9)) { addr -= 0xdc; + mach_log("VGA DAC read regs=%03x.\n", addr); + } else if ((addr >= 0x2ea) && (addr <= 0x2ed)) + mach_log("8514/A DAC read regs=%03x.\n", addr); switch (addr) { case 0x1ce: @@ -2419,19 +2483,62 @@ mach_in(uint16_t addr, void *priv) #ifdef ATI_8514_ULTRA -static void +void ati8514_out(uint16_t addr, uint8_t val, void *priv) { + svga_t *svga = (svga_t *)priv; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + mach_log("[%04X:%08X]: ADDON OUT addr=%03x, val=%02x.\n", CS, cpu_state.pc, addr, val); - svga_out(addr, val, priv); + + switch (addr) { + case 0x0102: + dev->pos_regs[2] = val; + mem_mapping_disable(&dev->bios_rom.mapping); + if (dev->pos_regs[2] & 0x01) + mem_mapping_enable(&dev->bios_rom.mapping); + break; + case 0x0103: + dev->pos_regs[3] = val; + dev->bios_addr = 0xc0000 + (((dev->pos_regs[3] >> 1) & 0x7f) << 11); + if (dev->pos_regs[3] & 0x01) + mem_mapping_set_addr(&dev->bios_rom.mapping, dev->bios_addr, 0x2000); + break; + case 0x0104: + case 0x0105: + case 0x0106: + case 0x0107: + dev->pos_regs[addr & 7] = val; + break; + default: + svga_out(addr, val, priv); + break; + } } -static uint8_t +uint8_t ati8514_in(uint16_t addr, void *priv) { + svga_t *svga = (svga_t *)priv; + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; uint8_t temp = 0xff; - temp = svga_in(addr, priv); + switch (addr) { + case 0x0100: + case 0x0101: + case 0x0102: + case 0x0103: + case 0x0104: + case 0x0105: + case 0x0106: + case 0x0107: + temp = dev->pos_regs[addr & 7]; + break; + default: + temp = svga_in(addr, priv); + break; + + } mach_log("[%04X:%08X]: ADDON IN addr=%03x, temp=%02x.\n", CS, cpu_state.pc, addr, temp); return temp; @@ -2446,6 +2553,8 @@ ati8514_recalctimings(svga_t *svga) mach_log("ON=%d, vgahdisp=%d.\n", dev->on, svga->hdisp); if (dev->on) { mach_log("8514/A ON.\n"); + dev->pitch = dev->ext_pitch; + dev->rowoffset = dev->ext_crt_pitch; dev->h_total = dev->htotal + 1; dev->rowcount = !!(dev->disp_cntl & 0x08); dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); @@ -2453,13 +2562,13 @@ ati8514_recalctimings(svga_t *svga) mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0xfe); - if (dev->hdisp) { + if (mach->accel.clock_sel & 0x01) { dev->h_disp = dev->hdisp; dev->dispend = dev->vdisp; } else { if (dev->accel.advfunc_cntl & 0x04) { - dev->h_disp = 1024; - dev->dispend = 768; + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; } else { dev->h_disp = 640; dev->dispend = 480; @@ -2474,17 +2583,6 @@ ati8514_recalctimings(svga_t *svga) if (dev->interlace) dev->dispend >>= 1; - if (dev->dispend == 766) - dev->dispend += 2; - - if (dev->dispend == 598) - dev->dispend += 2; - - if (dev->dispend == 478) - dev->dispend += 2; - - dev->pitch = dev->ext_pitch; - dev->rowoffset = dev->ext_crt_pitch; 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); svga->map8 = dev->pallook; if (dev->vram_512k_8514) { @@ -2498,14 +2596,6 @@ ati8514_recalctimings(svga_t *svga) } dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; - } else { - if (!(svga->gdcreg[6] & 1) && !(svga->attrregs[0x10] & 1)) { /*Text mode*/ - if (svga->seqregs[1] & 8) { /*40 column*/ - svga->render = svga_render_text_40; - } else { - svga->render = svga_render_text_80; - } - } } } #endif @@ -2541,11 +2631,9 @@ mach_recalctimings(svga_t *svga) svga->htotal <<= 1; svga->dots_per_clock <<= 1; svga->rowoffset <<= 1; - svga->gdcreg[5] &= ~0x40; } if (mach->regs[0xb0] & 0x20) { - svga->gdcreg[5] |= 0x40; if ((mach->regs[0xb6] & 0x18) >= 0x10) svga->packed_4bpp = 1; else @@ -2554,7 +2642,7 @@ mach_recalctimings(svga_t *svga) svga->packed_4bpp = 0; if ((dev->local & 0xff) < 0x02) { - if ((mach->regs[0xb6] & 0x18) == 8) { + if ((mach->regs[0xb6] & 0x18) == 0x08) { svga->hdisp <<= 1; svga->htotal <<= 1; svga->dots_per_clock <<= 1; @@ -2563,8 +2651,7 @@ mach_recalctimings(svga_t *svga) svga->ati_4color = 0; } - svga->render8514 = ibm8514_render_blank; - mach_log("ON?=%d.\n", dev->on); + mach_log("ON?=%d, override=%d.\n", dev->on, svga->override); if (dev->on) { mach_log("8514/A ON, extpitch=%d, devma=%x, vgamalatch=%x.\n", dev->ext_pitch, dev->ma, svga->ma_latch); dev->pitch = dev->ext_pitch; @@ -2576,7 +2663,7 @@ mach_recalctimings(svga_t *svga) 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, mach->accel.clock_sel & 0xfe, dev->interlace); if ((dev->local & 0xff) >= 0x02) { - if (dev->bpp || (dev->accel_bpp >= 24) || (mach->accel.clock_sel & 0x01)) { + if (dev->bpp || ((mach->accel.ext_ge_config & 0x30) == 0x30) || (mach->accel.clock_sel & 0x01)) { dev->h_disp = dev->hdisp; dev->dispend = dev->vdisp; } else { @@ -2647,6 +2734,8 @@ mach_recalctimings(svga_t *svga) } dev->accel_bpp = 8; } + + svga->render8514 = ibm8514_render_blank; mach_log("hv(%d,%d), pitch=%d, rowoffset=%d, gextconfig=%03x, bpp=%d, shadow=%x, vgahdisp=%d.\n", 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); switch (dev->accel_bpp) { case 8: @@ -2678,8 +2767,8 @@ mach_recalctimings(svga_t *svga) } } } else { + svga->render8514 = ibm8514_render_blank; 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); - svga->map8 = dev->pallook; if (dev->vram_512k_8514) { if (dev->h_disp == 640) { dev->ext_pitch = 640; @@ -2691,67 +2780,47 @@ mach_recalctimings(svga_t *svga) } dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; + goto mach8_vga_modes; } - } + } else { +mach8_vga_modes: + if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { + mach_log("GDCREG5=%02x, ATTR10=%02x, ATI B0 bit 5=%02x, ON=%d.\n", svga->gdcreg[5] & 0x60, svga->attrregs[0x10] & 0x40, mach->regs[0xb0] & 0x20, dev->on); + if ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) { + 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 (mach->regs[0xb8] & 0x40) + svga->clock *= 2; + } else { + switch (mach->regs[0xb8] & 0xc0) { + case 0x40: + svga->clock *= 2; + break; + case 0x80: + svga->clock *= 3; + break; + case 0xc0: + svga->clock *= 4; + break; - if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { - if (((svga->gdcreg[6] & 1) || (svga->attrregs[0x10] & 1))) { - 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 (mach->regs[0xb8] & 0x40) - svga->clock *= 2; - } else { - switch (mach->regs[0xb8] & 0xc0) { - case 0x40: - svga->clock *= 2; - break; - case 0x80: - svga->clock *= 3; - break; - case 0xc0: - svga->clock *= 4; - break; - - default: - break; - } - } - switch (svga->gdcreg[5] & 0x60) { - case 0x00: - if (svga->seqregs[1] & 8) /*Low res (320)*/ - svga->render = svga_render_4bpp_lowres; - else - svga->render = svga_render_4bpp_highres; - break; - case 0x20: /*4 colours*/ - if (svga->seqregs[1] & 8) /*Low res (320)*/ - svga->render = svga_render_2bpp_lowres; - else - svga->render = svga_render_2bpp_highres; - break; - case 0x40: - case 0x60: /*256+ colours*/ - switch (svga->bpp) { - default: - case 8: - svga->map8 = svga->pallook; - mach_log("Lowres=%x, seqreg[1]bit3=%x.\n", svga->lowres, svga->seqregs[1] & 8); - if (svga->lowres) - svga->render = svga_render_8bpp_lowres; - else { - svga->render = svga_render_8bpp_highres; - if (!svga->packed_4bpp) { - svga->ma_latch <<= 1; - svga->rowoffset <<= 1; - } - } - break; + default: + break; + } } - break; - - default: - break; + svga->map8 = svga->pallook; + mach_log("Lowres=%x, seqreg[1]bit3=%x.\n", svga->lowres, svga->seqregs[1] & 8); + if (svga->lowres) + svga->render = svga_render_8bpp_lowres; + else { + svga->render = svga_render_8bpp_highres; + if (!svga->packed_4bpp) { + svga->ma_latch <<= 1; + svga->rowoffset <<= 1; + } + } + } } } } @@ -2769,7 +2838,6 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u switch (port) { case 0x82e8: case 0x86e8: - case 0x86e9: case 0xc2e8: case 0xc6e8: ibm8514_accel_out_fifo(svga, port, val, len); @@ -2825,11 +2893,12 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if (len == 2) { if (dev->accel.cmd_back) { dev->accel.bkgd_color = val; + mach_log("CMDBack BKGDCOLOR, sy=%d, height=%d, val=%04x.\n", dev->accel.sy, mach->accel.height, val); } else { if (mach->accel.cmd_type >= 0) { if (mach_pixel_read(mach)) break; - mach_accel_out_pixtrans(mach, dev, val); + mach_accel_out_pixtrans(svga, mach, dev, val); } else { if (ibm8514_cpu_dest(svga)) break; @@ -2853,13 +2922,13 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xe6e8: if (port == 0xe6e8) { if (len == 2) { - if (dev->accel.cmd_back) { + if (dev->accel.cmd_back) dev->accel.frgd_color = val; - } else { + else { if (mach->accel.cmd_type >= 0) { if (mach_pixel_read(mach)) break; - mach_accel_out_pixtrans(mach, dev, val); + mach_accel_out_pixtrans(svga, mach, dev, val); } else { if (ibm8514_cpu_dest(svga)) break; @@ -2895,23 +2964,23 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u 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, mach, dev); + 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), mach, dev); + 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), mach, dev); + 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, mach, dev); + 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, mach, dev); + 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), mach, dev); + 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), mach, dev); + 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; default: @@ -2919,22 +2988,17 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u } } } + mach_log("Write Port=%04x, Busy=%02x.\n", port, dev->force_busy2); break; case 0xaae8: - case 0xaae9: case 0xaee8: - case 0xaee9: case 0xb2e8: - case 0xb2e9: case 0xb6e8: case 0xbae8: case 0xeae8: - case 0xeae9: case 0xeee8: - case 0xeee9: case 0xf2e8: - case 0xf2e9: case 0xf6e8: case 0xfae8: ibm8514_accel_out_fifo(svga, port, val, len); @@ -2983,10 +3047,18 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u if (len == 2) { mach->accel.bres_count = val & 0x7ff; mach_log("BresenhamDraw=%04x.\n", mach->accel.dp_config); - dev->data_available = 0; + dev->data_available = 0; dev->data_available2 = 0; mach->accel.cmd_type = 1; - mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); + frgd_sel = (mach->accel.dp_config >> 13) & 7; + bkgd_sel = (mach->accel.dp_config >> 7) & 3; + mono_src = (mach->accel.dp_config >> 5) & 3; + + dev->accel.cmd_back = 1; + if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) + dev->accel.cmd_back = 0; + + mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, svga, mach, dev); } break; @@ -2998,10 +3070,10 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_log("Line OPT=%04x.\n", val); if (len == 2) { mach->accel.linedraw_opt = val; - mach->accel.bbottom = dev->accel.multifunc[3]; - mach->accel.btop = dev->accel.multifunc[1]; - mach->accel.bleft = dev->accel.multifunc[2]; - mach->accel.bright = dev->accel.multifunc[4]; + mach->accel.bbottom = dev->accel.clip_bottom; + mach->accel.btop = dev->accel.clip_top; + mach->accel.bleft = dev->accel.clip_left; + mach->accel.bright = dev->accel.clip_right; if (mach->accel.linedraw_opt & 0x100) { mach->accel.bbottom = 2047; mach->accel.btop = 0; @@ -3033,7 +3105,16 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach_log("BitBLT=%04x.\n", mach->accel.dp_config); mach_log(".\n"); mach->accel.cmd_type = 2; /*Non-conforming BitBLT from dest_y_end register (0xaeee)*/ - mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); + + frgd_sel = (mach->accel.dp_config >> 13) & 7; + bkgd_sel = (mach->accel.dp_config >> 7) & 3; + mono_src = (mach->accel.dp_config >> 5) & 3; + + dev->accel.cmd_back = 1; + if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) + dev->accel.cmd_back = 0; + + mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, svga, mach, dev); } break; @@ -3060,8 +3141,17 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xc6ee: - mach->accel.cmd_type = 0; - mach_log("TODO: Short Stroke.\n"); + if (len == 2) { + mach->accel.cmd_type = 0; + mach_log("TODO: Short Stroke.\n"); + frgd_sel = (mach->accel.dp_config >> 13) & 7; + bkgd_sel = (mach->accel.dp_config >> 7) & 3; + mono_src = (mach->accel.dp_config >> 5) & 3; + + dev->accel.cmd_back = 1; + if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) + dev->accel.cmd_back = 0; + } break; case 0xcaee: @@ -3076,7 +3166,16 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach->accel.cmd_type = 5; /*Horizontal Raster Draw from scan_to_x register (0xcaee)*/ mach_log("ScanToX=%04x.\n", mach->accel.dp_config); mach_log(".\n"); - mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); + + frgd_sel = (mach->accel.dp_config >> 13) & 7; + bkgd_sel = (mach->accel.dp_config >> 7) & 3; + mono_src = (mach->accel.dp_config >> 5) & 3; + + dev->accel.cmd_back = 1; + if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) + dev->accel.cmd_back = 0; + + mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, svga, mach, dev); } break; @@ -3105,43 +3204,44 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xdaee: - mach_log("DAEE (extclipl) write val = %d\n", val & 0x7ff); if (len == 2) { dev->accel.multifunc[2] = val & 0x7ff; dev->accel.clip_left = dev->accel.multifunc[2]; if (val & 0x800) dev->accel.clip_left |= ~0x7ff; } + mach_log("DAEE (extclipl) write val=%d, left=%d.\n", val, dev->accel.clip_left); break; case 0xdeee: - mach_log("DEEE (extclipt) write val = %d\n", val & 0x7ff); if (len == 2) { dev->accel.multifunc[1] = val & 0x7ff; dev->accel.clip_top = dev->accel.multifunc[1]; - if (val & 0x800) + if (val & 0x800) { dev->accel.clip_top |= ~0x7ff; + } } + mach_log("DEEE (extclipt) write val = %d\n", val); break; case 0xe2ee: - mach_log("E2EE (extclipr) write val = %d\n", val & 0x7ff); if (len == 2) { dev->accel.multifunc[4] = val & 0x7ff; dev->accel.clip_right = dev->accel.multifunc[4]; if (val & 0x800) dev->accel.clip_right |= ~0x7ff; } + mach_log("E2EE (extclipr) write val = %d\n", val); break; case 0xe6ee: - mach_log("E6EE (extclipb) write val = %d\n", val & 0x7ff); if (len == 2) { dev->accel.multifunc[3] = val & 0x7ff; dev->accel.clip_bottom = dev->accel.multifunc[3]; if (val & 0x800) dev->accel.clip_bottom |= ~0x7ff; } + mach_log("E6EE (extclipb) write val = %d\n", val); break; case 0xeeee: @@ -3165,7 +3265,15 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u mach->accel.cy_end_line = mach->accel.line_array[3]; if ((mach->accel.line_idx == 3) || (mach->accel.line_idx == 5)) { mach->accel.cmd_type = (mach->accel.line_idx == 5) ? 4 : 3; - mach_accel_start(mach->accel.cmd_type, 0, -1, -1, 0, mach, dev); + frgd_sel = (mach->accel.dp_config >> 13) & 7; + bkgd_sel = (mach->accel.dp_config >> 7) & 3; + mono_src = (mach->accel.dp_config >> 5) & 3; + + dev->accel.cmd_back = 1; + if ((mono_src == 2) || (bkgd_sel == 2) || (frgd_sel == 2) || mach_pixel_read(mach)) + dev->accel.cmd_back = 0; + + 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; break; } @@ -3275,24 +3383,28 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 dev->interlace = !!(dev->disp_cntl & 0x10); } } - mach_log("ATI 8514/A: DISP_CNTL write %04x=%02x, interlace=%d.\n", port, dev->disp_cntl, dev->interlace); + mach_log("ATI 8514/A: DISP_CNTL write %04x=%02x, written=%02x, interlace=%d.\n", port, val & 0x70, dev->disp_cntl & 0x70, dev->interlace); svga_recalctimings(svga); break; case 0x4ae8: dev->accel.advfunc_cntl = val; - mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, dev->accel.advfunc_cntl & 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.\n", CS, cpu_state.pc, port, val & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); - if ((dev->local & 0xff) < 0x02) + if ((dev->local & 0xff) < 0x02) { dev->ext_crt_pitch = 128; - break; - case 0x4ae9: - dev->on = dev->accel.advfunc_cntl & 0x01; - vga_on = !dev->on; - mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, dev->accel.advfunc_cntl & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); + dev->on = dev->accel.advfunc_cntl & 0x01; + svga_recalctimings(svga); + } else { + dev->on = (dev->accel.advfunc_cntl & 0x01) | (mach->accel.clock_sel & 0x01); + if (!dev->on && dev->vendor_mode) { + dev->on |= 0x01; + dev->vendor_mode = 0; + } + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); + } mach_log("Vendor IBM mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); - - svga_recalctimings(svga); break; /*ATI Mach8/32 specific registers*/ @@ -3371,8 +3483,16 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 else dev->ext_crt_pitch <<= 1; } + if ((dev->local & 0xff) >= 0x02) { + dev->vendor_mode = 1; + dev->on = (dev->accel.advfunc_cntl & 0x01) | (mach->accel.clock_sel & 0x01); + if (!dev->on) + dev->on |= 0x01; + + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); + } mach_log("ATI 8514/A: (0x%04x) val=0x%02x.\n", port, val); - svga_recalctimings(svga); break; case 0x32ee: @@ -3404,7 +3524,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x42ee: case 0x42ef: - mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val); + mach_log("ATI 8514/A: (0x%04x) val=%04x.\n", port, val); WRITE8(port, mach->accel.test2, val); break; @@ -3418,16 +3538,20 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x4aee: case 0x4aef: WRITE8(port, mach->accel.clock_sel, val); - if (port & 1) + if ((dev->local & 0xff) < 0x02) { dev->on = mach->accel.clock_sel & 0x01; - - mach_log("ATI 8514/A: (0x%04x): ON=%d, val=%04x, hdisp=%d, vdisp=%d, val=0x%02x.\n", port, dev->on, val, dev->hdisp, dev->vdisp, val & 0xfe); - if (!(port & 1)) - mach_log("Vendor ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); - - vga_on = !dev->on; - svga_recalctimings(svga); - mach32_updatemapping(mach, svga); + svga_recalctimings(svga); + } else { + dev->on = (dev->accel.advfunc_cntl & 0x01) | (mach->accel.clock_sel & 0x01); + if (!dev->on && dev->vendor_mode) { + dev->on |= 0x01; + dev->vendor_mode = 0; + } + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); + } + mach_log("ATI 8514/A: (0x%04x): ON=%d, val=%04x, hdisp=%d, vdisp=%d.\n", port, mach->accel.clock_sel & 0x01, val, dev->hdisp, dev->vdisp); + mach_log("Vendor ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); break; case 0x52ee: @@ -3479,9 +3603,8 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 WRITE8(port, mach->accel.max_waitstates, val); mach->override_resolution = !!(mach->accel.max_waitstates & 0x400); mach_log("Override=%d.\n", mach->override_resolution); - if (mach->override_resolution) { - dev->on = 1; - vga_on = !dev->on; + if (mach->override_resolution && ((dev->local & 0xff) < 0x02)) { + dev->on |= 0x01; svga_recalctimings(svga); mach32_updatemapping(mach, svga); } @@ -3492,7 +3615,6 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 WRITE8(port, mach->accel.ge_offset_lo, val); svga_recalctimings(svga); mach_log("ATI 8514/A: (0x%04x) val=0x%02x, geoffset=%04x.\n", port, val, dev->accel.ge_offset); - mach32_updatemapping(mach, svga); break; case 0x72ee: @@ -3500,7 +3622,6 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 WRITE8(port, mach->accel.ge_offset_hi, val); svga_recalctimings(svga); mach_log("ATI 8514/A: (0x%04x) val=0x%02x, geoffset=%04x.\n", port, val, dev->accel.ge_offset); - mach32_updatemapping(mach, svga); break; case 0x76ee: @@ -3509,7 +3630,6 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 dev->ext_pitch = ((mach->accel.ge_pitch & 0xff) << 3); mach_log("ATI 8514/A: (0x%04x) val=0x%02x, extpitch=%d.\n", port, val, dev->ext_pitch); svga_recalctimings(svga); - mach32_updatemapping(mach, svga); break; case 0x7aee: @@ -3542,10 +3662,9 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 svga_set_ramdac_type(svga, !!(mach->accel.ext_ge_config & 0x4000)); mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val); svga_recalctimings(svga); - mach32_updatemapping(mach, svga); } else { mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val & 0x30); - ati_eeprom_write(&mach->eeprom, !!(mach->accel.ext_ge_config & 0x4040), !!(mach->accel.ext_ge_config & 0x2020), !!(mach->accel.ext_ge_config & 0x1010)); + ati_eeprom_write(&mach->eeprom, !!(mach->accel.ext_ge_config & 0x4000), !!(mach->accel.ext_ge_config & 0x2000), !!(mach->accel.ext_ge_config & 0x1000)); } break; @@ -3553,7 +3672,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x7eef: WRITE8(port, mach->accel.eeprom_control, val); ati_eeprom_write(&mach->eeprom, !!(mach->accel.eeprom_control & 8), !!(mach->accel.eeprom_control & 2), !!(mach->accel.eeprom_control & 1)); - mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val); + mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val); break; default: @@ -3670,7 +3789,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in } else { READ_PIXTRANS_WORD(dev->accel.dx, 0) } - mach_accel_out_pixtrans(mach, dev, temp); + mach_accel_out_pixtrans(svga, mach, dev, temp); } } } else { @@ -3714,23 +3833,23 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in 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, mach, dev); + 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), mach, dev); + 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), mach, dev); + 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, mach, dev); + 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, mach, dev); + 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), mach, dev); + 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), mach, dev); + 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; default: @@ -3861,14 +3980,16 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in break; case 0xceee: + mach_log("CEEE read=%d.\n", len); if (len == 1) temp = dev->vc & 0xff; else temp = dev->vc & 0x7ff; break; case 0xceef: + mach_log("CEEF read=%d.\n", len); if (len == 1) - temp = (dev->vc >> 8) & 7; + temp = (dev->vc >> 8) & 0x07; break; case 0xdaee: @@ -3895,8 +4016,10 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in temp = mach->accel.src_y & 0xff; break; case 0xdeef: - if (len == 1) - temp = mach->accel.src_y >> 8; + if (len == 1) { + if ((dev->local & 0xff) >= 0x02) + temp = mach->accel.src_y >> 8; + } break; case 0xfaee: @@ -3941,6 +4064,13 @@ static uint8_t mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) { uint8_t temp = 0; + int16_t clip_t = dev->accel.clip_top; + int16_t clip_l = dev->accel.clip_left; + int16_t clip_b = dev->accel.clip_bottom; + int16_t clip_r = dev->accel.clip_right; + uint16_t clip_b_ibm = dev->accel.clip_bottom; + uint16_t clip_r_ibm = dev->accel.clip_right; + int cmd = dev->accel.cmd >> 13; switch (port) { case 0x2e8: @@ -3956,7 +4086,45 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) case 0x42e8: case 0x42e9: if (dev->vc == dev->v_syncstart) - dev->subsys_stat |= 1; + dev->subsys_stat |= 0x01; + + if (mach->accel.cmd_type == -1) { + if (cmd == 6) { + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r_ibm) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b_ibm)) + dev->subsys_stat |= 0x02; + } else { + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r_ibm) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b_ibm)) + dev->subsys_stat |= 0x02; + } + } else { + switch (mach->accel.cmd_type) { + case 1: + case 2: + case 5: + if ((dev->accel.dx >= clip_l) && + (dev->accel.dx <= clip_r) && + (dev->accel.dy >= clip_t) && + (dev->accel.dy <= clip_b)) + dev->subsys_stat |= 0x02; + break; + case 3: + case 4: + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) + dev->subsys_stat |= 0x02; + break; + default: + break; + } + } if (port & 1) temp = dev->vram_512k_8514 ? 0x00 : 0x80; @@ -4037,6 +4205,16 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) case 0x52ee: case 0x52ef: READ8(port, mach->accel.scratch0); +#ifdef ATI_8514_ULTRA + if (dev->extensions && ((dev->local & 0xff) == 0x00)) { + if (mach->mca_bus) { + if (port & 1) + temp = dev->pos_regs[5]; + else + temp = dev->pos_regs[4]; + } + } +#endif break; case 0x56ee: @@ -4380,7 +4558,6 @@ mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t } addr &= dev->vram_mask; - dev->changedvram[addr >> 12] = svga->monitor->mon_changeframecount; switch (svga->writemode) { @@ -4467,36 +4644,6 @@ mach32_write_common(uint32_t addr, uint8_t val, int linear, mach_t *mach, svga_t svga->gdcreg[8] = wm; } -#ifdef ATI_8514_ULTRA -static void -ati8514_write(uint32_t addr, uint8_t val, void *priv) -{ - svga_t *svga = (svga_t *) priv; - mach_t *mach = (mach_t *) svga->ext8514; - mach32_write_common(addr, val, 0, mach, svga); -} - -static void -ati8514_writew(uint32_t addr, uint16_t val, void *priv) -{ - svga_t *svga = (svga_t *) priv; - mach_t *mach = (mach_t *) svga->ext8514; - mach32_write_common(addr, val & 0xff, 0, mach, svga); - mach32_write_common(addr + 1, val >> 8, 0, mach, svga); -} - -static void -ati8514_writel(uint32_t addr, uint32_t val, void *priv) -{ - svga_t *svga = (svga_t *) priv; - mach_t *mach = (mach_t *) svga->ext8514; - mach32_write_common(addr, val & 0xff, 0, mach, svga); - mach32_write_common(addr + 1, val >> 8, 0, mach, svga); - mach32_write_common(addr + 2, val >> 16, 0, mach, svga); - mach32_write_common(addr + 3, val >> 24, 0, mach, svga); -} -#endif - static void mach32_write(uint32_t addr, uint8_t val, void *priv) { @@ -4710,6 +4857,8 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) latch_addr = (addr & dev->vram_mask) & ~3; for (uint8_t i = 0; i < count; i++) dev->latch.b[i] = dev->vram[latch_addr | i]; + + mach_log("Read (normal) addr=%06x, ret=%02x.\n", addr, dev->vram[addr & dev->vram_mask]); return dev->vram[addr & dev->vram_mask]; } @@ -4734,7 +4883,6 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) addr &= dev->vram_mask; - mach_log("ReadMode=%02x.\n", svga->readmode); if (svga->readmode) { temp = 0xff; @@ -4752,48 +4900,10 @@ mach32_read_common(uint32_t addr, int linear, mach_t *mach, svga_t *svga) } else ret = dev->vram[addr | readplane]; + mach_log("ReadMode=%02x, addr=%06x, ret=%02x.\n", svga->readmode, addr, ret); return ret; } -#ifdef ATI_8514_ULTRA -static uint8_t -ati8514_read(uint32_t addr, void *priv) -{ - svga_t *svga = (svga_t *) priv; - mach_t *mach = (mach_t *) svga->ext8514; - uint8_t ret; - - ret = mach32_read_common(addr, 0, mach, svga); - return ret; -} - -static uint16_t -ati8514_readw(uint32_t addr, void *priv) -{ - svga_t *svga = (svga_t *) priv; - mach_t *mach = (mach_t *) svga->ext8514; - uint16_t ret; - - ret = mach32_read_common(addr, 0, mach, svga); - ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 8); - return ret; -} - -static uint32_t -ati8514_readl(uint32_t addr, void *priv) -{ - svga_t *svga = (svga_t *) priv; - mach_t *mach = (mach_t *) svga->ext8514; - uint32_t ret; - - ret = mach32_read_common(addr, 0, mach, svga); - ret |= (mach32_read_common(addr + 1, 0, mach, svga) << 8); - ret |= (mach32_read_common(addr + 2, 0, mach, svga) << 16); - ret |= (mach32_read_common(addr + 3, 0, mach, svga) << 24); - return ret; -} -#endif - static uint8_t mach32_read(uint32_t addr, void *priv) { @@ -4927,7 +5037,6 @@ mach32_readl_linear(uint32_t addr, mach_t *mach) uint32_t ret; cycles -= svga->monitor->mon_video_timing_read_l; - if (!dev->vram_512k_8514 && ((mach->accel.ext_ge_config & 0x30) == 0x00)) { addr <<= 1; addr &= dev->vram_mask; @@ -5115,6 +5224,7 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) ibm8514_t *dev = (ibm8514_t *) svga->dev8514; if (mach->pci_bus && (!(mach->pci_regs[PCI_REG_COMMAND] & PCI_COMMAND_MEM))) { + mach_log("No Mapping.\n"); mem_mapping_disable(&svga->mapping); mem_mapping_disable(&mach->mmio_linear_mapping); return; @@ -5165,17 +5275,15 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) mach_log("Linear Disabled APSIZE=4.\n"); mem_mapping_disable(&mach->mmio_linear_mapping); } - if (dev->on && ((dev->local & 0xff) >= 0x02)) { - mach_log("Mach32 banked mapping.\n"); -#ifdef ATI_8514_ULTRA - if (svga->ext8514 != NULL) { - mem_mapping_set_handler(&svga->mapping, ati8514_read, ati8514_readw, ati8514_readl, ati8514_write, ati8514_writew, ati8514_writel); - mem_mapping_set_p(&svga->mapping, svga); - } else -#endif - { + if ((dev->local & 0xff) >= 0x02) { + if (dev->on) { + mach_log("Mach32 banked mapping.\n"); mem_mapping_set_handler(&svga->mapping, mach32_read, mach32_readw, mach32_readl, mach32_write, mach32_writew, mach32_writel); mem_mapping_set_p(&svga->mapping, mach); + } else { + mach_log("IBM compatible banked mapping.\n"); + mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel); + mem_mapping_set_p(&svga->mapping, svga); } } else { mach_log("IBM compatible banked mapping.\n"); @@ -5191,13 +5299,15 @@ mach32_hwcursor_draw(svga_t *svga, int displine) ibm8514_t *dev = (ibm8514_t *) svga->dev8514; uint16_t dat; int comb; - int offset = dev->hwcursor_latch.x - dev->hwcursor_latch.xoff; + int offset; uint32_t color0; uint32_t color1; uint32_t *p; int x_pos; int y_pos; + offset = dev->hwcursor_latch.x - dev->hwcursor_latch.xoff; + mach_log("BPP=%d, displine=%d.\n", dev->accel_bpp, displine); switch (dev->accel_bpp) { default: @@ -5255,6 +5365,7 @@ mach32_hwcursor_draw(svga_t *svga, int displine) } dev->hwcursor_latch.addr += 2; } + if (dev->interlace && !dev->hwcursor_oddeven) dev->hwcursor_latch.addr += 16; } @@ -5263,7 +5374,6 @@ mach32_hwcursor_draw(svga_t *svga, int displine) static void ati8514_io_set(svga_t *svga) { - io_sethandler(0x2e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x6e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xae8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xee8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); @@ -5275,7 +5385,6 @@ ati8514_io_set(svga_t *svga) io_sethandler(0x26e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x2ee8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x42e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); - io_sethandler(0x46e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x4ae8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x52e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x56e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); @@ -5539,7 +5648,6 @@ mach_mca_reset(void *priv) mach_log("MCA reset.\n"); dev->on = 0; - vga_on = 1; mach_mca_write(0x102, 0, mach); timer_set_callback(&svga->timer, svga_poll); } @@ -5900,22 +6008,22 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) dev->ext_crt_pitch = 0x80; dev->accel_bpp = 8; dev->rowoffset = 0x80; - dev->hdisp = 0; - dev->vdisp = 0; + dev->hdisp = 1024; + dev->vdisp = 768; io_sethandler(0x02ea, 4, ati8514_in, NULL, NULL, ati8514_out, NULL, NULL, svga); ati8514_io_set(svga); mach->mca_bus = !!(dev->type & DEVICE_MCA); + mach->config1 = 0x01 | 0x02 | 0x08 | 0x80; + if (mach->mca_bus) - mach->config1 = 0x02 | 0x04; - else - mach->config1 = 0x02 | 0x2000; + mach->config1 |= 0x04; if (dev->vram_amount >= 1024) mach->config1 |= 0x20; - mach->config2 = 0x01 | 0x02; + mach->config2 = 0x02; } #endif diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index 32776f1eb..e192ecd49 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -58,7 +58,6 @@ uint8_t svga_rotate[8][256]; /*Primary SVGA device. As multiple video cards are not yet supported this is the only SVGA device.*/ static svga_t *svga_pri; -int vga_on; #ifdef ENABLE_SVGA_LOG int svga_do_log = ENABLE_SVGA_LOG; @@ -87,10 +86,24 @@ svga_get_pri(void) void svga_set_override(svga_t *svga, int val) { + ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + if (svga->override && !val) svga->fullchange = svga->monitor->mon_changeframecount; svga->override = val; + svga_log("Override=%x.\n", val); + if (ibm8514_active && (svga->dev8514 != NULL)) { + if (dev->on) { + if (svga->override) + timer_set_callback(&svga->timer, svga_poll); + else + timer_set_callback(&svga->timer, ibm8514_poll); + } else + timer_set_callback(&svga->timer, svga_poll); + } else + timer_set_callback(&svga->timer, svga_poll); + #ifdef OVERRIDE_OVERSCAN if (!val) { /* Override turned off, restore overscan X and Y per the CRTC. */ @@ -119,11 +132,10 @@ svga_out(uint16_t addr, uint8_t val, void *priv) uint8_t index; uint8_t pal4to16[16] = { 0, 7, 0x38, 0x3f, 0, 3, 4, 0x3f, 0, 2, 4, 0x3e, 0, 3, 5, 0x3f }; - if (!dev && (addr >= 0x2ea) && (addr <= 0x2ed)) - return; - - if (addr >= 0x3c6 && addr <= 0x3c9) - svga_log("VGA OUT addr=%03x, val=%02x.\n", addr, val); + if ((addr >= 0x2ea) && (addr <= 0x2ed)) { + if (!dev) + return; + } switch (addr) { case 0x2ea: @@ -172,6 +184,7 @@ svga_out(uint16_t addr, uint8_t val, void *priv) if ((val & 0x20) != svga->attr_palette_enable) { svga->fullchange = 3; svga->attr_palette_enable = val & 0x20; + svga_log("Write Port %03x palette enable=%02x.\n", addr, svga->attr_palette_enable); svga_recalctimings(svga); } } else { @@ -196,12 +209,16 @@ svga_out(uint16_t addr, uint8_t val, void *priv) /* Recalculate timings on change of attribute register 0x11 (overscan border color) too. */ if (svga->attraddr == 0x10) { - if (o != val) + if (o != val) { + svga_log("ATTR10.\n"); svga_recalctimings(svga); + } } else if (svga->attraddr == 0x11) { svga->overscan_color = svga->pallook[svga->attrregs[0x11]]; - if (o != val) + if (o != val) { + svga_log("ATTR11.\n"); svga_recalctimings(svga); + } } else if (svga->attraddr == 0x12) { if ((val & 0xf) != svga->plane_mask) svga->fullchange = svga->monitor->mon_changeframecount; @@ -224,8 +241,7 @@ svga_out(uint16_t addr, uint8_t val, void *priv) if (ibm8514_active && dev) dev->on = (val & 0x01) ? 0 : 1; - svga_log("3C3: VGA ON = %d.\n", val & 0x01); - vga_on = val & 0x01; + svga_log("Write Port 3C3.\n"); svga_recalctimings(svga); break; case 0x3c4: @@ -236,13 +252,16 @@ svga_out(uint16_t addr, uint8_t val, void *priv) return; o = svga->seqregs[svga->seqaddr & 0xf]; svga->seqregs[svga->seqaddr & 0xf] = val; - if (o != val && (svga->seqaddr & 0xf) == 1) + if (o != val && (svga->seqaddr & 0xf) == 1) { + svga_log("SEQADDR1 write1.\n"); svga_recalctimings(svga); + } switch (svga->seqaddr & 0xf) { case 1: if (svga->scrblank && !(val & 0x20)) svga->fullchange = 3; svga->scrblank = (svga->scrblank & ~0x20) | (val & 0x20); + svga_log("SEQADDR1 write2.\n"); svga_recalctimings(svga); break; case 2: @@ -273,7 +292,7 @@ svga_out(uint16_t addr, uint8_t val, void *priv) case 0x3c8: svga->dac_pos = 0; svga->dac_status = addr & 0x03; - svga->dac_addr = (val + (addr & 0x01)) & 255; + svga->dac_addr = (val + (addr & 0x01)) & 0xff; break; case 0x3c9: if (svga->adv_flags & FLAG_RAMDAC_SHIFT) @@ -289,7 +308,7 @@ svga_out(uint16_t addr, uint8_t val, void *priv) svga->dac_pos++; break; case 2: - index = svga->dac_addr & 255; + index = svga->dac_addr & 0xff; svga->dac_b = val; svga->vgapal[index].r = svga->dac_r; svga->vgapal[index].g = svga->dac_g; @@ -299,7 +318,7 @@ svga_out(uint16_t addr, uint8_t val, void *priv) else svga->pallook[index] = makecol32(video_6to8[svga->vgapal[index].r & 0x3f], video_6to8[svga->vgapal[index].g & 0x3f], video_6to8[svga->vgapal[index].b & 0x3f]); svga->dac_pos = 0; - svga->dac_addr = (svga->dac_addr + 1) & 255; + svga->dac_addr = (svga->dac_addr + 1) & 0xff; break; default: @@ -357,8 +376,10 @@ svga_out(uint16_t addr, uint8_t val, void *priv) } svga->gdcreg[svga->gdcaddr & 15] = val; svga->fast = (svga->gdcreg[8] == 0xff && !(svga->gdcreg[3] & 0x18) && !svga->gdcreg[1]) && ((svga->chain4 && (svga->packed_chain4 || svga->force_old_addr)) || svga->fb_only); - if (((svga->gdcaddr & 15) == 5 && (val ^ o) & 0x70) || ((svga->gdcaddr & 15) == 6 && (val ^ o) & 1)) + if (((svga->gdcaddr & 15) == 5 && (val ^ o) & 0x70) || ((svga->gdcaddr & 15) == 6 && (val ^ o) & 1)) { + svga_log("GDCADDR%02x recalc.\n", svga->gdcaddr & 0x0f); svga_recalctimings(svga); + } break; case 0x3da: svga->fcr = val; @@ -374,11 +395,14 @@ svga_in(uint16_t addr, void *priv) { svga_t *svga = (svga_t *) priv; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; + xga_t *xga = (xga_t *) svga->xga; uint8_t index; uint8_t ret = 0xff; - if (!dev && (addr >= 0x2ea) && (addr <= 0x2ed)) - return ret; + if ((addr >= 0x2ea) && (addr <= 0x2ed)) { + if (!dev) + return ret; + } switch (addr) { case 0x2ea: @@ -434,7 +458,11 @@ svga_in(uint16_t addr, void *priv) ret = 0x10; break; case 0x3c3: - ret = vga_on; + ret = 0x00; + if (xga_active && xga) + ret |= !xga->on; + if (ibm8514_active && dev) + ret |= !dev->on; break; case 0x3c4: ret = svga->seqaddr; @@ -452,7 +480,7 @@ svga_in(uint16_t addr, void *priv) ret = svga->dac_addr; break; case 0x3c9: - index = (svga->dac_addr - 1) & 255; + index = (svga->dac_addr - 1) & 0xff; switch (svga->dac_pos) { case 0: svga->dac_pos++; @@ -470,7 +498,7 @@ svga_in(uint16_t addr, void *priv) break; case 2: svga->dac_pos = 0; - svga->dac_addr = (svga->dac_addr + 1) & 255; + svga->dac_addr = (svga->dac_addr + 1) & 0xff; if (svga->ramdac_type == RAMDAC_8BIT) ret = svga->vgapal[index].b; else @@ -1013,6 +1041,7 @@ svga_do_render(svga_t *svga) if (svga->hwcursor_on) { if (!svga->override && svga->hwcursor_draw) svga->hwcursor_draw(svga, (svga->displine + svga->y_add + ((svga->hwcursor_latch.y >= 0) ? 0 : svga->hwcursor_latch.y)) & 2047); + svga->hwcursor_on--; if (svga->hwcursor_on && svga->interlace) svga->hwcursor_on--; @@ -1084,9 +1113,8 @@ svga_poll(void *priv) video_wait_for_buffer_monitor(svga->monitor_index); } - if (svga->hwcursor_on || svga->dac_hwcursor_on || svga->overlay_on) { + if (svga->hwcursor_on || svga->dac_hwcursor_on || svga->overlay_on) svga->changedvram[svga->ma >> 12] = svga->changedvram[(svga->ma >> 12) + 1] = svga->interlace ? 3 : 2; - } if (svga->vertical_linedbl) { old_ma = svga->ma; @@ -1172,6 +1200,7 @@ svga_poll(void *priv) svga->ma = svga->maback = (svga->rowoffset << 1) + svga->hblank_sub; else svga->ma = svga->maback = svga->hblank_sub; + svga->ma = (svga->ma << 2); svga->maback = (svga->maback << 2); @@ -1204,6 +1233,7 @@ svga_poll(void *priv) if (svga->changedvram[x]) svga->changedvram[x]--; } + if (svga->fullchange) svga->fullchange--; } @@ -1363,8 +1393,6 @@ svga_init(const device_t *info, svga_t *svga, void *priv, int memsize, svga->translate_address = NULL; svga->ksc5601_english_font_type = 0; - vga_on = 1; - if ((info->flags & DEVICE_PCI) || (info->flags & DEVICE_VLB) || (info->flags & DEVICE_MCA)) { mem_mapping_add(&svga->mapping, 0xa0000, 0x20000, svga_read, svga_readw, svga_readl, From 52c806b485878e5e0d030783cf29521eac464e0c Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sat, 2 Nov 2024 21:15:43 +0100 Subject: [PATCH 529/624] Forgot the XGA update --- src/video/vid_xga.c | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index bd18beae2..686634492 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -442,7 +442,6 @@ xga_ext_out_reg(xga_t *xga, svga_t *svga, uint8_t idx, uint8_t val) xga_log("Reg51 write = %02x.\n", val); xga->disp_cntl_2 = val; xga->on = ((val & 7) >= 2); - vga_on = !xga->on; svga_recalctimings(svga); break; @@ -2661,22 +2660,18 @@ xga_write_test(uint32_t addr, uint8_t val, void *priv) xga->a5_test = 2; xga->on = 0; - vga_on = 1; xga_log("XGA test1 addr=%05x, test=%02x.\n", addr, xga->a5_test); } else if (val == 0x5a) { xga->test = val; xga->on = 0; - vga_on = 1; xga_log("XGA test2 addr = %05x.\n", addr); } else if ((addr == 0xa0000) || (addr == 0xa0010)) { addr += xga->write_bank; xga->vram[addr & xga->vram_mask] = val; xga_log("XGA Linear endian reverse write, val = %02x, addr = %05x, banked mask = %04x, a5test=%d.\n", val, addr, svga->banked_mask, xga->a5_test); } - } else if (xga->aperture_cntl) { + } else if (xga->aperture_cntl) xga->on = 0; - vga_on = 1; - } } } @@ -2763,7 +2758,6 @@ xga_read_test(uint32_t addr, void *priv) if (addr == 0xa0001) { ret = xga->test; xga->on = 1; - vga_on = 0; } else if ((addr == 0xa0000) && (xga->a5_test == 1)) { /*This is required by XGAKIT to pass the memory test*/ xga_log("A5 test bank = %x.\n", addr); addr += xga->read_bank; @@ -2771,14 +2765,12 @@ xga_read_test(uint32_t addr, void *priv) } else { ret = xga->test; xga->on = 1; - vga_on = 0; } xga_log("A5 read: XGA ON = %d, addr = %05x, ret = %02x, test1 = %x.\n", xga->on, addr, ret, xga->a5_test); return ret; } else if (xga->test == 0x5a) { ret = xga->test; xga->on = 1; - vga_on = 0; xga_log("5A read: XGA ON = %d.\n", xga->on); return ret; } else if ((addr == 0xa0000) || (addr == 0xa0010)) { @@ -2787,7 +2779,6 @@ xga_read_test(uint32_t addr, void *priv) } } else if (xga->aperture_cntl) { xga->on = 0; - vga_on = 1; } } return ret; @@ -3041,7 +3032,6 @@ xga_poll(void *priv) if (xga->hwcursor_on) xga->changedvram[xga->ma >> 12] = xga->changedvram[(xga->ma >> 12) + 1] = xga->interlace ? 3 : 2; - xga_log("DISPCNTL = %d, vga = %d.\n", xga->disp_cntl_2 & 7, vga_on); switch (xga->disp_cntl_2 & 7) { case 2: xga_render_4bpp(svga); @@ -3202,7 +3192,6 @@ xga_mca_write(int port, uint8_t val, void *priv) io_removehandler(0x2100 + (xga->instance << 4), 0x0010, xga_ext_inb, NULL, NULL, xga_ext_outb, NULL, NULL, svga); mem_mapping_disable(&xga->memio_mapping); xga->on = 0; - vga_on = 1; xga->a5_test = 0; /* Save the MCA register value. */ @@ -3260,7 +3249,6 @@ xga_reset(void *priv) mem_mapping_disable(&xga->memio_mapping); xga->on = 0; - vga_on = 1; xga->a5_test = 0; mem_mapping_set_handler(&svga->mapping, svga_read, svga_readw, svga_readl, svga_write, svga_writew, svga_writel); } From aae600b325f3aa875724d9bd0488314aba1b7bf3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 3 Nov 2024 02:13:17 +0100 Subject: [PATCH 530/624] Config: Some clean-ups and the items in the main sections are now sorted alphabetically for easier readability. --- src/config.c | 114 +++++++++++++++++++++++++++++++++++++-------------- src/ini.c | 43 ++++++++++++++++++- 2 files changed, 125 insertions(+), 32 deletions(-) diff --git a/src/config.c b/src/config.c index 0153e20e8..14d73a193 100644 --- a/src/config.c +++ b/src/config.c @@ -118,7 +118,8 @@ load_general(void) memset(temp, '\0', sizeof(temp)); p = ini_section_get_string(cat, "vid_renderer", "default"); vid_api = plat_vidapi(p); - ini_section_delete_var(cat, "vid_api"); + if (!strcmp(p, "default")) + ini_section_delete_var(cat, "vid_api"); video_fullscreen_scale = ini_section_get_int(cat, "video_fullscreen_scale", 1); @@ -202,12 +203,12 @@ load_general(void) if (window_remember) { p = ini_section_get_string(cat, "window_coordinates", NULL); if (p == NULL) - p = "0, 0, 0, 0"; + p = "640, 480, 0, 0"; sscanf(p, "%i, %i, %i, %i", &cw, &ch, &cx, &cy); - } else + } else { cw = ch = cx = cy = 0; - - ini_section_delete_var(cat, "window_coordinates"); + ini_section_delete_var(cat, "window_coordinates"); + } do_auto_pause = ini_section_get_int(cat, "do_auto_pause", 0); @@ -404,7 +405,7 @@ load_machine(void) else time_sync = TIME_SYNC_ENABLED; } else - time_sync = !!ini_section_get_int(cat, "enable_sync", 1); + time_sync = TIME_SYNC_ENABLED; pit_mode = ini_section_get_int(cat, "pit_mode", -1); } @@ -902,10 +903,34 @@ load_storage_controllers(void) } } cassette_pos = ini_section_get_int(cat, "cassette_position", 0); + if (!cassette_pos) + ini_section_delete_var(cat, "cassette_position"); cassette_srate = ini_section_get_int(cat, "cassette_srate", 44100); + if (cassette_srate == 44100) + ini_section_delete_var(cat, "cassette_srate"); cassette_append = !!ini_section_get_int(cat, "cassette_append", 0); + if (!cassette_append) + ini_section_delete_var(cat, "cassette_append"); cassette_pcm = ini_section_get_int(cat, "cassette_pcm", 0); + if (!cassette_pcm) + ini_section_delete_var(cat, "cassette_pcm"); cassette_ui_writeprot = !!ini_section_get_int(cat, "cassette_writeprot", 0); + if (!cassette_ui_writeprot) + ini_section_delete_var(cat, "cassette_writeprot"); + + if (!cassette_enable) { + ini_section_delete_var(cat, "cassette_file"); + ini_section_delete_var(cat, "cassette_mode"); + for (int i = 0; i < MAX_PREV_IMAGES; i++) { + sprintf(temp, "cassette_image_history_%02i", i + 1); + ini_section_delete_var(cat, temp); + } + ini_section_delete_var(cat, "cassette_position"); + ini_section_delete_var(cat, "cassette_srate"); + ini_section_delete_var(cat, "cassette_append"); + ini_section_delete_var(cat, "cassette_pcm"); + ini_section_delete_var(cat, "cassette_ui_writeprot"); + } for (c = 0; c < 2; c++) { sprintf(temp, "cartridge_%02i_fn", c + 1); @@ -945,6 +970,9 @@ load_storage_controllers(void) } lba_enhancer_enabled = !!ini_section_get_int(cat, "lba_enhancer_enabled", 0); + + if (!lba_enhancer_enabled) + ini_section_delete_var(cat, "lba_enhancer_enabled"); } /* Load "Hard Disks" section. */ @@ -1063,9 +1091,8 @@ load_hard_disks(void) if (hdd[c].ide_channel > 7) hdd[c].ide_channel = 7; - } else { + } else ini_section_delete_var(cat, temp); - } /* SCSI */ if (hdd[c].bus == HDD_BUS_SCSI) { @@ -1128,24 +1155,24 @@ load_hard_disks(void) sprintf(temp, "hdd_%02i_parameters", c + 1); ini_section_delete_var(cat, temp); - sprintf(temp, "hdd_%02i_preide_channels", c + 1); + sprintf(temp, "hdd_%02i_mfm_channel", c + 1); ini_section_delete_var(cat, temp); - sprintf(temp, "hdd_%02i_ide_channels", c + 1); + sprintf(temp, "hdd_%02i_xta_channel", c + 1); ini_section_delete_var(cat, temp); - sprintf(temp, "hdd_%02i_scsi_id", c + 1); + sprintf(temp, "hdd_%02i_esdi_channel", c + 1); + ini_section_delete_var(cat, temp); + + sprintf(temp, "hdd_%02i_ide_channel", c + 1); + ini_section_delete_var(cat, temp); + + sprintf(temp, "hdd_%02i_scsi_location", c + 1); ini_section_delete_var(cat, temp); sprintf(temp, "hdd_%02i_fn", c + 1); ini_section_delete_var(cat, temp); } - - sprintf(temp, "hdd_%02i_mfm_channel", c + 1); - ini_section_delete_var(cat, temp); - - sprintf(temp, "hdd_%02i_ide_channel", c + 1); - ini_section_delete_var(cat, temp); } } @@ -1157,6 +1184,7 @@ load_floppy_and_cdrom_drives(void) char temp[512]; char tmp2[512]; char *p; + char *def_type; char s[512]; unsigned int board = 0; unsigned int dev = 0; @@ -1261,11 +1289,13 @@ load_floppy_and_cdrom_drives(void) cdrom[c].speed = ini_section_get_int(cat, temp, 8); sprintf(temp, "cdrom_%02i_type", c + 1); - p = ini_section_get_string(cat, temp, (c == 1) ? "86BOX_CD-ROM_1.00" : "none"); + def_type = (c == 1) ? "86BOX_CD-ROM_1.00" : "none"; + p = ini_section_get_string(cat, temp, def_type); cdrom_set_type(c, cdrom_get_from_internal_name(p)); if (cdrom_get_type(c) > KNOWN_CDROM_DRIVE_TYPES) cdrom_set_type(c, KNOWN_CDROM_DRIVE_TYPES); - ini_section_delete_var(cat, temp); + if (!strcmp(p, def_type)) + ini_section_delete_var(cat, temp); /* Default values, needed for proper operation of the Settings dialog. */ cdrom[c].ide_channel = cdrom[c].scsi_device_id = c + 2; @@ -1356,7 +1386,7 @@ load_floppy_and_cdrom_drives(void) sprintf(temp, "cdrom_%02i_ide_channel", c + 1); ini_section_delete_var(cat, temp); - sprintf(temp, "cdrom_%02i_scsi_id", c + 1); + sprintf(temp, "cdrom_%02i_scsi_location", c + 1); ini_section_delete_var(cat, temp); sprintf(temp, "cdrom_%02i_image_path", c + 1); @@ -1486,7 +1516,7 @@ load_other_removable_devices(void) sprintf(temp, "zip_%02i_ide_channel", c + 1); ini_section_delete_var(cat, temp); - sprintf(temp, "zip_%02i_scsi_id", c + 1); + sprintf(temp, "zip_%02i_scsi_location", c + 1); ini_section_delete_var(cat, temp); sprintf(temp, "zip_%02i_image_path", c + 1); @@ -1599,7 +1629,7 @@ load_other_removable_devices(void) sprintf(temp, "mo_%02i_ide_channel", c + 1); ini_section_delete_var(cat, temp); - sprintf(temp, "mo_%02i_scsi_id", c + 1); + sprintf(temp, "mo_%02i_scsi_location", c + 1); ini_section_delete_var(cat, temp); sprintf(temp, "mo_%02i_image_path", c + 1); @@ -1626,15 +1656,33 @@ load_other_peripherals(void) unittester_enabled = !!ini_section_get_int(cat, "unittester_enabled", 0); novell_keycard_enabled = !!ini_section_get_int(cat, "novell_keycard_enabled", 0); + if (!bugger_enabled) + ini_section_delete_var(cat, "bugger_enabled"); + + if (!postcard_enabled) + ini_section_delete_var(cat, "postcard_enabled"); + + if (!unittester_enabled) + ini_section_delete_var(cat, "unittester_enabled"); + + if (!novell_keycard_enabled) + ini_section_delete_var(cat, "novell_keycard_enabled"); + for (uint8_t c = 0; c < ISAMEM_MAX; c++) { sprintf(temp, "isamem%d_type", c); p = ini_section_get_string(cat, temp, "none"); isamem_type[c] = isamem_get_from_internal_name(p); + + if (!strcmp(p, "none")) + ini_section_delete_var(cat, temp); } p = ini_section_get_string(cat, "isartc_type", "none"); isartc_type = isartc_get_from_internal_name(p); + + if (!strcmp(p, "none")) + ini_section_delete_var(cat, temp); } /* Load the specified or a default configuration file. */ @@ -2015,17 +2063,20 @@ save_machine(void) /* Write the mem_size explicitly to the setttings in order to help managers to display it without having the actual machine table. */ - ini_section_delete_var(cat, "mem_size"); ini_section_set_int(cat, "mem_size", mem_size); ini_section_set_int(cat, "cpu_use_dynarec", cpu_use_dynarec); - ini_section_set_int(cat, "fpu_softfloat", fpu_softfloat); + + if (fpu_softfloat == 0) + ini_section_delete_var(cat, "fpu_softfloat"); + else + ini_section_set_int(cat, "fpu_softfloat", fpu_softfloat); if (time_sync & TIME_SYNC_ENABLED) if (time_sync & TIME_SYNC_UTC) ini_section_set_string(cat, "time_sync", "utc"); else - ini_section_set_string(cat, "time_sync", "local"); + ini_section_delete_var(cat, "time_sync"); else ini_section_set_string(cat, "time_sync", "disabled"); @@ -2215,7 +2266,10 @@ save_sound(void) else ini_section_set_string(cat, "sound_type", (sound_is_float == 1) ? "float" : "int16"); - ini_section_set_string(cat, "fm_driver", (fm_driver == FM_DRV_NUKED) ? "nuked" : "ymfm"); + if (fm_driver == FM_DRV_NUKED) + ini_section_delete_var(cat, "fm_driver"); + else + ini_section_set_string(cat, "fm_driver", "ymfm"); ini_delete_section_if_empty(config, cat); } @@ -2298,11 +2352,10 @@ save_ports(void) ini_section_set_int(cat, temp, com_ports[c].enabled); sprintf(temp, "serial%d_passthrough_enabled", c + 1); - if (serial_passthrough_enabled[c]) { + if (serial_passthrough_enabled[c]) ini_section_set_int(cat, temp, 1); - } else { + else ini_section_delete_var(cat, temp); - } } for (c = 0; c < PARALLEL_MAX; c++) { @@ -2524,9 +2577,8 @@ save_hard_disks(void) sprintf(tmp2, "%u, %u, %u, %i, %s", hdd[c].spt, hdd[c].hpc, hdd[c].tracks, hdd[c].wp, p); ini_section_set_string(cat, temp, tmp2); - } else { + } else ini_section_delete_var(cat, temp); - } sprintf(temp, "hdd_%02i_mfm_channel", c + 1); if (hdd_is_valid(c) && (hdd[c].bus == HDD_BUS_MFM)) diff --git a/src/ini.c b/src/ini.c index 616245786..c56a8af56 100644 --- a/src/ini.c +++ b/src/ini.c @@ -181,7 +181,48 @@ delete_section_if_empty(list_t *head, section_t *section) if (section == NULL) return; - if (entries_num(section) == 0) { + int n = entries_num(section); + + if (n > 0) { + int i = 0; + entry_t *i_ent = (entry_t *) section->entry_head.next; + + while (i_ent != NULL) { + int i_nlen = strlen(i_ent->name); + entry_t* i_next = (entry_t *) i_ent->list.next; + + if (i_nlen > 0) { + int j = 0; + entry_t *j_ent = (entry_t *) section->entry_head.next; + + while (j_ent != NULL) { + int j_nlen = strlen(j_ent->name); + entry_t* j_next = (entry_t *) j_ent->list.next; + if (j_nlen > 0) { + pclog("Comparing \"%s\" with \"%s\"...\n", j_ent->name, i_ent->name); + if ((j != i) && (strcmp(j_ent->name, i_ent->name) > 0)) { + pclog("Swapping \"%s\" with \"%s\"...\n", j_ent->name, i_ent->name); + + entry_t t_ent = { 0 }; + memcpy(&t_ent, j_ent, sizeof(entry_t)); + /* J: Contents of I, list of J */ + memcpy(j_ent->name, i_ent->name, sizeof(entry_t) - sizeof(i_ent->list)); + /* I: Contents of J, list of I */ + memcpy(i_ent->name, t_ent.name, sizeof(entry_t) - sizeof(i_ent->list)); + } + + j++; + } + + j_ent = (entry_t *) j_next; + } + + i++; + } + + i_ent = (entry_t *) i_next; + } + } else { list_delete(§ion->list, head); free(section); } From 44e295e66dd82876c163c4d372cd8945378fa9ca Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 3 Nov 2024 02:19:40 +0100 Subject: [PATCH 531/624] Config: More fixes and removed excess logging from ini.c. --- src/config.c | 17 +++++++++++++---- src/ini.c | 3 --- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/config.c b/src/config.c index 14d73a193..e951159f2 100644 --- a/src/config.c +++ b/src/config.c @@ -879,7 +879,7 @@ load_storage_controllers(void) path_normalize(cassette_fname); } - p = ini_section_get_string(cat, "cassette_mode", ""); + p = ini_section_get_string(cat, "cassette_mode", "load"); if (strlen(p) > 511) fatal("load_storage_controllers(): strlen(p) > 511\n"); else @@ -2384,6 +2384,7 @@ save_storage_controllers(void) ini_section_t cat = ini_find_or_create_section(config, "Storage controllers"); char temp[512]; int c; + char *def_hdc; ini_section_delete_var(cat, "scsicard"); @@ -2403,8 +2404,16 @@ save_storage_controllers(void) ini_section_set_string(cat, "fdc", fdc_card_get_internal_name(fdc_current[0])); - ini_section_set_string(cat, "hdc", - hdc_get_internal_name(hdc_current[0])); + if (machine_has_flags(machine, MACHINE_HDC)) + def_hdc = "internal"; + else + def_hdc = "none"; + + if (!strcmp(hdc_get_internal_name(hdc_current[0]), def_hdc)) + ini_section_delete_var(cat, "hdc"); + else + ini_section_set_string(cat, "hdc", + hdc_get_internal_name(hdc_current[0])); if (cdrom_interface_current == 0) ini_section_delete_var(cat, "cdrom_interface"); @@ -2439,7 +2448,7 @@ save_storage_controllers(void) ini_section_set_string(cat, "cassette_file", cassette_fname); } - if (strlen(cassette_mode) == 0) + if (!strcmp(cassette_mode, "load")) ini_section_delete_var(cat, "cassette_mode"); else ini_section_set_string(cat, "cassette_mode", cassette_mode); diff --git a/src/ini.c b/src/ini.c index c56a8af56..78c873758 100644 --- a/src/ini.c +++ b/src/ini.c @@ -199,10 +199,7 @@ delete_section_if_empty(list_t *head, section_t *section) int j_nlen = strlen(j_ent->name); entry_t* j_next = (entry_t *) j_ent->list.next; if (j_nlen > 0) { - pclog("Comparing \"%s\" with \"%s\"...\n", j_ent->name, i_ent->name); if ((j != i) && (strcmp(j_ent->name, i_ent->name) > 0)) { - pclog("Swapping \"%s\" with \"%s\"...\n", j_ent->name, i_ent->name); - entry_t t_ent = { 0 }; memcpy(&t_ent, j_ent, sizeof(entry_t)); /* J: Contents of I, list of J */ From fa69678a94905229fd525e474608c282b22a3ac1 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 3 Nov 2024 04:46:32 +0100 Subject: [PATCH 532/624] Even better (hopefully) way to fix the mode switches (November 3rd, 2024) 1. Added the missing call to mach32_updatemapping from port 0x3CF through its index 6. 2. If the accelerator DAC is active and the extended 256 color bit is on too then enable 8514/A mode when needed, otherwise it's VGA mode or decided by the passthrough/clock selection ports. 3. VGA DAC reads are redirected to the 8514/A DAC reads only when 8514/A mode is on. --- src/video/vid_ati_mach8.c | 101 ++++++++++++++------------------------ 1 file changed, 38 insertions(+), 63 deletions(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index cc0441f63..df2d5a731 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2196,12 +2196,9 @@ mach_out(uint16_t addr, uint8_t val, void *priv) addr ^= 0x60; if (((dev->disp_cntl & 0x60) == 0x20) && ((dev->local & 0xff) >= 0x02)) { - if ((addr >= 0x3c7) && (addr <= 0x3c9)) { - if (dev->bpp && !(svga->attrregs[0x10] & 0x40)) - addr -= 0xdc; - + 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); - } else if ((addr >= 0x2eb) && (addr <= 0x2ed)) + } else if ((addr >= 0x2ea) && (addr <= 0x2ed)) mach_log("8514/A 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); } @@ -2315,20 +2312,15 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs2 = !!(mach->accel.ext_ge_config & 0x1000); rs3 = !!(mach->accel.ext_ge_config & 0x2000); if ((dev->local & 0xff) >= 0x02) { - if (addr != 0x2ea) { - if (!(dev->accel.advfunc_cntl & 0x01) && !(mach->accel.clock_sel & 0x01) && ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01))) - dev->on |= 0x01; + if (mach->regs[0xb0] & 0x20) { + dev->on |= 0x01; + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); } - if (mach->pci_bus && !mach->ramdac_type) ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); else ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); - - if (addr != 0x2ea) { - svga_recalctimings(svga); - mach32_updatemapping(mach, svga); - } } else svga_out(addr, val, svga); return; @@ -2340,24 +2332,31 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs2 = !!(mach->regs[0xa0] & 0x20); rs3 = !!(mach->regs[0xa0] & 0x40); if ((dev->local & 0xff) >= 0x02) { - if (addr != 0x3C6) { - if (!(dev->accel.advfunc_cntl & 0x01) && ((mach->accel.clock_sel & 0x01) || (svga->attrregs[0x10] & 0x40))) - dev->on &= ~0x01; + if (!(mach->regs[0xb0] & 0x20)) { + dev->on &= ~0x01; + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); } - if (mach->pci_bus && !mach->ramdac_type) ati68860_ramdac_out((addr & 0x03) | (rs2 << 2) | (rs3 << 3), val, svga->ramdac, svga); else ati68875_ramdac_out(addr, rs2, rs3, val, svga->ramdac, svga); - - if (addr != 0x3C6) { - svga_recalctimings(svga); - mach32_updatemapping(mach, svga); - } } else svga_out(addr, val, svga); return; + case 0x3CF: + if (svga->gdcaddr == 6) { + uint8_t old_val = svga->gdcreg[6]; + svga->gdcreg[6] = val; + if ((svga->gdcreg[6] & 0xc) != (old_val & 0xc)) { + mach_log("GDCREG6=%02x.\n", svga->gdcreg[6] & 0xc); + mach32_updatemapping(mach, svga); + } + return; + } + break; + case 0x3D4: svga->crtcreg = val & 0x3f; return; @@ -2403,7 +2402,7 @@ mach_in(uint16_t addr, void *priv) if (((addr & 0xFFF0) == 0x3D0 || (addr & 0xFFF0) == 0x3B0) && !(svga->miscout & 1)) addr ^= 0x60; - if ((addr >= 0x3c6) && (addr <= 0x3c9)) { + if ((addr >= 0x3c6) && (addr <= 0x3c9) && dev->on) { addr -= 0xdc; mach_log("VGA DAC read regs=%03x.\n", addr); } else if ((addr >= 0x2ea) && (addr <= 0x2ed)) @@ -2780,10 +2779,8 @@ mach_recalctimings(svga_t *svga) } dev->accel_bpp = 8; svga->render8514 = ibm8514_render_8bpp; - goto mach8_vga_modes; } } else { -mach8_vga_modes: if (!svga->scrblank && (svga->crtc[0x17] & 0x80) && svga->attr_palette_enable) { mach_log("GDCREG5=%02x, ATTR10=%02x, ATI B0 bit 5=%02x, ON=%d.\n", svga->gdcreg[5] & 0x60, svga->attrregs[0x10] & 0x40, mach->regs[0xb0] & 0x20, dev->on); if ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) { @@ -3389,18 +3386,13 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x4ae8: dev->accel.advfunc_cntl = val; + dev->on = dev->accel.advfunc_cntl & 0x01; mach_log("[%04X:%08X]: ATI 8514/A: (0x%04x): ON=%d, shadow crt=%x, hdisp=%d, vdisp=%d.\n", CS, cpu_state.pc, port, val & 0x01, dev->accel.advfunc_cntl & 0x04, dev->hdisp, dev->vdisp); if ((dev->local & 0xff) < 0x02) { dev->ext_crt_pitch = 128; - dev->on = dev->accel.advfunc_cntl & 0x01; svga_recalctimings(svga); } else { - dev->on = (dev->accel.advfunc_cntl & 0x01) | (mach->accel.clock_sel & 0x01); - if (!dev->on && dev->vendor_mode) { - dev->on |= 0x01; - dev->vendor_mode = 0; - } svga_recalctimings(svga); mach32_updatemapping(mach, svga); } @@ -3483,15 +3475,9 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 else dev->ext_crt_pitch <<= 1; } - if ((dev->local & 0xff) >= 0x02) { - dev->vendor_mode = 1; - dev->on = (dev->accel.advfunc_cntl & 0x01) | (mach->accel.clock_sel & 0x01); - if (!dev->on) - dev->on |= 0x01; - - svga_recalctimings(svga); - mach32_updatemapping(mach, svga); - } + dev->on |= 0x01; + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); mach_log("ATI 8514/A: (0x%04x) val=0x%02x.\n", port, val); break; @@ -3532,26 +3518,16 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x46ef: WRITE8(port, mach->shadow_cntl, val); mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val); - mach32_updatemapping(mach, svga); break; case 0x4aee: case 0x4aef: WRITE8(port, mach->accel.clock_sel, val); - if ((dev->local & 0xff) < 0x02) { - dev->on = mach->accel.clock_sel & 0x01; - svga_recalctimings(svga); - } else { - dev->on = (dev->accel.advfunc_cntl & 0x01) | (mach->accel.clock_sel & 0x01); - if (!dev->on && dev->vendor_mode) { - dev->on |= 0x01; - dev->vendor_mode = 0; - } - svga_recalctimings(svga); - mach32_updatemapping(mach, svga); - } + dev->on = mach->accel.clock_sel & 0x01; mach_log("ATI 8514/A: (0x%04x): ON=%d, val=%04x, hdisp=%d, vdisp=%d.\n", port, mach->accel.clock_sel & 0x01, val, dev->hdisp, dev->vdisp); mach_log("Vendor ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); + svga_recalctimings(svga); + mach32_updatemapping(mach, svga); break; case 0x52ee: @@ -3576,8 +3552,6 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 mach_log("CRT Shadow Set 1: 640x480.\n"); else if ((mach->shadow_set & 0x03) == 0x02) mach_log("CRT Shadow Set 2: 1024x768.\n"); - - mach32_updatemapping(mach, svga); break; case 0x5eee: @@ -3601,13 +3575,6 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x6aee: case 0x6aef: WRITE8(port, mach->accel.max_waitstates, val); - mach->override_resolution = !!(mach->accel.max_waitstates & 0x400); - mach_log("Override=%d.\n", mach->override_resolution); - if (mach->override_resolution && ((dev->local & 0xff) < 0x02)) { - dev->on |= 0x01; - svga_recalctimings(svga); - mach32_updatemapping(mach, svga); - } break; case 0x6eee: @@ -5250,6 +5217,14 @@ 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 ((svga->gdcreg[6] & 0x01) || (svga->attrregs[0x10] & 0x01)) { + if (svga->attrregs[0x10] & 0x40) { + dev->on &= ~0x01; + svga_recalctimings(svga); + } + } + } break; default: From 64944dd291a29e56bf4a5a323f50039f10f27021 Mon Sep 17 00:00:00 2001 From: Barnacl437 Date: Sun, 3 Nov 2024 10:51:12 +0700 Subject: [PATCH 533/624] translation addition, fix a current string interpreted wrongly --- src/qt/languages/vi-VN.po | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index ee6d77849..3dc3e5bd9 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -13,7 +13,7 @@ msgid "&Keyboard requires capture" msgstr "Bàn phím &hoạt động cần capture chuột" msgid "&Right CTRL is left ALT" -msgstr "Gắn CTRL p&hải vào ALT trái" +msgstr "Gắn CTRL trá vào ALT ph&ải" msgid "&Hard Reset..." msgstr "Buộc khởi độn&g lại" @@ -39,6 +39,9 @@ msgstr "Ẩn tha&nh trạng thái" msgid "Hide &toolbar" msgstr "Ẩn thanh &công cụ" +msgid "Show non-primary monitors" +msgstr "Hiển thị các màn hình phụ" + msgid "&Resizeable window" msgstr "Tùy chỉnh cỡ cử&a sổ" @@ -66,6 +69,9 @@ msgstr "Tự nhập độ &phân giải..." msgid "F&orce 4:3 display ratio" msgstr "Giữ n&guyên khung hình 4:3" +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Co giãn toàn màn hình khi cực đại hóa cửa sổ" + msgid "&Window scale factor" msgstr "Đổi &tỷ lệ cửa sổ" @@ -198,6 +204,9 @@ msgstr "Bật trình trạng thái cho Discord" msgid "Sound &gain..." msgstr "Bộ &tăng âm..." +msgid "Open screenshots folder..." +msgstr "Mở thư mục ảnh chụp màn hình..." + msgid "Begin trace\tCtrl+T" msgstr "Bắt đầu dò\tCtrl+T" @@ -657,6 +666,9 @@ msgstr "86Box không tìm được bản ROM nào.\n\nVui lòng Date: Sun, 3 Nov 2024 10:53:18 +0700 Subject: [PATCH 534/624] fixing another fix typo --- src/qt/languages/vi-VN.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 3dc3e5bd9..39db7263c 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -13,7 +13,7 @@ msgid "&Keyboard requires capture" msgstr "Bàn phím &hoạt động cần capture chuột" msgid "&Right CTRL is left ALT" -msgstr "Gắn CTRL trá vào ALT ph&ải" +msgstr "Gắn CTRL trái vào ALT ph&ải" msgid "&Hard Reset..." msgstr "Buộc khởi độn&g lại" From 4465ef24e9e2b065041b733054afa52b1ef52f43 Mon Sep 17 00:00:00 2001 From: Barnacl437 Date: Sun, 3 Nov 2024 20:59:32 +0700 Subject: [PATCH 535/624] misinterpreting fix (again) --- src/qt/languages/vi-VN.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 39db7263c..6d9673e3d 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -13,7 +13,7 @@ msgid "&Keyboard requires capture" msgstr "Bàn phím &hoạt động cần capture chuột" msgid "&Right CTRL is left ALT" -msgstr "Gắn CTRL trái vào ALT ph&ải" +msgstr "Gắn ALT trái vào CTRL ph&ải" msgid "&Hard Reset..." msgstr "Buộc khởi độn&g lại" From 558176e4543161a9fa62a238b72296201068596b Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Sun, 3 Nov 2024 11:22:27 -0300 Subject: [PATCH 536/624] hdd_image: Don't return read error on out-of-bounds reads --- src/disk/hdd_image.c | 2 +- src/disk/minivhd/minivhd_io.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index 402140408..c702d9f29 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -542,7 +542,7 @@ hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) num_read = fread(buffer, 512, count, hdd_images[id].file); hdd_images[id].pos = sector + num_read; - if (num_read < count) + if ((num_read < count) && !feof(hdd_images[id].file)) return -1; } diff --git a/src/disk/minivhd/minivhd_io.c b/src/disk/minivhd/minivhd_io.c index cdf6694a8..3b75ca74d 100644 --- a/src/disk/minivhd/minivhd_io.c +++ b/src/disk/minivhd/minivhd_io.c @@ -230,7 +230,7 @@ mvhd_fixed_read(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *out_buff addr = ((int64_t) offset) * MVHD_SECTOR_SIZE; if (mvhd_fseeko64(vhdm->f, addr, SEEK_SET) == -1) vhdm->error = 1; - if (!fread(out_buff, transfer_sectors * MVHD_SECTOR_SIZE, 1, vhdm->f)) + if (!fread(out_buff, transfer_sectors * MVHD_SECTOR_SIZE, 1, vhdm->f) && !feof(vhdm->f)) vhdm->error = 1; return truncated_sectors; @@ -272,7 +272,7 @@ mvhd_sparse_read(MVHDMeta *vhdm, uint32_t offset, int num_sectors, void *out_buf } if (VHD_TESTBIT(vhdm->bitmap.curr_bitmap, sib)) { - if (!fread(buff, MVHD_SECTOR_SIZE, 1, vhdm->f)) + if (!fread(buff, MVHD_SECTOR_SIZE, 1, vhdm->f) && !feof(vhdm->f)) vhdm->error = 1; } else { memset(buff, 0, MVHD_SECTOR_SIZE); From c966538324b8f54a72ebc2dba1c66bf47cca4f57 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Sun, 3 Nov 2024 23:21:18 +0100 Subject: [PATCH 537/624] 8514/A compatible changes on Mach32 of the day (November 3rd, 2024) Mark the ATI extended 8514/A mode accordingly (that is, if bit 5 of ATI reg 0xb0 and using ATI extended ports at the same time). Fixes wrong colors in some instances using standard IBM 8514/A drivers on Mach32. --- src/video/vid_ati_mach8.c | 52 ++++++++------------------------------- 1 file changed, 10 insertions(+), 42 deletions(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index df2d5a731..c822cf625 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2312,7 +2312,8 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs2 = !!(mach->accel.ext_ge_config & 0x1000); rs3 = !!(mach->accel.ext_ge_config & 0x2000); if ((dev->local & 0xff) >= 0x02) { - if (mach->regs[0xb0] & 0x20) { + if (mach->regs[0xb0] & 0x20) { /*ATI extended 8514/A mode.*/ + dev->vendor_mode = 1; dev->on |= 0x01; svga_recalctimings(svga); mach32_updatemapping(mach, svga); @@ -2333,6 +2334,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs3 = !!(mach->regs[0xa0] & 0x40); if ((dev->local & 0xff) >= 0x02) { if (!(mach->regs[0xb0] & 0x20)) { + dev->vendor_mode = 0; dev->on &= ~0x01; svga_recalctimings(svga); mach32_updatemapping(mach, svga); @@ -2490,29 +2492,7 @@ ati8514_out(uint16_t addr, uint8_t val, void *priv) mach_log("[%04X:%08X]: ADDON OUT addr=%03x, val=%02x.\n", CS, cpu_state.pc, addr, val); - switch (addr) { - case 0x0102: - dev->pos_regs[2] = val; - mem_mapping_disable(&dev->bios_rom.mapping); - if (dev->pos_regs[2] & 0x01) - mem_mapping_enable(&dev->bios_rom.mapping); - break; - case 0x0103: - dev->pos_regs[3] = val; - dev->bios_addr = 0xc0000 + (((dev->pos_regs[3] >> 1) & 0x7f) << 11); - if (dev->pos_regs[3] & 0x01) - mem_mapping_set_addr(&dev->bios_rom.mapping, dev->bios_addr, 0x2000); - break; - case 0x0104: - case 0x0105: - case 0x0106: - case 0x0107: - dev->pos_regs[addr & 7] = val; - break; - default: - svga_out(addr, val, priv); - break; - } + svga_out(addr, val, priv); } uint8_t @@ -2522,22 +2502,7 @@ ati8514_in(uint16_t addr, void *priv) ibm8514_t *dev = (ibm8514_t *) svga->dev8514; uint8_t temp = 0xff; - switch (addr) { - case 0x0100: - case 0x0101: - case 0x0102: - case 0x0103: - case 0x0104: - case 0x0105: - case 0x0106: - case 0x0107: - temp = dev->pos_regs[addr & 7]; - break; - default: - temp = svga_in(addr, priv); - break; - - } + temp = svga_in(addr, priv); mach_log("[%04X:%08X]: ADDON IN addr=%03x, temp=%02x.\n", CS, cpu_state.pc, addr, temp); return temp; @@ -2583,7 +2548,6 @@ ati8514_recalctimings(svga_t *svga) dev->dispend >>= 1; 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); - svga->map8 = dev->pallook; if (dev->vram_512k_8514) { if (dev->h_disp == 640) { dev->ext_pitch = 640; @@ -3387,6 +3351,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x4ae8: dev->accel.advfunc_cntl = val; dev->on = dev->accel.advfunc_cntl & 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); if ((dev->local & 0xff) < 0x02) { @@ -3476,6 +3441,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 dev->ext_crt_pitch <<= 1; } dev->on |= 0x01; + dev->vendor_mode = 1; svga_recalctimings(svga); mach32_updatemapping(mach, svga); mach_log("ATI 8514/A: (0x%04x) val=0x%02x.\n", port, val); @@ -3524,6 +3490,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x4aef: WRITE8(port, mach->accel.clock_sel, val); dev->on = mach->accel.clock_sel & 0x01; + dev->vendor_mode = 1; mach_log("ATI 8514/A: (0x%04x): ON=%d, val=%04x, hdisp=%d, vdisp=%d.\n", port, mach->accel.clock_sel & 0x01, val, dev->hdisp, dev->vdisp); mach_log("Vendor ATI mode set %s resolution.\n", (dev->accel.advfunc_cntl & 0x04) ? "2: 1024x768" : "1: 640x480"); svga_recalctimings(svga); @@ -5220,6 +5187,7 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) if (((dev->local & 0xff) >= 0x02) && !(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); } @@ -5251,7 +5219,7 @@ mach32_updatemapping(mach_t *mach, svga_t *svga) mem_mapping_disable(&mach->mmio_linear_mapping); } if ((dev->local & 0xff) >= 0x02) { - if (dev->on) { + if (dev->on && dev->vendor_mode) { mach_log("Mach32 banked mapping.\n"); mem_mapping_set_handler(&svga->mapping, mach32_read, mach32_readw, mach32_readl, mach32_write, mach32_writew, mach32_writel); mem_mapping_set_p(&svga->mapping, mach); From 863b76a1909239f1fed07da99e5514af17595573 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Tue, 5 Nov 2024 01:08:13 +0100 Subject: [PATCH 538/624] Fixing regressions of the mach32 (November 5th, 2024) 1. ATI Extended 8514/A mode may not use bit 5 of ATI reg 0xb0 sometimes but at the same time it won't use the standard VGA way of setting up 256+ colors, therefore, in the VGA DAC writes, use standard VGA way to revert to VGA mode in the writes instead of relying on bit 5 of ATI reg 0xb0 being enabled/disabled there. Fixes mode switches in VLB/PCI configurations using Windows 9x and possibly other stuff, ISA is unaffected and still works fine. 2. Added more logs and and remove/set I/O handlers correctly for the PCI side. --- src/video/vid_ati_mach8.c | 130 +++++++++++++++++++++++++++++++++++++- 1 file changed, 129 insertions(+), 1 deletion(-) diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index c822cf625..8b59b3864 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -2313,6 +2313,7 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs3 = !!(mach->accel.ext_ge_config & 0x2000); if ((dev->local & 0xff) >= 0x02) { 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); @@ -2333,7 +2334,8 @@ mach_out(uint16_t addr, uint8_t val, void *priv) rs2 = !!(mach->regs[0xa0] & 0x20); rs3 = !!(mach->regs[0xa0] & 0x40); if ((dev->local & 0xff) >= 0x02) { - if (!(mach->regs[0xb0] & 0x20)) { + if (svga->attrregs[0x10] & 0x40) { + mach_log("VGA mode.\n"); dev->vendor_mode = 0; dev->on &= ~0x01; svga_recalctimings(svga); @@ -3424,6 +3426,7 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x22ee: if (mach->pci_bus) { mach->pci_cntl_reg = val; + mach_log("PCI Control Reg=%02x.\n", val); mach32_updatemapping(mach, svga); } break; @@ -5429,6 +5432,123 @@ ati8514_io_set(svga_t *svga) } #endif +static void +mach_io_remove(mach_t *mach) +{ + io_removehandler(0x2e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x6e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x12e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x16e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x1ae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x1ee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x22e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x26e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x2ee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x42e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x46e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x4ae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x52e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x56e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x5ae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x5ee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x82e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x86e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x8ae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x8ee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x92e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x96e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x9ae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x9ee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xa2e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xa6e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xaae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xaee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xb2e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xb6e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xbae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xbee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xe2e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + + io_removehandler(0xc2e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xc6e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xcae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xcee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xd2e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xd6e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xdae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xdee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xe6e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xeae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xeee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xf2e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xf6e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xfae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xfee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + + io_removehandler(0x02ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x06ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x0aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x0eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x12ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x16ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x1aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x1eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x22ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x26ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x2aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x2eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x32ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x36ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x3aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x3eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x42ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x46ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x4aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x52ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x56ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x5aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x5eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x62ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x66ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x6aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x6eee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x72ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x76ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0x7aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, 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(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); + io_removehandler(0x9aee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xa2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xa6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xaaee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xaeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xb2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xb6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xbaee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xbeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xc2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xc6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xcaee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xceee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xd2ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xd6ee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xdaee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, 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(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); + io_removehandler(0xfaee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); + io_removehandler(0xfeee, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); +} + static void mach_io_set(mach_t *mach) { @@ -5719,13 +5839,21 @@ mach32_pci_write(UNUSED(int func), int addr, uint8_t val, void *priv) case PCI_REG_COMMAND: mach->pci_regs[PCI_REG_COMMAND] = val & 0x27; if (val & PCI_COMMAND_IO) { + mach_log("Remove and set handlers.\n"); + io_removehandler(0x01ce, 2, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); io_removehandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); io_removehandler(0x03c0, 32, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); + mach_io_remove(mach); + io_sethandler(0x01ce, 2, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); io_sethandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); io_sethandler(0x03c0, 32, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); + mach_io_set(mach); } else { + mach_log("Remove handlers.\n"); + io_removehandler(0x01ce, 2, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); io_removehandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); io_removehandler(0x03c0, 32, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); + mach_io_remove(mach); } mach32_updatemapping(mach, &mach->svga); break; From a3ad407a21ae75f6b8db2c63d81930e75c4ce5ff Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Thu, 7 Nov 2024 13:02:52 -0300 Subject: [PATCH 539/624] hdd_image: Enter missing image mode on other open failures as well --- src/disk/hdd_image.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index c702d9f29..09f48ad50 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -295,7 +295,7 @@ hdd_image_load(int id) if (fn[0] == '.') { hdd_image_log("File name starts with .\n"); memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; + goto fail_raw; } hdd_images[id].file = plat_fopen(fn, "rb+"); if (hdd_images[id].file == NULL) { @@ -306,14 +306,14 @@ hdd_image_load(int id) if (hdd[id].wp) { hdd_image_log("A write-protected image must exist\n"); memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; + goto fail_raw; } hdd_images[id].file = plat_fopen(fn, "wb+"); if (hdd_images[id].file == NULL) { hdd_image_log("Unable to open image\n"); memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; + goto fail_raw; } else { if (image_is_hdi(fn)) { full_size = ((uint64_t) hdd[id].spt) * ((uint64_t) hdd[id].hpc) * ((uint64_t) hdd[id].tracks) << 9LL; @@ -389,10 +389,13 @@ retry_vhd: s = full_size = ((uint64_t) hdd[id].spt) * ((uint64_t) hdd[id].hpc) * ((uint64_t) hdd[id].tracks) << 9LL; ret = prepare_new_hard_disk(id, full_size); + if (ret <= 0) + goto fail_raw; return ret; } else { /* Failed for another reason */ hdd_image_log("Failed for another reason\n"); +fail_raw: hdd_images[id].type = HDD_IMAGE_RAW; hdd_images[id].last_sector = (uint32_t) (((uint64_t) hdd[id].spt) * ((uint64_t) hdd[id].hpc) * ((uint64_t) hdd[id].tracks)) - 1; return 1; @@ -418,7 +421,7 @@ retry_vhd: fclose(hdd_images[id].file); hdd_images[id].file = NULL; memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; + goto fail_raw; } if (fread(&spt, 1, 4, hdd_images[id].file) != 4) fatal("hdd_image_load(): HDI: Error reading sectors per track\n"); @@ -446,7 +449,7 @@ retry_vhd: fclose(hdd_images[id].file); hdd_images[id].file = NULL; memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; + goto fail_raw; } if (fread(&spt, 1, 4, hdd_images[id].file) != 4) fatal("hdd_image_load(): HDI: Error reading sectors per track\n"); From 55b091fb58888498a73590fe74d3a5c65073797a Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:23:21 +0100 Subject: [PATCH 540/624] Assorted string fixes, mostly for consistency. --- src/device.c | 8 ++++++++ src/device/mouse_ps2.c | 2 +- src/disk/hdc_st506_xt.c | 12 ++++++------ src/floppy/fdc_magitronic.c | 2 +- src/floppy/fdc_monster.c | 4 ++-- src/floppy/fdc_pii15xb.c | 2 +- src/network/net_3c503.c | 2 +- src/network/net_ne2000.c | 6 +++--- src/qt/qt_settingsinput.cpp | 2 +- src/qt/qt_settingsnetwork.cpp | 2 +- src/qt/qt_settingssound.cpp | 4 ++-- src/sound/midi.c | 6 +++--- src/video/vid_8514a.c | 2 +- 13 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/device.c b/src/device.c index 41f4b74d5..46125f58e 100644 --- a/src/device.c +++ b/src/device.c @@ -103,6 +103,14 @@ device_set_context(device_context_t *c, const device_t *dev, int inst) void * single_sec = config_find_section((char *) dev->name); if ((sec == NULL) && (single_sec != NULL)) config_rename_section(single_sec, c->name); + } else if (!strcmp(dev->name, "PS/2 Mouse")) { + sprintf(c->name, "%s", dev->name); + + /* Migrate the old "Standard PS/2 Mouse" section */ + const void *sec = config_find_section(c->name); + void * old_sec = config_find_section("Standard PS/2 Mouse"); + if ((sec == NULL) && (old_sec != NULL)) + config_rename_section(old_sec, c->name); } else sprintf(c->name, "%s", dev->name); } diff --git a/src/device/mouse_ps2.c b/src/device/mouse_ps2.c index c3a7310f0..e5f9dd410 100644 --- a/src/device/mouse_ps2.c +++ b/src/device/mouse_ps2.c @@ -389,7 +389,7 @@ static const device_config_t ps2_config[] = { }; const device_t mouse_ps2_device = { - .name = "Standard PS/2 Mouse", + .name = "PS/2 Mouse", .internal_name = "ps2", .flags = DEVICE_PS2, .local = MOUSE_TYPE_PS2, diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index b78466c3b..c221d530d 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -1916,7 +1916,7 @@ victor_v86p_available(void) static const device_config_t dtc_config[] = { { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xc8000, @@ -1967,7 +1967,7 @@ static const device_config_t st11_config[] = { }, { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xc8000, @@ -2002,7 +2002,7 @@ static const device_config_t st11_config[] = { static const device_config_t wd_config[] = { { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xc8000, @@ -2080,7 +2080,7 @@ static const device_config_t wd_nobios_config[] = { static const device_config_t wd_rll_config[] = { { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xc8000, @@ -2140,7 +2140,7 @@ static const device_config_t wd_rll_config[] = { static const device_config_t wd1004a_config[] = { { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xc8000, @@ -2186,7 +2186,7 @@ static const device_config_t wd1004a_config[] = { static const device_config_t wd1004_rll_config[] = { { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xc8000, diff --git a/src/floppy/fdc_magitronic.c b/src/floppy/fdc_magitronic.c index 084ce8c81..f607267ef 100644 --- a/src/floppy/fdc_magitronic.c +++ b/src/floppy/fdc_magitronic.c @@ -111,7 +111,7 @@ static const device_config_t b215_config[] = { // clang-format off { .name = "bios_addr", - .description = "BIOS Address:", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xca000, diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index 504254ee0..292ab6a5b 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -209,7 +209,7 @@ static const device_config_t monster_fdc_config[] = { }, { .name = "sec_dma", - .description = "Secondary Controller DMA", + .description = "Secondary Controller DMA Address", .type = CONFIG_SELECTION, .default_string = "", .default_int = 2, @@ -234,7 +234,7 @@ static const device_config_t monster_fdc_config[] = { #endif { .name = "bios_addr", - .description = "BIOS Address:", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xc8000, diff --git a/src/floppy/fdc_pii15xb.c b/src/floppy/fdc_pii15xb.c index 5fd38d250..cc998e8e1 100644 --- a/src/floppy/fdc_pii15xb.c +++ b/src/floppy/fdc_pii15xb.c @@ -124,7 +124,7 @@ static const device_config_t pii_config[] = { // clang-format off { .name = "bios_addr", - .description = "BIOS Address:", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xce000, diff --git a/src/network/net_3c503.c b/src/network/net_3c503.c index 11e823326..6191c02bf 100644 --- a/src/network/net_3c503.c +++ b/src/network/net_3c503.c @@ -720,7 +720,7 @@ static const device_config_t threec503_config[] = { }, { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xCC000, diff --git a/src/network/net_ne2000.c b/src/network/net_ne2000.c index 5d8566bb7..324154947 100644 --- a/src/network/net_ne2000.c +++ b/src/network/net_ne2000.c @@ -1392,7 +1392,7 @@ static const device_config_t ne2000_config[] = { }, { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0, @@ -1479,7 +1479,7 @@ static const device_config_t ne2000_compat_config[] = { }, { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0, @@ -1560,7 +1560,7 @@ static const device_config_t ne2000_compat_8bit_config[] = { }, { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0, diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 05e44c2c0..9d864390d 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -77,7 +77,7 @@ SettingsInput::onCurrentMachineChanged(int machineId) mouseModel->insertRow(row); auto idx = mouseModel->index(row, 0); - mouseModel->setData(idx, name, Qt::DisplayRole); + mouseModel->setData(idx, tr(name.toUtf8().data()), Qt::DisplayRole); mouseModel->setData(idx, i, Qt::UserRole); if (i == mouse_type) { diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp index 2aa3705fd..9c8646c00 100644 --- a/src/qt/qt_settingsnetwork.cpp +++ b/src/qt/qt_settingsnetwork.cpp @@ -127,7 +127,7 @@ SettingsNetwork::onCurrentMachineChanged(int machineId) } if (network_card_available(c) && device_is_valid(network_card_getdevice(c), machineId)) { - int row = Models::AddEntry(model, name, c); + int row = Models::AddEntry(model, tr(name.toUtf8().data()), c); if (c == net_cards_conf[i].device_num) { selectedRow = row - removeRows; } diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index e0572c3d8..4d1df4cef 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -119,7 +119,7 @@ SettingsSound::onCurrentMachineChanged(const int machineId) } if (midi_out_device_available(c)) { - int row = Models::AddEntry(model, name, c); + int row = Models::AddEntry(model, tr(name.toUtf8().data()), c); if (c == midi_output_device_current) { selectedRow = row - removeRows; } @@ -142,7 +142,7 @@ SettingsSound::onCurrentMachineChanged(const int machineId) } if (midi_in_device_available(c)) { - int row = Models::AddEntry(model, name, c); + int row = Models::AddEntry(model, tr(name.toUtf8().data()), c); if (c == midi_input_device_current) { selectedRow = row - removeRows; } diff --git a/src/sound/midi.c b/src/sound/midi.c index 9edf0a2aa..78794ef24 100644 --- a/src/sound/midi.c +++ b/src/sound/midi.c @@ -83,12 +83,12 @@ static const MIDI_OUT_DEVICE devices[] = { { &cm32l_device }, { &cm32ln_device }, #endif /*USE_MUNT */ -#ifdef USE_RTMIDI - { &rtmidi_output_device }, -#endif /* USE_RTMIDI */ #ifdef USE_OPL4ML { &opl4_midi_device }, #endif /* USE_OPL4ML */ +#ifdef USE_RTMIDI + { &rtmidi_output_device }, +#endif /* USE_RTMIDI */ { NULL } // clang-format on }; diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 8742c3b32..6cb7f6104 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -3970,7 +3970,7 @@ static const device_config_t ext8514_config[] = { }, { .name = "bios_addr", - .description = "BIOS address", + .description = "BIOS Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xc8000, From d4bbb523c010101b9573d5c5bf1458269b2d42fc Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:26:09 +0100 Subject: [PATCH 541/624] SB MIDI to DSP MIDI. --- src/sound/snd_azt2316a.c | 4 ++-- src/sound/snd_gus.c | 2 +- src/sound/snd_optimc.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/sound/snd_azt2316a.c b/src/sound/snd_azt2316a.c index 28ab2b7ac..1f8f954d6 100644 --- a/src/sound/snd_azt2316a.c +++ b/src/sound/snd_azt2316a.c @@ -1443,7 +1443,7 @@ static const device_config_t azt1605_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -1564,7 +1564,7 @@ static const device_config_t azt2316a_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 diff --git a/src/sound/snd_gus.c b/src/sound/snd_gus.c index 10b6f00dc..b0ce28c6f 100644 --- a/src/sound/snd_gus.c +++ b/src/sound/snd_gus.c @@ -1515,7 +1515,7 @@ static const device_config_t gus_config[] = { }, { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index 3b649639a..c3b9482e8 100644 --- a/src/sound/snd_optimc.c +++ b/src/sound/snd_optimc.c @@ -458,7 +458,7 @@ static const device_config_t optimc_config[] = { // clang-format off { .name = "receive_input", - .description = "Receive input (SB MIDI)", + .description = "Receive input (DSP MIDI)", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 From 519f47746a418099c47a5c553214be9d28506d69 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:28:13 +0100 Subject: [PATCH 542/624] DMA channel, not Address. --- src/floppy/fdc_monster.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index 292ab6a5b..cbbaea7bf 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -209,7 +209,7 @@ static const device_config_t monster_fdc_config[] = { }, { .name = "sec_dma", - .description = "Secondary Controller DMA Address", + .description = "Secondary Controller DMA channel", .type = CONFIG_SELECTION, .default_string = "", .default_int = 2, From 922032035e4b6137b34a9917eb98d3aec1449a9b Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:31:27 +0100 Subject: [PATCH 543/624] MIDI input and output strings. --- src/sound/midi_rtmidi.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sound/midi_rtmidi.cpp b/src/sound/midi_rtmidi.cpp index 72df8fd32..9222c8dda 100644 --- a/src/sound/midi_rtmidi.cpp +++ b/src/sound/midi_rtmidi.cpp @@ -234,7 +234,7 @@ static const device_config_t system_midi_config[] = { // clang-format off { .name = "midi", - .description = "MIDI out device", + .description = "MIDI Output Device", .type = CONFIG_MIDI_OUT, .default_string = "", .default_int = 0 @@ -247,7 +247,7 @@ static const device_config_t midi_input_config[] = { // clang-format off { .name = "midi_input", - .description = "MIDI in device", + .description = "MIDI Input Device", .type = CONFIG_MIDI_IN, .default_string = "", .default_int = 0 From 8b68dec1b50abce37dd43c8c1663aa90f1e16c3a Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:33:27 +0100 Subject: [PATCH 544/624] Two more strings. --- src/device/mouse_serial.c | 2 +- src/network/net_3c503.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/device/mouse_serial.c b/src/device/mouse_serial.c index afc662a19..fa3190536 100644 --- a/src/device/mouse_serial.c +++ b/src/device/mouse_serial.c @@ -1044,7 +1044,7 @@ static const device_config_t ltsermouse_config[] = { }, { .name = "rts_toggle", - .description = "Microsoft-compatible RTS toggle", + .description = "RTS toggle", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 diff --git a/src/network/net_3c503.c b/src/network/net_3c503.c index 6191c02bf..0205388ed 100644 --- a/src/network/net_3c503.c +++ b/src/network/net_3c503.c @@ -693,7 +693,7 @@ static const device_config_t threec503_config[] = { }, { .name = "dma", - .description = "DMA", + .description = "DMA channel", .type = CONFIG_SELECTION, .default_string = "", .default_int = 3, From bace3fe90080c0ba12c4ef2fd17131b3e58ac176 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:35:27 +0100 Subject: [PATCH 545/624] Voodoo Recomiler -> Dynamic Recompiler. --- src/video/vid_voodoo.c | 2 +- src/video/vid_voodoo_banshee.c | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index efa2d20c8..a9981333b 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -1418,7 +1418,7 @@ static const device_config_t voodoo_config[] = { #ifndef NO_CODEGEN { .name = "recompiler", - .description = "Recompiler", + .description = "Dynamic Recompiler", .type = CONFIG_BINARY, .default_int = 1 }, diff --git a/src/video/vid_voodoo_banshee.c b/src/video/vid_voodoo_banshee.c index c1fb65b00..0c5e5f7bb 100644 --- a/src/video/vid_voodoo_banshee.c +++ b/src/video/vid_voodoo_banshee.c @@ -3220,7 +3220,7 @@ static const device_config_t banshee_sgram_config[] = { #ifndef NO_CODEGEN { .name = "recompiler", - .description = "Recompiler", + .description = "Dynamic Recompiler", .type = CONFIG_BINARY, .default_int = 1 }, @@ -3275,7 +3275,7 @@ static const device_config_t banshee_sgram_16mbonly_config[] = { #ifndef NO_CODEGEN { .name = "recompiler", - .description = "Recompiler", + .description = "Dynamic Recompiler", .type = CONFIG_BINARY, .default_int = 1 }, @@ -3330,7 +3330,7 @@ static const device_config_t banshee_sdram_config[] = { #ifndef NO_CODEGEN { .name = "recompiler", - .description = "Recompiler", + .description = "Dynamic Recompiler", .type = CONFIG_BINARY, .default_int = 1 }, From a1566e905f13dd1a83ece30ae2f32a8c4d4f4663 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:36:34 +0100 Subject: [PATCH 546/624] XGA address -> Address. --- src/video/vid_xga.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index 686634492..cfc002a0b 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -3649,7 +3649,7 @@ static const device_config_t xga_isa_configuration[] = { }, { .name = "ext_mem_addr", - .description = "MMIO address", + .description = "MMIO Address", .type = CONFIG_HEX16, .default_string = "", .default_int = 0x00f0, From fbc21cdf49e32a4e2308dfdfbc78562f8bfcb606 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:42:01 +0100 Subject: [PATCH 547/624] DMA channel -> DMA. --- src/floppy/fdc_monster.c | 2 +- src/network/net_3c501.c | 2 +- src/network/net_3c503.c | 2 +- src/network/net_pcnet.c | 2 +- src/scsi/scsi_aha154x.c | 6 +++--- src/scsi/scsi_buslogic.c | 2 +- src/sound/snd_adlibgold.c | 2 +- src/sound/snd_sb.c | 8 ++++---- src/video/vid_xga.c | 4 ++-- 9 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/floppy/fdc_monster.c b/src/floppy/fdc_monster.c index cbbaea7bf..00b6d37f5 100644 --- a/src/floppy/fdc_monster.c +++ b/src/floppy/fdc_monster.c @@ -209,7 +209,7 @@ static const device_config_t monster_fdc_config[] = { }, { .name = "sec_dma", - .description = "Secondary Controller DMA channel", + .description = "Secondary Controller DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 2, diff --git a/src/network/net_3c501.c b/src/network/net_3c501.c index 868ee036f..2cafb1d46 100644 --- a/src/network/net_3c501.c +++ b/src/network/net_3c501.c @@ -1191,7 +1191,7 @@ static const device_config_t threec501_config[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 3, diff --git a/src/network/net_3c503.c b/src/network/net_3c503.c index 0205388ed..6191c02bf 100644 --- a/src/network/net_3c503.c +++ b/src/network/net_3c503.c @@ -693,7 +693,7 @@ static const device_config_t threec503_config[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 3, diff --git a/src/network/net_pcnet.c b/src/network/net_pcnet.c index 1e28c5846..b800c1129 100644 --- a/src/network/net_pcnet.c +++ b/src/network/net_pcnet.c @@ -3116,7 +3116,7 @@ static const device_config_t pcnet_isa_config[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 5, diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index 7d9f1ba24..3887fd4ba 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -1197,7 +1197,7 @@ static const device_config_t aha_154xb_config[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 6, @@ -1290,7 +1290,7 @@ static const device_config_t aha_154x_config[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 6, @@ -1363,7 +1363,7 @@ static const device_config_t aha_154xcf_config[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 6, diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index ac3b464a8..b0aeedfa4 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -1818,7 +1818,7 @@ static const device_config_t BT_ISA_Config[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 6, diff --git a/src/sound/snd_adlibgold.c b/src/sound/snd_adlibgold.c index 8f62d0417..9b1797770 100644 --- a/src/sound/snd_adlibgold.c +++ b/src/sound/snd_adlibgold.c @@ -1222,7 +1222,7 @@ static const device_config_t adgold_config[] = { }, { .name = "dma", - .description = "Low DMA channel", + .description = "Low DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 1, diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 4f6961fab..b62572342 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -4552,7 +4552,7 @@ static const device_config_t sb_16_config[] = { }, { .name = "dma", - .description = "Low DMA channel", + .description = "Low DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 1, @@ -4576,7 +4576,7 @@ static const device_config_t sb_16_config[] = { }, { .name = "dma16", - .description = "High DMA channel", + .description = "High DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 5, @@ -4822,7 +4822,7 @@ static const device_config_t sb_awe32_config[] = { }, { .name = "dma", - .description = "Low DMA channel", + .description = "Low DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 1, @@ -4846,7 +4846,7 @@ static const device_config_t sb_awe32_config[] = { }, { .name = "dma16", - .description = "High DMA channel", + .description = "High DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 5, diff --git a/src/video/vid_xga.c b/src/video/vid_xga.c index cfc002a0b..3df43a29c 100644 --- a/src/video/vid_xga.c +++ b/src/video/vid_xga.c @@ -3673,7 +3673,7 @@ static const device_config_t xga_isa_configuration[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 7, @@ -3714,7 +3714,7 @@ static const device_config_t xga_inmos_isa_configuration[] = { }, { .name = "dma", - .description = "DMA channel", + .description = "DMA", .type = CONFIG_SELECTION, .default_string = "", .default_int = 7, From b2258f4ae700f0a50543751b1d79799eba604b91 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:45:38 +0100 Subject: [PATCH 548/624] BIOS -> BIOS Revision. --- src/disk/hdc_xtide.c | 4 ++-- src/scsi/scsi_ncr53c8xx.c | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/disk/hdc_xtide.c b/src/disk/hdc_xtide.c index 057d4f0ed..9899e2a0f 100644 --- a/src/disk/hdc_xtide.c +++ b/src/disk/hdc_xtide.c @@ -233,7 +233,7 @@ static const device_config_t xtide_config[] = { // clang-format off { .name = "bios", - .description = "BIOS", + .description = "BIOS Revision", .type = CONFIG_BIOS, .default_string = "xt", .default_int = 0, @@ -255,7 +255,7 @@ static const device_config_t xtide_at_config[] = { // clang-format off { .name = "bios", - .description = "BIOS", + .description = "BIOS Revision", .type = CONFIG_BIOS, .default_string = "at", .default_int = 0, diff --git a/src/scsi/scsi_ncr53c8xx.c b/src/scsi/scsi_ncr53c8xx.c index 1395c2f6f..1425f468b 100644 --- a/src/scsi/scsi_ncr53c8xx.c +++ b/src/scsi/scsi_ncr53c8xx.c @@ -2667,7 +2667,7 @@ static const device_config_t ncr53c8xx_pci_config[] = { // clang-format off { .name = "bios", - .description = "BIOS", + .description = "BIOS Revision", .type = CONFIG_SELECTION, .default_string = "", .default_int = 1, From d6cd3572028229c94e0c6ec78858ff31362d7237 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:47:59 +0100 Subject: [PATCH 549/624] BIOS Version -> BIOS Revision. --- src/scsi/scsi_ncr53c400.c | 2 +- src/scsi/scsi_spock.c | 2 +- src/video/vid_et4000.c | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/scsi/scsi_ncr53c400.c b/src/scsi/scsi_ncr53c400.c index 0e772c16c..bea918660 100644 --- a/src/scsi/scsi_ncr53c400.c +++ b/src/scsi/scsi_ncr53c400.c @@ -836,7 +836,7 @@ static const device_config_t rt1000b_config[] = { }, { .name = "bios_ver", - .description = "BIOS Version", + .description = "BIOS Revision", .type = CONFIG_BIOS, .default_string = "v8_10r", .default_int = 0, diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index ba2817fe3..0c30d1532 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -1201,7 +1201,7 @@ static const device_config_t spock_rom_config[] = { // clang-format off { .name = "bios_ver", - .description = "BIOS Version", + .description = "BIOS Revision", .type = CONFIG_SELECTION, .default_string = "", .default_int = 1, diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index 0ac7050f4..caf8d03c7 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -967,7 +967,7 @@ static const device_config_t et4000_tc6058af_config[] = { }, { .name = "bios_ver", - .description = "BIOS Version", + .description = "BIOS Revision", .type = CONFIG_BIOS, .default_string = "v1_10", .default_int = 0, @@ -1014,7 +1014,7 @@ static const device_config_t et4000_bios_config[] = { }, { .name = "bios_ver", - .description = "BIOS Version", + .description = "BIOS Revision", .type = CONFIG_BIOS, .default_string = "v8_01", .default_int = 0, From 066fe83a08551394fb3b2f914454722dab933c51 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:49:50 +0100 Subject: [PATCH 550/624] Memory Size -> Memory size. --- src/device/isamem.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/device/isamem.c b/src/device/isamem.c index f2332a5cc..4ff819d67 100644 --- a/src/device/isamem.c +++ b/src/device/isamem.c @@ -857,7 +857,7 @@ static const device_config_t ibmxt_32k_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 32, @@ -905,7 +905,7 @@ static const device_config_t ibmxt_64k_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 64, @@ -953,7 +953,7 @@ static const device_config_t ibmxt_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 128, @@ -1001,7 +1001,7 @@ static const device_config_t genericxt_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 16, @@ -1049,7 +1049,7 @@ static const device_config_t msramcard_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 64, @@ -1097,7 +1097,7 @@ static const device_config_t mssystemcard_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 64, @@ -1159,7 +1159,7 @@ static const device_config_t ibmat_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 512, @@ -1207,7 +1207,7 @@ static const device_config_t genericat_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 512, @@ -1255,7 +1255,7 @@ static const device_config_t p5pak_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 128, @@ -1303,7 +1303,7 @@ static const device_config_t a6pak_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 64, @@ -1351,7 +1351,7 @@ static const device_config_t ems5150_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 256, @@ -1402,7 +1402,7 @@ static const device_config_t ev159_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 512, @@ -1544,7 +1544,7 @@ static const device_config_t ev165a_config[] = { // clang-format off { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 512, @@ -1669,7 +1669,7 @@ static const device_config_t brxt_config[] = { }, { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 512, @@ -1762,7 +1762,7 @@ static const device_config_t brat_config[] = { }, { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 512, @@ -1841,7 +1841,7 @@ static const device_config_t lotech_config[] = { }, { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 2048, @@ -1897,7 +1897,7 @@ static const device_config_t rampage_config[] = { }, { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 256, /* Technically 128k, but banks 2-7 must be 256, headaches elsewise */ @@ -2009,7 +2009,7 @@ static const device_config_t iab_config[] = { }, { .name = "size", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SPINNER, .default_string = "", .default_int = 128, From 6d7e11c620e3cd26f9be0fca7a1ff70b42baae08 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:51:18 +0100 Subject: [PATCH 551/624] WD8003 and AHA-154x: address -> Address. --- src/network/net_wd8003.c | 2 +- src/scsi/scsi_aha154x.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/net_wd8003.c b/src/network/net_wd8003.c index 04b922aaf..4ea3f4525 100644 --- a/src/network/net_wd8003.c +++ b/src/network/net_wd8003.c @@ -841,7 +841,7 @@ static const device_config_t wd8003_config[] = { }, { .name = "ram_addr", - .description = "RAM address", + .description = "RAM Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xD0000, diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index 3887fd4ba..e3f38c4e5 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -1397,7 +1397,7 @@ static const device_config_t aha_154xcf_config[] = { }, { .name = "fdc_addr", - .description = "FDC address", + .description = "FDC Address", .type = CONFIG_HEX16, .default_string = "", .default_int = 0, From 55e70fb3c3dc4fcc5449c5d15bb1a7efbe9b2680 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 02:53:38 +0100 Subject: [PATCH 552/624] Sound Font -> SoundFont. --- src/sound/midi_fluidsynth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/midi_fluidsynth.c b/src/sound/midi_fluidsynth.c index f8c7964f7..8a292f5df 100644 --- a/src/sound/midi_fluidsynth.c +++ b/src/sound/midi_fluidsynth.c @@ -321,7 +321,7 @@ static const device_config_t fluidsynth_config[] = { // clang-format off { .name = "sound_font", - .description = "Sound Font", + .description = "SoundFont", .type = CONFIG_FNAME, .default_string = "", .file_filter = "SF2 Sound Fonts (*.sf2)|*.sf2" From b8a742a108168d2e10359b9eb5c93444e767de1f Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 04:35:34 +0100 Subject: [PATCH 553/624] Xi8088 UMB mapping strings. --- src/machine/m_xt_xi8088.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/machine/m_xt_xi8088.c b/src/machine/m_xt_xi8088.c index 8515ea27a..702a088ce 100644 --- a/src/machine/m_xt_xi8088.c +++ b/src/machine/m_xt_xi8088.c @@ -122,37 +122,37 @@ static const device_config_t xi8088_config[] = { }, { .name = "umb_c0000h_c7fff", - .description = "Map 0xc0000-0xc7fff as UMB", + .description = "Map C0000-C7FFF as UMB", .type = CONFIG_BINARY, .default_int = 0 }, { .name = "umb_c8000h_cffff", - .description = "Map 0xc8000-0xcffff as UMB", + .description = "Map C8000-CFFFF as UMB", .type = CONFIG_BINARY, .default_int = 0 }, { .name = "umb_d0000h_d7fff", - .description = "Map 0xd0000-0xd7fff as UMB", + .description = "Map D0000-D7FFF as UMB", .type = CONFIG_BINARY, .default_int = 0 }, { .name = "umb_d8000h_dffff", - .description = "Map 0xd8000-0xdffff as UMB", + .description = "Map D8000-DFFFF as UMB", .type = CONFIG_BINARY, .default_int = 0 }, { .name = "umb_e0000h_e7fff", - .description = "Map 0xe0000-0xe7fff as UMB", + .description = "Map E0000-E7FFF as UMB", .type = CONFIG_BINARY, .default_int = 0 }, { .name = "umb_e8000h_effff", - .description = "Map 0xe8000-0xeffff as UMB", + .description = "Map E8000-EFFFF as UMB", .type = CONFIG_BINARY, .default_int = 0 }, From dc2d3f6bcd1d599c80ad2029a949214b815aa1dc Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 05:06:09 +0100 Subject: [PATCH 554/624] MIDI input receive toggle strings. --- src/sound/snd_adlibgold.c | 2 +- src/sound/snd_audiopci.c | 8 +++--- src/sound/snd_azt2316a.c | 8 +++--- src/sound/snd_cmi8x38.c | 4 +-- src/sound/snd_gus.c | 2 +- src/sound/snd_mpu401.c | 4 +-- src/sound/snd_optimc.c | 4 +-- src/sound/snd_pas16.c | 16 +++++------ src/sound/snd_sb.c | 60 +++++++++++++++++++-------------------- 9 files changed, 53 insertions(+), 55 deletions(-) diff --git a/src/sound/snd_adlibgold.c b/src/sound/snd_adlibgold.c index 9b1797770..37f1a5905 100644 --- a/src/sound/snd_adlibgold.c +++ b/src/sound/snd_adlibgold.c @@ -1256,7 +1256,7 @@ static const device_config_t adgold_config[] = { }, { .name = "receive_input", - .description = "Receive input (MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index f8c14e06f..06ebeb0e3 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -2311,7 +2311,7 @@ static const device_config_t es1371_config[] = { }, { .name = "receive_input", - .description = "Receive input (MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -2345,7 +2345,7 @@ static const device_config_t es1373_config[] = { }, { .name = "receive_input", - .description = "Receive input (MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -2375,7 +2375,7 @@ static const device_config_t ct5880_config[] = { }, { .name = "receive_input", - .description = "Receive input (MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -2388,7 +2388,7 @@ static const device_config_t es1371_onboard_config[] = { // clang-format off { .name = "receive_input", - .description = "Receive input (MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 diff --git a/src/sound/snd_azt2316a.c b/src/sound/snd_azt2316a.c index 1f8f954d6..f4596fbb0 100644 --- a/src/sound/snd_azt2316a.c +++ b/src/sound/snd_azt2316a.c @@ -1443,14 +1443,14 @@ static const device_config_t azt1605_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -1564,14 +1564,14 @@ static const device_config_t azt2316a_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 diff --git a/src/sound/snd_cmi8x38.c b/src/sound/snd_cmi8x38.c index d548763ce..e99280b1e 100644 --- a/src/sound/snd_cmi8x38.c +++ b/src/sound/snd_cmi8x38.c @@ -1510,7 +1510,7 @@ static const device_config_t cmi8x38_config[] = { // clang-format off { .name = "receive_input", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -1530,7 +1530,7 @@ static const device_config_t cmi8738_config[] = { }, { .name = "receive_input", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 diff --git a/src/sound/snd_gus.c b/src/sound/snd_gus.c index b0ce28c6f..3ef13a918 100644 --- a/src/sound/snd_gus.c +++ b/src/sound/snd_gus.c @@ -1515,7 +1515,7 @@ static const device_config_t gus_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index 21595e373..03f2ec0a4 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -1901,7 +1901,7 @@ static const device_config_t mpu401_standalone_config[] = { }, { .name = "receive_input", - .description = "Receive input", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_int = 1 }, @@ -1949,7 +1949,7 @@ static const device_config_t mpu401_standalone_mca_config[] = { }, { .name = "receive_input", - .description = "Receive input", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_int = 1 }, diff --git a/src/sound/snd_optimc.c b/src/sound/snd_optimc.c index c3b9482e8..346c300f2 100644 --- a/src/sound/snd_optimc.c +++ b/src/sound/snd_optimc.c @@ -458,14 +458,14 @@ static const device_config_t optimc_config[] = { // clang-format off { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c index 5ab14d1b8..4c81bd9e8 100644 --- a/src/sound/snd_pas16.c +++ b/src/sound/snd_pas16.c @@ -2403,20 +2403,20 @@ static const device_config_t pas16_config[] = { .default_string = "", .default_int = 0 }, - { - .name = "receive_input401", - .description = "Receive input (MPU-401)", - .type = CONFIG_BINARY, - .default_string = "", - .default_int = 0 - }, { .name = "receive_input", - .description = "Receive input (PAS MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, + { + .name = "receive_input401", + .description = "Receive MIDI input (MPU-401)", + .type = CONFIG_BINARY, + .default_string = "", + .default_int = 0 + }, { .name = "", .description = "", .type = CONFIG_END } }; diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index b62572342..ffb2d747f 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -4055,7 +4055,7 @@ static const device_config_t sb_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4165,7 +4165,7 @@ static const device_config_t sb15_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4294,7 +4294,7 @@ static const device_config_t sb2_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4360,7 +4360,7 @@ static const device_config_t sb_mcv_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4450,7 +4450,7 @@ static const device_config_t sb_pro_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4461,7 +4461,7 @@ static const device_config_t sb_pro_config[] = { static const device_config_t sb_pro_mcv_config[] = { { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -4614,14 +4614,14 @@ static const device_config_t sb_16_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -4639,14 +4639,14 @@ static const device_config_t sb_16_pnp_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -4657,7 +4657,7 @@ static const device_config_t sb_16_pnp_config[] = { static const device_config_t sb_32_pnp_config[] = { { .name = "onboard_ram", - .description = "Onboard RAM", + .description = "Memory Size", .type = CONFIG_SELECTION, .default_string = "", .default_int = 0, @@ -4696,14 +4696,14 @@ static const device_config_t sb_32_pnp_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -4916,14 +4916,14 @@ static const device_config_t sb_awe32_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -4973,14 +4973,14 @@ static const device_config_t sb_awe32_pnp_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -5050,14 +5050,14 @@ static const device_config_t sb_awe64_value_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -5123,14 +5123,14 @@ static const device_config_t sb_awe64_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -5188,14 +5188,14 @@ static const device_config_t sb_awe64_gold_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -5318,7 +5318,7 @@ static const device_config_t ess_688_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5449,14 +5449,14 @@ static const device_config_t ess_1688_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -5468,7 +5468,7 @@ static const device_config_t ess_1688_config[] = { static const device_config_t ess_688_pnp_config[] = { { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 @@ -5487,14 +5487,14 @@ static const device_config_t ess_1688_pnp_config[] = { }, { .name = "receive_input", - .description = "Receive input (DSP MIDI)", + .description = "Receive MIDI input", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 }, { .name = "receive_input401", - .description = "Receive input (MPU-401)", + .description = "Receive MIDI input (MPU-401)", .type = CONFIG_BINARY, .default_string = "", .default_int = 0 @@ -5950,5 +5950,3 @@ const device_t ess_chipchat_16_mca_device = { .force_redraw = NULL, .config = ess_1688_pnp_config }; - - From 61a88eea02c39eb8a21e3d812ee4a717de99ee46 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 05:09:45 +0100 Subject: [PATCH 555/624] Enable Boot ROM -> Enable BIOS. --- src/scsi/scsi_t128.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/scsi/scsi_t128.c b/src/scsi/scsi_t128.c index 7e42a089d..3a49f599f 100644 --- a/src/scsi/scsi_t128.c +++ b/src/scsi/scsi_t128.c @@ -573,7 +573,7 @@ static const device_config_t t128_config[] = { }, { .name = "boot", - .description = "Enable Boot ROM", + .description = "Enable BIOS", .type = CONFIG_BINARY, .default_string = "", .default_int = 1 From 1dcd2f830517ee6cc15cd32a4e9ff7f94445faae Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 05:13:03 +0100 Subject: [PATCH 556/624] Board Revision -> BIOS Revision. --- src/disk/hdc_st506_xt.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/disk/hdc_st506_xt.c b/src/disk/hdc_st506_xt.c index c221d530d..766b28086 100644 --- a/src/disk/hdc_st506_xt.c +++ b/src/disk/hdc_st506_xt.c @@ -1984,15 +1984,15 @@ static const device_config_t st11_config[] = { }, { .name = "revision", - .description = "Board Revision", + .description = "BIOS Revision", .type = CONFIG_SELECTION, .default_string = "", .default_int = 19, .file_filter = "", .spinner = { 0 }, .selection = { - { .description = "Rev. 05 (v1.7)", .value = 5 }, - { .description = "Rev. 19 (v2.0)", .value = 19 }, + { .description = "v1.7", .value = 5 }, + { .description = "v2.0", .value = 19 }, { .description = "" } } }, From 748987fa46c5102dc80699121ea42263f2ceeb88 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 05:15:54 +0100 Subject: [PATCH 557/624] Onboard memory size -> Memory size. --- src/video/vid_cl54xx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 01210a9d9..1adcc14ec 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -4599,7 +4599,7 @@ static const device_config_t gd5426_config[] = { static const device_config_t gd5428_onboard_config[] = { { .name = "memory", - .description = "Onboard memory size", + .description = "Memory size", .type = CONFIG_SELECTION, .selection = { { @@ -4653,7 +4653,7 @@ static const device_config_t gd5429_config[] = { static const device_config_t gd5440_onboard_config[] = { { .name = "memory", - .description = "Onboard memory size", + .description = "Memory size", .type = CONFIG_SELECTION, .selection = { { @@ -4707,7 +4707,7 @@ static const device_config_t gd5434_config[] = { static const device_config_t gd5434_onboard_config[] = { { .name = "memory", - .description = "Onboard memory size", + .description = "Memory size", .type = CONFIG_SELECTION, .selection = { { From 9beadac6074f0ad71e592737e585309840c20cdd Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 05:17:58 +0100 Subject: [PATCH 558/624] Some forgotten instances of "address" in network/net_wd8003.c. --- src/network/net_wd8003.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/network/net_wd8003.c b/src/network/net_wd8003.c index 4ea3f4525..5fd1034eb 100644 --- a/src/network/net_wd8003.c +++ b/src/network/net_wd8003.c @@ -908,7 +908,7 @@ static const device_config_t wd8003eb_config[] = { }, { .name = "ram_addr", - .description = "RAM address", + .description = "RAM Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xD0000, @@ -997,7 +997,7 @@ static const device_config_t wd8013_config[] = { }, { .name = "ram_addr", - .description = "RAM address", + .description = "RAM Address", .type = CONFIG_HEX20, .default_string = "", .default_int = 0xD0000, From 9d3559a0ab72b14e7b4bc656972d7e9ab81ca7a1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 23:38:48 +0100 Subject: [PATCH 559/624] Memory Size -> Memory size. --- src/sound/snd_sb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index ffb2d747f..305e291d5 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -4657,7 +4657,7 @@ static const device_config_t sb_16_pnp_config[] = { static const device_config_t sb_32_pnp_config[] = { { .name = "onboard_ram", - .description = "Memory Size", + .description = "Memory size", .type = CONFIG_SELECTION, .default_string = "", .default_int = 0, From d98e51b7f47b745fedb1c8ca84ae71da12a8b448 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 10 Nov 2024 23:49:57 +0100 Subject: [PATCH 560/624] Onboard RAM -> Memory size --- src/sound/snd_gus.c | 2 +- src/sound/snd_sb.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/sound/snd_gus.c b/src/sound/snd_gus.c index 3ef13a918..55707b493 100644 --- a/src/sound/snd_gus.c +++ b/src/sound/snd_gus.c @@ -1491,7 +1491,7 @@ static const device_config_t gus_config[] = { }, { .name = "gus_ram", - "Onboard RAM", + "Memory size", .type = CONFIG_SELECTION, .default_string = "", .default_int = 0, diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 305e291d5..6536071b0 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -4870,7 +4870,7 @@ static const device_config_t sb_awe32_config[] = { }, { .name = "onboard_ram", - .description = "Onboard RAM", + .description = "Memory size", .type = CONFIG_SELECTION, .default_string = "", .default_int = 512, @@ -4934,7 +4934,7 @@ static const device_config_t sb_awe32_config[] = { static const device_config_t sb_awe32_pnp_config[] = { { .name = "onboard_ram", - .description = "Onboard RAM", + .description = "Memory size", .type = CONFIG_SELECTION, .default_string = "", .default_int = 512, @@ -4991,7 +4991,7 @@ static const device_config_t sb_awe32_pnp_config[] = { static const device_config_t sb_awe64_value_config[] = { { .name = "onboard_ram", - .description = "Onboard RAM", + .description = "Memory size", .type = CONFIG_SELECTION, .default_string = "", .default_int = 512, @@ -5068,7 +5068,7 @@ static const device_config_t sb_awe64_value_config[] = { static const device_config_t sb_awe64_config[] = { { .name = "onboard_ram", - .description = "Onboard RAM", + .description = "Memory size", .type = CONFIG_SELECTION, .default_string = "", .default_int = 1024, @@ -5141,7 +5141,7 @@ static const device_config_t sb_awe64_config[] = { static const device_config_t sb_awe64_gold_config[] = { { .name = "onboard_ram", - .description = "Onboard RAM", + .description = "Memory size", .type = CONFIG_SELECTION, .default_string = "", .default_int = 4096, From fffb5fbbc767b16b709d9ffbf58427f3b46b7be7 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 11 Nov 2024 09:44:29 +0100 Subject: [PATCH 561/624] Everything in the device configuration dialog is now translatable. --- src/qt/qt_deviceconfig.cpp | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 21f9a7e80..deb28f8b3 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -124,7 +124,8 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) return; while (config->type != -1) { - const int config_type = config->type & CONFIG_TYPE_MASK; + const int config_type = config->type & CONFIG_TYPE_MASK; + const char *tdesc = tr(config->description).toUtf8().data(); /* Ignore options of the wrong class. */ if (!!(config->type & CONFIG_DEP) != is_dep) @@ -168,7 +169,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) auto *cbox = new QCheckBox(); cbox->setObjectName(config->name); cbox->setChecked(value > 0); - this->ui->formLayout->addRow(config->description, cbox); + this->ui->formLayout->addRow(tdesc, cbox); break; } #ifdef USE_RTMIDI @@ -183,11 +184,11 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) char midiName[512] = { 0 }; rtmidi_out_get_dev_name(i, midiName); - Models::AddEntry(model, midiName, i); + Models::AddEntry(model, tr(midiName), i); if (i == value) currentIndex = i; } - this->ui->formLayout->addRow(config->description, cbox); + this->ui->formLayout->addRow(tdesc, cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -202,11 +203,11 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) char midiName[512] = { 0 }; rtmidi_in_get_dev_name(i, midiName); - Models::AddEntry(model, midiName, i); + Models::AddEntry(model, tr(midiName), i); if (i == value) currentIndex = i; } - this->ui->formLayout->addRow(config->description, cbox); + this->ui->formLayout->addRow(tdesc, cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -221,15 +222,15 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) cbox->setMaxVisibleItems(30); auto *model = cbox->model(); int currentIndex = -1; - + this->ui->formLayout->addRow(tdesc, cbox); for (auto *sel = config->selection; (sel != nullptr) && (sel->description != nullptr) && (strlen(sel->description) > 0); ++sel) { - int row = Models::AddEntry(model, sel->description, sel->value); + const char *sdesc = tr(sel->description).toUtf8().data(); + int row = Models::AddEntry(model, sdesc, sel->value); if (sel->value == value) currentIndex = row; } - this->ui->formLayout->addRow(config->description, cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -248,13 +249,14 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) for (int d = 0; d < bios->files_no; d++) p += !!rom_present(const_cast(bios->files[d])); if (p == bios->files_no) { - const int row = Models::AddEntry(model, bios->name, q); + const char *bname = tr(bios->name).toUtf8().data(); + const int row = Models::AddEntry(model, bname, q); if (!strcmp(selected.toUtf8().constData(), bios->internal_name)) currentIndex = row; } q++; } - this->ui->formLayout->addRow(config->description, cbox); + this->ui->formLayout->addRow(tdesc, cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -267,7 +269,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) if (config->spinner.step > 0) spinBox->setSingleStep(config->spinner.step); spinBox->setValue(value); - this->ui->formLayout->addRow(config->description, spinBox); + this->ui->formLayout->addRow(tdesc, spinBox); break; } case CONFIG_FNAME: @@ -277,7 +279,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) fileField->setFileName(selected); fileField->setFilter(QString(config->file_filter).left(static_cast(strcspn(config->file_filter, "|")))); - this->ui->formLayout->addRow(config->description, fileField); + this->ui->formLayout->addRow(tdesc, fileField); break; } case CONFIG_STRING: @@ -286,7 +288,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) lineEdit->setObjectName(config->name); lineEdit->setCursor(Qt::IBeamCursor); lineEdit->setText(selected); - this->ui->formLayout->addRow(config->description, lineEdit); + this->ui->formLayout->addRow(tdesc, lineEdit); break; } case CONFIG_SERPORT: @@ -305,7 +307,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) currentIndex = row; } - this->ui->formLayout->addRow(config->description, cbox); + this->ui->formLayout->addRow(tdesc, cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -337,7 +339,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) }); hboxLayout->addWidget(lineEdit); hboxLayout->addWidget(generateButton); - this->ui->formLayout->addRow(config->description, hboxLayout); + this->ui->formLayout->addRow(tdesc, hboxLayout); break; } } @@ -349,7 +351,7 @@ void DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *settings) { DeviceConfig dc(settings); - dc.setWindowTitle(QString("%1 Device Configuration").arg(device->name)); + dc.setWindowTitle(QString(tr("%1 Device Configuration")).arg(device->name)); device_context_t device_context; device_set_context(&device_context, device, instance); From 4807f63d6f77eb0795d033975c2dd5997de3bba6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 11 Nov 2024 22:08:46 +0100 Subject: [PATCH 562/624] VNC: Remove the obsolete reference to vnc_mouse_poll(), fixes #4950. --- src/vnc.c | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/vnc.c b/src/vnc.c index 7b4b1f7b0..cd9911b02 100644 --- a/src/vnc.c +++ b/src/vnc.c @@ -125,7 +125,6 @@ vnc_clientgone(UNUSED(rfbClientPtr cl)) #if 0 plat_mouse_capture(0); #endif - mouse_set_poll_ex(NULL); plat_pause(1); } @@ -152,7 +151,6 @@ vnc_newclient(rfbClientPtr cl) #if 0 plat_mouse_capture(1); #endif - mouse_set_poll_ex(vnc_mouse_poll); plat_pause(0); } From 30ee3a37ca8ce06ac693bcd580d1ce1a00821580 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 11 Nov 2024 22:21:49 +0100 Subject: [PATCH 563/624] Improved the handling of device configuration translations. --- src/qt/qt_deviceconfig.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index deb28f8b3..319bed028 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -125,7 +125,10 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) while (config->type != -1) { const int config_type = config->type & CONFIG_TYPE_MASK; - const char *tdesc = tr(config->description).toUtf8().data(); + const char *temp = tr(config->description).toUtf8().data(); + char tdesc[512] = { 0 }; + + strcpy(tdesc, temp); /* Ignore options of the wrong class. */ if (!!(config->type & CONFIG_DEP) != is_dep) @@ -222,15 +225,17 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) cbox->setMaxVisibleItems(30); auto *model = cbox->model(); int currentIndex = -1; - this->ui->formLayout->addRow(tdesc, cbox); for (auto *sel = config->selection; (sel != nullptr) && (sel->description != nullptr) && (strlen(sel->description) > 0); ++sel) { - const char *sdesc = tr(sel->description).toUtf8().data(); - int row = Models::AddEntry(model, sdesc, sel->value); + const char *temp2 = tr(sel->description).toUtf8().data(); + char sdesc[512] = { 0 }; + strcpy(sdesc, temp2); + int row = Models::AddEntry(model, sdesc, sel->value); if (sel->value == value) currentIndex = row; } + this->ui->formLayout->addRow(tdesc, cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -249,7 +254,9 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) for (int d = 0; d < bios->files_no; d++) p += !!rom_present(const_cast(bios->files[d])); if (p == bios->files_no) { - const char *bname = tr(bios->name).toUtf8().data(); + const char *temp2 = tr(bios->name).toUtf8().data(); + char bname[512] = { 0 }; + strcpy(bname, temp2); const int row = Models::AddEntry(model, bname, q); if (!strcmp(selected.toUtf8().constData(), bios->internal_name)) currentIndex = row; From efc61061a859149e15e9dbd24d0e84bc793ba3a8 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 12 Nov 2024 01:38:51 +0100 Subject: [PATCH 564/624] KB -> kB. --- src/sound/snd_gus.c | 2 +- src/video/vid_et3000.c | 4 ++-- src/video/vid_et4000.c | 12 ++++++------ src/video/vid_rtg310x.c | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/sound/snd_gus.c b/src/sound/snd_gus.c index 55707b493..3b041def9 100644 --- a/src/sound/snd_gus.c +++ b/src/sound/snd_gus.c @@ -1499,7 +1499,7 @@ static const device_config_t gus_config[] = { .spinner = { 0 }, .selection = { { - .description = "256 KB", + .description = "256 kB", .value = 0 }, { diff --git a/src/video/vid_et3000.c b/src/video/vid_et3000.c index a7d2a749f..30c075b25 100644 --- a/src/video/vid_et3000.c +++ b/src/video/vid_et3000.c @@ -553,9 +553,9 @@ static const device_config_t et3000_config[] = { .type = CONFIG_SELECTION, .default_int = 512, .selection = { - { .description = "256 KB", + { .description = "256 kB", .value = 256 }, - { .description = "512 KB", + { .description = "512 kB", .value = 512 }, { .description = "" } } }, { .type = CONFIG_END } diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index caf8d03c7..d8668d931 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -949,11 +949,11 @@ static const device_config_t et4000_tc6058af_config[] = { .default_int = 512, .selection = { { - .description = "256 KB", + .description = "256 kB", .value = 256 }, { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -996,11 +996,11 @@ static const device_config_t et4000_bios_config[] = { .default_int = 1024, .selection = { { - .description = "256 KB", + .description = "256 kB", .value = 256 }, { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -1043,11 +1043,11 @@ static const device_config_t et4000_config[] = { .default_int = 1024, .selection = { { - .description = "256 KB", + .description = "256 kB", .value = 256 }, { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { diff --git a/src/video/vid_rtg310x.c b/src/video/vid_rtg310x.c index e82763d15..10bec8620 100644 --- a/src/video/vid_rtg310x.c +++ b/src/video/vid_rtg310x.c @@ -393,11 +393,11 @@ static const device_config_t rtg3105_config[] = { .default_int = 512, .selection = { { - .description = "256 KB", + .description = "256 kB", .value = 256 }, { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -420,11 +420,11 @@ static const device_config_t rtg3106_config[] = { .default_int = 1024, .selection = { { - .description = "256 KB", + .description = "256 kB", .value = 256 }, { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { From 09eb050423cbf0c5b8e52c170015bad99532bf1a Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 12 Nov 2024 01:45:58 +0100 Subject: [PATCH 565/624] More KB -> kB. --- src/sound/snd_gus.c | 2 +- src/sound/snd_sb.c | 8 ++++---- src/video/vid_8514a.c | 4 ++-- src/video/vid_ati_mach8.c | 6 +++--- src/video/vid_cl54xx.c | 6 +++--- src/video/vid_nga.c | 4 ++-- src/video/vid_s3.c | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/sound/snd_gus.c b/src/sound/snd_gus.c index 3b041def9..25da1643e 100644 --- a/src/sound/snd_gus.c +++ b/src/sound/snd_gus.c @@ -1503,7 +1503,7 @@ static const device_config_t gus_config[] = { .value = 0 }, { - .description = "512 KB", + .description = "512 kB", .value = 1 }, { diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 6536071b0..438ce15bc 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -4669,7 +4669,7 @@ static const device_config_t sb_32_pnp_config[] = { .value = 0 }, { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -4882,7 +4882,7 @@ static const device_config_t sb_awe32_config[] = { .value = 0 }, { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -4946,7 +4946,7 @@ static const device_config_t sb_awe32_pnp_config[] = { .value = 0 }, { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -4999,7 +4999,7 @@ static const device_config_t sb_awe64_value_config[] = { .spinner = { 0 }, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 6cb7f6104..4d301e2f2 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -3937,7 +3937,7 @@ static const device_config_t ext8514_config[] = { .default_int = 1024, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -4006,7 +4006,7 @@ static const device_config_t ext8514_config[] = { .default_int = 1024, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index 8b59b3864..b426b8876 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -6173,7 +6173,7 @@ static const device_config_t mach8_config[] = { .default_int = 1024, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -6199,7 +6199,7 @@ static const device_config_t mach32_config[] = { .default_int = 2048, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -6252,7 +6252,7 @@ static const device_config_t mach32_pci_config[] = { .default_int = 2048, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 1adcc14ec..8e6a75014 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -4549,7 +4549,7 @@ static const device_config_t gd542x_config[] = { .type = CONFIG_SELECTION, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -4574,7 +4574,7 @@ static const device_config_t gd5426_config[] = { .type = CONFIG_SELECTION, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { @@ -4603,7 +4603,7 @@ static const device_config_t gd5428_onboard_config[] = { .type = CONFIG_SELECTION, .selection = { { - .description = "512 KB", + .description = "512 kB", .value = 512 }, { diff --git a/src/video/vid_nga.c b/src/video/vid_nga.c index 32c103a8b..59d3475e5 100644 --- a/src/video/vid_nga.c +++ b/src/video/vid_nga.c @@ -643,11 +643,11 @@ const device_config_t nga_config[] = { .default_int = 64, .selection = { { - .description = "32 KB", + .description = "32 kB", .value = 32 }, { - .description = "64 KB", + .description = "64 kB", .value = 64 }, { diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 295c65bd4..2d7debe0a 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -10489,7 +10489,7 @@ static const device_config_t s3_orchid_86c911_config[] = { .type = CONFIG_SELECTION, .default_int = 1, .selection = { - { .description = "512 KB", + { .description = "512 kB", .value = 0 }, { .description = "1 MB", .value = 1 }, @@ -10519,7 +10519,7 @@ static const device_config_t s3_phoenix_trio32_config[] = { .type = CONFIG_SELECTION, .default_int = 2, .selection = { - { .description = "512 KB", + { .description = "512 kB", .value = 0 }, { .description = "1 MB", .value = 1 }, From 937c507bb9230977b92be7c3bf7457df5e6429a5 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 12 Nov 2024 01:48:17 +0100 Subject: [PATCH 566/624] Xi8088 strings. --- src/machine/m_xt_xi8088.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_xt_xi8088.c b/src/machine/m_xt_xi8088.c index 702a088ce..9b55dc021 100644 --- a/src/machine/m_xt_xi8088.c +++ b/src/machine/m_xt_xi8088.c @@ -110,11 +110,11 @@ static const device_config_t xi8088_config[] = { .type = CONFIG_SELECTION, .selection = { { - .description = "64KB starting from 0xF0000", + .description = "64 kB starting from F0000", .value = 0 }, { - .description = "128KB starting from 0xE0000 (address MSB inverted, last 64KB first)", + .description = "128 kB starting from E0000 (address MSB inverted, last 64KB first)", .value = 1 } }, From f6d89766b0010665ebfcef970262d3141733a64c Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 13 Nov 2024 06:31:16 +0100 Subject: [PATCH 567/624] Remove the usage of the undefined vnc_enabled variable, fixes #4961. --- src/qt/qt_main.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/qt_main.cpp b/src/qt/qt_main.cpp index a50c53820..3cce79690 100644 --- a/src/qt/qt_main.cpp +++ b/src/qt/qt_main.cpp @@ -396,7 +396,7 @@ main(int argc, char *argv[]) /* Set the PAUSE mode depending on the renderer. */ #ifdef USE_VNC - if (vnc_enabled && vid_api != 5) + if (vid_api == 5) plat_pause(1); else #endif From 988f567f3dc699172109d1d9ec869f3369ecb2dd Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 13 Nov 2024 06:32:19 +0100 Subject: [PATCH 568/624] Bumped the version number back to 4.3. --- CMakeLists.txt | 2 +- debian/changelog | 4 ++-- src/86box.c | 3 +++ src/unix/assets/86Box.spec | 4 ++-- src/unix/assets/net.86box.86Box.metainfo.xml | 2 +- vcpkg.json | 2 +- 6 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a70cbd61f..8d7b3f6f0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 4.2.2 + VERSION 4.3 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/debian/changelog b/debian/changelog index ae80cfa9d..5665ff968 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -86box (4.2.2) UNRELEASED; urgency=medium +86box (4.3) UNRELEASED; urgency=medium * Bump release. - -- Jasmine Iwanek Sat, 28 Sep 2024 18:31:57 +0200 + -- Jasmine Iwanek Wed, 13 Nov 2024 06:31:46 +0100 diff --git a/src/86box.c b/src/86box.c index 5e1f58413..64c1e03c3 100644 --- a/src/86box.c +++ b/src/86box.c @@ -452,6 +452,8 @@ delete_nvr_file(uint8_t flash) fn = NULL; } +extern void device_find_all_descs(void); + /* * Perform initial startup of the PC. * @@ -636,6 +638,7 @@ usage: dump_missing = 1; } else if (!strcasecmp(argv[c], "--donothing") || !strcasecmp(argv[c], "-Y")) { do_nothing = 1; + device_find_all_descs(); } else if (!strcasecmp(argv[c], "--keycodes") || !strcasecmp(argv[c], "-K")) { if ((c + 1) == argc) goto usage; diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index e351c017a..86f380d22 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -15,7 +15,7 @@ %global romver 4.1 Name: 86Box -Version: 4.2.2 +Version: 4.3 Release: 1%{?dist} Summary: Classic PC emulator License: GPLv2+ @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Sat Aug 31 Jasmine Iwanek 4.2.2-1 +* Sat Aug 31 Jasmine Iwanek 4.3-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index 47a0a6b87..6618f21d2 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + diff --git a/vcpkg.json b/vcpkg.json index af6f9a5c8..87859869b 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "86box", - "version-string": "4.2.2", + "version-string": "4.3", "homepage": "https://86box.net/", "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later", From 6110a60f1406549dd60e82037f1b7ba3c5300f6e Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 13 Nov 2024 13:05:38 +0100 Subject: [PATCH 569/624] Reverted the excess changes to 86box.c. --- src/86box.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/86box.c b/src/86box.c index 64c1e03c3..5e1f58413 100644 --- a/src/86box.c +++ b/src/86box.c @@ -452,8 +452,6 @@ delete_nvr_file(uint8_t flash) fn = NULL; } -extern void device_find_all_descs(void); - /* * Perform initial startup of the PC. * @@ -638,7 +636,6 @@ usage: dump_missing = 1; } else if (!strcasecmp(argv[c], "--donothing") || !strcasecmp(argv[c], "-Y")) { do_nothing = 1; - device_find_all_descs(); } else if (!strcasecmp(argv[c], "--keycodes") || !strcasecmp(argv[c], "-K")) { if ((c + 1) == argc) goto usage; From 83064c6e215dd05abcd8feacbebad28565c8c64e Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 13 Nov 2024 19:42:27 +0500 Subject: [PATCH 570/624] Further improvements to the translation system --- src/qt/qt_deviceconfig.cpp | 49 ++++++++++++++--------------------- src/qt/qt_settingsinput.cpp | 2 +- src/qt/qt_settingsnetwork.cpp | 2 +- src/qt/qt_settingssound.cpp | 4 +-- 4 files changed, 24 insertions(+), 33 deletions(-) diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 319bed028..935b48a82 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -124,11 +124,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) return; while (config->type != -1) { - const int config_type = config->type & CONFIG_TYPE_MASK; - const char *temp = tr(config->description).toUtf8().data(); - char tdesc[512] = { 0 }; - - strcpy(tdesc, temp); + const int config_type = config->type & CONFIG_TYPE_MASK; /* Ignore options of the wrong class. */ if (!!(config->type & CONFIG_DEP) != is_dep) @@ -172,7 +168,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) auto *cbox = new QCheckBox(); cbox->setObjectName(config->name); cbox->setChecked(value > 0); - this->ui->formLayout->addRow(tdesc, cbox); + this->ui->formLayout->addRow(tr(config->description), cbox); break; } #ifdef USE_RTMIDI @@ -187,11 +183,11 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) char midiName[512] = { 0 }; rtmidi_out_get_dev_name(i, midiName); - Models::AddEntry(model, tr(midiName), i); + Models::AddEntry(model, midiName, i); if (i == value) currentIndex = i; } - this->ui->formLayout->addRow(tdesc, cbox); + this->ui->formLayout->addRow(tr(config->description), cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -206,11 +202,11 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) char midiName[512] = { 0 }; rtmidi_in_get_dev_name(i, midiName); - Models::AddEntry(model, tr(midiName), i); + Models::AddEntry(model, midiName, i); if (i == value) currentIndex = i; } - this->ui->formLayout->addRow(tdesc, cbox); + this->ui->formLayout->addRow(tr(config->description), cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -225,17 +221,15 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) cbox->setMaxVisibleItems(30); auto *model = cbox->model(); int currentIndex = -1; + for (auto *sel = config->selection; (sel != nullptr) && (sel->description != nullptr) && (strlen(sel->description) > 0); ++sel) { - const char *temp2 = tr(sel->description).toUtf8().data(); - char sdesc[512] = { 0 }; - strcpy(sdesc, temp2); - int row = Models::AddEntry(model, sdesc, sel->value); + int row = Models::AddEntry(model, tr(sel->description), sel->value); if (sel->value == value) currentIndex = row; } - this->ui->formLayout->addRow(tdesc, cbox); + this->ui->formLayout->addRow(tr(config->description), cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -254,16 +248,13 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) for (int d = 0; d < bios->files_no; d++) p += !!rom_present(const_cast(bios->files[d])); if (p == bios->files_no) { - const char *temp2 = tr(bios->name).toUtf8().data(); - char bname[512] = { 0 }; - strcpy(bname, temp2); - const int row = Models::AddEntry(model, bname, q); + const int row = Models::AddEntry(model, tr(bios->name), q); if (!strcmp(selected.toUtf8().constData(), bios->internal_name)) currentIndex = row; } q++; } - this->ui->formLayout->addRow(tdesc, cbox); + this->ui->formLayout->addRow(tr(config->description), cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -276,7 +267,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) if (config->spinner.step > 0) spinBox->setSingleStep(config->spinner.step); spinBox->setValue(value); - this->ui->formLayout->addRow(tdesc, spinBox); + this->ui->formLayout->addRow(tr(config->description), spinBox); break; } case CONFIG_FNAME: @@ -286,7 +277,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) fileField->setFileName(selected); fileField->setFilter(QString(config->file_filter).left(static_cast(strcspn(config->file_filter, "|")))); - this->ui->formLayout->addRow(tdesc, fileField); + this->ui->formLayout->addRow(tr(config->description), fileField); break; } case CONFIG_STRING: @@ -295,7 +286,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) lineEdit->setObjectName(config->name); lineEdit->setCursor(Qt::IBeamCursor); lineEdit->setText(selected); - this->ui->formLayout->addRow(tdesc, lineEdit); + this->ui->formLayout->addRow(tr(config->description), lineEdit); break; } case CONFIG_SERPORT: @@ -314,7 +305,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) currentIndex = row; } - this->ui->formLayout->addRow(tdesc, cbox); + this->ui->formLayout->addRow(tr(config->description), cbox); cbox->setCurrentIndex(currentIndex); break; } @@ -346,7 +337,7 @@ DeviceConfig::ProcessConfig(void *dc, const void *c, const bool is_dep) }); hboxLayout->addWidget(lineEdit); hboxLayout->addWidget(generateButton); - this->ui->formLayout->addRow(tdesc, hboxLayout); + this->ui->formLayout->addRow(tr(config->description), hboxLayout); break; } } @@ -358,15 +349,15 @@ void DeviceConfig::ConfigureDevice(const _device_ *device, int instance, Settings *settings) { DeviceConfig dc(settings); - dc.setWindowTitle(QString(tr("%1 Device Configuration")).arg(device->name)); + dc.setWindowTitle(tr("%1 Device Configuration").arg(tr(device->name))); device_context_t device_context; device_set_context(&device_context, device, instance); - const auto device_label = new QLabel(device->name); + const auto device_label = new QLabel(tr(device->name)); device_label->setAlignment(Qt::AlignCenter); dc.ui->formLayout->addRow(device_label); - const auto line = new QFrame; + const auto line = new QFrame; line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); dc.ui->formLayout->addRow(line); @@ -472,6 +463,6 @@ DeviceConfig::DeviceName(const _device_ *device, const char *internalName, const else { char temp[512]; device_get_name(device, bus, temp); - return tr(temp, nullptr, 512); + return tr((const char *) temp); } } diff --git a/src/qt/qt_settingsinput.cpp b/src/qt/qt_settingsinput.cpp index 9d864390d..05e44c2c0 100644 --- a/src/qt/qt_settingsinput.cpp +++ b/src/qt/qt_settingsinput.cpp @@ -77,7 +77,7 @@ SettingsInput::onCurrentMachineChanged(int machineId) mouseModel->insertRow(row); auto idx = mouseModel->index(row, 0); - mouseModel->setData(idx, tr(name.toUtf8().data()), Qt::DisplayRole); + mouseModel->setData(idx, name, Qt::DisplayRole); mouseModel->setData(idx, i, Qt::UserRole); if (i == mouse_type) { diff --git a/src/qt/qt_settingsnetwork.cpp b/src/qt/qt_settingsnetwork.cpp index 9c8646c00..2aa3705fd 100644 --- a/src/qt/qt_settingsnetwork.cpp +++ b/src/qt/qt_settingsnetwork.cpp @@ -127,7 +127,7 @@ SettingsNetwork::onCurrentMachineChanged(int machineId) } if (network_card_available(c) && device_is_valid(network_card_getdevice(c), machineId)) { - int row = Models::AddEntry(model, tr(name.toUtf8().data()), c); + int row = Models::AddEntry(model, name, c); if (c == net_cards_conf[i].device_num) { selectedRow = row - removeRows; } diff --git a/src/qt/qt_settingssound.cpp b/src/qt/qt_settingssound.cpp index 4d1df4cef..e0572c3d8 100644 --- a/src/qt/qt_settingssound.cpp +++ b/src/qt/qt_settingssound.cpp @@ -119,7 +119,7 @@ SettingsSound::onCurrentMachineChanged(const int machineId) } if (midi_out_device_available(c)) { - int row = Models::AddEntry(model, tr(name.toUtf8().data()), c); + int row = Models::AddEntry(model, name, c); if (c == midi_output_device_current) { selectedRow = row - removeRows; } @@ -142,7 +142,7 @@ SettingsSound::onCurrentMachineChanged(const int machineId) } if (midi_in_device_available(c)) { - int row = Models::AddEntry(model, tr(name.toUtf8().data()), c); + int row = Models::AddEntry(model, name, c); if (c == midi_input_device_current) { selectedRow = row - removeRows; } From e11604069f5b5ba53931d4a85c93c30d6c79d7e2 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Wed, 13 Nov 2024 19:44:03 +0500 Subject: [PATCH 571/624] config.c: Don't delete the storage controllers section too early Fixes potential segfaults --- src/config.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/config.c b/src/config.c index e951159f2..5a3f507c1 100644 --- a/src/config.c +++ b/src/config.c @@ -2431,8 +2431,6 @@ save_storage_controllers(void) else ini_section_set_int(cat, "ide_qua", ide_qua_enabled); - ini_delete_section_if_empty(config, cat); - if (cassette_enable == 0) ini_section_delete_var(cat, "cassette_enabled"); else @@ -2522,6 +2520,8 @@ save_storage_controllers(void) ini_section_delete_var(cat, "lba_enhancer_enabled"); else ini_section_set_int(cat, "lba_enhancer_enabled", 1); + + ini_delete_section_if_empty(config, cat); } /* Save "Other Peripherals" section. */ From afe95cd20cc17cfbdc294f3932d6cc6a8c91aa21 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 13 Nov 2024 22:55:16 +0100 Subject: [PATCH 572/624] Video changes of the day (November 13th, 2024) 1. Finally add the ATI 8514/A Ultra add-on BIOS in both ISA and MCA variants (despite the ROM page failure on POST). 2. Fixed a mode switch bug in the Mach8 (both add-on and vga combo) when exiting the Win3.x GUI using the native drivers. 3. Corrected (best possible) the eeprom load of the Mach8 products. 4. Partial implementation of the FIFO on the 8514/A compatible products including Mach8/32 and plain IBM 8514/A. --- src/include/86box/vid_8514a.h | 8 +- src/include/86box/vid_ati_eeprom.h | 3 +- src/include/86box/vid_svga.h | 2 - src/video/vid_8514a.c | 280 +++++++++++++++-------------- src/video/vid_ati_eeprom.c | 38 +++- src/video/vid_ati_mach8.c | 231 +++++++++++++++--------- src/video/vid_svga.c | 17 +- 7 files changed, 338 insertions(+), 241 deletions(-) diff --git a/src/include/86box/vid_8514a.h b/src/include/86box/vid_8514a.h index ec8c5e168..0e6e0965a 100644 --- a/src/include/86box/vid_8514a.h +++ b/src/include/86box/vid_8514a.h @@ -42,6 +42,9 @@ typedef union { typedef struct ibm8514_t { rom_t bios_rom; rom_t bios_rom2; + mem_mapping_t bios_mapping; + uint8_t *rom1; + uint8_t *rom2; hwcursor8514_t hwcursor; hwcursor8514_t hwcursor_latch; uint8_t pos_regs[8]; @@ -212,6 +215,8 @@ typedef struct ibm8514_t { uint8_t subsys_cntl; uint8_t subsys_stat; + atomic_int fifo_idx; + atomic_int ext_fifo_idx; atomic_int force_busy; atomic_int force_busy2; @@ -223,11 +228,10 @@ typedef struct ibm8514_t { int ext_crt_pitch; int extensions; int linear; - int _4bpp; uint32_t vram_amount; int vram_512k_8514; - PALETTE _8514pal; int vendor_mode; + PALETTE _8514pal; latch8514_t latch; } ibm8514_t; diff --git a/src/include/86box/vid_ati_eeprom.h b/src/include/86box/vid_ati_eeprom.h index 99af36eda..c52b5bd4b 100644 --- a/src/include/86box/vid_ati_eeprom.h +++ b/src/include/86box/vid_ati_eeprom.h @@ -47,7 +47,8 @@ typedef struct ati_eeprom_t { } ati_eeprom_t; void ati_eeprom_load(ati_eeprom_t *eeprom, char *fn, int type); -void ati_eeprom_load_mach8(ati_eeprom_t *eeprom, char *fn); +void ati_eeprom_load_mach8(ati_eeprom_t *eeprom, char *fn, int mca); +void ati_eeprom_load_mach8_vga(ati_eeprom_t *eeprom, char *fn); void ati_eeprom_write(ati_eeprom_t *eeprom, int ena, int clk, int dat); int ati_eeprom_read(ati_eeprom_t *eeprom); diff --git a/src/include/86box/vid_svga.h b/src/include/86box/vid_svga.h index 8a9f1fdbe..d38b7614b 100644 --- a/src/include/86box/vid_svga.h +++ b/src/include/86box/vid_svga.h @@ -312,7 +312,6 @@ extern void ibm8514_accel_out_pixtrans(svga_t *svga, uint16_t port, uint32_t extern void ibm8514_short_stroke_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, svga_t *svga, uint8_t ssv, int len); extern void ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat, svga_t *svga, int len); -#ifdef ATI_8514_ULTRA extern void ati8514_out(uint16_t addr, uint8_t val, void *priv); extern uint8_t ati8514_in(uint16_t addr, void *priv); extern void ati8514_recalctimings(svga_t *svga); @@ -320,7 +319,6 @@ extern uint8_t ati8514_mca_read(int port, void *priv); extern void ati8514_mca_write(int port, uint8_t val, void *priv); extern void ati8514_pos_write(uint16_t port, uint8_t val, void *priv); extern void ati8514_init(svga_t *svga, void *ext8514, void *dev8514); -#endif extern void xga_write_test(uint32_t addr, uint8_t val, void *priv); extern uint8_t xga_read_test(uint32_t addr, void *priv); diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index 4d301e2f2..ceeb835e3 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -43,9 +43,7 @@ #include <86box/vid_ati_mach8.h> #include "cpu.h" -#ifdef ATI_8514_ULTRA -#define BIOS_MACH8_ROM_PATH "roms/video/mach8/11301113140.BIN" -#endif +#define BIOS_MACH8_ROM_PATH "roms/video/mach8/11301113140_4k.BIN" static void ibm8514_accel_outb(uint16_t port, uint8_t val, void *priv); static void ibm8514_accel_outw(uint16_t port, uint16_t val, void *priv); @@ -337,18 +335,21 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) switch (port) { case 0x82e8: case 0xc2e8: + dev->fifo_idx++; if (len == 2) dev->accel.cur_y = val & 0x7ff; break; case 0x86e8: case 0xc6e8: + dev->fifo_idx++; if (len == 2) dev->accel.cur_x = val & 0x7ff; break; case 0x8ae8: case 0xcae8: + dev->fifo_idx++; if (len == 2) { dev->accel.desty = val & 0x7ff; dev->accel.desty_axstp = val & 0x3fff; @@ -359,6 +360,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x8ee8: case 0xcee8: + dev->fifo_idx++; if (len == 2) { dev->accel.destx = val & 0x7ff; dev->accel.destx_distp = val & 0x3fff; @@ -368,6 +370,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) break; case 0x92e8: + dev->fifo_idx++; if (len == 2) dev->test = val; fallthrough; @@ -382,6 +385,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x96e8: case 0xd6e8: + dev->fifo_idx++; if (len == 2) { dev->accel.maj_axis_pcnt = val & 0x7ff; dev->accel.maj_axis_pcnt_no_limit = val; @@ -390,6 +394,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x9ae8: case 0xdae8: + dev->fifo_idx++; dev->accel.ssv_state = 0; if (len == 2) { dev->data_available = 0; @@ -406,6 +411,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0x9ee8: case 0xdee8: + dev->fifo_idx++; dev->accel.ssv_state = 1; if (len == 2) { dev->accel.short_stroke = val; @@ -430,6 +436,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0xa2e8: case 0xe2e8: + dev->fifo_idx++; if (port == 0xe2e8) { if (len == 2) { if (dev->accel.cmd_back) @@ -448,6 +455,7 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0xa6e8: case 0xe6e8: + dev->fifo_idx++; if (port == 0xe6e8) { if (len == 2) { if (dev->accel.cmd_back) @@ -466,34 +474,40 @@ ibm8514_accel_out_fifo(svga_t *svga, uint16_t port, uint32_t val, int len) case 0xaae8: case 0xeae8: + dev->fifo_idx++; if (len == 2) dev->accel.wrt_mask = val; break; case 0xaee8: case 0xeee8: + dev->fifo_idx++; if (len == 2) dev->accel.rd_mask = val; break; case 0xb2e8: case 0xf2e8: + dev->fifo_idx++; if (len == 2) dev->accel.color_cmp = val; break; case 0xb6e8: case 0xf6e8: + dev->fifo_idx++; dev->accel.bkgd_mix = val & 0xff; break; case 0xbae8: case 0xfae8: + dev->fifo_idx++; dev->accel.frgd_mix = val & 0xff; break; case 0xbee8: case 0xfee8: + dev->fifo_idx++; if (len == 2) { dev->accel.multifunc_cntl = val; dev->accel.multifunc[dev->accel.multifunc_cntl >> 12] = dev->accel.multifunc_cntl & 0xfff; @@ -601,7 +615,6 @@ void ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len) { ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - uint8_t old = 0; if (port & 0x8000) ibm8514_accel_out_fifo(svga, port, val, len); @@ -687,26 +700,31 @@ ibm8514_accel_out(uint16_t port, uint32_t val, svga_t *svga, int len) break; case 0x42e8: - if (val & 1) - dev->subsys_stat &= ~1; - if (val & 2) - dev->subsys_stat &= ~2; - if (val & 4) - dev->subsys_stat &= ~4; - if (val & 8) - dev->subsys_stat &= ~8; + if (val & 0x01) + dev->subsys_stat &= ~0x01; + if (val & 0x02) + dev->subsys_stat &= ~0x02; + if (val & 0x04) + dev->subsys_stat &= ~0x04; + if (val & 0x08) + dev->subsys_stat &= ~0x08; break; case 0x42e9: - old = dev->subsys_cntl; dev->subsys_cntl = val; - if ((old ^ val) & 1) - dev->subsys_stat |= 1; - if ((old ^ val) & 2) - dev->subsys_stat |= 2; - if ((old ^ val) & 4) - dev->subsys_stat |= 4; - if ((old ^ val) & 8) - dev->subsys_stat |= 8; + if (val & 0x01) + dev->subsys_stat |= 0x01; + if (val & 0x02) + dev->subsys_stat |= 0x02; + if (val & 0x04) + dev->subsys_stat |= 0x04; + if (val & 0x08) + dev->subsys_stat |= 0x08; + + if ((val & 0xc0) == 0xc0) { + dev->fifo_idx = 0; + dev->force_busy = 0; + dev->force_busy2 = 0; + } break; case 0x4ae8: @@ -771,6 +789,22 @@ ibm8514_accel_in_fifo(svga_t *svga, uint16_t port, int len) case 0x9ae8: case 0xdae8: + if ((dev->fifo_idx >= 1) && (dev->fifo_idx <= 8)) { + temp |= (1 << (dev->fifo_idx - 1)); + switch (dev->accel.cmd >> 13) { + case 2: + case 3: + case 4: + case 6: + if (dev->accel.sy < 0) + dev->fifo_idx = 0; + break; + default: + if (!dev->accel.sy) + dev->fifo_idx = 0; + break; + } + } if (len == 2) { if (dev->force_busy) temp |= 0x200; /*Hardware busy*/ @@ -878,10 +912,15 @@ ibm8514_accel_in(uint16_t port, svga_t *svga) dev->subsys_stat |= 0x02; } + if (!dev->fifo_idx) { + if (!dev->force_busy && !dev->force_busy2) + temp |= 0x08; + } + if (port & 1) temp = dev->vram_512k_8514 ? 0x00 : 0x80; else { - temp |= (dev->subsys_stat | 0x80); + temp |= (dev->subsys_stat | (dev->vram_512k_8514 ? 0x00 : 0x80)); temp |= 0x20; } break; @@ -932,6 +971,8 @@ ibm8514_short_stroke_start(int count, int cpu_input, uint32_t mix_dat, uint32_t dev->accel.ssv_draw = ssv & 0x10; if (ibm8514_cpu_src(svga)) { + dev->data_available = 0; + dev->data_available2 = 0; return; /*Wait for data from CPU*/ } } @@ -1242,70 +1283,34 @@ ibm8514_accel_start(int count, int cpu_input, uint32_t mix_dat, uint32_t cpu_dat break; } - if (dev->accel.err_term >= dev->accel.maj_axis_pcnt) { - dev->accel.err_term += dev->accel.destx_distp; - /*Step minor axis*/ - switch (dev->accel.cmd & 0xe0) { - case 0x00: - dev->accel.cy--; - break; - case 0x20: - dev->accel.cy--; - break; - case 0x40: - dev->accel.cx--; - break; - case 0x60: - dev->accel.cx++; - break; - case 0x80: - dev->accel.cy++; - break; - case 0xa0: - dev->accel.cy++; - break; - case 0xc0: - dev->accel.cx--; - break; - case 0xe0: - dev->accel.cx++; - break; - - default: - break; - } - } else - dev->accel.err_term += dev->accel.desty_axstp; - - /*Step major axis*/ - switch (dev->accel.cmd & 0xe0) { - case 0x00: - dev->accel.cx--; - break; - case 0x20: - dev->accel.cx++; - break; - case 0x40: - dev->accel.cy--; - break; - case 0x60: - dev->accel.cy--; - break; - case 0x80: - dev->accel.cx--; - break; - case 0xa0: - dev->accel.cx++; - break; - case 0xc0: + if (dev->accel.cmd & 0x40) { + if (dev->accel.cmd & 0x80) dev->accel.cy++; - break; - case 0xe0: - dev->accel.cy++; - break; + else + dev->accel.cy--; - default: - break; + if (dev->accel.err_term >= 0) { + dev->accel.err_term += dev->accel.destx_distp; + if (dev->accel.cmd & 0x20) + dev->accel.cx++; + else + dev->accel.cx--; + } else + dev->accel.err_term += dev->accel.desty_axstp; + } else { + if (dev->accel.cmd & 0x20) + dev->accel.cx++; + else + dev->accel.cx--; + + if (dev->accel.err_term >= 0) { + dev->accel.err_term += dev->accel.destx_distp; + if (dev->accel.cmd & 0x80) + dev->accel.cy++; + else + dev->accel.cy--; + } else + dev->accel.err_term += dev->accel.desty_axstp; } dev->accel.ssv_len--; @@ -2356,8 +2361,8 @@ skip_nibble_rect_write: } } } else { - ibm8514_log("Polygon Draw Type=%02x, CL=%d, CR=%d.\n", dev->accel.multifunc[0x0a] & 0x06, clip_l, clip_r); - while (count-- && dev->accel.sy >= 0) { + ibm8514_log("Polygon Draw Type=%02x, CX=%d, CY=%d, SY=%d, CL=%d, CR=%d.\n", dev->accel.multifunc[0x0a] & 0x06, dev->accel.cx, dev->accel.cy, dev->accel.sy, clip_l, clip_r); + while (count-- && (dev->accel.sy >= 0)) { if ((dev->accel.cx >= clip_l) && (dev->accel.cx <= clip_r) && (dev->accel.cy >= clip_t) && @@ -3291,16 +3296,16 @@ ibm8514_render_8bpp(svga_t *svga) for (int x = 0; x <= dev->h_disp; x += 8) { dat = *(uint32_t *) (&dev->vram[dev->ma & dev->vram_mask]); - p[0] = dev->pallook[dat & dev->dac_mask]; - p[1] = dev->pallook[(dat >> 8) & dev->dac_mask]; - p[2] = dev->pallook[(dat >> 16) & dev->dac_mask]; - p[3] = dev->pallook[(dat >> 24) & dev->dac_mask]; + p[0] = dev->pallook[dat & dev->dac_mask & 0xff]; + p[1] = dev->pallook[(dat >> 8) & dev->dac_mask & 0xff]; + p[2] = dev->pallook[(dat >> 16) & dev->dac_mask & 0xff]; + p[3] = dev->pallook[(dat >> 24) & dev->dac_mask & 0xff]; dat = *(uint32_t *) (&dev->vram[(dev->ma + 4) & dev->vram_mask]); - p[4] = dev->pallook[dat & dev->dac_mask]; - p[5] = dev->pallook[(dat >> 8) & dev->dac_mask]; - p[6] = dev->pallook[(dat >> 16) & dev->dac_mask]; - p[7] = dev->pallook[(dat >> 24) & dev->dac_mask]; + p[4] = dev->pallook[dat & dev->dac_mask & 0xff]; + p[5] = dev->pallook[(dat >> 8) & dev->dac_mask & 0xff]; + p[6] = dev->pallook[(dat >> 16) & dev->dac_mask & 0xff]; + p[7] = dev->pallook[(dat >> 24) & dev->dac_mask & 0xff]; dev->ma += 8; p += 8; @@ -3702,13 +3707,10 @@ ibm8514_recalctimings(svga_t *svga) ibm8514_t *dev = (ibm8514_t *) svga->dev8514; svga->render8514 = ibm8514_render_blank; -#ifdef ATI_8514_ULTRA if (dev->extensions) { if (svga->ext8514 != NULL) ati8514_recalctimings(svga); - } else -#endif - { + } else { if (dev->on) { dev->h_total = dev->htotal + 1; dev->rowcount = !!(dev->disp_cntl & 0x08); @@ -3742,7 +3744,6 @@ ibm8514_recalctimings(svga_t *svga) dev->pitch = 1024; dev->rowoffset = 0x80; - svga->map8 = dev->pallook; if (dev->vram_512k_8514) { if (dev->h_disp == 640) dev->pitch = 640; @@ -3795,11 +3796,9 @@ ibm8514_mca_reset(void *priv) ibm8514_log("MCA reset.\n"); dev->on = 0; -#ifdef ATI_8514_ULTRA if (dev->extensions) ati8514_mca_write(0x102, 0, svga); else -#endif ibm8514_mca_write(0x102, 0, svga); timer_set_callback(&svga->timer, svga_poll); @@ -3808,9 +3807,8 @@ ibm8514_mca_reset(void *priv) static void * ibm8514_init(const device_t *info) { -#ifdef ATI_8514_ULTRA uint32_t bios_addr = 0; -#endif + uint16_t bios_rom_eeprom = 0x0000; if (svga_get_pri() == NULL) return NULL; @@ -3834,9 +3832,10 @@ ibm8514_init(const device_t *info) dev->type = info->flags; dev->bpp = 0; -#ifdef ATI_8514_ULTRA dev->extensions = device_get_config_int("extensions"); bios_addr = device_get_config_hex20("bios_addr"); + if (dev->type & DEVICE_MCA) + bios_addr = 0xc6000; switch (dev->extensions) { case 1: @@ -3844,29 +3843,28 @@ ibm8514_init(const device_t *info) mach_t * mach = (mach_t *) calloc(1, sizeof(mach_t)); svga->ext8514 = mach; + rom_init(&dev->bios_rom, + BIOS_MACH8_ROM_PATH, + bios_addr, 0x1000, 0xfff, + 0, MEM_MAPPING_EXTERNAL); + + ati8514_init(svga, svga->ext8514, svga->dev8514); + mach->accel.scratch0 = ((((bios_addr >> 7) - 0x1000) >> 4)); + bios_rom_eeprom = mach->accel.scratch0; if (dev->type & DEVICE_MCA) { - rom_init(&dev->bios_rom, - BIOS_MACH8_ROM_PATH, - 0xc6000, 0x2000, 0x1fff, - 0, MEM_MAPPING_EXTERNAL); dev->pos_regs[0] = 0x88; dev->pos_regs[1] = 0x80; + mach->eeprom.data[0] = 0x0000; + mach->eeprom.data[1] = bios_rom_eeprom | ((bios_rom_eeprom | 0x01) << 8); mca_add(ati8514_mca_read, ati8514_mca_write, ibm8514_mca_feedb, ibm8514_mca_reset, svga); - ati_eeprom_load_mach8(&mach->eeprom, "ati8514_mca.nvr"); + ati_eeprom_load_mach8(&mach->eeprom, "ati8514_mca.nvr", 1); mem_mapping_disable(&dev->bios_rom.mapping); - } else { - rom_init(&dev->bios_rom, - BIOS_MACH8_ROM_PATH, - bios_addr, 0x2000, 0x1fff, - 0, MEM_MAPPING_EXTERNAL); - mach->accel.scratch0 = (((bios_addr >> 7) - 0x1000) >> 4); - ati_eeprom_load_mach8(&mach->eeprom, "ati8514.nvr"); - } - ati8514_init(svga, svga->ext8514, svga->dev8514); + } else + ati_eeprom_load_mach8(&mach->eeprom, "ati8514.nvr", 0); break; } - fallthrough; + fallthrough; default: ibm8514_io_set(svga); @@ -3877,16 +3875,6 @@ ibm8514_init(const device_t *info) } break; } -#else - ibm8514_io_set(svga); - - if (dev->type & DEVICE_MCA) { - dev->pos_regs[0] = 0x7f; - dev->pos_regs[1] = 0xef; - mca_add(ibm8514_mca_read, ibm8514_mca_write, ibm8514_mca_feedb, ibm8514_mca_reset, svga); - } -#endif - return svga; } @@ -3895,13 +3883,10 @@ ibm8514_close(void *priv) { svga_t *svga = (svga_t *) priv; ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - -#ifdef ATI_8514_ULTRA mach_t *mach = (mach_t *) svga->ext8514; if (mach) free(mach); -#endif if (dev) { free(dev->vram); @@ -3927,9 +3912,8 @@ ibm8514_force_redraw(void *priv) svga->fullchange = changeframecount; } -#ifdef ATI_8514_ULTRA // clang-format off -static const device_config_t ext8514_config[] = { +static const device_config_t isa_ext8514_config[] = { { .name = "memory", .description = "Memory size", @@ -3996,9 +3980,9 @@ static const device_config_t ext8514_config[] = { .type = CONFIG_END } }; -#else + // clang-format off -static const device_config_t ext8514_config[] = { +static const device_config_t mca_ext8514_config[] = { { .name = "memory", .description = "Memory size", @@ -4018,11 +4002,29 @@ static const device_config_t ext8514_config[] = { } } }, + { + .name = "extensions", + .description = "Vendor", + .type = CONFIG_SELECTION, + .default_int = 0, + .selection = { + { + .description = "IBM", + .value = 0 + }, + { + .description = "ATI", + .value = 1 + }, + { + .description = "" + } + } + }, { .type = CONFIG_END } }; -#endif // clang-format off const device_t gen8514_isa_device = { @@ -4036,7 +4038,7 @@ const device_t gen8514_isa_device = { { .available = NULL }, .speed_changed = ibm8514_speed_changed, .force_redraw = ibm8514_force_redraw, - .config = ext8514_config + .config = isa_ext8514_config }; const device_t ibm8514_mca_device = { @@ -4050,7 +4052,7 @@ const device_t ibm8514_mca_device = { { .available = NULL }, .speed_changed = ibm8514_speed_changed, .force_redraw = ibm8514_force_redraw, - .config = ext8514_config + .config = mca_ext8514_config }; diff --git a/src/video/vid_ati_eeprom.c b/src/video/vid_ati_eeprom.c index 054d83d36..a057f1f39 100644 --- a/src/video/vid_ati_eeprom.c +++ b/src/video/vid_ati_eeprom.c @@ -43,11 +43,12 @@ ati_eeprom_load(ati_eeprom_t *eeprom, char *fn, int type) } if (fread(eeprom->data, 1, size, fp) != size) memset(eeprom->data, 0, size); + fclose(fp); } void -ati_eeprom_load_mach8(ati_eeprom_t *eeprom, char *fn) +ati_eeprom_load_mach8(ati_eeprom_t *eeprom, char *fn, int mca) { FILE *fp; int size; @@ -55,14 +56,43 @@ ati_eeprom_load_mach8(ati_eeprom_t *eeprom, char *fn) strncpy(eeprom->fn, fn, sizeof(eeprom->fn) - 1); fp = nvr_fopen(eeprom->fn, "rb"); size = 128; - if (!fp) { /*The ATI Graphics Ultra bios expects an immediate write to nvram if none is present at boot time otherwise + if (!fp) { + if (mca) { + (void) fseek(fp, 2L, SEEK_SET); + memset(eeprom->data + 2, 0xff, size - 2); + fp = nvr_fopen(eeprom->fn, "wb"); + fwrite(eeprom->data, 1, size, fp); + fclose(fp); + } else + memset(eeprom->data, 0xff, size); + return; + } + if (fread(eeprom->data, 1, size, fp) != size) + memset(eeprom->data, 0, size); + + fclose(fp); +} + +void +ati_eeprom_load_mach8_vga(ati_eeprom_t *eeprom, char *fn) +{ + FILE *fp; + int size; + eeprom->type = 0; + strncpy(eeprom->fn, fn, sizeof(eeprom->fn) - 1); + fp = nvr_fopen(eeprom->fn, "rb"); + size = 128; + if (!fp) { /*The ATI Graphics Ultra bios expects a fresh nvram zero'ed at boot time otherwise it would hang the machine.*/ memset(eeprom->data, 0, size); fp = nvr_fopen(eeprom->fn, "wb"); fwrite(eeprom->data, 1, size, fp); + fclose(fp); + return; } if (fread(eeprom->data, 1, size, fp) != size) memset(eeprom->data, 0, size); + fclose(fp); } @@ -79,9 +109,9 @@ ati_eeprom_save(ati_eeprom_t *eeprom) void ati_eeprom_write(ati_eeprom_t *eeprom, int ena, int clk, int dat) { - if (!ena) { + if (!ena) eeprom->out = 1; - } + if (clk && !eeprom->oldclk) { if (ena && !eeprom->oldena) { eeprom->state = EEPROM_WAIT; diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index b426b8876..f488edace 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -56,19 +56,17 @@ static video_timings_t timing_mach32_pci = { .type = VIDEO_PCI, .write_b = 2, static void mach_accel_outb(uint16_t port, uint8_t val, void *priv); static void mach_accel_outw(uint16_t port, uint16_t val, void *priv); +static void mach_accel_outl(uint16_t port, uint32_t val, void *priv); static uint8_t mach_accel_inb(uint16_t port, void *priv); static uint16_t mach_accel_inw(uint16_t port, void *priv); -static uint8_t mach_in(uint16_t addr, void *priv); +static uint32_t mach_accel_inl(uint16_t port, void *priv); -#ifdef ATI_8514_ULTRA static void ati8514_accel_outb(uint16_t port, uint8_t val, void *priv); static void ati8514_accel_outw(uint16_t port, uint16_t val, void *priv); static void ati8514_accel_outl(uint16_t port, uint32_t val, void *priv); 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); -#endif - static void mach32_updatemapping(mach_t *mach, svga_t *svga); @@ -1254,10 +1252,12 @@ 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 (mach_pixel_write(mach)) { + mach_log("Write PIXTRANS.\n"); dev->data_available = 0; dev->data_available2 = 0; return; } else if (mach_pixel_read(mach)) { + mach_log("Read PIXTRANS.\n"); dev->data_available = 1; dev->data_available2 = 1; return; @@ -2484,14 +2484,9 @@ mach_in(uint16_t addr, void *priv) return temp; } - -#ifdef ATI_8514_ULTRA void ati8514_out(uint16_t addr, uint8_t val, void *priv) { - svga_t *svga = (svga_t *)priv; - ibm8514_t *dev = (ibm8514_t *) svga->dev8514; - mach_log("[%04X:%08X]: ADDON OUT addr=%03x, val=%02x.\n", CS, cpu_state.pc, addr, val); svga_out(addr, val, priv); @@ -2500,8 +2495,6 @@ ati8514_out(uint16_t addr, uint8_t val, void *priv) uint8_t ati8514_in(uint16_t addr, void *priv) { - svga_t *svga = (svga_t *)priv; - ibm8514_t *dev = (ibm8514_t *) svga->dev8514; uint8_t temp = 0xff; temp = svga_in(addr, priv); @@ -2526,15 +2519,20 @@ ati8514_recalctimings(svga_t *svga) dev->accel.ge_offset = (mach->accel.ge_offset_lo | (mach->accel.ge_offset_hi << 16)); mach->accel.ge_offset = dev->accel.ge_offset; - mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x04, mach->accel.clock_sel & 0xfe); + mach_log("HDISP=%d, VDISP=%d, shadowset=%x, 8514/A mode=%x, clocksel=%02x.\n", dev->hdisp, dev->vdisp, mach->shadow_set & 0x03, dev->accel.advfunc_cntl & 0x05, mach->accel.clock_sel & 0x01); if (mach->accel.clock_sel & 0x01) { dev->h_disp = dev->hdisp; dev->dispend = dev->vdisp; } else { if (dev->accel.advfunc_cntl & 0x04) { - dev->h_disp = dev->hdisp; - dev->dispend = dev->vdisp; + if (dev->hdisp == 640) { + dev->h_disp = 1024; + dev->dispend = 768; + } else { + dev->h_disp = dev->hdisp; + dev->dispend = dev->vdisp; + } } else { dev->h_disp = 640; dev->dispend = 480; @@ -2563,7 +2561,6 @@ ati8514_recalctimings(svga_t *svga) svga->render8514 = ibm8514_render_8bpp; } } -#endif static void mach_recalctimings(svga_t *svga) @@ -2803,14 +2800,18 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x86e8: case 0xc2e8: case 0xc6e8: + dev->ext_fifo_idx++; ibm8514_accel_out_fifo(svga, port, val, len); break; case 0xf6ee: - ibm8514_accel_out_fifo(svga, 0x82e8, val, len); + dev->ext_fifo_idx++; + if (len == 2) + dev->accel.cur_y = val & 0x7ff; break; case 0x8ae8: case 0xcae8: + dev->ext_fifo_idx++; ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) { mach_log("SRCY=%d.\n", val & 0x07ff); @@ -2820,6 +2821,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x8ee8: case 0xcee8: + dev->ext_fifo_idx++; ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) { mach_log("SRCX=%d.\n", val & 0x07ff); @@ -2829,11 +2831,13 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x92e8: case 0xd2e8: + dev->ext_fifo_idx++; ibm8514_accel_out_fifo(svga, port, val, len); break; case 0x96e8: case 0xd6e8: + dev->ext_fifo_idx++; ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) mach->accel.test = val & 0x1fff; @@ -2841,17 +2845,21 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0x9ae8: case 0xdae8: + dev->ext_fifo_idx++; mach->accel.cmd_type = -1; ibm8514_accel_out_fifo(svga, port, val, len); break; case 0x9ee8: case 0xdee8: + dev->ext_fifo_idx++; ibm8514_accel_out_fifo(svga, port, val, len); break; case 0xa2e8: case 0xe2e8: + dev->ext_fifo_idx++; + dev->fifo_idx++; if (port == 0xe2e8) { if (len == 2) { if (dev->accel.cmd_back) { @@ -2883,6 +2891,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xa6e8: case 0xe6e8: + dev->ext_fifo_idx++; + dev->fifo_idx++; if (port == 0xe6e8) { if (len == 2) { if (dev->accel.cmd_back) @@ -2913,6 +2923,8 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xe2e9: case 0xe6e9: + dev->ext_fifo_idx++; + dev->fifo_idx++; 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) { @@ -2964,11 +2976,13 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u case 0xf2e8: case 0xf6e8: case 0xfae8: + dev->ext_fifo_idx++; ibm8514_accel_out_fifo(svga, port, val, len); break; case 0xbee8: case 0xfee8: + dev->ext_fifo_idx++; ibm8514_accel_out_fifo(svga, port, val, len); if (len == 2) { if ((dev->accel.multifunc_cntl >> 12) == 5) { @@ -2980,6 +2994,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u /*ATI Mach8/32 specific registers*/ case 0x82ee: + dev->ext_fifo_idx++; mach->accel.patt_data_idx_reg = val & 0x1f; mach->accel.patt_data_idx = mach->accel.patt_data_idx_reg; @@ -2992,6 +3007,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x8eee: + dev->ext_fifo_idx++; if (len == 2) { if (mach->accel.patt_data_idx_reg < 0x10) { mach->accel.color_pattern[mach->accel.patt_data_idx] = val & 0xff; @@ -3007,6 +3023,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x96ee: + dev->ext_fifo_idx++; if (len == 2) { mach->accel.bres_count = val & 0x7ff; mach_log("BresenhamDraw=%04x.\n", mach->accel.dp_config); @@ -3026,10 +3043,12 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0x9aee: + dev->ext_fifo_idx++; mach->accel.line_idx = val & 0x07; break; case 0xa2ee: + dev->ext_fifo_idx++; mach_log("Line OPT=%04x.\n", val); if (len == 2) { mach->accel.linedraw_opt = val; @@ -3047,16 +3066,19 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xa6ee: + dev->ext_fifo_idx++; if (len == 2) mach->accel.dest_x_start = val & 0x7ff; break; case 0xaaee: + dev->ext_fifo_idx++; if (len == 2) mach->accel.dest_x_end = val & 0x7ff; break; case 0xaeee: + dev->ext_fifo_idx++; if (len == 2) { mach->accel.dest_y_end = val & 0x7ff; if ((val + 1) == 0x10000) { @@ -3082,28 +3104,34 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xb2ee: + dev->ext_fifo_idx++; if (len == 2) mach->accel.src_x_start = val & 0x7ff; break; case 0xb6ee: - ibm8514_accel_out_fifo(svga, 0xb6e8, val, len); + dev->ext_fifo_idx++; + dev->accel.bkgd_mix = val & 0xff; break; case 0xbaee: - ibm8514_accel_out_fifo(svga, 0xbae8, val, len); + dev->ext_fifo_idx++; + dev->accel.frgd_mix = val & 0xff; break; case 0xbeee: + dev->ext_fifo_idx++; if (len == 2) mach->accel.src_x_end = val & 0x7ff; break; case 0xc2ee: + dev->ext_fifo_idx++; mach->accel.src_y_dir = val & 1; break; case 0xc6ee: + dev->ext_fifo_idx++; if (len == 2) { mach->accel.cmd_type = 0; mach_log("TODO: Short Stroke.\n"); @@ -3118,6 +3146,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xcaee: + dev->ext_fifo_idx++; if (len == 2) { mach->accel.scan_to_x = (val & 0x7ff); if ((val + 1) == 0x10000) { @@ -3143,6 +3172,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xceee: + dev->ext_fifo_idx++; mach_log("CEEE write val = %04x.\n", val); if (len == 2) { dev->data_available = 0; @@ -3152,6 +3182,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xd2ee: + dev->ext_fifo_idx++; mach->accel.patt_len = val & 0x1f; mach_log("Write Port d2ee: Pattern Length=%d, val=%04x.\n", val & 0x1f, val); mach->accel.mono_pattern_enable = !!(val & 0x80); @@ -3162,11 +3193,13 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xd6ee: + dev->ext_fifo_idx++; mach->accel.patt_idx = val & 0x1f; mach_log("Write Port d6ee: Pattern Index=%d.\n", val & 0x1f); break; case 0xdaee: + dev->ext_fifo_idx++; if (len == 2) { dev->accel.multifunc[2] = val & 0x7ff; dev->accel.clip_left = dev->accel.multifunc[2]; @@ -3177,6 +3210,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xdeee: + dev->ext_fifo_idx++; if (len == 2) { dev->accel.multifunc[1] = val & 0x7ff; dev->accel.clip_top = dev->accel.multifunc[1]; @@ -3188,6 +3222,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xe2ee: + dev->ext_fifo_idx++; if (len == 2) { dev->accel.multifunc[4] = val & 0x7ff; dev->accel.clip_right = dev->accel.multifunc[4]; @@ -3198,6 +3233,7 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xe6ee: + dev->ext_fifo_idx++; if (len == 2) { dev->accel.multifunc[3] = val & 0x7ff; dev->accel.clip_bottom = dev->accel.multifunc[3]; @@ -3208,17 +3244,20 @@ mach_accel_out_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, u break; case 0xeeee: + dev->ext_fifo_idx++; if (len == 2) mach->accel.dest_cmp_fn = val; break; case 0xf2ee: + dev->ext_fifo_idx++; mach_log("F2EE.\n"); if (len == 2) mach->accel.dst_clr_cmp_mask = val; break; case 0xfeee: + dev->ext_fifo_idx++; mach_log("LineDraw=%04x.\n", mach->accel.dp_config); if (len == 2) { mach->accel.line_array[mach->accel.line_idx] = val; @@ -3263,8 +3302,14 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x1ee8: case 0x1ee9: case 0x42e8: + ibm8514_accel_out(port, val, svga, 2); + break; case 0x42e9: ibm8514_accel_out(port, val, svga, 2); + if ((val & 0xc0) == 0xc0) { + dev->ext_fifo_idx = 0; + mach->force_busy = 0; + } break; case 0x6e8: @@ -3443,11 +3488,13 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 else dev->ext_crt_pitch <<= 1; } - dev->on |= 0x01; - dev->vendor_mode = 1; + if ((dev->local & 0xff) >= 0x02) { + dev->on |= 0x01; + dev->vendor_mode = 1; + } svga_recalctimings(svga); mach32_updatemapping(mach, svga); - mach_log("ATI 8514/A: (0x%04x) val=0x%02x.\n", port, val); + mach_log("ATI 8514/A: (0x%04x) val=0x%02x, extended 8514/A mode=%02x.\n", port, val, mach->regs[0xb0] & 0x20); break; case 0x32ee: @@ -3459,8 +3506,10 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 case 0x36ee: case 0x36ef: mach_log("ATI 8514/A: (0x%04x) val = %04x.\n", port, val); - WRITE8(port, mach->misc, val); - mach->misc &= 0xfff0; + if ((dev->local & 0xff) >= 0x02) { + WRITE8(port, mach->misc, val); + mach->misc &= 0xfff0; + } break; case 0x3aee: @@ -3599,17 +3648,8 @@ mach_accel_out_call(uint16_t port, uint8_t val, mach_t *mach, svga_t *svga, ibm8 svga_set_ramdac_type(svga, !!(mach->accel.ext_ge_config & 0x4000)); mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val); svga_recalctimings(svga); - } else { - mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val & 0x30); + } else ati_eeprom_write(&mach->eeprom, !!(mach->accel.ext_ge_config & 0x4000), !!(mach->accel.ext_ge_config & 0x2000), !!(mach->accel.ext_ge_config & 0x1000)); - } - break; - - case 0x7eee: - case 0x7eef: - WRITE8(port, mach->accel.eeprom_control, val); - ati_eeprom_write(&mach->eeprom, !!(mach->accel.eeprom_control & 8), !!(mach->accel.eeprom_control & 2), !!(mach->accel.eeprom_control & 1)); - mach_log("ATI 8514/A: (0x%04x) val=%02x.\n", port, val); break; default: @@ -3631,7 +3671,7 @@ static uint16_t mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, int len) { const uint16_t *vram_w = (uint16_t *) dev->vram; - uint16_t temp = 0; + uint16_t temp = 0x0000; int cmd; int frgd_sel; int bkgd_sel; @@ -3649,6 +3689,11 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in case 0x9ae8: case 0xdae8: + if ((dev->fifo_idx >= 1) && (dev->fifo_idx <= 8)) { + temp |= (1 << (dev->fifo_idx - 1)); + dev->fifo_idx = 0; + } + if (len == 2) { if (dev->force_busy) temp |= 0x200; /*Hardware busy*/ @@ -3672,8 +3717,19 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in break; } } else { - if (dev->accel.sy < 0) - 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; + } } } } @@ -3846,6 +3902,15 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in temp = mach->accel.test >> 8; break; + case 0x9aee: + if (len == 2) { + if ((dev->ext_fifo_idx >= 1) && (dev->ext_fifo_idx <= 16)) { + temp |= (1 << (dev->ext_fifo_idx - 1)); + dev->ext_fifo_idx = 0; + } + } + break; + case 0xa2ee: if (len == 1) temp = mach->accel.linedraw_opt & 0xff; @@ -3991,8 +4056,7 @@ mach_accel_in_fifo(mach_t *mach, svga_t *svga, ibm8514_t *dev, uint16_t port, in break; } - if (port != 0x9aee && port != 0x62ee) - mach_log("[%04X:%08X]: Port FIFO IN=%04x, temp=%04x, len=%d.\n", CS, cpu_state.pc, port, temp, len); + mach_log("[%04X:%08X]: Port FIFO IN=%04x, temp=%04x, len=%d.\n", CS, cpu_state.pc, port, temp, len); return temp; } @@ -4023,7 +4087,7 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) case 0x42e8: case 0x42e9: if (dev->vc == dev->v_syncstart) - dev->subsys_stat |= 0x01; + temp |= 0x01; if (mach->accel.cmd_type == -1) { if (cmd == 6) { @@ -4031,13 +4095,13 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) (dev->accel.dx <= clip_r_ibm) && (dev->accel.dy >= clip_t) && (dev->accel.dy <= clip_b_ibm)) - dev->subsys_stat |= 0x02; + temp |= 0x02; } else { if ((dev->accel.cx >= clip_l) && (dev->accel.cx <= clip_r_ibm) && (dev->accel.cy >= clip_t) && (dev->accel.cy <= clip_b_ibm)) - dev->subsys_stat |= 0x02; + temp |= 0x02; } } else { switch (mach->accel.cmd_type) { @@ -4048,25 +4112,29 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) (dev->accel.dx <= clip_r) && (dev->accel.dy >= clip_t) && (dev->accel.dy <= clip_b)) - dev->subsys_stat |= 0x02; + temp |= 0x02; break; case 3: case 4: - if ((dev->accel.cx >= clip_l) && - (dev->accel.cx <= clip_r) && - (dev->accel.cy >= clip_t) && - (dev->accel.cy <= clip_b)) - dev->subsys_stat |= 0x02; + if ((dev->accel.cx >= clip_l) && + (dev->accel.cx <= clip_r) && + (dev->accel.cy >= clip_t) && + (dev->accel.cy <= clip_b)) + temp |= 0x02; break; default: break; } } + if ((!dev->fifo_idx || !dev->ext_fifo_idx)) { + if ((!dev->force_busy && !dev->force_busy2) || !mach->force_busy) + temp |= 0x08; + } if (port & 1) temp = dev->vram_512k_8514 ? 0x00 : 0x80; else { - temp |= (dev->subsys_stat | 0x80); + temp |= (dev->subsys_stat | (dev->vram_512k_8514 ? 0x00 : 0x80)); if (mach->accel.ext_ge_config & 0x08) temp |= ((mach->accel.ext_ge_config & 0x07) << 4); else @@ -4103,23 +4171,25 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) case 0x36ee: case 0x36ef: - READ8(port, mach->misc); + if ((dev->local & 0xff) >= 0x02) { + READ8(port, mach->misc); - if (!(port & 1)) { - temp &= ~0x0c; - switch (dev->vram_amount) { - case 1024: - temp |= 0x04; - break; - case 2048: - temp |= 0x08; - break; - case 4096: - temp |= 0x0c; - break; + if (!(port & 1)) { + temp &= ~0x0c; + switch (dev->vram_amount) { + case 1024: + temp |= 0x04; + break; + case 2048: + temp |= 0x08; + break; + case 4096: + temp |= 0x0c; + break; - default: - break; + default: + break; + } } } break; @@ -4142,16 +4212,13 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) case 0x52ee: case 0x52ef: READ8(port, mach->accel.scratch0); -#ifdef ATI_8514_ULTRA - if (dev->extensions && ((dev->local & 0xff) == 0x00)) { - if (mach->mca_bus) { + if (mach->mca_bus) { + if (svga->ext8514 != NULL) { + temp = (((dev->bios_rom.mapping.base >> 7) - 0x1000) >> 4); if (port & 1) - temp = dev->pos_regs[5]; - else - temp = dev->pos_regs[4]; + temp |= 0x01; } } -#endif break; case 0x56ee: @@ -4210,13 +4277,11 @@ mach_accel_in_call(uint16_t port, mach_t *mach, svga_t *svga, ibm8514_t *dev) default: break; } - if (port != 0x42e8 && port != 0x42e9 && port != 0x62ee && port != 0x62ef && port != 0x02e8 && port != 0x02e9) - mach_log("[%04X:%08X]: Port NORMAL IN=%04x, temp=%04x.\n", CS, cpu_state.pc, port, temp); + mach_log("[%04X:%08X]: Port NORMAL IN=%04x, temp=%04x.\n", CS, cpu_state.pc, port, temp); return temp; } -#ifdef ATI_8514_ULTRA static void ati8514_accel_out(uint16_t port, uint8_t val, svga_t *svga) { @@ -4267,7 +4332,6 @@ ati8514_accel_outl(uint16_t port, uint32_t val, void *priv) ati8514_accel_out(port + 3, (val >> 24), svga); } } -#endif static void mach_accel_outb(uint16_t port, uint8_t val, void *priv) @@ -4312,7 +4376,6 @@ mach_accel_outl(uint16_t port, uint32_t val, void *priv) } } -#ifdef ATI_8514_ULTRA static uint8_t ati8514_accel_in(uint16_t port, svga_t *svga) { @@ -4368,7 +4431,6 @@ ati8514_accel_inl(uint16_t port, void *priv) } return temp; } -#endif static uint8_t mach_accel_in(uint16_t port, mach_t *mach) @@ -5316,10 +5378,10 @@ mach32_hwcursor_draw(svga_t *svga, int displine) dev->hwcursor_latch.addr += 16; } -#ifdef ATI_8514_ULTRA static void ati8514_io_set(svga_t *svga) { + io_sethandler(0x2e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0x6e8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xae8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xee8, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); @@ -5430,7 +5492,6 @@ ati8514_io_set(svga_t *svga) io_sethandler(0xf6ee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); io_sethandler(0xfeee, 0x0002, ati8514_accel_inb, ati8514_accel_inw, ati8514_accel_inl, ati8514_accel_outb, ati8514_accel_outw, ati8514_accel_outl, svga); } -#endif static void mach_io_remove(mach_t *mach) @@ -5447,7 +5508,6 @@ mach_io_remove(mach_t *mach) io_removehandler(0x26e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x2ee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x42e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); - io_removehandler(0x46e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x4ae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x52e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_removehandler(0x56e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); @@ -5564,7 +5624,6 @@ mach_io_set(mach_t *mach) io_sethandler(0x26e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_sethandler(0x2ee8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_sethandler(0x42e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); - io_sethandler(0x46e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_sethandler(0x4ae8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_sethandler(0x52e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); io_sethandler(0x56e8, 0x0002, mach_accel_inb, mach_accel_inw, mach_accel_inl, mach_accel_outb, mach_accel_outw, mach_accel_outl, mach); @@ -5715,7 +5774,6 @@ mach_mca_reset(void *priv) timer_set_callback(&svga->timer, svga_poll); } -#ifdef ATI_8514_ULTRA uint8_t ati8514_mca_read(int port, void *priv) { @@ -5747,7 +5805,6 @@ ati8514_pos_write(uint16_t port, uint8_t val, void *priv) { ati8514_mca_write(port, val, priv); } -#endif static uint8_t mach32_pci_read(UNUSED(int func), int addr, void *priv) @@ -6031,10 +6088,10 @@ mach8_init(const device_t *info) io_sethandler(0x03c0, 32, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); io_sethandler(0x02ea, 4, mach_in, NULL, NULL, mach_out, NULL, NULL, mach); mach_io_set(mach); + mach->accel.cmd_type = -2; if ((dev->local & 0xff) >= 0x02) { svga->decode_mask = (4 << 20) - 1; - mach->accel.cmd_type = -1; mach->cursor_col_1 = 0xff; mach->ext_cur_col_1_r = 0xff; mach->ext_cur_col_1_g = 0xff; @@ -6055,19 +6112,18 @@ mach8_init(const device_t *info) } else pci_add_card(PCI_ADD_VIDEO, mach32_pci_read, mach32_pci_write, mach, &mach->pci_slot); - mach->pci_regs[PCI_REG_COMMAND] = 0x83; + mach->pci_regs[PCI_REG_COMMAND] = 0x87; mach->pci_regs[0x30] = 0x00; mach->pci_regs[0x32] = 0x0c; mach->pci_regs[0x33] = 0x00; } else ati_eeprom_load(&mach->eeprom, "mach32.nvr", 1); } else - ati_eeprom_load_mach8(&mach->eeprom, "mach8.nvr"); + ati_eeprom_load_mach8_vga(&mach->eeprom, "mach8.nvr"); return mach; } -#ifdef ATI_8514_ULTRA void ati8514_init(svga_t *svga, void *ext8514, void *dev8514) { @@ -6086,7 +6142,7 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) ati8514_io_set(svga); mach->mca_bus = !!(dev->type & DEVICE_MCA); - mach->config1 = 0x01 | 0x02 | 0x08 | 0x80; + mach->config1 = 0x02 | 0x08 | 0x80; if (mach->mca_bus) mach->config1 |= 0x04; @@ -6096,7 +6152,6 @@ ati8514_init(svga_t *svga, void *ext8514, void *dev8514) mach->config2 = 0x02; } -#endif static int mach8_vga_available(void) diff --git a/src/video/vid_svga.c b/src/video/vid_svga.c index e192ecd49..5054bd8e7 100644 --- a/src/video/vid_svga.c +++ b/src/video/vid_svga.c @@ -458,11 +458,16 @@ svga_in(uint16_t addr, void *priv) ret = 0x10; break; case 0x3c3: - ret = 0x00; - if (xga_active && xga) - ret |= !xga->on; - if (ibm8514_active && dev) - ret |= !dev->on; + ret = 0x01; + if (xga_active && xga) { + if (xga->on) + ret = 0x00; + } + if (ibm8514_active && dev) { + if (dev->on) + ret = 0x00; + } + svga_log("VGA read: (0x%04x) ret=%02x.\n", addr, ret); break; case 0x3c4: ret = svga->seqaddr; @@ -560,6 +565,8 @@ svga_in(uint16_t addr, void *priv) if ((addr >= 0x3c6) && (addr <= 0x3c9)) svga_log("VGA IN addr=%03x, temp=%02x.\n", addr, ret); + else if ((addr >= 0x2ea) && (addr <= 0x2ed)) + svga_log("8514/A IN addr=%03x, temp=%02x.\n", addr, ret); return ret; } From 4c0eb397290049c6112a2e56fda5e7e05e094529 Mon Sep 17 00:00:00 2001 From: TC1995 Date: Wed, 13 Nov 2024 23:34:31 +0100 Subject: [PATCH 573/624] Spock changes of the day (November 13th, 2024) 1. The SCSI ID is now more correct about about the difference between physical unit number and actual SCSI ID. This should fix boot freezes on NT 1991 builds for x86 using said card, as well as keeping compatibility the same as before. --- src/scsi/scsi_spock.c | 70 +++++++++++++++++++++++++++++++------------ 1 file changed, 51 insertions(+), 19 deletions(-) diff --git a/src/scsi/scsi_spock.c b/src/scsi/scsi_spock.c index 0c30d1532..e308d0788 100644 --- a/src/scsi/scsi_spock.c +++ b/src/scsi/scsi_spock.c @@ -455,11 +455,8 @@ spock_process_imm_cmd(spock_t *scsi) int phys_id; int lun_id; - scsi->assign = 0; - switch (scsi->command & CMD_MASK) { case CMD_ASSIGN: - scsi->assign = 1; adapter_id = (scsi->command >> 16) & 15; phys_id = (scsi->command >> 20) & 7; lun_id = (scsi->command >> 24) & 7; @@ -512,6 +509,7 @@ spock_process_imm_cmd(spock_t *scsi) scsi->present[j] = i; j++; } else { + scsi->present[j] = 0xff; spock_log("Adapter Reset, SCSI reset not present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[i].phys_id, scsi_devices[scsi->bus][i].type); } } @@ -566,6 +564,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) scsi->present[j] = c; j++; } else { + scsi->present[j] = 0xff; spock_log("Reset, SCSI reset not present devices=%d, phys ID=%d, type=%04x.\n", j, scsi->dev_id[c].phys_id, scsi_devices[scsi->bus][c].type); } } @@ -699,7 +698,11 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) break; case CMD_DEVICE_INQUIRY: - scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + if (scsi->present[scsi->scb_id] != 0xff) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + spock_log("Device Inquiry, ID=%d\n", scsi->cdb_id); scsi->cdb[0] = GPCMD_INQUIRY; scsi->cdb[1] = scsi->dev_id[scsi->scb_id].lun_id << 5; /*LUN*/ @@ -715,9 +718,13 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_SEND_OTHER_SCSI: - scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + if (scsi->present[scsi->scb_id] != 0xff) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + dma_bm_read(scsi->scb_addr + 0x18, scsi->cdb, 12, 2); - spock_log("Send Other SCSI, SCB ID=%d, PHYS ID=%d, CDB[0]=%02x, CDB_ID=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->cdb[0], scsi->cdb_id); + spock_log("Send Other SCSI, SCB ID=%d, PHYS ID=%d, CDB[0]=%02x, CDB_ID=%d, ID Present=%d.\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id, scsi->cdb[0], scsi->cdb_id, scsi->present[scsi->scb_id]); scsi->cdb[1] = (scsi->cdb[1] & 0x1f) | (scsi->dev_id[scsi->scb_id].lun_id << 5); /*Patch correct LUN into command*/ scsi->cdb_len = (scb->lba_addr & 0xff) ? (scb->lba_addr & 0xff) : 6; scsi->scsi_state = SCSI_STATE_SELECT; @@ -725,7 +732,11 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_READ_DEVICE_CAPACITY: - scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + if (scsi->present[scsi->scb_id] != 0xff) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + spock_log("Device Capacity, SCB ID=%d, PHYS ID=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id); scsi->cdb[0] = GPCMD_READ_CDROM_CAPACITY; scsi->cdb[1] = scsi->dev_id[scsi->scb_id].lun_id << 5; /*LUN*/ @@ -743,7 +754,11 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_READ_DATA: - scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + if (scsi->present[scsi->scb_id] != 0xff) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + spock_log("Device Read Data, SCB ID=%d, PHYS ID=%d\n", scsi->scb_id, scsi->dev_id[scsi->scb_id].phys_id); scsi->cdb[0] = GPCMD_READ_10; scsi->cdb[1] = scsi->dev_id[scsi->scb_id].lun_id << 5; /*LUN*/ @@ -761,7 +776,11 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_WRITE_DATA: - scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + if (scsi->present[scsi->scb_id] != 0xff) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + spock_log("Device Write Data\n"); scsi->cdb[0] = GPCMD_WRITE_10; scsi->cdb[1] = scsi->dev_id[scsi->scb_id].lun_id << 5; /*LUN*/ @@ -779,7 +798,11 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_VERIFY: - scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + if (scsi->present[scsi->scb_id] != 0xff) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + spock_log("Device Verify\n"); scsi->cdb[0] = GPCMD_VERIFY_10; scsi->cdb[1] = scsi->dev_id[scsi->scb_id].lun_id << 5; /*LUN*/ @@ -798,7 +821,11 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) return; case CMD_REQUEST_SENSE: - scsi->cdb_id = scsi->assign ? scsi->dev_id[scsi->scb_id].phys_id : scsi->present[scsi->scb_id]; + if (scsi->present[scsi->scb_id] != 0xff) + scsi->cdb_id = scsi->dev_id[scsi->scb_id].phys_id; + else + scsi->cdb_id = 0xff; + spock_log("Device Request Sense, ID=%d\n", scsi->cdb_id); scsi->cdb[0] = GPCMD_REQUEST_SENSE; scsi->cdb[1] = scsi->dev_id[scsi->scb_id].lun_id << 5; /*LUN*/ @@ -818,7 +845,7 @@ spock_execute_cmd(spock_t *scsi, scb_t *scb) case 2: /* Wait */ if (scsi->scsi_state == SCSI_STATE_IDLE) { - if (scsi_device_present(&scsi_devices[scsi->bus][scsi->cdb_id])) { + if (scsi_device_present(&scsi_devices[scsi->bus][scsi->cdb_id]) && (scsi->cdb_id != 0xff)) { if (scsi->last_status == SCSI_STATUS_OK) { scsi->scb_state = 3; spock_log("Status is Good on device ID %d, cdb id = %d.\n", scsi->scb_id, scsi->cdb_id); @@ -878,7 +905,7 @@ spock_process_scsi(spock_t *scsi, scb_t *scb) case SCSI_STATE_SELECT: spock_log("Selecting ID %d, SCB ID %d, LUN %d, adapter id = %d.\n", scsi->cdb_id, scsi->scb_id, scsi->dev_id[scsi->scb_id].lun_id, scsi->attention); - if ((scsi->cdb_id != (uint8_t) -1) && scsi_device_present(&scsi_devices[scsi->bus][scsi->cdb_id])) { + if ((scsi->cdb_id != 0xff) && scsi_device_present(&scsi_devices[scsi->bus][scsi->cdb_id])) { scsi->scsi_state = SCSI_STATE_SEND_COMMAND; spock_log("Device selected at ID %i.\n", scsi->cdb_id); } else { @@ -893,6 +920,7 @@ spock_process_scsi(spock_t *scsi, scb_t *scb) break; case SCSI_STATE_SEND_COMMAND: + spock_log("Send Command ID=%d.\n", scsi->cdb_id); sd = &scsi_devices[scsi->bus][scsi->cdb_id]; memset(scsi->temp_cdb, 0x00, 12); @@ -954,9 +982,9 @@ spock_process_scsi(spock_t *scsi, scb_t *scb) } } else { spock_log("Normal Transfer\n"); - if (sd->phase == SCSI_PHASE_DATA_IN) { + if (sd->phase == SCSI_PHASE_DATA_IN) dma_bm_write(scsi->data_ptr, sd->sc->temp_buffer, MIN(sd->buffer_length, (int) scsi->data_len), 2); - } else if (sd->phase == SCSI_PHASE_DATA_OUT) + else if (sd->phase == SCSI_PHASE_DATA_OUT) dma_bm_read(scsi->data_ptr, sd->sc->temp_buffer, MIN(sd->buffer_length, (int) scsi->data_len), 2); } @@ -1077,9 +1105,11 @@ spock_mca_write(int port, uint8_t val, void *priv) if (scsi->pos_regs[2] & 1) { io_sethandler((((scsi->pos_regs[2] >> 1) & 7) * 8) + 0x3540, 0x0008, spock_read, spock_readw, NULL, spock_write, spock_writew, NULL, scsi); - if ((scsi->pos_regs[2] & 0xf0) != 0xf0) { - mem_mapping_set_addr(&scsi->bios_rom.mapping, ((scsi->pos_regs[2] >> 4) * 0x2000) + 0xc0000, 0x8000); - mem_mapping_enable(&scsi->bios_rom.mapping); + if (scsi->pos_regs[4] & 2) { + if (((scsi->pos_regs[2] >> 4) & 0x0f) != 0x0f) { + mem_mapping_set_addr(&scsi->bios_rom.mapping, ((scsi->pos_regs[2] >> 4) * 0x2000) + 0xc0000, 0x8000); + mem_mapping_enable(&scsi->bios_rom.mapping); + } } } spock_log("[%04X:%08X]: POS Write Port = %x, val = %02x, rom addr = %05x\n", CS, cpu_state.pc, port & 7, val, ((scsi->pos_regs[2] >> 4) * 0x2000) + 0xc0000); @@ -1120,11 +1150,12 @@ spock_mca_reset(void *priv) /* Reset all devices on controller reset. */ for (uint8_t i = 0; i < 8; i++) { scsi_device_reset(&scsi_devices[scsi->bus][i]); - scsi->present[i] = 0; + scsi->present[i] = 0xff; } spock_log("Reset.\n"); mem_mapping_disable(&scsi->bios_rom.mapping); + scsi->pos_regs[4] = 0x02; spock_mca_write(0x102, 0, scsi); } @@ -1158,6 +1189,7 @@ spock_init(const device_t *info) scsi->pos_regs[0] = scsi->spock_16bit ? 0xfe : 0xff; scsi->pos_regs[1] = 0x8e; + scsi->pos_regs[4] = 0x02; mca_add(spock_mca_read, spock_mca_write, spock_mca_feedb, spock_mca_reset, scsi); scsi->in_reset = 2; From 001907f7c6a68c0d2e0d4050f59131d669a7a4cd Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 14 Nov 2024 06:04:52 +0100 Subject: [PATCH 574/624] The first batch of updated translations, including German fixes by Pellzi, closes #4948. --- src/qt/languages/ca-ES.po | 1037 ++++++++++++++++++++++++++++++++++-- src/qt/languages/cs-CZ.po | 953 ++++++++++++++++++++++++++++++++- src/qt/languages/de-DE.po | 1057 ++++++++++++++++++++++++++++++++++--- src/qt/languages/en-GB.po | 45 ++ src/qt/languages/es-ES.po | 954 ++++++++++++++++++++++++++++++++- src/qt/languages/fi-FI.po | 949 ++++++++++++++++++++++++++++++++- src/qt/languages/fr-FR.po | 956 ++++++++++++++++++++++++++++++++- 7 files changed, 5777 insertions(+), 174 deletions(-) diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 94b35a235..f2c21d94b 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -16,7 +16,7 @@ msgid "&Right CTRL is left ALT" msgstr "CTRL &dret és ALT esquerre" msgid "&Hard Reset..." -msgstr "&Reinicialització completa..." +msgstr "&Reinicialització completa ..." msgid "&Ctrl+Alt+Del\tCtrl+F12" msgstr "&Ctrl+Alt+Del\tCtrl+F12" @@ -28,7 +28,7 @@ msgid "&Pause" msgstr "&Pausa" msgid "E&xit..." -msgstr "&Sortir..." +msgstr "&Sortir ..." msgid "&View" msgstr "&Vista" @@ -43,7 +43,7 @@ msgid "&Resizeable window" msgstr "&Finestra redimensionable" msgid "R&emember size && position" -msgstr "&Recordar mida i posició" +msgstr "&Recordar grandària i posició" msgid "Re&nderer" msgstr "Re&nderitzador" @@ -61,7 +61,7 @@ msgid "&VNC" msgstr "&VNC" msgid "Specify dimensions..." -msgstr "E&specificar dimensions..." +msgstr "E&specificar dimensions ..." msgid "F&orce 4:3 display ratio" msgstr "F&orçar ràtio 4:3" @@ -181,7 +181,7 @@ msgid "&Tools" msgstr "&Eines" msgid "&Settings..." -msgstr "&Ajustaments..." +msgstr "&Ajustaments ..." msgid "&Update status bar icons" msgstr "&Actualitzar icones a la barra d'estat" @@ -190,13 +190,13 @@ msgid "Take s&creenshot\tCtrl+F11" msgstr "Prendre c&aptura\tCtrl+F11" msgid "&Preferences..." -msgstr "&Preferències..." +msgstr "&Preferències ..." msgid "Enable &Discord integration" -msgstr "Habilita la integració amb el &Discord" +msgstr "Activar la integració amb el &Discord" msgid "Sound &gain..." -msgstr "&Guany de so..." +msgstr "&Guany de so ..." msgid "Begin trace\tCtrl+T" msgstr "Començar traça\tCtrl+T" @@ -208,19 +208,19 @@ msgid "&Help" msgstr "&Ajuda" msgid "&Documentation..." -msgstr "&Documentació..." +msgstr "&Documentació ..." msgid "&About 86Box..." -msgstr "&Quant a 86Box..." +msgstr "&Quant a 86Box ..." msgid "&New image..." -msgstr "&Nova imatge..." +msgstr "&Nova imatge ..." msgid "&Existing image..." -msgstr "Imatge &Existent..." +msgstr "Imatge &Existent ..." msgid "Existing image (&Write-protected)..." -msgstr "Imatge Existent (&Només-lectura)..." +msgstr "Imatge Existent (&Només-lectura) ..." msgid "&Record" msgstr "&Gravar" @@ -238,10 +238,10 @@ msgid "E&ject" msgstr "E&xtreure" msgid "&Image..." -msgstr "&Imatge..." +msgstr "&Imatge ..." msgid "E&xport to 86F..." -msgstr "E&xportar a 86F..." +msgstr "E&xportar a 86F ..." msgid "&Mute" msgstr "&Silenciar" @@ -250,40 +250,40 @@ msgid "E&mpty" msgstr "E&xtreure disc" msgid "&Reload previous image" -msgstr "&Recarregar imatge prèvia" +msgstr "&Recarregar imatge anterior" msgid "&Folder..." -msgstr "&Carpeta..." +msgstr "&Carpeta ..." msgid "Target &framerate" -msgstr "&Taxa de refresc objectiu" +msgstr "objectiu de &taxa de refresc" msgid "&Sync with video" msgstr "&Sincronitzar amb vídeo" msgid "&25 fps" -msgstr "&25 fps" +msgstr "&25 fotogrames/s" msgid "&30 fps" -msgstr "&30 fps" +msgstr "&30 fotogrames/s" msgid "&50 fps" -msgstr "&50 fps" +msgstr "&50 fotogrames/s" msgid "&60 fps" -msgstr "&60 fps" +msgstr "&60 fotogrames/s" msgid "&75 fps" -msgstr "&75 fps" +msgstr "&75 fotogrames/s" msgid "&VSync" msgstr "&VSync" msgid "&Select shader..." -msgstr "&Seleccionar shader..." +msgstr "&Seleccionar shader ..." msgid "&Remove shader" -msgstr "&Eliminar shader" +msgstr "S&upressió de shader" msgid "Preferences" msgstr "Preferències" @@ -340,7 +340,7 @@ msgid "Height:" msgstr "Alçada:" msgid "Lock to this size" -msgstr "Bloquejar aquesta mida" +msgstr "Bloquejar aquesta grandària" msgid "Machine type:" msgstr "Tipus de màquina:" @@ -390,8 +390,11 @@ msgstr "Recopilador Dinàmic" msgid "Video:" msgstr "Vídeo:" -msgid "Voodoo Graphics" -msgstr "Gràfics Voodoo" +msgid "Video #2:" +msgstr "Vídeo 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Gràfics Voodoo 1 o 2" msgid "IBM 8514/A Graphics" msgstr "Gràfics IBM 8514/A" @@ -406,16 +409,16 @@ msgid "Joystick:" msgstr "Joystick:" msgid "Joystick 1..." -msgstr "Joystick 1..." +msgstr "Joystick 1 ..." msgid "Joystick 2..." -msgstr "Joystick 2..." +msgstr "Joystick 2 ..." msgid "Joystick 3..." -msgstr "Joystick 3..." +msgstr "Joystick 3 ..." msgid "Joystick 4..." -msgstr "Joystick 4..." +msgstr "Joystick 4 ..." msgid "Sound card #1:" msgstr "Targeta de so 1:" @@ -541,13 +544,13 @@ msgid "Hard disks:" msgstr "Discs durs:" msgid "&New..." -msgstr "&Nou..." +msgstr "&Nou ..." msgid "&Existing..." -msgstr "&Existent..." +msgstr "&Existent ..." msgid "&Remove" -msgstr "E&liminar" +msgstr "S&upressió" msgid "Bus:" msgstr "Bus:" @@ -559,7 +562,7 @@ msgid "ID:" msgstr "ID:" msgid "&Specify..." -msgstr "E&specificar..." +msgstr "E&specificar ..." msgid "Sectors:" msgstr "Sectors:" @@ -571,7 +574,7 @@ msgid "Cylinders:" msgstr "Cilindres:" msgid "Size (MB):" -msgstr "Mida (MB):" +msgstr "Grandària (MB):" msgid "Type:" msgstr "Tipus:" @@ -580,7 +583,7 @@ msgid "Image Format:" msgstr "Format d'imatge:" msgid "Block Size:" -msgstr "Mida del bloc:" +msgstr "Grandària del bloc:" msgid "Floppy drives:" msgstr "Unitats de disquet:" @@ -684,6 +687,9 @@ msgstr "La màquina \"%hs\" no està disponible perquè falten ROM al directori msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "La targeta de vídeo \"%hs\" no està disponible perquè falten ROM al directori roms/video. Canvi a una targeta de vídeo disponible." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "La targeta de vídeo 2 \"%hs\" no està disponible perquè falten ROM al directori roms/video. Canvi a una targeta de vídeo disponible." + msgid "Machine" msgstr "Màquina" @@ -762,17 +768,26 @@ msgstr "No s'han trobat dispositius PCap" msgid "Invalid PCap device" msgstr "El dispositiu PCap no és vàlid" -msgid "Standard 2-button joystick(s)" -msgstr "Joystick(s) estàndard de 2 botons" +msgid "2-axis, 2-button joystick(s)" +msgstr "Joystick(s) de 2 eixes, 2 botons" -msgid "Standard 4-button joystick" -msgstr "Joystick(s) estàndard de 4 botons" +msgid "2-axis, 4-button joystick" +msgstr "Joystick de 2 eixes, 4 botons" -msgid "Standard 6-button joystick" -msgstr "Joystick(s) estàndard de 6 botons" +msgid "2-axis, 6-button joystick" +msgstr "Joystick de 2 eixes, 6 botons" -msgid "Standard 8-button joystick" -msgstr "Joystick(s) estàndard de 8 botons" +msgid "2-axis, 8-button joystick" +msgstr "Joystick de 2 eixes, 8 botons" + +msgid "3-axis, 2-button joystick" +msgstr "Joystick de 3 eixes, 2 botons" + +msgid "3-axis, 4-button joystick" +msgstr "Joystick de 3 eixes, 4 botons" + +msgid "4-axis, 4-button joystick" +msgstr "Joystick de 4 eixes, 4 botons" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Esteu segur que voleu sortir de 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -853,7 +871,10 @@ msgid "Invalid configuration" msgstr "Configuració invàlida" 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 és necessària per a la conversió automàtica de fitxers PostScript a PDF.\n\nQualsevol document enviat a la impressora genèrica postScript es desarà com a fitxer PostScript (.ps)." +msgstr "%1 és necessària per a la conversió automàtica de fitxers PostScript a PDF.\n\nQualsevol document enviat a la impressora genèrica PostScript es desarà com a fitxer PostScript (.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." +msgstr "%1 és necessària per a la conversió automàtica de fitxers PCL a PDF.\n\nQualsevol document enviat a la impressora genèrica PCL es desarà com a fitxer Printer Command Language (.pcl)." msgid "Entering fullscreen mode" msgstr "Entrant en mode pantalla completa" @@ -874,7 +895,7 @@ msgid "CD-ROM images" msgstr "Imatges de CD-ROM" msgid "%1 Device Configuration" -msgstr "%1 Configuració de Dispositiu" +msgstr "Configuració de Dispositiu %1" msgid "Monitor in sleep mode" msgstr "Monitor en mode estalvi" @@ -937,10 +958,10 @@ msgid "MFM/RLL or ESDI CD-ROM drives never existed" msgstr "Les unitats de CD-ROM MFM/RLL o ESDI no van existir mai" msgid "Custom..." -msgstr "Personalitzat..." +msgstr "Personalitzat ..." msgid "Custom (large)..." -msgstr "Personalitzat (gran)..." +msgstr "Personalitzat (gran) ..." msgid "Add New Hard Disk" msgstr "Afegir disc dur nou" @@ -964,7 +985,7 @@ msgid "Unable to write file" msgstr "No has estat possible escriure el fitxer" msgid "HDI or HDX images with a sector size other than 512 are not supported." -msgstr "Les imatges HDI o HDX amb una mida de sector diferent de 512 no s'admeten." +msgstr "Les imatges HDI o HDX amb una grandària de sector diferent de 512 no s'admeten." msgid "Disk image file already exists" msgstr "El fitxer d'imatge de disc ja existeix" @@ -999,6 +1020,27 @@ msgstr "Sobreescriure" msgid "Don't overwrite" msgstr "No sobreescriure" +msgid "Raw image" +msgstr "Imatge crua" + +msgid "HDI image" +msgstr "Imatge HDI" + +msgid "HDX image" +msgstr "Imatge HDX" + +msgid "Fixed-size VHD" +msgstr "VHD de grandària fixa" + +msgid "Dynamic-size VHD" +msgstr "VHD de grandària dinàmica" + +msgid "Differencing VHD" +msgstr "VHD diferencial" + +msgid "(N/A)" +msgstr "(Cap)" + msgid "Raw image (.img)" msgstr "Imatge crua (.img)" @@ -1009,10 +1051,10 @@ msgid "HDX image (.hdx)" msgstr "Imatge HDX (.hdx)" msgid "Fixed-size VHD (.vhd)" -msgstr "VHD de mida fixa (.vhd)" +msgstr "VHD de grandària fixa (.vhd)" msgid "Dynamic-size VHD (.vhd)" -msgstr "VHD de mida dinàmica (.vhd)" +msgstr "VHD de grandària dinàmica (.vhd)" msgid "Differencing VHD (.vhd)" msgstr "VHD diferencial (.vhd)" @@ -1168,7 +1210,892 @@ msgid "&Auto-pause on focus loss" msgstr "&Pausa automàtica en la pèrdua del focus" msgid "WinBox is no longer supported" -msgstr "WinBox is no longer supported" +msgstr "Winbox ja no és compatible" 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 behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." +msgstr "El desenvolupament del gerent de Winbox es va aturar el 2022 per falta de mantenidors. A mesura que dirigim els nostres esforços cap a la millora de 86Box, hem pres la decisió de deixar de donar suport a Winbox com a gerent.\n\nNo es proporcionaran més actualitzacions a través de Winbox i és possible que es trobi amb un comportament incorrecte si continueu utilitzant -lo amb versions més recents de 86Box. Qualsevol informe d'errors relacionat amb el comportament de WinBox es tancarà com a no vàlid.\n\nVés a 86box.net per obtenir una llista d’altres gestors que puguis utilitzar." + +msgid "Generate" +msgstr "Generar" + +msgid "Joystick configuration" +msgstr "Configuració del joystick" + +msgid "Device" +msgstr "Dispositiu" + +msgid "%1 (X axis)" +msgstr "%1 (eix X)" + +msgid "%1 (Y axis)" +msgstr "%1 (eix Y)" + +msgid "MCA devices" +msgstr "Dispositius MCA" + +msgid "List of MCA devices:" +msgstr "Lista de dispositius MCA:" + +msgid "Tablet tool" +msgstr "Eina de tauleta" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Quant a Qt" + +msgid "MCA devices..." +msgstr "Dispositius MCA ..." + +msgid "Show non-primary monitors" +msgstr "Mostrar monitors no primaris" + +msgid "Open screenshots folder..." +msgstr "Obrir la carpeta de captures de pantalla ..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Apliqueu el mode d’estirament de pantalla completa en màxima" + +msgid "Cursor/Puck" +msgstr "Cursor/Puck" + +msgid "Pen" +msgstr "Ploma" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Unitat CD/DVD d'amfitrió (%1:)" + +msgid "&Connected" +msgstr "&Connectat" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Comportament del renderitzador" + +msgid "Use target framerate:" +msgstr "Utilitzeu el objectiu de la velocitat:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "No has estat possible canviar al context d'OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Es requereix la versió 3.0 o superior d'OpenGL. La versió actual és %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "No has estat possible inicialitzar OpenGL. Error %1." + +msgid "Error initializing OpenGL" +msgstr "Error en inicialitzar OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Tornant al renderitzador software.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "No has estat possible assignar la memòria per a un buffer de desempaquetament.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Quan seleccioneu imatges de suports (CD-ROM, disquet, etc.), el diàleg obert s’iniciarà al mateix directori que el fitxer de configuració 86Box. Aquesta configuració només farà una diferència en les macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Aquesta màquina podria haver estat moguda o copiada." + +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 "Per tal d’assegurar una funcionalitat adequada de xarxa, 86box ha de saber si aquesta màquina es va moure o copiar.\n\nSeleccioneu \"Ho he copiat\" si no esteu segurs." + +msgid "I Moved It" +msgstr "Ho vaig moure" + +msgid "I Copied It" +msgstr "Ho he copiat" + +msgid "86Box Monitor #" +msgstr "Monitor de 86Box " + +msgid "No MCA devices." +msgstr "No s'han trobat dispositius MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Targeta de xarxa 1" + +msgid "Network Card #2" +msgstr "Targeta de xarxa 2" + +msgid "Network Card #3" +msgstr "Targeta de xarxa 3" + +msgid "Network Card #4" +msgstr "Targeta de xarxa 4" + +msgid "Mode" +msgstr "Mode" + +msgid "Interface" +msgstr "Interfície" + +msgid "Adapter" +msgstr "Adaptador" + +msgid "VDE Socket" +msgstr "Socket de VDE" + +msgid "86Box Unit Tester" +msgstr "Test de la unitat de 86 Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Targeta de clau de Novell Netware 2.x" + +msgid "Serial port passthrough 1" +msgstr "Pas del port sèrie 1" + +msgid "Serial port passthrough 2" +msgstr "Pas del port sèrie 2" + +msgid "Serial port passthrough 3" +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 ..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Ratolí bus Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Ratolí bus Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Ratolí sèrie Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Ratolí sèrie Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Ratolí sèrie Logitech" + +msgid "PS/2 Mouse" +msgstr "Ratolí PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (sèrie)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Mòdem estàndard, complint els Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Emulació de Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulació de Roland MT-32 (nou)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulació de Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulació de Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Placa filla OPL4-ML" + +msgid "System MIDI" +msgstr "MIDI de sistema" + +msgid "MIDI Input Device" +msgstr "Dispositiu d'entrada MIDI" + +msgid "BIOS Address" +msgstr "Adreça de BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Activar les escrits a la ROM extensor de BIOS" + +msgid "Address" +msgstr "Adreça" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revisió de la BIOS" + +msgid "Translate 26 -> 17" +msgstr "Traduir 26 -> 17" + +msgid "Language" +msgstr "Idioma" + +msgid "Enable backlight" +msgstr "Activar la llum posterior" + +msgid "Invert colors" +msgstr "Colors invertits" + +msgid "BIOS size" +msgstr "Grandària de la BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapa C0000-C7FFF com UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapa C8000-CFFFF com UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapa D0000-D7FFF com UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapa D8000-DFFFF com UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapa E0000-E7FFF com UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapa E8000-EFFFF com UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Jumper JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Dispositiu de sortida MIDI" + +msgid "MIDI Real time" +msgstr "MIDI en temps real" + +msgid "MIDI Thru" +msgstr "Pas de l’entrada MIDI" + +msgid "MIDI Clockout" +msgstr "Rellotge MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Guany de sortida" + +msgid "Chorus" +msgstr "Cor" + +msgid "Chorus Voices" +msgstr "Veus de cor" + +msgid "Chorus Level" +msgstr "Nivell de cor" + +msgid "Chorus Speed" +msgstr "Velocitat del cor" + +msgid "Chorus Depth" +msgstr "Profunditat de cor" + +msgid "Chorus Waveform" +msgstr "Forma d'ona del cor" + +msgid "Reverb" +msgstr "Reverberació" + +msgid "Reverb Room Size" +msgstr "Grandària del loc de reveberació" + +msgid "Reverb Damping" +msgstr "Amortiment de reverberació" + +msgid "Reverb Width" +msgstr "Amplada de reverberació" + +msgid "Reverb Level" +msgstr "Nivell de reverberació" + +msgid "Interpolation Method" +msgstr "Mètode d'interpolació" + +msgid "Reverb Output Gain" +msgstr "Guany de sortida de reverberació" + +msgid "Reversed stereo" +msgstr "Estèreo invertit" + +msgid "Nice ramp" +msgstr "Rampa bonica" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Botons" + +msgid "Serial Port" +msgstr "Port sèrie" + +msgid "RTS toggle" +msgstr "Commutació RTS" + +msgid "Revision" +msgstr "Revisió" + +msgid "Controller" +msgstr "Controlador" + +msgid "Show Crosshair" +msgstr "Mostra el cursor de creuers" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Adreça MAC" + +msgid "MAC Address OUI" +msgstr "OUI de adreça MAC" + +msgid "Enable BIOS" +msgstr "Activar BIOS" + +msgid "Baud Rate" +msgstr "Taxa de baud" + +msgid "TCP/IP listening port" +msgstr "Port d'escolta TCP/IP" + +msgid "Phonebook File" +msgstr "Arxiu de la llibreta de telèfon" + +msgid "Telnet emulation" +msgstr "Emulació de telnet" + +msgid "RAM Address" +msgstr "Adreça de RAM" + +msgid "RAM size" +msgstr "Grandària de RAM" + +msgid "Initial RAM size" +msgstr "Grandària inicial de RAMu" + +msgid "Serial Number" +msgstr "Número de sèrie" + +msgid "Host ID" +msgstr "Identificador d'amfitrió" + +msgid "FDC Address" +msgstr "Adreça del FDC" + +msgid "MPU-401 Address" +msgstr "Adreça del MPU-401" + +msgid "MPU-401 IRQ" +msgstr "IRQ MPU-401" + +msgid "Receive MIDI input" +msgstr "Rebre l'entrada MIDI" + +msgid "Low DMA" +msgstr "DMA baix" + +msgid "Enable Game port" +msgstr "Activar port de joc" + +msgid "Surround module" +msgstr "Mòdul Surround" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Activar la interrupció del codec en la configuració del CODEC (necessari per alguns controladors)" + +msgid "SB Address" +msgstr "Adreça de SB" + +msgid "WSS IRQ" +msgstr "IRQ de WSS" + +msgid "WSS DMA" +msgstr "DMA de WSS" + +msgid "Enable OPL" +msgstr "Activar OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Rebre l'entrada MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "DMA baix del SB" + +msgid "6CH variant (6-channel)" +msgstr "Variant de 6Ch (6 canals)" + +msgid "Enable CMS" +msgstr "Activar CMS" + +msgid "Mixer" +msgstr "Mescadora" + +msgid "High DMA" +msgstr "DMA alt" + +msgid "Control PC speaker" +msgstr "Controlar l'altaveu del PC" + +msgid "Memory size" +msgstr "Grandària de memòria" + +msgid "EMU8000 Address" +msgstr "Adreça de EMU8000" + +msgid "IDE Controller" +msgstr "Controlador IDE" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "Tipus de GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Activar comanda 0x04 \"Sortir de 86Box\"" + +msgid "Display type" +msgstr "Tipus de pantalla" + +msgid "Composite type" +msgstr "Tipus de pantalla composta" + +msgid "RGB type" +msgstr "Tipus de pantalla RGB" + +msgid "Line doubling type" +msgstr "Tipus de doblatge de línia" + +msgid "Snow emulation" +msgstr "Emulació de neu" + +msgid "Monitor type" +msgstr "Tipus de moitor" + +msgid "Character set" +msgstr "Conjunt de caràcters" + +msgid "XGA type" +msgstr "Tipus de XGA" + +msgid "Instance" +msgstr "Instància" + +msgid "MMIO Address" +msgstr "Adreça de MMIO" + +msgid "RAMDAC type" +msgstr "Tipus de RAMDAC" + +msgid "Blend" +msgstr "Barrejar" + +msgid "Bilinear filtering" +msgstr "Filtratge bilineal" + +msgid "Dithering" +msgstr "Endurir" + +msgid "Enable NMI for CGA emulation" +msgstr "Activar NMI per a emulació CGA" + +msgid "Voodoo type" +msgstr "Tipus de targeta Voodoo" + +msgid "Framebuffer memory size" +msgstr "Grandària de memòria framebuffer" + +msgid "Texture memory size" +msgstr "Grandària de memòria de textura" + +msgid "Dither subtraction" +msgstr "Resta" + +msgid "Screen Filter" +msgstr "Filtre de pantalla" + +msgid "Render threads" +msgstr "Fils de renderització" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Adreça inicial" + +msgid "Contiguous Size" +msgstr "Grandària contigua" + +msgid "I/O Width" +msgstr "Amplada de E/S" + +msgid "Transfer Speed" +msgstr "Velocitat de transferència" + +msgid "EMS mode" +msgstr "Mode EMS" + +msgid "Address for > 2 MB" +msgstr "Adreça per a > 2 MB" + +msgid "Frame Address" +msgstr "Adreça de marc" + +msgid "USA" +msgstr "Estats Units" + +msgid "Danish" +msgstr "Danès" + +msgid "Always at selected speed" +msgstr "Sempre a la velocitat seleccionada" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Configuració de la BIOS + Hotkeys (desactivat durant la publicació)" + +msgid "64 kB starting from F0000" +msgstr "64 kB a partir de F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB a partir de E0000 (MSG de adreça invertit, els darrers 64KB primer)" + +msgid "Sine" +msgstr "Cintra" + +msgid "Triangle" +msgstr "Triangle" + +msgid "Linear" +msgstr "Lineal" + +msgid "4th Order" +msgstr "4t ordre" + +msgid "7th Order" +msgstr "7è ordre" + +msgid "Non-timed (original)" +msgstr "No cronometrat (original)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 no poblat)" + +msgid "Two" +msgstr "Dos" + +msgid "Three" +msgstr "Tres" + +msgid "Wheel" +msgstr "Roda" + +msgid "Five + Wheel" +msgstr "Cinc + roda" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 sèrie / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) sèrie" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Desactivar la BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr " 8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (estèreo)" + +msgid "Classic" +msgstr "Clàssic" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Compost" + +msgid "Old" +msgstr "Vella" + +msgid "New" +msgstr "Nova" + +msgid "Color (generic)" +msgstr "Color (genèric)" + +msgid "Green Monochrome" +msgstr "Moncorom verd" + +msgid "Amber Monochrome" +msgstr "Monocrom ambre" + +msgid "Gray Monochrome" +msgstr "Monocrom gris" + +msgid "Color (no brown)" +msgstr "Color (sense marró)" + +msgid "Color (IBM 5153)" +msgstr "Color (IBM 5153)" + +msgid "Simple doubling" +msgstr "Doble simple" + +msgid "sRGB interpolation" +msgstr "Interpolació sRGB" + +msgid "Linear interpolation" +msgstr "Interpolació lineal" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monocrom (5151/MDA) (blanc)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monocrom (5151/MDA) (verd)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monocrom (5151/MDA) (ambre)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Color 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Color 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Color millorat - mode normal (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Color millorat - mode millorat (5154/ECD)" + +msgid "Green" +msgstr "Verd" + +msgid "Amber" +msgstr "Ambre" + +msgid "Gray" +msgstr "Gris" + +msgid "Color" +msgstr "Color" + +msgid "U.S. English" +msgstr "Anglès dels EUA" + +msgid "Scandinavian" +msgstr "Escandinau" + +msgid "Other languages" +msgstr "Altres idiomes" + +msgid "Bochs latest" +msgstr "Bochs més recent" + +msgid "Mono Non-Interlaced" +msgstr "Monocrom no interlat" + +msgid "Color Interlaced" +msgstr "Color interlat" + +msgid "Color Non-Interlaced" +msgstr "Color no interlat" + +msgid "3Dfx Voodoo Graphics" +msgstr "Gràfics 3dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 unitats TMU)" + +msgid "8-bit" +msgstr "8 bits" + +msgid "16-bit" +msgstr "16 bits" + +msgid "Standard (150ns)" +msgstr "Estàndard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Alta velocitat (120ns)" + +msgid "Enabled" +msgstr "Activada" + +msgid "Standard" +msgstr "Estàndard" + +msgid "High-Speed" +msgstr "Alta velocitat" + +msgid "Stereo LPT DAC" +msgstr "DAC LPT estèreo" + +msgid "Generic Text Printer" +msgstr "Impressora de text genèrica" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "De matriu de punts ESC/P genèrica" + +msgid "Generic PostScript Printer" +msgstr "Impressora PostScript genèrica" + +msgid "Generic PCL5e Printer" +msgstr "Impressora PCL5e genèrica" + +msgid "Parallel Line Internet Protocol" +msgstr "Protocol d'Internet de línia paraŀlela" + +msgid "Protection Dongle for Savage Quest" +msgstr "Dispositiu de protecció per a Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Dispositiu de pas de sèrie" + +msgid "Passthrough Mode" +msgstr "Mode de pas" + +msgid "Host Serial Device" +msgstr "Dispositiu de sèrie amfitrió" + +msgid "Name of pipe" +msgstr "Nom de la canonada" + +msgid "Data bits" +msgstr "Bits de dades" + +msgid "Stop bits" +msgstr "Bits de aturada" + +msgid "Baud Rate of Passthrough" +msgstr "Taxa de baud de pas" + +msgid "Named Pipe (Server)" +msgstr "Pipe anomenat (servidor)" + +msgid "Host Serial Passthrough" +msgstr "Pas del port sèrie amfitrió" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 84debf20b..5c9dd4811 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -390,8 +390,11 @@ msgstr "Dynamický překladač" msgid "Video:" msgstr "Grafika:" -msgid "Voodoo Graphics" -msgstr "Použít grafický akcelerátor Voodoo" +msgid "Video #2:" +msgstr "Grafika 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Použít grafický akcelerátor Voodoo 1 nebo 2" msgid "IBM 8514/A Graphics" msgstr "Grafika IBM 8514/A" @@ -442,7 +445,7 @@ msgid "Use FLOAT32 sound" msgstr "Použít zvuk FLOAT32" msgid "FM synth driver" -msgstr "FM synth driver" +msgstr "Ovladač syntezátoru FM" msgid "Nuked (more accurate)" msgstr "Nuked (přesnější)" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Kritická chyba" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - POZASTAVENO" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Stiskněte Ctrl+Alt+PgDn pro návrat z režimu celé obrazovky." @@ -684,6 +687,9 @@ msgstr "Počítač \"%hs\" není dostupný, jelikož chybí obraz jeho paměti R msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Video adaptér \"%hs\" není dostupný, jelikož chybí obraz jeho paměti ROM ve složce \"roms/video\". Konfigurace se přepne na jiný dostupný adaptér." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Video adaptér 2 \"%hs\" není dostupný, jelikož chybí obraz jeho paměti ROM ve složce \"roms/video\". Konfigurace se přepne na jiný dostupný adaptér." + msgid "Machine" msgstr "Počítač" @@ -762,17 +768,26 @@ msgstr "Nebyla nalezena žádná PCap zařízení" msgid "Invalid PCap device" msgstr "Neplatné PCap zařízení" -msgid "Standard 2-button joystick(s)" -msgstr "Standardní 2tlačítkový joystick" +msgid "2-axis, 2-button joystick(s)" +msgstr "2osový, 2tlačítkový joystick" -msgid "Standard 4-button joystick" -msgstr "Standardní 4tlačítkový joystick" +msgid "2-axis, 4-button joystick" +msgstr "2osový, 4tlačítkový joystick" -msgid "Standard 6-button joystick" -msgstr "Standardní 6tlačítkový joystick" +msgid "2-axis, 6-button joystick" +msgstr "2osový, 6tlačítkový joystick" -msgid "Standard 8-button joystick" -msgstr "Standardní 8tlačítkový joystick" +msgid "2-axis, 8-button joystick" +msgstr "2osový, 8tlačítkový joystick" + +msgid "3-axis, 2-button joystick" +msgstr "3osový, 2tlačítkový joystick" + +msgid "3-axis, 4-button joystick" +msgstr "3osový, 4tlačítkový joystick" + +msgid "4-axis, 4-button joystick" +msgstr "4osový, 4tlačítkový joystick" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Opravdu chcete ukončit 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Neplatná konfigurace" 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 je potřeba pro automatický převod PostScript dokumentů do PDF.\n\nJakékoliv dokumenty vytisknuté přes obecnou PostScriptovou tiskárnu budou uloženy jako PostScript (.ps) soubory." +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 je potřeba pro automatický převod PCL dokumentů do PDF.\n\nJakékoliv dokumenty vytisknuté přes obecnou PCL-ovou tiskárnu budou uloženy jako Printer Command Language (.pcl) soubory." + msgid "Entering fullscreen mode" msgstr "Vstup do režimu celé obrazovky" @@ -874,7 +895,7 @@ msgid "CD-ROM images" msgstr "Obraz CD-ROM disku" msgid "%1 Device Configuration" -msgstr "Konfigurace zařízení %1" +msgstr "Nastavení zařízení %1" msgid "Monitor in sleep mode" msgstr "Monitor je v režimu spánku" @@ -999,6 +1020,27 @@ msgstr "Přepsat" msgid "Don't overwrite" msgstr "Nepřepisovat" +msgid "Raw image" +msgstr "Surový obraz" + +msgid "HDI image" +msgstr "HDI obraz" + +msgid "HDX image" +msgstr "HDX obraz" + +msgid "Fixed-size VHD" +msgstr "VHD s pevnou velikostí" + +msgid "Dynamic-size VHD" +msgstr "VHD s dynamickou velikostí" + +msgid "Differencing VHD" +msgstr "Rozdílový VHD" + +msgid "(N/A)" +msgstr "(Žadné)" + msgid "Raw image (.img)" msgstr "Surový obraz (.img)" @@ -1172,3 +1214,888 @@ msgstr "WinBox již není podporován" 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 "Vývoj správce WinBox byl zastaven v roce 2022 z důvodu nedostatku správců. Vzhledem k tomu, že naše úsilí směřujeme k tomu, abychom 86Box ještě vylepšili, rozhodli jsme se WinBox jako správce již nepodporovat.\n\nProstřednictvím WinBoxu nebudou poskytovány žádné další aktualizace a pokud jej budete nadále používat s novějšími verzemi 86Boxu, můžete se setkat s nesprávným chováním. Veškerá hlášení o chybách souvisejících s chováním WinBoxu budou uzavřena jako neplatná.\n\nSeznam dalších správců, které můžete používat, najdete na webu 86box.net." + +msgid "Generate" +msgstr "Vytvoř" + +msgid "Joystick configuration" +msgstr "Konfigurace joysticku" + +msgid "Device" +msgstr "Zařízení" + +msgid "%1 (X axis)" +msgstr "%1 (os X)" + +msgid "%1 (Y axis)" +msgstr "%1 (os Y)" + +msgid "MCA devices" +msgstr "Zařízení MCA" + +msgid "List of MCA devices:" +msgstr "Seznam zařízení MCA:" + +msgid "Tablet tool" +msgstr "Nástroj pro tablety" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "O programu Qt" + +msgid "MCA devices..." +msgstr "Zařízení MCA ..." + +msgid "Show non-primary monitors" +msgstr "Zobrazit neprimární monitory" + +msgid "Open screenshots folder..." +msgstr "Otevři složku screenshots..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Použití režimu roztá&hnutí při celé obrazovce při maximalizaci" + +msgid "Cursor/Puck" +msgstr "Kurzor/Puk" + +msgid "Pen" +msgstr "Pero" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Jednotka CD/DVD hostitele (%1:)" + +msgid "&Connected" +msgstr "&Připojeno" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Chování vykreslování" + +msgid "Use target framerate:" +msgstr "Použij cílovou snímkovou frekvenci:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Nepodařilo se přepnout na kontext OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Je vyžadována verze OpenGL 3.0 nebo vyšší. Aktuální verze je %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Inicializace OpenGL se nezdařila. Chyba %1." + +msgid "Error initializing OpenGL" +msgstr "Chyba při inicializaci OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Návrat k softwarovému vykreslování.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Alokace paměti pro rozbalovací vyrovnávací paměť se nezdařila.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Při výběru obrazů médií (CD-ROM, disketa atd.) se otevřené dialogové okno spustí ve stejném adresáři jako konfigurační soubor 86Box. Toto nastavení bude mít pravděpodobně význam pouze v systému MacOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Tento počítač mohl být přemístěn nebo zkopírován." + +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 "Pro zajištění správné funkce sítě potřebuje 86Box vědět, zda byl tento počítač přesunut nebo zkopírován.\n\nJestliže si nejste jisti, zvolte \"Zkopíroval jsem ho\"." + +msgid "I Moved It" +msgstr "Přesunul jsem ho" + +msgid "I Copied It" +msgstr "Zkopíroval jsem ho" + +msgid "86Box Monitor #" +msgstr "86Box Monitor " + +msgid "No MCA devices." +msgstr "Žádné zařízení MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Síťová karta 1" + +msgid "Network Card #2" +msgstr "Síťová karta 2" + +msgid "Network Card #3" +msgstr "Síťová karta 3" + +msgid "Network Card #4" +msgstr "Síťová karta 4" + +msgid "Mode" +msgstr "Režim" + +msgid "Interface" +msgstr "Rozhraní" + +msgid "Adapter" +msgstr "Adaptér" + +msgid "VDE Socket" +msgstr "Zásuvka VDE" + +msgid "86Box Unit Tester" +msgstr "86Box Unit Tester" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Klíčová karta Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Průchod sériového portu 1" + +msgid "Serial port passthrough 2" +msgstr "Průchod sériového portu 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Sběrnicová myš Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Sběrnicová myš Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Sériová myš Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Sériová myš Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Sériová myš Logitech" + +msgid "PS/2 Mouse" +msgstr "Myš PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (sériová)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Modem kompatibilní se standardem Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Emulace Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulace Roland MT-32 (nový)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulace Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulace Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Dceřiná deska OPL4-ML" + +msgid "System MIDI" +msgstr "Systémové MIDI" + +msgid "MIDI Input Device" +msgstr "Vstupní zařízení MIDI" + +msgid "BIOS Address" +msgstr "Adresa BIOSu" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Povolení zápisu do rozšiřující paměti ROM systému BIOS" + +msgid "Address" +msgstr "Adresa" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revize BIOSu" + +msgid "Translate 26 -> 17" +msgstr "Přeložit 26 -> 17" + +msgid "Language" +msgstr "Jazyk" + +msgid "Enable backlight" +msgstr "Povolit podsvícení" + +msgid "Invert colors" +msgstr "Invertování barev" + +msgid "BIOS size" +msgstr "Velikost BIOSu" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapovat C0000-C7FFF jako UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapovat C8000-CFFFF jako UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapovat D0000-D7FFF jako UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapovat D8000-DFFFF jako UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapovat E0000-E7FFF jako UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapovat E8000-EFFFF jako UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 propojka (JIM)" + +msgid "MIDI Output Device" +msgstr "Výstupní zařízení MIDI" + +msgid "MIDI Real time" +msgstr "MIDI v reálném čase" + +msgid "MIDI Thru" +msgstr "Průchozí vstupu MIDI" + +msgid "MIDI Clockout" +msgstr "Odbíjení hodin MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Zesílení výstupu" + +msgid "Chorus" +msgstr "Sbor" + +msgid "Chorus Voices" +msgstr "Hlasy sboru" + +msgid "Chorus Level" +msgstr "Úroveň sboru" + +msgid "Chorus Speed" +msgstr "Rychlost sboru" + +msgid "Chorus Depth" +msgstr "Hloubka sboru" + +msgid "Chorus Waveform" +msgstr "Průběh sboru" + +msgid "Reverb" +msgstr "Dozvuk" + +msgid "Reverb Room Size" +msgstr "Velikost místnosti pro dozvuk" + +msgid "Reverb Damping" +msgstr "Tlumení dozvuku" + +msgid "Reverb Width" +msgstr "Šířka dozvuku" + +msgid "Reverb Level" +msgstr "Úroveň dozvuku" + +msgid "Interpolation Method" +msgstr "Metoda interpolace" + +msgid "Reverb Output Gain" +msgstr "Zesílení výstupu dozvuku" + +msgid "Reversed stereo" +msgstr "Obrácené stereo" + +msgid "Nice ramp" +msgstr "Pěkná rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Tlačítka" + +msgid "Serial Port" +msgstr "Sériový port" + +msgid "RTS toggle" +msgstr "Přepínač RTS" + +msgid "Revision" +msgstr "Revize" + +msgid "Controller" +msgstr "Řadič" + +msgid "Show Crosshair" +msgstr "Zobrazení křížového ukazatele" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Adresa MAC" + +msgid "MAC Address OUI" +msgstr "OUI adresy MAC" + +msgid "Enable BIOS" +msgstr "Povolit BIOS" + +msgid "Baud Rate" +msgstr "Přenosová rychlost" + +msgid "TCP/IP listening port" +msgstr "Naslouchací port TCP/IP" + +msgid "Phonebook File" +msgstr "Soubor telefonního seznamu" + +msgid "Telnet emulation" +msgstr "Emulace Telnetu" + +msgid "RAM Address" +msgstr "Adresa RAMu" + +msgid "RAM size" +msgstr "Velikost RAMu" + +msgid "Initial RAM size" +msgstr "Počáteční velikost RAMu" + +msgid "Serial Number" +msgstr "Sériové číslo" + +msgid "Host ID" +msgstr "ID hostitele" + +msgid "FDC Address" +msgstr "Adresa FDCu" + +msgid "MPU-401 Address" +msgstr "Adresa MPU-401" + +msgid "MPU-401 IRQ" +msgstr "IRQ MPU-401" + +msgid "Receive MIDI input" +msgstr "Příjem vstupu MIDI" + +msgid "Low DMA" +msgstr "Nízký DMA" + +msgid "Enable Game port" +msgstr "Povolit herní port" + +msgid "Surround module" +msgstr "Modul Surround" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Vyvolání přerušení CODEC při nastavení CODEC (potřebují některé ovladače)" + +msgid "SB Address" +msgstr "Adresa SB" + +msgid "WSS IRQ" +msgstr "IRQ WSS" + +msgid "WSS DMA" +msgstr "DMA WSS" + +msgid "Enable OPL" +msgstr "Povolit OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Příjem vstupu MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "Nízký DMA SB" + +msgid "6CH variant (6-channel)" +msgstr "Varianta 6CH (6 kanálů)" + +msgid "Enable CMS" +msgstr "Povolit CMS" + +msgid "Mixer" +msgstr "Směšovač" + +msgid "High DMA" +msgstr "Vysoký DMA" + +msgid "Control PC speaker" +msgstr "Ovládát reproduktoru PC" + +msgid "Memory size" +msgstr "Velikost pamĕti" + +msgid "EMU8000 Address" +msgstr "Adresa EMU8000" + +msgid "IDE Controller" +msgstr "Řadič IDE" + +msgid "Codec" +msgstr "Kodek" + +msgid "GUS type" +msgstr "Type GUSu" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Povolit příkaz 0x04 \"Ukončit 86Box\"" + +msgid "Display type" +msgstr "Typ obrazu" + +msgid "Composite type" +msgstr "Typ kompozitního obrazu" + +msgid "RGB type" +msgstr "Typ obrazu RGB" + +msgid "Line doubling type" +msgstr "Typ zdvojení řádku" + +msgid "Snow emulation" +msgstr "Emulace sněhu" + +msgid "Monitor type" +msgstr "Typ monitoru" + +msgid "Character set" +msgstr "Znaková sada" + +msgid "XGA type" +msgstr "Typ XGA" + +msgid "Instance" +msgstr "Instance" + +msgid "MMIO Address" +msgstr "Adresa MMIO" + +msgid "RAMDAC type" +msgstr "Typ RAMDACu" + +msgid "Blend" +msgstr "Směs" + +msgid "Bilinear filtering" +msgstr "Bilineární filtrování" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Povolit NMI pro emulace CGA" + +msgid "Voodoo type" +msgstr "Typ karty Voodoo" + +msgid "Framebuffer memory size" +msgstr "Velikost paměti framebufferu" + +msgid "Texture memory size" +msgstr "Velikost paměti textur" + +msgid "Dither subtraction" +msgstr "Odečítání ditheru" + +msgid "Screen Filter" +msgstr "Filtr obrazovky" + +msgid "Render threads" +msgstr "Vlákna vykreslování" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Počáteční adresa" + +msgid "Contiguous Size" +msgstr "Souvislá velikost" + +msgid "I/O Width" +msgstr "Šířka I/O" + +msgid "Transfer Speed" +msgstr "Rychlost přenosu" + +msgid "EMS mode" +msgstr "Režím EMS" + +msgid "Address for > 2 MB" +msgstr "Adresa pro > 2 MB" + +msgid "Frame Address" +msgstr "Rámcová adresa" + +msgid "USA" +msgstr "Spojené státy" + +msgid "Danish" +msgstr "Dánština" + +msgid "Always at selected speed" +msgstr "Vždy při zvolené rychlosti" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Nastavení BIOS + klávesové zkratky (vypnuto během POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB od F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB od E0000 (invertovaný MSB adresy, nejprve posledních 64 kB)" + +msgid "Sine" +msgstr "Sinusoví" + +msgid "Triangle" +msgstr "Trojúhelní" + +msgid "Linear" +msgstr "Lineární" + +msgid "4th Order" +msgstr "4. řád" + +msgid "7th Order" +msgstr "7. řád" + +msgid "Non-timed (original)" +msgstr "Bez časování (originální)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 není vyplněn)" + +msgid "Two" +msgstr "Dvě" + +msgid "Three" +msgstr "Tři" + +msgid "Wheel" +msgstr "Kolečko" + +msgid "Five + Wheel" +msgstr "Pět + kolečko" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 sériová / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) sériová" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Zakázat BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr " 8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klasické" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Kompozitný" + +msgid "Old" +msgstr "Starý" + +msgid "New" +msgstr "Nový" + +msgid "Color (generic)" +msgstr "Barevný (obecný)" + +msgid "Green Monochrome" +msgstr "Zelený monochromatický" + +msgid "Amber Monochrome" +msgstr "Jantarový monochromatický" + +msgid "Gray Monochrome" +msgstr "Šedý monochromatický" + +msgid "Color (no brown)" +msgstr "Barevný (bez hnědé)" + +msgid "Color (IBM 5153)" +msgstr "Barevný (IBM 5153)" + +msgid "Simple doubling" +msgstr "Prosté zdvojení" + +msgid "sRGB interpolation" +msgstr "Interpolace sRGB" + +msgid "Linear interpolation" +msgstr "Lineární interpolace" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monochromatický (5151/MDA) (bílý)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monochromatický (5151/MDA) (zelený)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monochromatický (5151/MDA) (jantarový)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Barevný 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Barevný 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Rozšířený barevný - normální režim (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Rozšířený barevný - rozšířený režim (5154/ECD)" + +msgid "Green" +msgstr "Zelený" + +msgid "Amber" +msgstr "Jantarový" + +msgid "Gray" +msgstr "Šedý" + +msgid "Color" +msgstr "Barevný" + +msgid "U.S. English" +msgstr "Americká angličtina" + +msgid "Scandinavian" +msgstr "Skandinávské" + +msgid "Other languages" +msgstr "Ostatní jazyky" + +msgid "Bochs latest" +msgstr "Bochs nejnovější" + +msgid "Mono Non-Interlaced" +msgstr "Monochromatický bez prokládání" + +msgid "Color Interlaced" +msgstr "Barevný prokládaný" + +msgid "Color Non-Interlaced" +msgstr "Barevný bez prokládání" + +msgid "3Dfx Voodoo Graphics" +msgstr "Grafický akcelerátor 3dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 jednotky TMU)" + +msgid "8-bit" +msgstr "8-bitové" + +msgid "16-bit" +msgstr "16-bitové" + +msgid "Standard (150ns)" +msgstr "Standardní (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Vysokorychlostní (120ns)" + +msgid "Enabled" +msgstr "Zapnuta" + +msgid "Standard" +msgstr "Standardní" + +msgid "High-Speed" +msgstr "Vysokorychlostní" + +msgid "Stereo LPT DAC" +msgstr "Stereofonní převodník LPT" + +msgid "Generic Text Printer" +msgstr "Obecná textová tiskárna" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Generická jehličková ESC/P" + +msgid "Generic PostScript Printer" +msgstr "Obecná tiskárna PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Obecná tiskárna PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Internetový protokol paralelní linky" + +msgid "Protection Dongle for Savage Quest" +msgstr "Ochranný klíč pro Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Zařízení průchodu sériového portu" + +msgid "Passthrough Mode" +msgstr "Režim průchodu" + +msgid "Host Serial Device" +msgstr "Hostitelské sériové zařízení" + +msgid "Name of pipe" +msgstr "Název potrubí" + +msgid "Data bits" +msgstr "Datové bity" + +msgid "Stop bits" +msgstr "Stop bity" + +msgid "Baud Rate of Passthrough" +msgstr "Přenosová rychlost průchodu" + +msgid "Named Pipe (Server)" +msgstr "Pojmenované potrubí (server)" + +msgid "Host Serial Passthrough" +msgstr "Průchod sériového portu hostitele" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 70b856aa2..385edf9ab 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -16,7 +16,7 @@ msgid "&Right CTRL is left ALT" msgstr "&Die rechte Strg-Taste ist die Linke Alt-Taste" msgid "&Hard Reset..." -msgstr "&Hard-Reset..." +msgstr "&Kaltstart..." msgid "&Ctrl+Alt+Del\tCtrl+F12" msgstr "&Strg+Alt+Entf\tStrg+F12" @@ -115,7 +115,7 @@ msgid "&Fullscreen\tCtrl+Alt+PgUp" msgstr "&Vollbild\tStrg+Alt+Bild auf" msgid "Fullscreen &stretch mode" -msgstr "&Stretching-Modus im Vollbildmodus" +msgstr "&Strecken-Modus im Vollbildmodus" msgid "&Full screen stretch" msgstr "&Vollbild-Stretching" @@ -169,10 +169,10 @@ msgid "&Average" msgstr "&Durchschnittsmethode" msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" -msgstr "Overscan für CGA/PCjr/Tandy/E&GA/(S)VGA-Displays" +msgstr "Overscan für CGA/PCjr/Tandy/E&GA/(S)VGA-Monitore" msgid "Change contrast for &monochrome display" -msgstr "Kontrast für &monochrome Displays ändern" +msgstr "Kontrast für &monochrome Monitore ändern" msgid "&Media" msgstr "&Medien" @@ -193,7 +193,7 @@ msgid "&Preferences..." msgstr "&Einstellungen..." msgid "Enable &Discord integration" -msgstr "&Discord-Integration aktivieren" +msgstr "&Discord-Integration einschalten" msgid "Sound &gain..." msgstr "&Klangverstärkung..." @@ -376,13 +376,13 @@ msgid "Time synchronization" msgstr "Zeitsynchronisierung" msgid "Disabled" -msgstr "Deaktiviert" +msgstr "Ausgeschaltet" msgid "Enabled (local time)" -msgstr "Aktiviert (Lokale Uhrzeit)" +msgstr "Eingeschaltet (Lokale Uhrzeit)" msgid "Enabled (UTC)" -msgstr "Aktiviert (UTC)" +msgstr "Eingeschaltet (UTC)" msgid "Dynamic Recompiler" msgstr "Dynamischer Recompiler" @@ -390,8 +390,11 @@ msgstr "Dynamischer Recompiler" msgid "Video:" msgstr "Videokarte:" -msgid "Voodoo Graphics" -msgstr "Voodoo-Grafik" +msgid "Video #2:" +msgstr "Videokarte 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 oder 2 Grafik" msgid "IBM 8514/A Graphics" msgstr "IBM 8514/A-Grafik" @@ -436,7 +439,7 @@ msgid "MIDI In Device:" msgstr "MIDI In-Gerät:" msgid "Standalone MPU-401" -msgstr "Standalone-MPU-401-Gerät" +msgstr "Eigenständiges-MPU-401-Gerät" msgid "Use FLOAT32 sound" msgstr "FLOAT32-Wiedergabe benutzen" @@ -637,10 +640,10 @@ msgid "Fatal error" msgstr "Fataler Fehler" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - PAUSIERT" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." -msgstr "Bitte Strg+Alt+Bild ab zur Rückkehr in den Fenstermodus drücken." +msgstr "Strg+Alt+Bild ab, zur Rückkehr in den Fenstermodus." msgid "Speed" msgstr "Geschwindigkeit" @@ -664,7 +667,7 @@ msgid "Turbo" msgstr "Turbo" msgid "On" -msgstr "An" +msgstr "Ein" msgid "Off" msgstr "Aus" @@ -684,6 +687,9 @@ msgstr "Das System \"%hs\" ist aufgrund von fehlenden ROMs im Verzeichnis roms/m msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Die Videokarte \"%hs\" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird auf eine verfügbare Videokarte gewechselt." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Die Videokarte 2 \"%hs\" ist aufgrund von fehlenden ROMs im Verzeichnis roms/video nicht verfügbar. Es wird auf eine verfügbare Videokarte gewechselt." + msgid "Machine" msgstr "System" @@ -694,13 +700,13 @@ msgid "Input devices" msgstr "Eingabegeräte" msgid "Sound" -msgstr "Multimedia" +msgstr "Sound" msgid "Network" msgstr "Netzwerk" msgid "Ports (COM & LPT)" -msgstr "Anschlüsse (COM & LPT)" +msgstr "Anschlüsse (COM + LPT)" msgid "Storage controllers" msgstr "Speichercontroller" @@ -709,7 +715,7 @@ msgid "Hard disks" msgstr "Festplatten" msgid "Floppy & CD-ROM drives" -msgstr "Disketten- & CD-ROM-Laufwerke" +msgstr "Disketten- + CD-ROM-Laufwerke" msgid "Other removable devices" msgstr "Andere Wechsellaufwerke" @@ -718,13 +724,13 @@ msgid "Other peripherals" msgstr "Andere Peripheriegeräte" msgid "Click to capture mouse" -msgstr "Zum Einfangen des Mauszeigers bitte klicken" +msgstr "Klicken zum Einfangen des Mauszeigers" msgid "Press %1 to release mouse" -msgstr "Bitte %1 zur Mausfreigabe drücken" +msgstr "Drücke %1 zur Mausfreigabe" msgid "Press %1 or middle button to release mouse" -msgstr "Bitte %1 oder die mittlere Maustaste zur Mausfreigabe drücken" +msgstr "Drücke %1 oder die mittlere Maustaste zur Mausfreigabe" msgid "Ctrl+End" msgstr "Strg+Ende" @@ -765,17 +771,26 @@ msgstr "Keine PCap-Geräte gefunden" msgid "Invalid PCap device" msgstr "Ungültiges PCap-Gerät" -msgid "Standard 2-button joystick(s)" -msgstr "Standard 2-Tasten-Joystick(s)" +msgid "2-axis, 2-button joystick(s)" +msgstr "2-Achsen-, 2-Tasten-Joystick(s)" -msgid "Standard 4-button joystick" -msgstr "Standard 4-Tasten-Joystick" +msgid "2-axis, 4-button joystick" +msgstr "2-Achsen-, 4-Tasten-Joystick" -msgid "Standard 6-button joystick" -msgstr "Standard 6-Tasten-Joystick" +msgid "2-axis, 6-button joystick" +msgstr "2-Achsen-, 6-Tasten-Joystick" -msgid "Standard 8-button joystick" -msgstr "Standard 8-Tasten-Joystick" +msgid "2-axis, 8-button joystick" +msgstr "2-Achsen-, 8-Tasten-Joystick" + +msgid "3-axis, 2-button joystick" +msgstr "3-Achsen-, 2-Tasten-Joystick" + +msgid "3-axis, 4-button joystick" +msgstr "3-Achsen-, 4-Tasten-Joystick" + +msgid "4-axis, 4-button joystick" +msgstr "4-Achsen-, 4-Tasten-Joystick" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -802,7 +817,7 @@ msgid "Flux images" msgstr "Fluximages" msgid "Are you sure you want to hard reset the emulated machine?" -msgstr "Sind Sie sich sicher, dass Sie einen Hard-Reset für das emulierte System durchführen wollen?" +msgstr "Sind Sie sich sicher, dass Sie einen Kaltstart für das emulierte System durchführen wollen?" msgid "Are you sure you want to exit 86Box?" msgstr "Sind Sie sich sicher, dass Sie 86Box beenden wollen?" @@ -810,6 +825,9 @@ msgstr "Sind Sie sich sicher, dass Sie 86Box beenden wollen?" msgid "Unable to initialize Ghostscript" 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" @@ -829,10 +847,10 @@ msgid "No ROMs found" msgstr "Keine ROMs gefunden" msgid "Do you want to save the settings?" -msgstr "Möchten Sie die Einstellungen speichern?" +msgstr "Sollen die Einstellungen gespeichert werden?" msgid "This will hard reset the emulated machine." -msgstr "Dies wird zu einem Hard-Reset des emulierten Systems führen." +msgstr "Dies wird zu einem Kaltstart des emulierten Systems führen." msgid "Save" msgstr "Speichern" @@ -847,16 +865,19 @@ msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG msgstr "Ein Emulator für alte Computer\n\nAutoren: 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 sowie andere.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho sowie andere.\n\nÜbersetzt von: dob205\n\nVeröffentlicht unter der GNU General Public License in der Version 2 oder neuer. Siehe LICENSE für mehr Informationen." msgid "Hardware not available" -msgstr "Hardware nicht verfügbar" +msgstr "Diese Hardware ist nicht verfügbar" msgid "Make sure %1 is installed and that you are on a %1-compatible network connection." -msgstr "Bitte stellen Sie sicher, dass %1 installiert ist und sie eine %1-kompatible Netzwerkverbindung nutzen." +msgstr "Überprüfe, dass %1 installiert ist, und eine %1-kompatible Netzwerkverbindung genutzt wird." msgid "Invalid configuration" msgstr "Ungültige Konfiguration" 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 wird zur automatischen Konversion von PostScript-Dateien in das PDF-Format benötigt.\n\nSämtliche an den generischen PostScript-Drucker gesendete Dateien werden als PostScript (.ps)-Dateien gesichert." +msgstr "%1 wird zur automatischen Konvertierung von PostScript-Dateien ins PDF-Format benötigt.\n\nSämtliche an den generischen PostScript-Drucker gesendete Dateien werden als PostScript (*.ps) Dateien gesichert." + +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 wird zur automatischen Konvertierung von PCL-Dateien ins PDF-Format benötigt.\n\nSämtliche an den generischen PCL-Drucker gesendete Dateien werden als Printer Command Language (*.pcl) Dateien gesichert." msgid "Entering fullscreen mode" msgstr "Vollbildmodus wird aktiviert" @@ -889,7 +910,7 @@ msgid "OpenGL options" msgstr "OpenGL-Optionen" msgid "You are loading an unsupported configuration" -msgstr "Sie laden gerade eine nicht unterstützte Konfiguration" +msgstr "Zur Zeit wird eine nicht unterstützte Konfiguration geladen" 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 "Das Filtern der CPU-Typen basierend auf dem ausgewählten System ist für dieses System deaktiviert.\n\nDies ermöglicht es, dass man eine sonst nicht mit dem ausgewählten System inkompatible CPU auswählen kann. Allerdings kann dies zu Inkompatiblilitäten mit dem BIOS des Systems oder anderen Programmen kommen.\n\nDas Aktivieren dieser Einstellung wird nicht unterstützt und sämtliche Bugreports können als \"invalid\" geschlossen werden." @@ -910,10 +931,10 @@ msgid "Cartridge images" msgstr "Cartridgeimages" msgid "Error initializing renderer" -msgstr "Fehler bei der Rendererinitialisierung" +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. Bitte benutzen Sie einen anderen Renderer." +msgstr "Der OpenGL (3.0-Kern)-Renderer konnte nicht initialisiert werden. Benutze einen anderen Renderer." msgid "Resume execution" msgstr "Fortsetzen" @@ -928,16 +949,16 @@ msgid "Press Ctrl+Alt+Esc" msgstr "Strg+Alt+Esc drücken" msgid "Hard reset" -msgstr "Hard-Reset" +msgstr "Kaltstart" msgid "ACPI shutdown" -msgstr "ACPI-basiertes Herunterfahren" +msgstr "ACPI basiertes Herunterfahren" msgid "Hard disk (%1)" msgstr "Festplatte (%1)" msgid "MFM/RLL or ESDI CD-ROM drives never existed" -msgstr "MFM/RLL- oder ESDI CD-ROM-Laufwerke hat es niemals gegeben" +msgstr "MFM/RLL- oder ESDI CD-ROM-Laufwerke existieren nicht" msgid "Custom..." msgstr "Angepasst..." @@ -973,25 +994,25 @@ msgid "Disk image file already exists" msgstr "Die Festplattenimagedatei existiert bereits" msgid "Please specify a valid file name." -msgstr "Bitte geben Sie einen gültigen Dateinamen ein." +msgstr "Gültiger Dateinamen eingeben." msgid "Disk image created" msgstr "Disk-Image wurde erstellt" msgid "Make sure the file exists and is readable." -msgstr "Bitte stellen Sie sicher, dass die Datei existiert und lesbar ist." +msgstr "Stell sicher, dass die Datei existiert und lesbar ist." msgid "Make sure the file is being saved to a writable directory." -msgstr "Bitte stellen Sie sicher, dass die Datei in ein Verzeichnis mit Schreibberechtigungen gespeichert wird." +msgstr "Stell sicher, dass die Datei in ein Verzeichnis mit Schreibberechtigungen gespeichert wird." msgid "Disk image too large" -msgstr "Festplattenimage ist zu groß" +msgstr "Das Festplattenimage ist zu groß" msgid "Remember to partition and format the newly-created drive." -msgstr "Bitte denken Sie an das Partitionieren und Formatieren des neu erstellten Laufwerks." +msgstr "Partitioniere und Formatiere das neu erstellte Laufwerk, ansonsten es nicht zu gebruachen ist." msgid "The selected file will be overwritten. Are you sure you want to use it?" -msgstr "Die ausgewählte Datei wird überschrieben. Möchten Sie diese Datei nutzen?" +msgstr "Die ausgewählte Datei wird überschrieben. Soll diese Datei genutzen werden?" msgid "Unsupported disk image" msgstr "Nicht unterstütztes Festplattenimage" @@ -1002,6 +1023,27 @@ msgstr "Überschreiben" msgid "Don't overwrite" msgstr "Nicht überschreiben" +msgid "Raw image" +msgstr "Rohdatenimages" + +msgid "HDI image" +msgstr "HDI-Images" + +msgid "HDX image" +msgstr "HDX-Images" + +msgid "Fixed-size VHD" +msgstr "VHD mit fester Größe" + +msgid "Dynamic-size VHD" +msgstr "VHD mit dynamischer Größe" + +msgid "Differencing VHD" +msgstr "Differenzierende VHD" + +msgid "(N/A)" +msgstr "(Kein)" + msgid "Raw image (.img)" msgstr "Rohdatenimages (.img)" @@ -1033,7 +1075,7 @@ msgid "Select the parent VHD" msgstr "Eltern-VHD-Datei bitte auswählen" 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 "Dies bedeutet, dass das Elternimage nach der Erstellung des differenzierenden Images erzeugt wurde.\n\nDies kann auch passieren, falls die Image-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Image erstellt hat, passieren.\n\nMöchten Sie die Zeitstempel korrigieren?" +msgstr "Dies bedeutet, dass das Elternimage nach der Erstellung des differenzierenden Images erzeugt wurde.\n\nDies kann auch passieren, falls die Image-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Image erstellt hat, passieren.\n\nSoll der Zeitstempel korrigiert werden?" msgid "Parent and child disk timestamps do not match" msgstr "Die Zeitstempel der Eltern- und der Kindesplatte stimmen nicht überein" @@ -1078,13 +1120,13 @@ msgid "720 kB" msgstr "720 kB" msgid "1.2 MB" -msgstr "1,2 MB" +msgstr "1.2 MB" msgid "1.25 MB" -msgstr "1,25 MB" +msgstr "1.25 MB" msgid "1.44 MB" -msgstr "1,44 MB" +msgstr "1.44 MB" msgid "DMF (cluster 1024)" msgstr "DMF (1024 Cluster)" @@ -1093,40 +1135,40 @@ msgid "DMF (cluster 2048)" msgstr "DMF (2048 Cluster)" msgid "2.88 MB" -msgstr "2,88 MB" +msgstr "2.88 MB" msgid "ZIP 100" -msgstr "ZIP 100" +msgstr "ZIP-DRIVE 100" msgid "3.5\" 128 MB (ISO 10090)" -msgstr "3,5-Zoll 128 MB (ISO 10090)" +msgstr "3.5-Zoll 128 MB (ISO 10090)" msgid "3.5\" 230 MB (ISO 13963)" -msgstr "3,5-Zoll 230 MB (ISO 13963)" +msgstr "3.5-Zoll 230 MB (ISO 13963)" msgid "3.5\" 540 MB (ISO 15498)" -msgstr "3,5-Zoll 540 MB (ISO 15498)" +msgstr "3.5-Zoll 540 MB (ISO 15498)" msgid "3.5\" 640 MB (ISO 15498)" -msgstr "3,5-Zoll 640 MB (ISO 15498)" +msgstr "3.5-Zoll 640 MB (ISO 15498)" msgid "3.5\" 1.3 GB (GigaMO)" -msgstr "3,5-Zoll 1,3 GB (GigaMO)" +msgstr "3.5-Zoll 1,3 GB (GigaMO)" msgid "3.5\" 2.3 GB (GigaMO 2)" -msgstr "3,5-Zoll 2,3 GB (GigaMO 2)" +msgstr "3.5-Zoll 2,3 GB (GigaMO 2)" msgid "5.25\" 600 MB" -msgstr "5,25-Zoll 600 MB" +msgstr "5.25-Zoll 600 MB" msgid "5.25\" 650 MB" -msgstr "5,25-Zoll 650 MB" +msgstr "5.25-Zoll 650 MB" msgid "5.25\" 1 GB" msgstr "5,25-Zoll 1 GB" msgid "5.25\" 1.3 GB" -msgstr "5,25-Zoll 1,3 GB" +msgstr "5.25-Zoll 1,3 GB" msgid "Perfect RPM" msgstr "Perfekte Drehzahl" @@ -1135,7 +1177,7 @@ msgid "1% below perfect RPM" msgstr "1% unterhalb der perfekten Drehzahl" msgid "1.5% below perfect RPM" -msgstr "1,5% unterhalb der perfekten Drehzahl" +msgstr "1.5% unterhalb der perfekten Drehzahl" msgid "2% below perfect RPM" msgstr "2% unterhalb der perfekten Drehzahl" @@ -1147,7 +1189,7 @@ msgid "Failed to initialize network driver" msgstr "Netzwerktreiber konnte nicht initialisiert werden" msgid "The network configuration will be switched to the null driver" -msgstr "Die Netzwerkkonfiguration wird auf den Nulltreiber umgestellt" +msgstr "Die Netzwerkkonfiguration wird auf den Nulltreiber (Packete werden vom Host gelöscht) umgestellt" msgid "Mouse sensitivity:" msgstr "Empfindlichkeit der Maus:" @@ -1171,7 +1213,892 @@ msgid "&Auto-pause on focus loss" msgstr "&Auto-Pause bei Fokusverlust" msgid "WinBox is no longer supported" -msgstr "WinBox wird nicht mehr unterstützt" +msgstr "Der WinBox Manager wird nicht mehr unterstützt" 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 "Die Entwicklung des WinBox-Managers wurde im Jahr 2022 eingestellt, da es an Betreuern mangelte. Da wir unsere Bemühungen darauf richten, 86Box noch besser zu machen, haben wir uns entschlossen, WinBox nicht mehr als Manager zu unterstützen.\n\nEs werden keine weiteren Updates für WinBox zur Verfügung gestellt, und es kann zu fehlerhaftem Verhalten kommen, wenn Sie WinBox weiterhin mit neueren Versionen von 86Box verwenden. Alle Fehlerberichte, die sich auf das Verhalten von WinBox beziehen, werden als ungültig geschlossen.\n\nAuf 86box.net finden Sie eine Liste anderer Manager, die Sie verwenden können." +msgstr "Die Entwicklung des WinBox-Managers wurde im Jahr 2022 eingestellt, da es an Betreuern mangelte. Da wir unsere Bemühungen darauf richten, 86Box noch besser zu machen, haben wir uns entschlossen, WinBox nicht mehr als Manager zu unterstützen.\n\nEs werden keine weiteren Updates für WinBox zur Verfügung gestellt, und es kann zu fehlerhaftem Verhalten kommen, wenn WinBox weiterhin mit neueren Versionen von 86Box verwendet wird. Alle Fehlerberichte, die sich auf das Verhalten von WinBox beziehen, werden als ungültig geschlossen.\n\nAuf 86box.net ist eine Liste anderer Manager zu finden, die verwendet werden können." + +msgid "Generate" +msgstr "Erzeugen" + +msgid "Joystick configuration" +msgstr "Joystick-Konfiguration" + +msgid "Device" +msgstr "Gerät" + +msgid "%1 (X axis)" +msgstr "%1 (X-Achse)" + +msgid "%1 (Y axis)" +msgstr "%1 (Y-Achse)" + +msgid "MCA devices" +msgstr "MCA-Geräte" + +msgid "List of MCA devices:" +msgstr "Leiste die MCA-Geräte:" + +msgid "Tablet tool" +msgstr "Nástroj pro tablety" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Über Qt" + +msgid "MCA devices..." +msgstr "MCA-Geräte..." + +msgid "Show non-primary monitors" +msgstr "Nicht-primäre Monitore anzeigen" + +msgid "Open screenshots folder..." +msgstr "Ordner „screenshots“ öffnen..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Strecken-Modus im Vollbildmodus bei Maximierung anwenden" + +msgid "Cursor/Puck" +msgstr "Mauszeiger/Puck" + +msgid "Pen" +msgstr "Stift" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Host-CD/DVD-Laufwerk (%1:)" + +msgid "&Connected" +msgstr "&Verbunden" + +msgid "Clear image history" +msgstr "Bildverlauf löschen" + +msgid "Create..." +msgstr "Erstellen..." + +msgid "previous image" +msgstr "Voriges Image" + +msgid "Host CD/DVD Drive (%1)" +msgstr "Host-CD/DVD-Laufwerk (%1)" + +msgid "Unknown Bus" +msgstr "Unbekannter Bus" + +msgid "Null Driver" +msgstr "Nulltreiber (Packete werden vom Host gelöscht)" + +msgid "NIC %02i (%ls) %ls" +msgstr "NIC %02i (%ls) %ls" + +msgid "Error opening \"%1\": %2" +msgstr "Fehler beim Öffnen \"%1\": %2" + +msgid "Error compiling vertex shader in file \"%1\"" +msgstr "Fehler beim Kompilieren des Vertex-Shaders in der Datei \"%1\"" + +msgid "Error compiling fragment shader in file \"%1\"" +msgstr "Fehler beim Kompilieren des Fragment-Shaders in der Datei \"%1\"" + +msgid "Error linking shader program in file \"%1\"" +msgstr "Fehler beim Linken des Shader-Programms in der Datei \"%1\"" + +msgid "OpenGL 3.0 renderer options" +msgstr "OpenGL 3.0 Renderer-Optionen" + +msgid "Render behavior" +msgstr "Rendering-Verhalten" + +msgid "Use target framerate:" +msgstr "Zielframerate verwenden:" + +msgid " fps" +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>Rendern Sie jedes Bild sofort, 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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +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 "Die Zuweisung von Speicher für den Entpackungspuffer ist fehlgeschlagen.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Bei der Auswahl von Medien-Images (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>" + +msgid "This machine might have been moved or copied." +msgstr "Dieses Gerät wurde möglicherweise verschoben oder kopiert." + +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 "Um eine ordnungsgemäße Netzwerkfunktionalität zu gewährleisten, muss 86Box wissen, ob dieses Gerät verschoben oder kopiert wurde. \n\nWählen Sie \"Ich habe es kopiert\", wenn Sie sich nicht sicher sind." + +msgid "I Moved It" +msgstr "Ich habe es bewegt" + +msgid "I Copied It" +msgstr "Ich habe es kopiert" + +msgid "86Box Monitor #" +msgstr "86Box Monitor " + +msgid "No MCA devices." +msgstr "Keine MCA-Geräte." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Netzwerkkarte 1" + +msgid "Network Card #2" +msgstr "Netzwerkkarte 2" + +msgid "Network Card #3" +msgstr "Netzwerkkarte 3" + +msgid "Network Card #4" +msgstr "Netzwerkkarte 4" + +msgid "Mode" +msgstr "Modus" + +msgid "Interface" +msgstr "Schnittstelle" + +msgid "Adapter" +msgstr "Adaptér" + +msgid "VDE Socket" +msgstr "VDE-Steckdose" + +msgid "86Box Unit Tester" +msgstr "86Box-Gerätetester" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x Schlüsselkarte" + +msgid "Serial port passthrough 1" +msgstr "Passthrough der Serielle Schnittstelle 1" + +msgid "Serial port passthrough 2" +msgstr "Passthrough der Serielle Schnittstelle 2" + +msgid "Serial port passthrough 3" +msgstr "Passthrough der Serielle Schnittstelle 3" + +msgid "Serial port passthrough 4" +msgstr "Passthrough der Serielle Schnittstelle 4" + +msgid "Vision Systems LBA Enhancer" +msgstr "Vision Systems LBA Enhancer" + +msgid "Renderer options..." +msgstr "Renderer-Optionen..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft Bus-Maus" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft Bus-Maus (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse Systems Serielle Maus" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft Serielle Maus" + +msgid "Logitech Serial Mouse" +msgstr "Logitech Serielle Maus" + +msgid "PS/2 Mouse" +msgstr "PS/2-Maus" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (Serielle)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Standard Hayes-kompatibles Modem" + +msgid "Roland MT-32 Emulation" +msgstr "Roland MT-32-Emulation" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Roland MT-32 (Neu)-Emulation" + +msgid "Roland CM-32L Emulation" +msgstr "Roland CM-32L-Emulation" + +msgid "Roland CM-32LN Emulation" +msgstr "Roland CM-32LN-Emulation" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML-Tochterplatine" + +msgid "System MIDI" +msgstr "System MIDI" + +msgid "MIDI Input Device" +msgstr "MIDI-Eingabegerät" + +msgid "BIOS Address" +msgstr "BIOS-Adresse" + +msgid "Enable BIOS extension ROM Writes" +msgstr "BIOS-Erweiterung ROM-Schreiben einschalten" + +msgid "Address" +msgstr "Adresse" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS-Revision" + +msgid "Translate 26 -> 17" +msgstr "Übersetzen 26 -> 17" + +msgid "Language" +msgstr "Sprache" + +msgid "Enable backlight" +msgstr "Hintergrundbeleuchtung einschalten" + +msgid "Invert colors" +msgstr "Farben invertieren" + +msgid "BIOS size" +msgstr "BIOS-Größe" + +msgid "Map C0000-C7FFF as UMB" +msgstr "C0000-C7FFF als UMB zuordnen" + +msgid "Map C8000-CFFFF as UMB" +msgstr "C8000-CFFFF als UMB zuordnen" + +msgid "Map D0000-D7FFF as UMB" +msgstr "D0000-D7FFF als UMB zuordnen" + +msgid "Map D8000-DFFFF as UMB" +msgstr "D8000-DFFFF als UMB zuordnen" + +msgid "Map E0000-E7FFF as UMB" +msgstr "E0000-E7FFF als UMB zuordnen" + +msgid "Map E8000-EFFFF as UMB" +msgstr "E8000-EFFFF als UMB zuordnen" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 Steckbrücke (JIM)" + +msgid "MIDI Output Device" +msgstr "MIDI-Ausgabegerät" + +msgid "MIDI Real time" +msgstr "MIDI in Echtzeit" + +msgid "MIDI Thru" +msgstr "MIDI-Durchgang" + +msgid "MIDI Clockout" +msgstr "MIDI-Taktausgabe" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Ausgangsverstärkung" + +msgid "Chorus" +msgstr "Chor" + +msgid "Chorus Voices" +msgstr "Chorstimmen" + +msgid "Chorus Level" +msgstr "Chorpegel" + +msgid "Chorus Speed" +msgstr "Chorgeschwindigkeit" + +msgid "Chorus Depth" +msgstr "Chortiefe" + +msgid "Chorus Waveform" +msgstr "Chor-Wellenform" + +msgid "Reverb" +msgstr "Nachhall" + +msgid "Reverb Room Size" +msgstr "Größe des Nachhallraums" + +msgid "Reverb Damping" +msgstr "Nachhalldämpfung" + +msgid "Reverb Width" +msgstr "Nachhall-Breite" + +msgid "Reverb Level" +msgstr "Nachhall-Pegel" + +msgid "Interpolation Method" +msgstr "Interpolationsmethode" + +msgid "Reverb Output Gain" +msgstr "Nachhall-Ausgangsverstärkung" + +msgid "Reversed stereo" +msgstr "Umgekehrtes Stereo" + +msgid "Nice ramp" +msgstr "Schöne Rampe" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Tasten" + +msgid "Serial Port" +msgstr "Serielle Schnittstelle" + +msgid "RTS toggle" +msgstr "RTS-Umschaltung" + +msgid "Revision" +msgstr "Revision" + +msgid "Controller" +msgstr "Controller" + +msgid "Show Crosshair" +msgstr "Fadenkreuz anzeigen" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC-Adresse" + +msgid "MAC Address OUI" +msgstr "OUI der MAC-Adresse" + +msgid "Enable BIOS" +msgstr "BIOS einschalten" + +msgid "Baud Rate" +msgstr "Baudrate" + +msgid "TCP/IP listening port" +msgstr "TCP/IP-Abhörport" + +msgid "Phonebook File" +msgstr "Telefonbuch-Datei" + +msgid "Telnet emulation" +msgstr "Telnet-Emulation" + +msgid "RAM Address" +msgstr "RAM-Adresse" + +msgid "RAM size" +msgstr "RAM-Größe" + +msgid "Initial RAM size" +msgstr "Ursprüngliche RAM-Größe" + +msgid "Serial Number" +msgstr "Seriennummer" + +msgid "Host ID" +msgstr "Host-ID" + +msgid "FDC Address" +msgstr "FDC-Adresse" + +msgid "MPU-401 Address" +msgstr "MPU-401-Adresse" + +msgid "MPU-401 IRQ" +msgstr "MPU-401-RQ" + +msgid "Receive MIDI input" +msgstr "MIDI-Eingang empfangen" + +msgid "Low DMA" +msgstr "Niedrige DMA" + +msgid "Enable Game port" +msgstr "Game-Port einschalten" + +msgid "Surround module" +msgstr "Surround-Modul" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "CODEC-Interrupt bei CODEC-Einrichtung auslösen (wird von einigen Treibern benötigt)" + +msgid "SB Address" +msgstr "SB-Adresse" + +msgid "WSS IRQ" +msgstr "WSS-IRQ" + +msgid "WSS DMA" +msgstr "WSS-DMA" + +msgid "Enable OPL" +msgstr "OPL einschalten" + +msgid "Receive MIDI input (MPU-401)" +msgstr "MIDI-Eingang empfangen (MPU-401)" + +msgid "SB low DMA" +msgstr "Niedrige SB-DMA" + +msgid "6CH variant (6-channel)" +msgstr "6CH-Variante (6-Kanal)" + +msgid "Enable CMS" +msgstr "CMS einschalten" + +msgid "Mixer" +msgstr "Mischanlage" + +msgid "High DMA" +msgstr "Hohe DMA" + +msgid "Control PC speaker" +msgstr "PC-Lautsprecher steuern" + +msgid "Memory size" +msgstr "Speichergröße" + +msgid "EMU8000 Address" +msgstr "EMU8000-Adresse" + +msgid "IDE Controller" +msgstr "IDE-Controller" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "GUS-Typ" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Befehl 0x04 \"86Box beenden\" einschalten" + +msgid "Display type" +msgstr "Anzeigetyp" + +msgid "Composite type" +msgstr "Composite-Anzeigetyp" + +msgid "RGB type" +msgstr "RGB-Anzeigetyp" + +msgid "Line doubling type" +msgstr "Typ der Zeilenverdopplung" + +msgid "Snow emulation" +msgstr "Schnee-Emulation" + +msgid "Monitor type" +msgstr "Monitor-Typ" + +msgid "Character set" +msgstr "Zeichensatz" + +msgid "XGA type" +msgstr "XGA-Typ" + +msgid "Instance" +msgstr "Instanz" + +msgid "MMIO Address" +msgstr "MMIO-Adresse" + +msgid "RAMDAC type" +msgstr "RAMDAC-Typ" + +msgid "Blend" +msgstr "Mischung" + +msgid "Bilinear filtering" +msgstr "Bilineare Filterung" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "NMI für CGA-Emulation einschalten" + +msgid "Voodoo type" +msgstr "Voodoo-typ" + +msgid "Framebuffer memory size" +msgstr "Größe des Framebufferspeichers" + +msgid "Texture memory size" +msgstr "Größe des Texturspeichers" + +msgid "Dither subtraction" +msgstr "Dither-Subtraktion" + +msgid "Screen Filter" +msgstr "Bildschirm-Filter" + +msgid "Render threads" +msgstr "Render-Threads" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Startadresse" + +msgid "Contiguous Size" +msgstr "Zusammenhängende Größe" + +msgid "I/O Width" +msgstr "E/A-Breite" + +msgid "Transfer Speed" +msgstr "Übertragungsgeschwindigkeit" + +msgid "EMS mode" +msgstr "EMS-Modus" + +msgid "Address for > 2 MB" +msgstr "Adresse für > 2 MB" + +msgid "Frame Address" +msgstr "Rahmenadresse" + +msgid "USA" +msgstr "USA" + +msgid "Danish" +msgstr "Dänisch" + +msgid "Always at selected speed" +msgstr "Immer mit der gewählten Geschwindigkeit" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS-Einstellung + Hotkeys (aus während POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB ab F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB ab E0000 (MSB der Adresse invertiert, letzte 64KB zuerst)" + +msgid "Sine" +msgstr "Sinus" + +msgid "Triangle" +msgstr "Dreieck" + +msgid "Linear" +msgstr "Linear" + +msgid "4th Order" +msgstr "4. Bestellung" + +msgid "7th Order" +msgstr "7. Bestellung" + +msgid "Non-timed (original)" +msgstr "Nicht zeitgesteuert (Original)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 nicht bestückt)" + +msgid "Two" +msgstr "Zwei" + +msgid "Three" +msgstr "Drei" + +msgid "Wheel" +msgstr "Rad" + +msgid "Five + Wheel" +msgstr "Fünf + Rad" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 Serielle / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) Serielle" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "BIOS ausschalten" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr " 8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (Stereo)" + +msgid "Classic" +msgstr "Klassisch" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Composite" + +msgid "Old" +msgstr "Alt" + +msgid "New" +msgstr "Neu" + +msgid "Color (generic)" +msgstr "Farbe (generisch)" + +msgid "Green Monochrome" +msgstr "Grünes Monochrom" + +msgid "Amber Monochrome" +msgstr "Bernsteinfarbenes Monochrom" + +msgid "Gray Monochrome" +msgstr "Graues Monochrom" + +msgid "Color (no brown)" +msgstr "Farbe (kein Braun)" + +msgid "Color (IBM 5153)" +msgstr "Farbe (IBM 5153)" + +msgid "Simple doubling" +msgstr "Einfache Verdoppelung" + +msgid "sRGB interpolation" +msgstr "sRGB-Interpolation" + +msgid "Linear interpolation" +msgstr "Lineare Interpolation" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monochrom (5151/MDA) (weißes)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monochrom (5151/MDA) (grünes)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monochrom (5151/MDA) (bernsteinfarbenes)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Farbe 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Farbe 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Erhöhte Farbe - Normaler Modus (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Erhöhte Farbe - Erhöhter Modus (5154/ECD)" + +msgid "Green" +msgstr "Grünes" + +msgid "Amber" +msgstr "Bernsteinfarbenes" + +msgid "Gray" +msgstr "Graues" + +msgid "Color" +msgstr "Farbe" + +msgid "U.S. English" +msgstr "U.S. Englisch" + +msgid "Scandinavian" +msgstr "Skandinavisch" + +msgid "Other languages" +msgstr "Andere Sprachen" + +msgid "Bochs latest" +msgstr "Bochs neueste" + +msgid "Mono Non-Interlaced" +msgstr "Monochrom nicht verschachtelt" + +msgid "Color Interlaced" +msgstr "Farbe verschachtelt" + +msgid "Color Non-Interlaced" +msgstr "Farbe nicht verschachtelt" + +msgid "3Dfx Voodoo Graphics" +msgstr "3dfx Voodoo Grafik" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMUs)" + +msgid "8-bit" +msgstr "8-Bit" + +msgid "16-bit" +msgstr "16-Bit" + +msgid "Standard (150ns)" +msgstr "Standard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Hochgeschwindigkeit (120ns)" + +msgid "Enabled" +msgstr "Eingeschaltet" + +msgid "Standard" +msgstr "Standard" + +msgid "High-Speed" +msgstr "Hochgeschwindigkeit" + +msgid "Stereo LPT DAC" +msgstr "Stereo-LPT-DAC" + +msgid "Generic Text Printer" +msgstr "Generischer Textdrucker" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Allgemeiner ESC/P-Nadel" + +msgid "Generic PostScript Printer" +msgstr "Generischer PostScript-Drucker" + +msgid "Generic PCL5e Printer" +msgstr "Generischer PCL5e-Drucker" + +msgid "Parallel Line Internet Protocol" +msgstr "Parallel Line Internet Protocol" + +msgid "Protection Dongle for Savage Quest" +msgstr "Schutz-Dongle für Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Gerät des Passthroughs der Serielle Schnittstelle" + +msgid "Passthrough Mode" +msgstr "Modus des Passthroughs" + +msgid "Host Serial Device" +msgstr "Host Serielles Gerät" + +msgid "Name of pipe" +msgstr "Name der Leitung" + +msgid "Data bits" +msgstr "Datenbits" + +msgid "Stop bits" +msgstr "Stoppbits" + +msgid "Baud Rate of Passthrough" +msgstr "Baudrate des Passthroughs" + +msgid "Named Pipe (Server)" +msgstr "Benannte Leitung (Server)" + +msgid "Host Serial Passthrough" +msgstr "Passthrough der seriellen Schnittstelle des Hosts" diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index fa6d1e2c3..bd3a5ba99 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -26,3 +26,48 @@ msgstr "OpenGL (3.0 Core) renderer could not be initialised. Use another rendere msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." msgstr "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behaviour will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Apply fullscreen stretch mode when maximised" + +msgid "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 "<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>" + +msgid "Color (generic)" +msgstr "Colour (generic)" + +msgid "Gray Monochrome" +msgstr "Grey Monochrome" + +msgid "Color (no brown)" +msgstr "Colour (no brown)" + +msgid "Color (IBM 5153)" +msgstr "Colour (IBM 5153)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Colour 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Colour 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Enhanced Colour - Normal Mode (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Enhanced Colour - Enhanced Mode (5154/ECD)" + +msgid "Gray" +msgstr "Grey" + +msgid "Color" +msgstr "Colour" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 21fedd7df..7613033e7 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -256,7 +256,7 @@ msgid "&Folder..." msgstr "&Carpeta..." msgid "Target &framerate" -msgstr "&Tasa de refresco objetivo" +msgstr "Objetivo de &tasa de refresco" msgid "&Sync with video" msgstr "&Sincronizar con vídeo" @@ -390,14 +390,17 @@ msgstr "Recompilador Dinámico" msgid "Video:" msgstr "Vídeo:" -msgid "Voodoo Graphics" -msgstr "Voodoo Graphics" +msgid "Video #2:" +msgstr "Vídeo 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Gráficos Voodoo 1 o 2" msgid "IBM 8514/A Graphics" -msgstr "IBM 8514/A Graphics" +msgstr "Gráficos IBM 8514/A" msgid "XGA Graphics" -msgstr "XGA Graphics" +msgstr "Gráficos XGA" msgid "Mouse:" msgstr "Ratón:" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Error fatal" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - EN PAUSA" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Pulsa Ctrl+Alt+PgDn para volver a modo ventana." @@ -684,6 +687,9 @@ msgstr "La máquina \"%hs\" no está disponible debido a ROMs faltantes en el di msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "La tarjeta de vídeo \"%hs\" no está disponible debido a ROMs faltantes en el directorio roms/machines. Cambiando a una tarjeta de vídeo disponible." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "La tarjeta de vídeo 2 \"%hs\" no está disponible debido a ROMs faltantes en el directorio roms/machines. Cambiando a una tarjeta de vídeo disponible." + msgid "Machine" msgstr "Máquina" @@ -762,17 +768,26 @@ msgstr "No se encontraron dispositivos PCap" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" -msgid "Standard 2-button joystick(s)" -msgstr "Mando(s) de 2 botones estándar" +msgid "2-axis, 2-button joystick(s)" +msgstr "Mando(s) de 2 ejes, 2 botones" -msgid "Standard 4-button joystick" -msgstr "Mando de 4 botones estándar" +msgid "2-axis, 4-button joystick" +msgstr "Mando de 2 ejes, 4 botones" -msgid "Standard 6-button joystick" -msgstr "Mando de 6 botones estándar" +msgid "2-axis, 6-button joystick" +msgstr "Mando de 2 ejes, 6 botones" -msgid "Standard 8-button joystick" -msgstr "Mando de 8 botones estándar" +msgid "2-axis, 8-button joystick" +msgstr "Mando de 2 ejes, 8 botones" + +msgid "3-axis, 2-button joystick" +msgstr "Mando de 3 ejes, 2 botones" + +msgid "3-axis, 4-button joystick" +msgstr "Mando de 3 ejes, 4 botones" + +msgid "4-axis, 4-button joystick" +msgstr "Mando de 4 ejes, 4 botones" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "¿Está seguro de que quiere cerrar a 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Configuración inválida" 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 es necesaria para la conversión automática de archivos PostScript a PDF.\n\nCualquier documento enviado a la impresora genérica postScript se guardará como archivo PostScript (.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." +msgstr "%1 es necesaria para la conversión automática de archivos PCL a PDF.\n\nCualquier documento enviado a la impresora genérica PCL se guardará como archivo Printer Command Language (.pcl)." + msgid "Entering fullscreen mode" msgstr "Entrando en modo pantalla completa" @@ -999,6 +1020,27 @@ msgstr "Sobreescribir" msgid "Don't overwrite" msgstr "No sobreescribir" +msgid "Raw image" +msgstr "Imagen plana" + +msgid "HDI image" +msgstr "Imagen HDI" + +msgid "HDX image" +msgstr "Imagen HDX" + +msgid "Fixed-size VHD" +msgstr "VHD de tamaño fijo" + +msgid "Dynamic-size VHD" +msgstr "VHD de tamaño dinámico" + +msgid "Differencing VHD" +msgstr "VHD diferencial" + +msgid "(N/A)" +msgstr "(Ninguno)" + msgid "Raw image (.img)" msgstr "Imagen plana (.img)" @@ -1172,3 +1214,887 @@ msgstr "WinBox ya no recibe soporte" 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 "El desarrollo del gestor WinBox se detuvo en 2022 debido a la falta de mantenedores. Como dirigimos nuestros esfuerzos a hacer 86Box aún mejor, hemos tomado la decisión de dejar de dar soporte a WinBox como gestor.\n\nNo se proporcionarán más actualizaciones a través de WinBox, y puede encontrar un comportamiento incorrecto si continúa usándolo con versiones más nuevas de 86Box. Cualquier informe de error relacionado con el comportamiento de WinBox será cerrado como inválido.\n\nVaya a 86box.net para una lista de otros gestores que puede utilizar." +msgid "Generate" +msgstr "Vytvoř" + +msgid "Joystick configuration" +msgstr "Configuración del mando" + +msgid "Device" +msgstr "Dispositivo" + +msgid "%1 (X axis)" +msgstr "%1 (eje X)" + +msgid "%1 (Y axis)" +msgstr "%1 (eje Y)" + +msgid "MCA devices" +msgstr "Dispositivos MCA" + +msgid "List of MCA devices:" +msgstr "Lista de dispositivos MCA:" + +msgid "Tablet tool" +msgstr "Herramienta de tableta" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Acerca de Qt" + +msgid "MCA devices..." +msgstr "Dispositivos MCA ..." + +msgid "Show non-primary monitors" +msgstr "Mostrar monitores no primarios" + +msgid "Open screenshots folder..." +msgstr "Abrir la carpeta screenshots..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Usar escalado pantalla completa en modalidad maximizada" + +msgid "Cursor/Puck" +msgstr "Cursor/Puck" + +msgid "Pen" +msgstr "Bolígrafo" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Unidad de CD/DVD anfitriona (%1:)" + +msgid "&Connected" +msgstr "&Conectrado" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Comportamiento del renderizador" + +msgid "Use target framerate:" +msgstr "Usar objetivo de tasa de refresco:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "No ha sido posible cambiar al contexto OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Es requerida la versión 3.0 o más alta de OpenGL. La versión actual es %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "La inicialización de OpenGL no tuvo éxito. Error %1." + +msgid "Error initializing OpenGL" +msgstr "Error al inicializar OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Recurrir al renderizado por software.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "La allocación de memoria para el búfer de desempaquetado no tuvo éxito.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Al seleccionar imágenes multimedia (CD-ROM, disquete, etc.), el diálogo de apertura se iniciará en el mismo directorio que el archivo de configuración de 86Box. Es probable que este ajuste sólo suponga una diferencia en macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Esta máquina puede haber sido movida o copiado." + +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 "Para acertarse de que la funcionalidad de red funcione correctamente, 86Box tiene que saber si esta máquina ha sido movida o copiada.\n\nSi no está seguro, escoge \"La he copiado\"." + +msgid "I Moved It" +msgstr "La he movido" + +msgid "I Copied It" +msgstr "La he copiado" + +msgid "86Box Monitor #" +msgstr "Monitor de 86Box " + +msgid "No MCA devices." +msgstr "No hay dispositovos MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Tarjeta de red 1" + +msgid "Network Card #2" +msgstr "Tarjeta de red 2" + +msgid "Network Card #3" +msgstr "Tarjeta de red 3" + +msgid "Network Card #4" +msgstr "Tarjeta de red 4" + +msgid "Mode" +msgstr "Modalidad" + +msgid "Interface" +msgstr "Interfaz" + +msgid "Adapter" +msgstr "Adaptador" + +msgid "VDE Socket" +msgstr "Toma VDE" + +msgid "86Box Unit Tester" +msgstr "Comprobador de unidad 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Tarjeta de llave Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Paso de puerto serie 1" + +msgid "Serial port passthrough 2" +msgstr "Paso de puerto serie 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Ratón de bus Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Ratón de bus Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Ratón serie Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Ratón serie Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Ratón serie Logitech" + +msgid "PS/2 Mouse" +msgstr "Ratón PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (serie)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Módem estándar compatible con Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Emulación Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulación Roland MT-32 (nuevo)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulación Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulación Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Placa hija OPL4-ML" + +msgid "System MIDI" +msgstr "MIDI del sistema" + +msgid "MIDI Input Device" +msgstr "Dispositivo de entrada MIDI" + +msgid "BIOS Address" +msgstr "Dirección de BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Habilitar escrituras para el ROM de extensión de BIOS" + +msgid "Address" +msgstr "Dirección" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revisión de BIOS" + +msgid "Translate 26 -> 17" +msgstr "Traducir 26 -> 17" + +msgid "Language" +msgstr "Idioma" + +msgid "Enable backlight" +msgstr "Habilitar retroiluminación" + +msgid "Invert colors" +msgstr "Invertir colores" + +msgid "BIOS size" +msgstr "Tamaño de BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapear a C0000-C7FFF como UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapear a C8000-CFFFF como UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapear a D0000-D7FFF como UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapear a D8000-DFFFF como UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapear a E0000-E7FFF como UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapear a E8000-EFFFF como UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Puente JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Dispositivo de salida MIDI" + +msgid "MIDI Real time" +msgstr "MIDI en tiempo real" + +msgid "MIDI Thru" +msgstr "Atravesar la entrada MIDI" + +msgid "MIDI Clockout" +msgstr "Salida de reloj MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Ganancia de salida" + +msgid "Chorus" +msgstr "Coro" + +msgid "Chorus Voices" +msgstr "Voces del coro" + +msgid "Chorus Level" +msgstr "Nível del coro" + +msgid "Chorus Speed" +msgstr "Velocidad del coro" + +msgid "Chorus Depth" +msgstr "Profundidad del coro" + +msgid "Chorus Waveform" +msgstr "Forma de onda del coro" + +msgid "Reverb" +msgstr "Reverberación" + +msgid "Reverb Room Size" +msgstr "Tamaño del lugar de reverberación" + +msgid "Reverb Damping" +msgstr "Amortiguación de reverberación" + +msgid "Reverb Width" +msgstr "Anchura de reverberación" + +msgid "Reverb Level" +msgstr "Nível de reverberación" + +msgid "Interpolation Method" +msgstr "Método de interpolación" + +msgid "Reverb Output Gain" +msgstr "Ganancia de salida de reverberación" + +msgid "Reversed stereo" +msgstr "Estéreo invertido" + +msgid "Nice ramp" +msgstr "Rama bonita" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Botones" + +msgid "Serial Port" +msgstr "Puerto serie" + +msgid "RTS toggle" +msgstr "Conmutación RTS" + +msgid "Revision" +msgstr "Revisión" + +msgid "Controller" +msgstr "Controlador" + +msgid "Show Crosshair" +msgstr "Mostrar retícula" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Dirección MAC" + +msgid "MAC Address OUI" +msgstr "OUI de dirección MAC" + +msgid "Enable BIOS" +msgstr "Habilitar BIOS" + +msgid "Baud Rate" +msgstr "Tasa de baudios" + +msgid "TCP/IP listening port" +msgstr "Puerto de escucha TCP/IP" + +msgid "Phonebook File" +msgstr "Archivo de agenda telefónica" + +msgid "Telnet emulation" +msgstr "Emulación Telnet" + +msgid "RAM Address" +msgstr "Dirección de RAM" + +msgid "RAM size" +msgstr "Tamaño de RAM" + +msgid "Initial RAM size" +msgstr "Tamaño inicial de RAM" + +msgid "Serial Number" +msgstr "Número de serie" + +msgid "Host ID" +msgstr "ID de anfitrión" + +msgid "FDC Address" +msgstr "Dirección del FDC" + +msgid "MPU-401 Address" +msgstr "Dirección del MPU-401" + +msgid "MPU-401 IRQ" +msgstr "IQ del MPU-401" + +msgid "Receive MIDI input" +msgstr "Recebir entrada MIDI" + +msgid "Low DMA" +msgstr "DMA bajo" + +msgid "Enable Game port" +msgstr "Habilitar puerto de juegos" + +msgid "Surround module" +msgstr "Módulo Surround" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Activar la interrupción CODEC en la configuración CODEC (necesario para algunos controladores)" + +msgid "SB Address" +msgstr "Dirección del SB" + +msgid "WSS IRQ" +msgstr "IRQ de WSS" + +msgid "WSS DMA" +msgstr "DMA de WSS" + +msgid "Enable OPL" +msgstr "Habilitar OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Recebir entrada MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "DMA bajo del SB" + +msgid "6CH variant (6-channel)" +msgstr "Variante 6CH (6 canales)" + +msgid "Enable CMS" +msgstr "Habilitar CMS" + +msgid "Mixer" +msgstr "Mezclador" + +msgid "High DMA" +msgstr "DMA alto" + +msgid "Control PC speaker" +msgstr "Controlar el altavoz del PC" + +msgid "Memory size" +msgstr "Tamaño de memoria" + +msgid "EMU8000 Address" +msgstr "Dirección de EMU8000" + +msgid "IDE Controller" +msgstr "Controlador IDE" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "Tipo de GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Habilitar comando 0x04 \"Salir de 86Box\"" + +msgid "Display type" +msgstr "Tipo de pantalla" + +msgid "Composite type" +msgstr "Tipo de pantalla compuesta" + +msgid "RGB type" +msgstr "Tipo de pantalla RGB" + +msgid "Line doubling type" +msgstr "Tipo de duplicación de línea" + +msgid "Snow emulation" +msgstr "Emulación de nieve" + +msgid "Monitor type" +msgstr "Tipo de monitor" + +msgid "Character set" +msgstr "Conjunto de caracteres" + +msgid "XGA type" +msgstr "Tipo de XGA" + +msgid "Instance" +msgstr "Instancia" + +msgid "MMIO Address" +msgstr "Dirección de MMIO" + +msgid "RAMDAC type" +msgstr "Tipo de RAMDAC" + +msgid "Blend" +msgstr "Mezclar" + +msgid "Bilinear filtering" +msgstr "Filtrado bilineal" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Habilitar NMI para emulación CGA" + +msgid "Voodoo type" +msgstr "Tipo de Voodoo" + +msgid "Framebuffer memory size" +msgstr "Tamaño de memoria del framebuffer" + +msgid "Texture memory size" +msgstr "Tamaño de memoria de textura" + +msgid "Dither subtraction" +msgstr "Sustracción de dither" + +msgid "Screen Filter" +msgstr "Filtro de pantalla" + +msgid "Render threads" +msgstr "Hilos de renderización" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Dirección inicial" + +msgid "Contiguous Size" +msgstr "Tamaño contiguo" + +msgid "I/O Width" +msgstr "Anchura de E/S" + +msgid "Transfer Speed" +msgstr "Velocidad de transferencia" + +msgid "EMS mode" +msgstr "Modo EMS" + +msgid "Address for > 2 MB" +msgstr "Dirección para > 2 MB" + +msgid "Frame Address" +msgstr "Dirección del marco" + +msgid "USA" +msgstr "EE.UU." + +msgid "Danish" +msgstr "Danés" + +msgid "Always at selected speed" +msgstr "Siempre a la velocidad seleccionada" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Configuración de la BIOS + Teclas de acceso rápido (desactivadas durante la POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB desde F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB desde E0000 (MSB de dirección invertido, últimas 64KB primero)" + +msgid "Sine" +msgstr "Sinusoidal" + +msgid "Triangle" +msgstr "Triangular" + +msgid "Linear" +msgstr "Linear" + +msgid "4th Order" +msgstr "4ª Orden" + +msgid "7th Order" +msgstr "7ª Orden" + +msgid "Non-timed (original)" +msgstr "No cronometrado (original)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 no poblado)" + +msgid "Two" +msgstr "Dos" + +msgid "Three" +msgstr "Tres" + +msgid "Wheel" +msgstr "Rueda" + +msgid "Five + Wheel" +msgstr "Cinco + rueda" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 serie / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) serie" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Deshabilitar BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr " 8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (estéreo)" + +msgid "Classic" +msgstr "Clásico" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Compuesto" + +msgid "Old" +msgstr "Viejo" + +msgid "New" +msgstr "Nuevo" + +msgid "Color (generic)" +msgstr "Color (genérico)" + +msgid "Green Monochrome" +msgstr "Monocromo verde" + +msgid "Amber Monochrome" +msgstr "Monocromo ámbar" + +msgid "Gray Monochrome" +msgstr "Monocromo gris" + +msgid "Color (no brown)" +msgstr "Color (sin marrón)" + +msgid "Color (IBM 5153)" +msgstr "Color (IBM 5153)" + +msgid "Simple doubling" +msgstr "Duplicación simple" + +msgid "sRGB interpolation" +msgstr "Interpolación sRGB" + +msgid "Linear interpolation" +msgstr "Interpolación lineare" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monocromo (5151/MDA) (blanco)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monocromo (5151/MDA) (verde)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monocromo (5151/MDA) (ámbar)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Color 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Color 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Color mejorado - modo normal (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Color mejorado - modo mejorado (5154/ECD)" + +msgid "Green" +msgstr "Verde" + +msgid "Amber" +msgstr "Ámbar" + +msgid "Gray" +msgstr "Gris" + +msgid "Color" +msgstr "Color" + +msgid "U.S. English" +msgstr "Inglés de EE.UU." + +msgid "Scandinavian" +msgstr "Escandinavo" + +msgid "Other languages" +msgstr "Otros idiomas" + +msgid "Bochs latest" +msgstr "Bochs más nuevo" + +msgid "Mono Non-Interlaced" +msgstr "Monocromo no entrelazado" + +msgid "Color Interlaced" +msgstr "Color entrelazado" + +msgid "Color Non-Interlaced" +msgstr "Color no entrelazado" + +msgid "3Dfx Voodoo Graphics" +msgstr "Gráficos 3dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 unidades TMU)" + +msgid "8-bit" +msgstr "8 bitss" + +msgid "16-bit" +msgstr "16 bits" + +msgid "Standard (150ns)" +msgstr "Estándar (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Alta velocidad (120ns)" + +msgid "Enabled" +msgstr "Habilitado" + +msgid "Standard" +msgstr "Estándar" + +msgid "High-Speed" +msgstr "Alta velocidad" + +msgid "Stereo LPT DAC" +msgstr "DAC LPT estéreo" + +msgid "Generic Text Printer" +msgstr "Impresora genérica de texto" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Matricial ESC/P genérica" + +msgid "Generic PostScript Printer" +msgstr "Impresora genérica PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Impresora genérica PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Protocolo de Internet de línea paralela" + +msgid "Protection Dongle for Savage Quest" +msgstr "Dongle de protección para Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Dispositivo de paso de puerto serie" + +msgid "Passthrough Mode" +msgstr "Modo de paso" + +msgid "Host Serial Device" +msgstr "Dispositivo serie anfitrión" + +msgid "Name of pipe" +msgstr "Nombre de tubería" + +msgid "Data bits" +msgstr "Bits de datos" + +msgid "Stop bits" +msgstr "Bits de parada" + +msgid "Baud Rate of Passthrough" +msgstr "Tasa de baudios de paso" + +msgid "Named Pipe (Server)" +msgstr "Tubería con nombre (servidor)" + +msgid "Host Serial Passthrough" +msgstr "Paso del puerto serie del host" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 829e9870f..172bef41e 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -390,8 +390,11 @@ msgstr "Dynaaminen uudelleenkääntäjä" msgid "Video:" msgstr "Näytönohjain:" -msgid "Voodoo Graphics" -msgstr "Voodoo-grafiikkasuoritin" +msgid "Video #2:" +msgstr "Näytönohjain 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 tai 2-grafiikkasuoritin" msgid "IBM 8514/A Graphics" msgstr "IBM 8514/A-grafiikkasuoritin" @@ -684,6 +687,9 @@ msgstr "Konetta \"%hs\" ei voi käyttää puuttuvien ROM-tiedostojen vuoksi. Vai msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Näytönohjainta \"%hs\" ei voi käyttää puuttuvien ROM-tiedostojen vuoksi. Vaihdetaan käyttökelpoiseen näytönohjaimeen." +msgid "Video card 2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Näytönohjainta 2 \"%hs\" ei voi käyttää puuttuvien ROM-tiedostojen vuoksi. Vaihdetaan käyttökelpoiseen näytönohjaimeen." + msgid "Machine" msgstr "Tietokone" @@ -762,17 +768,26 @@ msgstr "PCap-laitteita ei löytynyt" msgid "Invalid PCap device" msgstr "Virheellinen PCap-laite" -msgid "Standard 2-button joystick(s)" -msgstr "Standardi 2-painikkeinen peliohjain/-ohjaimet" +msgid "2-axis, 2-button joystick(s)" +msgstr "2-akselinen 2-painikkeinen peliohjain/-ohjaimet" -msgid "Standard 4-button joystick" -msgstr "Standardi 4-painikkeinen peliohjain" +msgid "2-axis, 4-button joystick" +msgstr "2-akselinen 4-painikkeinen peliohjain" -msgid "Standard 6-button joystick" -msgstr "Standardi 6-painikkeinen peliohjain" +msgid "2-axis, 6-button joystick" +msgstr "2-akselinen 6-painikkeinen peliohjain" -msgid "Standard 8-button joystick" -msgstr "Standardi 8-painikkeinen peliohjain" +msgid "2-axis, 8-button joystick" +msgstr "2-akselinen 8-painikkeinen peliohjain" + +msgid "3-axis, 2-button joystick" +msgstr "3-akselinen 2-painikkeinen peliohjain" + +msgid "3-axis, 4-button joystick" +msgstr "3-akselinen 4-painikkeinen peliohjain" + +msgid "4-axis, 4-button joystick" +msgstr "4-akselinen 4-painikkeinen peliohjain" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Haluatko varmasti sulkea 86Boxin?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Virheelliset määritykset" 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 vaaditaan PostScript-tiedostojen automaattiseen muuntamiseen PDF-tiedostoiksi.\n\nKaikki geneeriselle PostScript-tulostimelle lähetetyt asiakirjat tallennetaan PostScript (.ps) -tiedostoina." +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 vaaditaan PCL-tiedostojen automaattiseen muuntamiseen PDF-tiedostoiksi.\n\nKaikki geneeriselle PCL-tulostimelle lähetetyt asiakirjat tallennetaan Printer Command Language (.ps) -tiedostoina." + msgid "Entering fullscreen mode" msgstr "Siirrytään koko näytön tilaan" @@ -910,7 +931,7 @@ 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ää." +msgstr "OpenGL (3.0 Core)-renderöijän alustus epäonnistui. Käytä toista renderöijää." msgid "Resume execution" msgstr "Jatka suoritusta" @@ -999,6 +1020,27 @@ msgstr "Korvaa" msgid "Don't overwrite" msgstr "Älä korvaa" +msgid "Raw image" +msgstr "Raaka levykuva" + +msgid "HDI image" +msgstr "HDI-levykuva" + +msgid "HDX image" +msgstr "HDX-levykuva" + +msgid "Fixed-size VHD" +msgstr "Kiinteä VHD" + +msgid "Dynamic-size VHD" +msgstr "Dynaaminen VHD" + +msgid "Differencing VHD" +msgstr "Differentiaalinen VHD" + +msgid "(N/A)" +msgstr "(Ei mikään)" + msgid "Raw image (.img)" msgstr "Raaka levykuva (.img)" @@ -1172,3 +1214,888 @@ msgstr "WinBoxia ei enää tueta" 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 "WinBox-managerin kehitys lopetettiin vuonna 2022, koska ylläpitäjiä ei ollut riittävästi. Koska suuntaamme ponnistuksemme 86Boxin parantamiseen entisestään, olemme päättäneet olla enää tukematta WinBoxia managerina.\n\nWinBoxin kautta ei enää toimiteta päivityksiä, ja saatat kohdata virheellistä käyttäytymistä, jos jatkat sen käyttöä 86Boxin uudemmissa versioissa. Kaikki WinBoxin käyttäytymiseen liittyvät vikailmoitukset suljetaan virheellisinä.\n\nSiirry osoitteeseen 86box.net saadaksesi luettelon muista käyttämistäsi hallintaohjelmista." + +msgid "Generate" +msgstr "Luo" + +msgid "Joystick configuration" +msgstr "Peliohjainin kokoonpano" + +msgid "Device" +msgstr "Laite" + +msgid "%1 (X axis)" +msgstr "%1 (X-akseli)" + +msgid "%1 (Y axis)" +msgstr "%1 (Y-akseli)" + +msgid "MCA devices" +msgstr "MCA-laitteet" + +msgid "List of MCA devices:" +msgstr "Luettelo MCA-laitteista:" + +msgid "Tablet tool" +msgstr "Tablettityökalu" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Tietoja Qt:sta" + +msgid "MCA devices..." +msgstr "MCA-laitteet..." + +msgid "Show non-primary monitors" +msgstr "Näytä muut kuin ensisijaiset monitorit" + +msgid "Open screenshots folder..." +msgstr "Avaa kuvakaappaukset-kansio..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Sovelletaan koko näytön venytystilaa maksimoidessa" + +msgid "Cursor/Puck" +msgstr "Kursori/Kiekko" + +msgid "Pen" +msgstr "Kynä" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Isäntä CD/DVD-asema (%1:)" + +msgid "&Connected" +msgstr "&Yhdistetty" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Renderöintikäyttäytyminen" + +msgid "Use target framerate:" +msgstr "Käytä kuvataajuustavoitetta:" + +msgid " fps" +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" + +msgid "Shaders" +msgstr "Varjostinohjelmat" + +msgid "Remove" +msgstr "Poista" + +msgid "No shader selected" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Ei voitu siirtyä OpenGL-kontekstiin." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Tarvitaan OpenGL-versio 3.0 tai uudempi. Nykyinen versio on %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "OpenGL:n alustaminen epäonnistui. Virhe %1." + +msgid "Error initializing OpenGL" +msgstr "Virhe OpenGL:n alustamisessa" + +msgid "Falling back to software rendering.\n" +msgstr "Paluu ohjelmistoalustusöintiin.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Pakkauspuskurin muistin varaaminen epäonnistui.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Kun valitset mediakuvia (CD-ROM, levykkeet jne.), avausikkuna käynnistyy samaan hakemistoon kuin 86Boxin konfigurointitiedosto. Tällä asetuksella on todennäköisesti merkitystä vain macOS-käyttöjärjestelmässä.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Kone on saatettu siirtää tai kopioida." + +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 "Varmistaakseen asianmukaisen verkkotoiminnon 86Boxin on tiedettävä, onko tämä kone siirretty vai kopioitu.\n\nValitse \"Kopioin sen\", jos et ole varma." + +msgid "I Moved It" +msgstr "Siirsin sen" + +msgid "I Copied It" +msgstr "Kopioin sen" + +msgid "86Box Monitor #" +msgstr "86Box Monitor " + +msgid "No MCA devices." +msgstr "Ei MCA-laitteita." + +msgid "MiB" +msgstr "Mit" + +msgid "Network Card #1" +msgstr "Verkkokortti 1" + +msgid "Network Card #2" +msgstr "Verkkokortti 2" + +msgid "Network Card #3" +msgstr "Verkkokortti 3" + +msgid "Network Card #4" +msgstr "Verkkokortti 4" + +msgid "Mode" +msgstr "Tila" + +msgid "Interface" +msgstr "Liitäntä" + +msgid "Adapter" +msgstr "Sovitin" + +msgid "VDE Socket" +msgstr "VDE-pistorasia" + +msgid "86Box Unit Tester" +msgstr "86Box Unit Tester" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x -avainkortti" + +msgid "Serial port passthrough 1" +msgstr "Sarjaportin läpivienti 1" + +msgid "Serial port passthrough 2" +msgstr "Sarjaportin läpivienti 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft-väylähiiri" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft-väylähiiri (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse Systems-sarjahiiri" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft-sarjahiiri" + +msgid "Logitech Serial Mouse" +msgstr "Logitech-sarjahiiri" + +msgid "PS/2 Mouse" +msgstr "PS/2 hiiri" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (sarja)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Tavallinen Hayes-yhteensopiva modeemi" + +msgid "Roland MT-32 Emulation" +msgstr "Roland MT-32-emulointi" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Roland MT-32 (uusi)-emulointi" + +msgid "Roland CM-32L Emulation" +msgstr "Roland CM-32L-emulointi" + +msgid "Roland CM-32LN Emulation" +msgstr "Roland CM-32LN-emulointi" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML-tytärlevy" + +msgid "System MIDI" +msgstr "Järjestelmän MIDI" + +msgid "MIDI Input Device" +msgstr "MIDI-syöttölaite" + +msgid "BIOS Address" +msgstr "BIOS-osoite" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Käytä BIOS-laajennuksen ROM-kirjoitusten" + +msgid "Address" +msgstr "Osoite" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS-tarkistus" + +msgid "Translate 26 -> 17" +msgstr "Käännä 26 -> 17" + +msgid "Language" +msgstr "Kieli" + +msgid "Enable backlight" +msgstr "Käytä taustavalota" + +msgid "Invert colors" +msgstr "Käännä värit" + +msgid "BIOS size" +msgstr "BIOS-koko" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Kartta C0000-C7FFF UMB:nä" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Kartta C8000-CFFFF UMB:nä" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Kartta D0000-D7FFF UMB:nä" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Kartta D8000-DFFFF UMB:nä" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Kartta E0000-E7FFF UMB:nä" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Kartta E8000-EFFFF UMB:nä" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 Jumpperi (JIM)" + +msgid "MIDI Output Device" +msgstr "MIDI-lähtölaite" + +msgid "MIDI Real time" +msgstr "MIDI reaaliajassa" + +msgid "MIDI Thru" +msgstr "MIDI-tulon läpivienti" + +msgid "MIDI Clockout" +msgstr "MIDI-kellon ulostulo" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Lähtötaso" + +msgid "Chorus" +msgstr "Kuoro" + +msgid "Chorus Voices" +msgstr "Kuoron äänet" + +msgid "Chorus Level" +msgstr "Kuorotaso" + +msgid "Chorus Speed" +msgstr "Kuronopeus" + +msgid "Chorus Depth" +msgstr "Kuorosyvyys" + +msgid "Chorus Waveform" +msgstr "Kuoroaaltomuoto" + +msgid "Reverb" +msgstr "Jälkikaiunta" + +msgid "Reverb Room Size" +msgstr "Jälkikaiuntahuoneen koko" + +msgid "Reverb Damping" +msgstr "Jälkikaiunta vaimennus" + +msgid "Reverb Width" +msgstr "Jälkikaiunnan leveys" + +msgid "Reverb Level" +msgstr "Jälkikaiunnan taso" + +msgid "Interpolation Method" +msgstr "Interpolointimenetelmä" + +msgid "Reverb Output Gain" +msgstr "Jälkikaiunta lähtötaso" + +msgid "Reversed stereo" +msgstr "Käänteinen stereo" + +msgid "Nice ramp" +msgstr "Hieno ramppi" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Painikkeet" + +msgid "Serial Port" +msgstr "Sarjaportti" + +msgid "RTS toggle" +msgstr "RTS-vaihtokytkin" + +msgid "Revision" +msgstr "Tarkistus" + +msgid "Controller" +msgstr "Ohjain" + +msgid "Show Crosshair" +msgstr "Näytä ristikko" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC-osoite" + +msgid "MAC Address OUI" +msgstr "MAC-osoitteen OUI" + +msgid "Enable BIOS" +msgstr "Käytä BIOS:ta" + +msgid "Baud Rate" +msgstr "Baudinopeus" + +msgid "TCP/IP listening port" +msgstr "TCP/IP-kuunteluportti" + +msgid "Phonebook File" +msgstr "Puhelinluettelotiedosto" + +msgid "Telnet emulation" +msgstr "Telnet-emulointi" + +msgid "RAM Address" +msgstr "RAM-osoite" + +msgid "RAM size" +msgstr "RAM-koko" + +msgid "Initial RAM size" +msgstr "Alkuperäinen RAM-koko" + +msgid "Serial Number" +msgstr "Sarjanumero" + +msgid "Host ID" +msgstr "Isännän ID" + +msgid "FDC Address" +msgstr "FDC-osoite" + +msgid "MPU-401 Address" +msgstr "MPU-401-osoite" + +msgid "MPU-401 IRQ" +msgstr "MPU-401-IRQ" + +msgid "Receive MIDI input" +msgstr "Vastaanota MIDI-tulo" + +msgid "Low DMA" +msgstr "Matala DMA" + +msgid "Enable Game port" +msgstr "Käytä peliporttita" + +msgid "Surround module" +msgstr "Surround-moduuli" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "CODEC-keskeytyksen nostaminen CODEC-asennuksen yhteydessä (jotkut ohjaimet tarvitsevat sitä)" + +msgid "SB Address" +msgstr "SB-osoite" + +msgid "WSS IRQ" +msgstr "WSS-IRQ" + +msgid "WSS DMA" +msgstr "WSS-DMA" + +msgid "Enable OPL" +msgstr "Käytä OPL:ta" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Vastaanota MIDI-tulo (MPU-401)" + +msgid "SB low DMA" +msgstr "Matala SB-DMA" + +msgid "6CH variant (6-channel)" +msgstr "6CH-muunnos (6-kanavainen)" + +msgid "Enable CMS" +msgstr "Käytä CMS:ta" + +msgid "Mixer" +msgstr "Mikseri" + +msgid "High DMA" +msgstr "Korkea DMA" + +msgid "Control PC speaker" +msgstr "Ohjaus PC-kaiutin" + +msgid "Memory size" +msgstr "Muistin koko" + +msgid "EMU8000 Address" +msgstr "EMU8000-osoite" + +msgid "IDE Controller" +msgstr "IDE-ohjain" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "GUS-tyyppi" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Käytä komentota 0x04 \"Poistuminen 86Box\"" + +msgid "Display type" +msgstr "Näytön tyyppi" + +msgid "Composite type" +msgstr "Komposiittityyppi" + +msgid "RGB type" +msgstr "RGB-tyyppi" + +msgid "Line doubling type" +msgstr "Linjan kaksinkertaistamistyyppi" + +msgid "Snow emulation" +msgstr "Lumi-emulointi" + +msgid "Monitor type" +msgstr "Monitorityyppi" + +msgid "Character set" +msgstr "Merkistö" + +msgid "XGA type" +msgstr "XGA-tyyppi" + +msgid "Instance" +msgstr "Instanssi" + +msgid "MMIO Address" +msgstr "MMIO-osoite" + +msgid "RAMDAC type" +msgstr "RAMDAC-tyyppi" + +msgid "Blend" +msgstr "Sekoitus" + +msgid "Bilinear filtering" +msgstr "Bilineaarinen suodatus" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Käytä NMI:ta CGA-emulointia varten" + +msgid "Voodoo type" +msgstr "Voodoo-tyyppi" + +msgid "Framebuffer memory size" +msgstr "Kehyspuskurin muistin koko" + +msgid "Texture memory size" +msgstr "Tekstuurimuistin koko" + +msgid "Dither subtraction" +msgstr "Ditherin vähennys" + +msgid "Screen Filter" +msgstr "Seulasuodatin" + +msgid "Render threads" +msgstr "Renderöintisäikeet" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Aloitusosoite" + +msgid "Contiguous Size" +msgstr "Vierekkäinen koko" + +msgid "I/O Width" +msgstr "I/O-leveys" + +msgid "Transfer Speed" +msgstr "Siirtonopeus" + +msgid "EMS mode" +msgstr "EMS-tila" + +msgid "Address for > 2 MB" +msgstr "Osoite > 2 Mt" + +msgid "Frame Address" +msgstr "Kehyksen osoite" + +msgid "USA" +msgstr "USA" + +msgid "Danish" +msgstr "Tanskalainen" + +msgid "Always at selected speed" +msgstr "Aina valitulla nopeudella" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS-asetus + pikanäppäimet (pois päältä POSTin aikana)" + +msgid "64 kB starting from F0000" +msgstr "64 kB alkaen F0000:sta" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB alkaen E0000:sta (osoitteen käänteinen MSB, viimeiset 64 kB ensin)" + +msgid "Sine" +msgstr "Sinus" + +msgid "Triangle" +msgstr "Kolmio" + +msgid "Linear" +msgstr "Lineaarinen" + +msgid "4th Order" +msgstr "4. tilaus" + +msgid "7th Order" +msgstr "7. tilaus" + +msgid "Non-timed (original)" +msgstr "Ajastamaton (alkuperäinen)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 ei käytössä)" + +msgid "Two" +msgstr "Kaksi" + +msgid "Three" +msgstr "Kolme" + +msgid "Wheel" +msgstr "Pyörä" + +msgid "Five + Wheel" +msgstr "Viisi + pyörä" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 sarja / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) sarja" + +msgid "8 kB" +msgstr "8 kt" + +msgid "32 kB" +msgstr "32 kt" + +msgid "16 kB" +msgstr "16 kt" + +msgid "64 kB" +msgstr "64 kt" + +msgid "Disable BIOS" +msgstr "BIOS pois käytöstä" + +msgid "512 kB" +msgstr "512 kt" + +msgid "2 MB" +msgstr "2 Mt" + +msgid "8 MB" +msgstr " 8 Mt" + +msgid "28 MB" +msgstr "28 Mt" + +msgid "1 MB" +msgstr "1 Mt" + +msgid "4 MB" +msgstr "4 Mt" + +msgid "12 MB" +msgstr "12 Mt" + +msgid "16 MB" +msgstr "16 Mt" + +msgid "20 MB" +msgstr "20 Mt" + +msgid "24 MB" +msgstr "24 Mt" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klassinen" + +msgid "256 kB" +msgstr "256 kt" + +msgid "Composite" +msgstr "Komposiitti" + +msgid "Old" +msgstr "Vanha" + +msgid "New" +msgstr "Uusi" + +msgid "Color (generic)" +msgstr "Väri (yleinen)" + +msgid "Green Monochrome" +msgstr "Vihreä yksivärinen" + +msgid "Amber Monochrome" +msgstr "Keltainen yksivärinen" + +msgid "Gray Monochrome" +msgstr "Harmaa yksivärinen" + +msgid "Color (no brown)" +msgstr "Väri (ei ruskea)" + +msgid "Color (IBM 5153)" +msgstr "Väri (IBM 5153)" + +msgid "Simple doubling" +msgstr "Yksinkertainen kaksinkertaistaminen" + +msgid "sRGB interpolation" +msgstr "sRGB-interpolointi" + +msgid "Linear interpolation" +msgstr "Lineaarinen interpolointi" + +msgid "128 kB" +msgstr "128 kt" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Yksivärinen (5151/MDA) (valkoinen)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Yksivärinen (5151/MDA) (vihreä)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Yksivärinen (5151/MDA) (keltainen)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Väri 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Väri 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Parannettu väri - Normaali tila (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Parannettu väri - Parannettu tila (5154/ECD)" + +msgid "Green" +msgstr "Vihreä" + +msgid "Amber" +msgstr "Keltainen" + +msgid "Gray" +msgstr "Harmaa" + +msgid "Color" +msgstr "Väri" + +msgid "U.S. English" +msgstr "Yhdysvaltain englanti" + +msgid "Scandinavian" +msgstr "Skandinaavinen" + +msgid "Other languages" +msgstr "Muut kielet" + +msgid "Bochs latest" +msgstr "Bochs uusin" + +msgid "Mono Non-Interlaced" +msgstr "Yksivärinen ei-välitetyt" + +msgid "Color Interlaced" +msgstr "Väri välitetyt" + +msgid "Color Non-Interlaced" +msgstr "Väri ei-välitetyt" + +msgid "3Dfx Voodoo Graphics" +msgstr "3dfx Voodoo-grafiikkasuoritin" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU:ta)" + +msgid "8-bit" +msgstr "8-bittinen" + +msgid "16-bit" +msgstr "16-bittinen" + +msgid "Standard (150ns)" +msgstr "Vakio (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Nopea (120ns)" + +msgid "Enabled" +msgstr "Käytössä" + +msgid "Standard" +msgstr "Vakio" + +msgid "High-Speed" +msgstr "Nopea" + +msgid "Stereo LPT DAC" +msgstr "Stereo-LPT-DAC" + +msgid "Generic Text Printer" +msgstr "Yleinen tekstitulostin" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Yleinen ESC/P pistematriisi" + +msgid "Generic PostScript Printer" +msgstr "Yleinen PostScript-tulostin" + +msgid "Generic PCL5e Printer" +msgstr "Yleinen PCL5e-tulostin" + +msgid "Parallel Line Internet Protocol" +msgstr "Rinnakkaislinjan Internet-protokolla" + +msgid "Protection Dongle for Savage Quest" +msgstr "Savage Questin suojausdongle" + +msgid "Serial Passthrough Device" +msgstr "Sarjaportin läpivientilaite" + +msgid "Passthrough Mode" +msgstr "Läpivientitila" + +msgid "Host Serial Device" +msgstr "Isäntäkoneen sarjalaiten" + +msgid "Name of pipe" +msgstr "Putken nimi" + +msgid "Data bits" +msgstr "Databitit" + +msgid "Stop bits" +msgstr "Pysäytysbitit" + +msgid "Baud Rate of Passthrough" +msgstr "Läpiviennin baudinopeus" + +msgid "Named Pipe (Server)" +msgstr "Nimetty putki (palvelin)" + +msgid "Host Serial Passthrough" +msgstr "Isännän sarjaportin läpivienti" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index db16abe07..69e9a46e0 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -124,7 +124,7 @@ msgid "&4:3" msgstr "&4:3" msgid "&Square pixels (Keep ratio)" -msgstr "pixels &Carrés(Keep ratio)" +msgstr "Pixels &carrés (Keep ratio)" msgid "&Integer scale" msgstr "Echelle &Entière" @@ -172,7 +172,7 @@ msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" msgstr "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" msgid "Change contrast for &monochrome display" -msgstr "Modifier contraste affichage &monochrome" +msgstr "Modifier contraste affichage &monochrome" msgid "&Media" msgstr "&Media" @@ -390,8 +390,11 @@ msgstr "Recompilateur dynamique" msgid "Video:" msgstr "Vidéo:" -msgid "Voodoo Graphics" -msgstr "Graphique Voodoo" +msgid "Video #2:" +msgstr "Vidéo 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Graphique Voodoo 1 ou 2" msgid "IBM 8514/A Graphics" msgstr "Graphique IBM 8514/A" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Erreur fatale" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - EN PAUSE" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Appuyez sur Ctrl+Alt+PgDn pour revenir au mode fenêtré." @@ -684,6 +687,9 @@ msgstr "La machine \"%hs\" n'est pas disponible en raison de l'absence de ROMs d msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "La carte vidéo \"%hs\" n'est pas disponible en raison de l'absence de ROMs dans le répertoire roms/video. Basculer vers une carte vidéo disponible." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "La carte vidéo 2 \"%hs\" n'est pas disponible en raison de l'absence de ROMs dans le répertoire roms/video. Basculer vers une carte vidéo disponible." + msgid "Machine" msgstr "Machine" @@ -741,9 +747,6 @@ msgstr "T" msgid "S" msgstr "S" -msgid "MiB" -msgstr "Mio" - msgid "KB" msgstr "Ko" @@ -765,17 +768,26 @@ msgstr "Aucun dispositif PCap trouvé" msgid "Invalid PCap device" msgstr "Dispositif PCap non valide" -msgid "Standard 2-button joystick(s)" -msgstr "Manette(s) standard avec 2 boutons" +msgid "2-axis, 2-button joystick(s)" +msgstr "Manette(s) avec 2 axes, 2 boutons" -msgid "Standard 4-button joystick" -msgstr "Manette standard avec 4 boutons" +msgid "2-axis, 4-button joystick" +msgstr "Manette avec 2 axes, 4 boutons" -msgid "Standard 6-button joystick" -msgstr "Manette standard avec 6 boutons" +msgid "2-axis, 6-button joystick" +msgstr "Manette avec 2 axes, 6 boutons" -msgid "Standard 8-button joystick" -msgstr "Manette standard avec 6 boutons" +msgid "2-axis, 8-button joystick" +msgstr "Manette avec 2 axes, 8 boutons" + +msgid "3-axis, 2-button joystick" +msgstr "Manette avec 3 axes, 2 boutons" + +msgid "3-axis, 4-button joystick" +msgstr "Manette avec 3 axes, 4 boutons" + +msgid "4-axis, 4-button joystick" +msgstr "Manette avec 4 axes, 4 boutons" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -810,6 +822,9 @@ msgstr "Etes-vous sûr de vouloir quitter 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -858,6 +873,9 @@ msgstr "Configuration non valide" 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 est nécessair pour la conversion automatique des fichiers PostScript dans PDF.\n\nTous les documents envoyés à l'imprimante générique PostScript seront sauvés comme des fichiers PostScript (.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." +msgstr "%1 est nécessair pour la conversion automatique des fichiers PCL dans PDF.\n\nTous les documents envoyés à l'imprimante générique PCL seront sauvés comme des fichiers Printer Command Language (.pcl)." + msgid "Entering fullscreen mode" msgstr "Entrer en mode plein écran" @@ -1002,6 +1020,27 @@ msgstr "Écraser" msgid "Don't overwrite" msgstr "Ne pas écraser" +msgid "Raw image" +msgstr "Image brute" + +msgid "HDI image" +msgstr "Image HDI" + +msgid "HDX image" +msgstr "Image HDX" + +msgid "Fixed-size VHD" +msgstr "VHD à taille fixe" + +msgid "Dynamic-size VHD" +msgstr "VHD à taille dynamique" + +msgid "Differencing VHD" +msgstr "VHD à différenciation" + +msgid "(N/A)" +msgstr "(N.D.)" + msgid "Raw image (.img)" msgstr "Image brute (.img)" @@ -1175,3 +1214,888 @@ msgstr "WinBox n'est plus pris en charge" 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 "Le développement du gestionnaire WinBox s'est arrêté en 2022 en raison d'un manque de mainteneurs. Comme nous concentrons nos efforts sur l'amélioration de 86Box, nous avons pris la décision de ne plus supporter WinBox en tant que gestionnaire.\n\nAucune mise à jour ne sera fournie par WinBox, et vous pourriez rencontrer des comportements incorrects si vous continuez à l'utiliser avec des versions plus récentes de 86Box. Tous les rapports de bogues relatifs au comportement de WinBox seront classés comme non valides.\n\nAllez sur 86box.net pour une liste d'autres gestionnaires que vous pouvez utiliser." + +msgid "Generate" +msgstr "Générer" + +msgid "Joystick configuration" +msgstr "Configuration de manette" + +msgid "Device" +msgstr "Dispositif" + +msgid "%1 (X axis)" +msgstr "%1 (axe X)" + +msgid "%1 (Y axis)" +msgstr "%1 (axe Y)" + +msgid "MCA devices" +msgstr "Dispositifs MCA" + +msgid "List of MCA devices:" +msgstr "Liste des dispositifs MCA :" + +msgid "Tablet tool" +msgstr "Nástroj pro tablety" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "O programu Qt" + +msgid "MCA devices..." +msgstr "Dispositifs MCA..." + +msgid "Show non-primary monitors" +msgstr "Afficher les moniteurs non primaires" + +msgid "Open screenshots folder..." +msgstr "Ouvrir le dossier des captures d'écran..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Appliquer le mode elargi plein écran lorsque l'écran est maximisé" + +msgid "Cursor/Puck" +msgstr "Curseur/Palette" + +msgid "Pen" +msgstr "Stylo" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Lecteur CD/DVD hôte (%1:)" + +msgid "&Connected" +msgstr "&Connecté" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Comportement de rendu" + +msgid "Use target framerate:" +msgstr "Utiliser le taux de rafraîchissement cible:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Impossible de passer au contexte OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "La version 3.0 ou supérieure d'OpenGL est requise. La version actuelle est %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "L'initialisation d'OpenGL a échoué. Erreur %1." + +msgid "Error initializing OpenGL" +msgstr "Erreur d'initialisation d'OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Se rabattre sur le rendu logiciel.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "L'allocation de mémoire pour le tampon de décompression a échoué.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Lors de la sélection d'images multimédia (CD-ROM, disquette, etc.), la boîte de dialogue d'ouverture démarrera dans le même répertoire que le fichier de configuration de 86Box. Ce paramètre ne fera probablement une différence que sur macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Cette machine peut avoir été déplacée ou copiée." + +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 "Afin d'assurer le bon fonctionnement du réseau, 86Box doit savoir si cette machine a été déplacée ou copiée.\n\nSélectionnez « Je l'ai copié » si vous n'êtes pas sûr." + +msgid "I Moved It" +msgstr "Je l'ai déplacé" + +msgid "I Copied It" +msgstr "Je l'ai copié" + +msgid "86Box Monitor #" +msgstr "Moniteur 86Box " + +msgid "No MCA devices." +msgstr "Pas de dispositifs MCA." + +msgid "MiB" +msgstr "Mio" + +msgid "Network Card #1" +msgstr "Carte réseau 1" + +msgid "Network Card #2" +msgstr "Carte réseau 2" + +msgid "Network Card #3" +msgstr "Carte réseau 3" + +msgid "Network Card #4" +msgstr "Carte réseau 4" + +msgid "Mode" +msgstr "Mode" + +msgid "Interface" +msgstr "Interface" + +msgid "Adapter" +msgstr "Adaptateur" + +msgid "VDE Socket" +msgstr "Prise VDE" + +msgid "86Box Unit Tester" +msgstr "Testeur d'unité de 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Carte clé Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Passage du port série 1" + +msgid "Serial port passthrough 2" +msgstr "Passage du port série 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Souris bus Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Souris bus Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Souris série Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Souris série Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Souris série Logitech" + +msgid "PS/2 Mouse" +msgstr "Souris PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (série)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Modem standard conforme à la norme Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Émulation Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Émulation Roland MT-32 (nouveau)" + +msgid "Roland CM-32L Emulation" +msgstr "Émulation Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Émulation Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Carte fille OPL4-ML" + +msgid "System MIDI" +msgstr "MIDI de système" + +msgid "MIDI Input Device" +msgstr "Dispositif d'entrée MIDI" + +msgid "BIOS Address" +msgstr "Adresse BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Activer les écritures au ROM d'extension du BIOS" + +msgid "Address" +msgstr "Adresse" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Révision BIOS" + +msgid "Translate 26 -> 17" +msgstr "Traduire 26 -> 17" + +msgid "Language" +msgstr "Language" + +msgid "Enable backlight" +msgstr "Activer le rétro-éclairage" + +msgid "Invert colors" +msgstr "Inversion des couleurs" + +msgid "BIOS size" +msgstr "Taille du BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapper C0000-C7FFF en tant qu'UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapper C8000-CFFFF en tant qu'UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapper D0000-D7FFF en tant qu'UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapper D8000-DFFFF en tant qu'UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapper E0000-E7FFF en tant qu'UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapper E8000-EFFFF en tant qu'UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Cavalier JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Dispositif de sortie MIDI" + +msgid "MIDI Real time" +msgstr "MIDI en temps réel" + +msgid "MIDI Thru" +msgstr "Passage de la entrée MIDI" + +msgid "MIDI Clockout" +msgstr "Horloge MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Gain sortie" + +msgid "Chorus" +msgstr "Chœur" + +msgid "Chorus Voices" +msgstr "Voix de chœur" + +msgid "Chorus Level" +msgstr "Niveau de chœur" + +msgid "Chorus Speed" +msgstr "Vitesse du chœur" + +msgid "Chorus Depth" +msgstr "Profondeur du chœur" + +msgid "Chorus Waveform" +msgstr "Forme d'onde du chœur" + +msgid "Reverb" +msgstr "Réverbération" + +msgid "Reverb Room Size" +msgstr "Taille de la salle de réverbération" + +msgid "Reverb Damping" +msgstr "Amortissement de réverbération" + +msgid "Reverb Width" +msgstr "Largeur de réverbération" + +msgid "Reverb Level" +msgstr "Niveau de réverbération" + +msgid "Interpolation Method" +msgstr "Méthode d'interpolation" + +msgid "Reverb Output Gain" +msgstr "Gain de sortie de réverbération" + +msgid "Reversed stereo" +msgstr "Stéréo inversée" + +msgid "Nice ramp" +msgstr "Belle rampe" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Boutons" + +msgid "Serial Port" +msgstr "Port série" + +msgid "RTS toggle" +msgstr "Basculement RTS" + +msgid "Revision" +msgstr "Révision" + +msgid "Controller" +msgstr "Contrôleur" + +msgid "Show Crosshair" +msgstr "Afficher le réticule" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Adresse MAC" + +msgid "MAC Address OUI" +msgstr "OUI de adresse MAC" + +msgid "Enable BIOS" +msgstr "Activer BIOS" + +msgid "Baud Rate" +msgstr "Taux de bauds" + +msgid "TCP/IP listening port" +msgstr "Port d'écoute TCP/IP" + +msgid "Phonebook File" +msgstr "Fichier de répertoire" + +msgid "Telnet emulation" +msgstr "Émulation de Telnet" + +msgid "RAM Address" +msgstr "Adresse RAM" + +msgid "RAM size" +msgstr "Taille du RAM" + +msgid "Initial RAM size" +msgstr "Taille initiale du RAM" + +msgid "Serial Number" +msgstr "Numéro de série" + +msgid "Host ID" +msgstr "ID de l'hôte" + +msgid "FDC Address" +msgstr "Adresse FDC" + +msgid "MPU-401 Address" +msgstr "Adresse MPU-401" + +msgid "MPU-401 IRQ" +msgstr "IRQ MPU-401" + +msgid "Receive MIDI input" +msgstr "Réception de l'entrée MIDI" + +msgid "Low DMA" +msgstr "DMA bas" + +msgid "Enable Game port" +msgstr "Activer le port de jeu" + +msgid "Surround module" +msgstr "Module d'ambiance" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Lever l'interruption CODEC lors de la configuration du CODEC (nécessaire pour certains pilotes)" + +msgid "SB Address" +msgstr "Adresse SB" + +msgid "WSS IRQ" +msgstr "IRQ WSS" + +msgid "WSS DMA" +msgstr "DMA WSS" + +msgid "Enable OPL" +msgstr "Activer OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Réception de l'entrée MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "DMA bas SB" + +msgid "6CH variant (6-channel)" +msgstr "Variante 6CH (6 canaux)" + +msgid "Enable CMS" +msgstr "Activer CMS" + +msgid "Mixer" +msgstr "Mixeur" + +msgid "High DMA" +msgstr "DMA haut" + +msgid "Control PC speaker" +msgstr "Contrôler l'haut-parleur du PC" + +msgid "Memory size" +msgstr "Taille de mémoire" + +msgid "EMU8000 Address" +msgstr "Adresse EMU8000" + +msgid "IDE Controller" +msgstr "Contrôleur IDE" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "Type de GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Activer la commande 0x04 « Sortir de 86Box »" + +msgid "Display type" +msgstr "Type d'écran" + +msgid "Composite type" +msgstr "Type de composite" + +msgid "RGB type" +msgstr "Type de RVB" + +msgid "Line doubling type" +msgstr "Type de doublage de ligne" + +msgid "Snow emulation" +msgstr "Émulation de neige" + +msgid "Monitor type" +msgstr "Type de moniteur" + +msgid "Character set" +msgstr "Jeu de caractères" + +msgid "XGA type" +msgstr "Type de XGA" + +msgid "Instance" +msgstr "Instance" + +msgid "MMIO Address" +msgstr "Adresse MMIO" + +msgid "RAMDAC type" +msgstr "Type de RAMDAC" + +msgid "Blend" +msgstr "Mélanger" + +msgid "Bilinear filtering" +msgstr "Filtrage bilinéaire" + +msgid "Dithering" +msgstr "Tramage" + +msgid "Enable NMI for CGA emulation" +msgstr "Activer NMI pour l'émulation CGA" + +msgid "Voodoo type" +msgstr "Type de Voodoo" + +msgid "Framebuffer memory size" +msgstr "Taille de la mémoire du tampon d'images" + +msgid "Texture memory size" +msgstr "Taille de la mémoire des textures" + +msgid "Dither subtraction" +msgstr "Soustraction de tramage" + +msgid "Screen Filter" +msgstr "Filtre d'écran" + +msgid "Render threads" +msgstr "Fils de rendu" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Adresse de départ" + +msgid "Contiguous Size" +msgstr "Taille contiguë" + +msgid "I/O Width" +msgstr "Largeur E/S" + +msgid "Transfer Speed" +msgstr "Vitesse de transfert" + +msgid "EMS mode" +msgstr "Mode EMS" + +msgid "Address for > 2 MB" +msgstr "Adresse pour > 2 MB" + +msgid "Frame Address" +msgstr "Adresse du frame" + +msgid "USA" +msgstr "États-Unis" + +msgid "Danish" +msgstr "Danois" + +msgid "Always at selected speed" +msgstr "Toujours à la vitesse sélectionnée" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Paramètres du BIOS + touches de raccourci (désactivées pendant le POST)" + +msgid "64 kB starting from F0000" +msgstr "64 ko à partir de F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 ko à partir de E0000 (adresse MSB inversée, derniers 64KB en premier)" + +msgid "Sine" +msgstr "Sinusoïdale" + +msgid "Triangle" +msgstr "Triangulaire" + +msgid "Linear" +msgstr "Linéaire" + +msgid "4th Order" +msgstr "4ème ordre" + +msgid "7th Order" +msgstr "7ème ordre" + +msgid "Non-timed (original)" +msgstr "Non temporisé (original)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 non alimenté)" + +msgid "Two" +msgstr "Deux" + +msgid "Three" +msgstr "Trois" + +msgid "Wheel" +msgstr "Molette" + +msgid "Five + Wheel" +msgstr "Cinq + molette" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 série / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) série" + +msgid "8 kB" +msgstr "8 ko" + +msgid "32 kB" +msgstr "32 ko" + +msgid "16 kB" +msgstr "16 ko" + +msgid "64 kB" +msgstr "64 ko" + +msgid "Disable BIOS" +msgstr "Désactiver BIOS" + +msgid "512 kB" +msgstr "512 ko" + +msgid "2 MB" +msgstr "2 Mo" + +msgid "8 MB" +msgstr " 8 Mo" + +msgid "28 MB" +msgstr "28 Mo" + +msgid "1 MB" +msgstr "1 Mo" + +msgid "4 MB" +msgstr "4 Mo" + +msgid "12 MB" +msgstr "12 Mo" + +msgid "16 MB" +msgstr "16 Mo" + +msgid "20 MB" +msgstr "20 Mo" + +msgid "24 MB" +msgstr "24 Mo" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stéréo)" + +msgid "Classic" +msgstr "Classique" + +msgid "256 kB" +msgstr "256 ko" + +msgid "Composite" +msgstr "Composite" + +msgid "Old" +msgstr "Ancien" + +msgid "New" +msgstr "Nouveau" + +msgid "Color (generic)" +msgstr "Couleur (générique)" + +msgid "Green Monochrome" +msgstr "Monochrome vert" + +msgid "Amber Monochrome" +msgstr "Monochrome ambre" + +msgid "Gray Monochrome" +msgstr "Monochrome gris" + +msgid "Color (no brown)" +msgstr "Couleur (sans brun)" + +msgid "Color (IBM 5153)" +msgstr "Couleur (IBM 5153)" + +msgid "Simple doubling" +msgstr "Doublage simple" + +msgid "sRGB interpolation" +msgstr "Interpolation sRVB" + +msgid "Linear interpolation" +msgstr "Interpolation linéairee" + +msgid "128 kB" +msgstr "128 ko" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monochrome (5151/MDA) (blanc)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monochrome (5151/MDA) (vert)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monochrome (5151/MDA) (ambre)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Couler 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Couleur 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Couleur améliorée - Mode normal (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Couleur améliorée - Mode amélioré (5154/ECD)" + +msgid "Green" +msgstr "Vert" + +msgid "Amber" +msgstr "Ambre" + +msgid "Gray" +msgstr "Gris" + +msgid "Color" +msgstr "Couleur" + +msgid "U.S. English" +msgstr "Anglais des États-Unis" + +msgid "Scandinavian" +msgstr "Scandinave" + +msgid "Other languages" +msgstr "Autres langues" + +msgid "Bochs latest" +msgstr "Bochs dernière" + +msgid "Mono Non-Interlaced" +msgstr "Monochrome non entrelacé" + +msgid "Color Interlaced" +msgstr "Couler entrelacé" + +msgid "Color Non-Interlaced" +msgstr "Couleur non entrelacé" + +msgid "3Dfx Voodoo Graphics" +msgstr "Graphique 3dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 unités TMU)" + +msgid "8-bit" +msgstr "8 bits" + +msgid "16-bit" +msgstr "16 bits" + +msgid "Standard (150ns)" +msgstr "Standard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Haute vitesse (120ns)" + +msgid "Enabled" +msgstr "Activé" + +msgid "Standard" +msgstr "Standard" + +msgid "High-Speed" +msgstr "Haute vitesse" + +msgid "Stereo LPT DAC" +msgstr "Convertisseur numérique stéréo LPT" + +msgid "Generic Text Printer" +msgstr "Imprimante de texte générique" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Générique ESC/P à matrice à points" + +msgid "Generic PostScript Printer" +msgstr "Imprimante PostScript générique" + +msgid "Generic PCL5e Printer" +msgstr "Imprimante PCL5e générique" + +msgid "Parallel Line Internet Protocol" +msgstr "Protocole Internet à ligne parallèle" + +msgid "Protection Dongle for Savage Quest" +msgstr "Clé de protection pour Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Dispositif de passage du port série" + +msgid "Passthrough Mode" +msgstr "Mode de passage" + +msgid "Host Serial Device" +msgstr "Dispositif sériel de l'hôte" + +msgid "Name of pipe" +msgstr "Nom du tuyau" + +msgid "Data bits" +msgstr "Bits de données" + +msgid "Stop bits" +msgstr "Bits d'arrêt" + +msgid "Baud Rate of Passthrough" +msgstr "Taux de bauds du passage" + +msgid "Named Pipe (Server)" +msgstr "Tuyau nommé (serveur)" + +msgid "Host Serial Passthrough" +msgstr "Passage du port série de l'hôte" From 15acb728ac609502f05e1052e0f1614f0c1e17a2 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 14 Nov 2024 07:31:05 +0100 Subject: [PATCH 575/624] Catalan fixes and Croatian. --- src/qt/languages/ca-ES.po | 12 +- src/qt/languages/hr-HR.po | 955 +++++++++++++++++++++++++++++++++++++- 2 files changed, 947 insertions(+), 20 deletions(-) diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index f2c21d94b..8a98cccbd 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -1774,7 +1774,7 @@ msgid "Bilinear filtering" msgstr "Filtratge bilineal" msgid "Dithering" -msgstr "Endurir" +msgstr "Dithering" msgid "Enable NMI for CGA emulation" msgstr "Activar NMI per a emulació CGA" @@ -1789,7 +1789,7 @@ msgid "Texture memory size" msgstr "Grandària de memòria de textura" msgid "Dither subtraction" -msgstr "Resta" +msgstr "Sibtracció de dither" msgid "Screen Filter" msgstr "Filtre de pantalla" @@ -1831,19 +1831,19 @@ msgid "Always at selected speed" msgstr "Sempre a la velocitat seleccionada" msgid "BIOS setting + Hotkeys (off during POST)" -msgstr "Configuració de la BIOS + Hotkeys (desactivat durant la publicació)" +msgstr "Configuració de la BIOS + Hotkeys (desactivat durant el POST)" msgid "64 kB starting from F0000" msgstr "64 kB a partir de F0000" msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" -msgstr "128 kB a partir de E0000 (MSG de adreça invertit, els darrers 64KB primer)" +msgstr "128 kB a partir de E0000 (MSB de adreça invertit, els darrers 64KB primer)" msgid "Sine" -msgstr "Cintra" +msgstr "Sinusoidal" msgid "Triangle" -msgstr "Triangle" +msgstr "Triangular" msgid "Linear" msgstr "Lineal" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index eb69971b8..d3506f5aa 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -196,7 +196,7 @@ msgid "Enable &Discord integration" msgstr "Omogući integraciju sa programom &Discord" msgid "Sound &gain..." -msgstr "&Pojačanje zvuka..." +msgstr "&Pojačavanje zvuka..." msgid "Begin trace\tCtrl+T" msgstr "Z&apočni praćenje\tCtrl+T" @@ -390,8 +390,11 @@ msgstr "Dinamički rekompilator" msgid "Video:" msgstr "Video:" -msgid "Voodoo Graphics" -msgstr "Voodoo grafika" +msgid "Video #2:" +msgstr "Video 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 ili 2 grafika" msgid "IBM 8514/A Graphics" msgstr "IBM 8514/A grafika" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Fatalna greška" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - ZASTAO" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Pritisnite Ctrl+Alt+PgDn za povratak u prozorski način rada." @@ -684,6 +687,9 @@ msgstr "Sistem \"%hs\" nije dostupan jer ne postoje potrebni ROM-ovi u mapu roms msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Video kartica \"%hs\" nije dostupna jer ne postoje potrebni ROM-ovi u mapu roms/video. Prebacivanje na dostupnu video karticu." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Video kartica 2 \"%hs\" nije dostupna jer ne postoje potrebni ROM-ovi u mapu roms/video. Prebacivanje na dostupnu video karticu." + msgid "Machine" msgstr "Sistem" @@ -762,17 +768,26 @@ msgstr "Nema PCap uređaja" msgid "Invalid PCap device" msgstr "Nevažeći PCap uređaj" -msgid "Standard 2-button joystick(s)" -msgstr "Standardna palica za igru s 2 tipke" +msgid "2-axis, 2-button joystick(s)" +msgstr "Palica za igru s 2 osi, 2 tipke" -msgid "Standard 4-button joystick" -msgstr "Standardna palica za igru s 4 tipke" +msgid "2-axis, 4-button joystick" +msgstr "Palica za igru s 2 osi, 4 tipke" -msgid "Standard 6-button joystick" -msgstr "Standardna palica za igru s 6 tipke" +msgid "2-axis, 6-button joystick" +msgstr "Palica za igru s 2 osi, 6 tipke" -msgid "Standard 8-button joystick" -msgstr "Standardna palica za igru s 8 tipke" +msgid "2-axis, 8-button joystick" +msgstr "Palica za igru s 2 osi, 8 tipke" + +msgid "3-axis, 2-button joystick(s)" +msgstr "Palica za igru s 3 osi, 2 tipke" + +msgid "3-axis, 4-button joystick" +msgstr "Palica za igru s 3 osi, 4 tipke" + +msgid "4-axis, 4-button joystick" +msgstr "Palica za igru s 4 osi, 4 tipke" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Jeste li sigurni da želite zatvoriti 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Nevažeća konfiguracija" 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 je potrebno za automatsku konverziju PostScript datoteke u PDF datoteke.\n\nSvi dokumenti poslani na generički PostScript pisač bit će spremljeni kao PostScript (.ps) datoteke." +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 je potrebno za automatsku konverziju PCL datoteke u PDF datoteke.\n\nSvi dokumenti poslani na generički PCL pisač bit će spremljeni kao Printer Command Language (.pcl) datoteke." + msgid "Entering fullscreen mode" msgstr "Ulazim u cijelozaslonski način" @@ -999,6 +1020,27 @@ msgstr "Prepiši" msgid "Don't overwrite" msgstr "Ne prepiši" +msgid "Raw image" +msgstr "Slika neobrađenih podataka" + +msgid "HDI image" +msgstr "HDI slika" + +msgid "HDX image" +msgstr "HDX slika" + +msgid "Fixed-size VHD" +msgstr "VHD fiksne veličine" + +msgid "Dynamic-size VHD" +msgstr "VHD dinamičke veličine" + +msgid "Differencing VHD" +msgstr "Različiti VHD" + +msgid "(N/A)" +msgstr "(Bez)" + msgid "Raw image (.img)" msgstr "Slika neobrađenih podataka (.img)" @@ -1168,7 +1210,892 @@ msgid "&Auto-pause on focus loss" msgstr "&Automatska pauza pri gubitku fokusa" msgid "WinBox is no longer supported" -msgstr "WinBox is no longer supported" +msgstr "WinBox seviše ne podržava" 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 behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." +msgstr "Razvoj menadžera WinBox zaustavio se 2022. zbog nedostatka održavača. Dok usmjeravamo svoje napore, da 86Box bude još bolji, odlučili smo se, da više ne podržavmo Winbox kao menadžer.\n\nDaljnja ažuriranja neće bit više osigurana putem WinBox-a i možete naići na pogrešno ponašanje ako ga nastavite koristiti s novijim verzijama 86Box-a. Sva izvješća o pogreškama u vezi s ponašanjem WinBox-a bit će zatvorena kao nevaljana.\n\nZa popis drugih menadžera koje možete koristiti, idite na 86box.net." + +msgid "Generate" +msgstr "Generiraj" + +msgid "Joystick configuration" +msgstr "Konfiguracija palice za igru" + +msgid "Device" +msgstr "Uređaj" + +msgid "%1 (X axis)" +msgstr "%1 (os X)" + +msgid "%1 (Y axis)" +msgstr "%1 (os Y)" + +msgid "MCA devices" +msgstr "Uređaji MCA" + +msgid "List of MCA devices:" +msgstr "Spisak uređaja MCA:" + +msgid "Tablet tool" +msgstr "Alat za tablet" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "O programu Qt" + +msgid "MCA devices..." +msgstr "Uređaji MCA ..." + +msgid "Show non-primary monitors" +msgstr "Prikaži neprimarne monitore" + +msgid "Open screenshots folder..." +msgstr "Otvori mapu snimaka zaslona..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Primijeni način cijelozaslonskog rastezanja u maksimiziranom načinu" + +msgid "Cursor/Puck" +msgstr "Kursor/Pak" + +msgid "Pen" +msgstr "Olovka" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "CD/DVD pogon nositelja (%1:)" + +msgid "&Connected" +msgstr "&Povezan" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Ponašanje rendera" + +msgid "Use target framerate:" +msgstr "Koristi ciljni broj okvira u sekundi:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Nije se moguće prebaciti na kontekst OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Potrebna je OpenGL verzija 3.0 ili više. Trenutna verzija je %1. %2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Nije moguće inicijalizirati OpenGL. Greška %1." + +msgid "Error initializing OpenGL" +msgstr "Nije moguće inicijalizirati OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Vraća se na softverski renderer.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Nije moguće idodijeliti memoriju za međuspremnik za raspakiranje.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Prilikom odabira medijskih slika (CD-ROM, diskete itd.), otvoreni dijalog zopočet će u istom direktoriju kao i konfiguracijska datoteka 86Box-a. Razlika će vjerojatno biti primjetna samo na macOS-u.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Ovaj je sistem mogao biti premješten ili kopiran." + +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 "Kako bi se osigurala pravilna funkcionalnost mreže, 86Box mora znati, je li ovaj sistem bio premješten ili kopiran.\n\nAko niste sigurni, odaberite \"Kopirao sam ga\"." + +msgid "I Moved It" +msgstr "Premjestio sam ga" + +msgid "I Copied It" +msgstr "Kopirao sam ga" + +msgid "86Box Monitor #" +msgstr "Monitor 86Box-a " + +msgid "No MCA devices." +msgstr "Nema uređaja MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Mrežna kartica 1" + +msgid "Network Card #2" +msgstr "Mrežna kartica 2" + +msgid "Network Card #3" +msgstr "Mrežna kartica 3" + +msgid "Network Card #4" +msgstr "Mrežna kartica 4" + +msgid "Mode" +msgstr "Način" + +msgid "Interface" +msgstr "Sučelje" + +msgid "Adapter" +msgstr "Adapter" + +msgid "VDE Socket" +msgstr "VDE utičnica" + +msgid "86Box Unit Tester" +msgstr "Jedinični ispitivač 86Box-a" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Kjučna kartica za Novell Netware 2.x" + +msgid "Serial port passthrough 1" +msgstr "Prolaz serijskih vrata 1" + +msgid "Serial port passthrough 2" +msgstr "Prolaz serijskih vrata 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Sabirnički miš Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Sabirnički miš Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Serijski miš Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Serijski miš Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Serijski miš Logitech" + +msgid "PS/2 Mouse" +msgstr "Miš PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (serijski)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Standardni modem, usklađen s standardom Hayesom" + +msgid "Roland MT-32 Emulation" +msgstr "Emulacija Rolanda MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulacija Rolanda MT-32 (novog)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulacija Rolanda CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulacija Rolanda CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Kartica kćerka OPL4-ML" + +msgid "System MIDI" +msgstr "Sistemski MIDI" + +msgid "MIDI Input Device" +msgstr "Ulazni uređaj MIDI" + +msgid "BIOS Address" +msgstr "Adresa BIOS-a" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Omogući pisanje u ROM proširenja BIOS-a" + +msgid "Address" +msgstr "Adresa" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revizija BIOS-a" + +msgid "Translate 26 -> 17" +msgstr "Prevedi 26 -> 17" + +msgid "Language" +msgstr "Jezik" + +msgid "Enable backlight" +msgstr "Omogući pozadinsko osvjetljenje" + +msgid "Invert colors" +msgstr "Invertiraj boje" + +msgid "BIOS size" +msgstr "Veličina BIOS-a" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapiraj C0000-C7FFF kao UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapiraj C8000-CFFFF kao UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapiraj D0000-D7FFF kao UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapiraj D8000-DFFFF kao UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapiraj E0000-E7FFF kao UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapiraj E8000-EFFFF kao UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Džemper JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Izlazni uređaj MIDI" + +msgid "MIDI Real time" +msgstr "MIDI u realnom vremenu" + +msgid "MIDI Thru" +msgstr "Prolaz ulaza MIDI" + +msgid "MIDI Clockout" +msgstr "Taktovit MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Pojačavanje izlaza" + +msgid "Chorus" +msgstr "Zbor" + +msgid "Chorus Voices" +msgstr "Glasovi zbora" + +msgid "Chorus Level" +msgstr "Nivo zbora" + +msgid "Chorus Speed" +msgstr "Brzina zbora" + +msgid "Chorus Depth" +msgstr "Dubina zbora" + +msgid "Chorus Waveform" +msgstr "Valni oblik zbora" + +msgid "Reverb" +msgstr "Odjek" + +msgid "Reverb Room Size" +msgstr "Veličina sobe odjeka" + +msgid "Reverb Damping" +msgstr "Prigušivanje odjeka" + +msgid "Reverb Width" +msgstr "Širina odjeka" + +msgid "Reverb Level" +msgstr "Nivo odjeka" + +msgid "Interpolation Method" +msgstr "Metoda interpolacije" + +msgid "Reverb Output Gain" +msgstr "Pojačavanje izlaza odjeka" + +msgid "Reversed stereo" +msgstr "Obrnuti stereo" + +msgid "Nice ramp" +msgstr "Lijepa rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Gumbi" + +msgid "Serial Port" +msgstr "Serijska vrata" + +msgid "RTS toggle" +msgstr "Prebacivanje RTS" + +msgid "Revision" +msgstr "Revizija" + +msgid "Controller" +msgstr "Kontroler" + +msgid "Show Crosshair" +msgstr "Pokaži nišanski kursor" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Adresa MAC" + +msgid "MAC Address OUI" +msgstr "OUI adrese MAC" + +msgid "Enable BIOS" +msgstr "Omogući BIOS" + +msgid "Baud Rate" +msgstr "Baudova brzina" + +msgid "TCP/IP listening port" +msgstr "Port za slušanje TCP/IP" + +msgid "Phonebook File" +msgstr "Datoteka telefonskog imenika" + +msgid "Telnet emulation" +msgstr "Emulacija Telneta" + +msgid "RAM Address" +msgstr "Adresa RAM-a" + +msgid "RAM size" +msgstr "Veličina RAM-a" + +msgid "Initial RAM size" +msgstr "Početna veličina RAM-a" + +msgid "Serial Number" +msgstr "Serijski broj" + +msgid "Host ID" +msgstr "ID nositelja" + +msgid "FDC Address" +msgstr "Adresa FDC-a" + +msgid "MPU-401 Address" +msgstr "Adresa MPU-401-a" + +msgid "MPU-401 IRQ" +msgstr "IRQ MPU-401-a" + +msgid "Receive MIDI input" +msgstr "Primaj ulaz MIDI" + +msgid "Low DMA" +msgstr "Niski DMA" + +msgid "Enable Game port" +msgstr "Omogoći vrata za igru" + +msgid "Surround module" +msgstr "Modul Surround" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Podigni prekid CODEC na postavljanju CODEC-a (potrebno nekim upravljačkim programima)" + +msgid "SB Address" +msgstr "Adresa SB-a" + +msgid "WSS IRQ" +msgstr "IRQ WSS-a" + +msgid "WSS DMA" +msgstr "DMA WSS-a" + +msgid "Enable OPL" +msgstr "Omogući OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Primaj ulaz MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "Niski DMA SB-a" + +msgid "6CH variant (6-channel)" +msgstr "Varianta 6CH (6 kanala)" + +msgid "Enable CMS" +msgstr "Omogući CMS" + +msgid "Mixer" +msgstr "Mikser" + +msgid "High DMA" +msgstr "Visoki DMA" + +msgid "Control PC speaker" +msgstr "Kontroliraj zvučnik računala" + +msgid "Memory size" +msgstr "Veličina memorije" + +msgid "EMU8000 Address" +msgstr "Adresa EMU8000-a" + +msgid "IDE Controller" +msgstr "Kontroler IDE" + +msgid "Codec" +msgstr "Kodek" + +msgid "GUS type" +msgstr "Vrsta GUS-a" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Omogući naredbu 0x04 \"Izlazi iz 86Box-a\"" + +msgid "Display type" +msgstr "Vrsta zaslona" + +msgid "Composite type" +msgstr "Vrsta kompozitnog zaslona" + +msgid "RGB type" +msgstr "Vrsta zaslona RGB" + +msgid "Line doubling type" +msgstr "Vrsta udvostručenja linija" + +msgid "Snow emulation" +msgstr "Emulacija snijega" + +msgid "Monitor type" +msgstr "Vrsta monitora" + +msgid "Character set" +msgstr "Set znakova" + +msgid "XGA type" +msgstr "Vrsta kartice XGA" + +msgid "Instance" +msgstr "Primjer" + +msgid "MMIO Address" +msgstr "Adresa MMIO-a" + +msgid "RAMDAC type" +msgstr "Vrsta RAMDAC-a" + +msgid "Blend" +msgstr "Miješaj" + +msgid "Bilinear filtering" +msgstr "Bilinearno filtriranje" + +msgid "Dithering" +msgstr "Podrhtavanje" + +msgid "Enable NMI for CGA emulation" +msgstr "Omogući NMI za emulaciju CGA" + +msgid "Voodoo type" +msgstr "Vrsta kartice Voodoo" + +msgid "Framebuffer memory size" +msgstr "Veličina memorije za framebuffer" + +msgid "Texture memory size" +msgstr "Veličina memorije za teksturu" + +msgid "Dither subtraction" +msgstr "Oduzivanje podrhtaja" + +msgid "Screen Filter" +msgstr "Filtar zaslona" + +msgid "Render threads" +msgstr "Niti za render" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Početna adresa" + +msgid "Contiguous Size" +msgstr "Susjedna veličina" + +msgid "I/O Width" +msgstr "Širina I/O" + +msgid "Transfer Speed" +msgstr "Brzina prijenosa" + +msgid "EMS mode" +msgstr "Načina EMS" + +msgid "Address for > 2 MB" +msgstr "Adresa za > 2 MB" + +msgid "Frame Address" +msgstr "Adresa za frame" + +msgid "USA" +msgstr "SAD" + +msgid "Danish" +msgstr "Danski" + +msgid "Always at selected speed" +msgstr "Uvijek na odabranoj brzini" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Konfiguracija BIOS-a + Tipkovni prečaci (onemogućeni tekom POST-a)" + +msgid "64 kB starting from F0000" +msgstr "64 kB od F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB od E0000 (MSB adrese invertiran, poslednjih 64KB prvo)" + +msgid "Sine" +msgstr "Sinusni" + +msgid "Triangle" +msgstr "Trokutni" + +msgid "Linear" +msgstr "Linearni" + +msgid "4th Order" +msgstr "4. red" + +msgid "7th Order" +msgstr "7. red" + +msgid "Non-timed (original)" +msgstr "Bez tajmera (originalni)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 prazan)" + +msgid "Two" +msgstr "Dva" + +msgid "Three" +msgstr "Tri" + +msgid "Wheel" +msgstr "Kotač" + +msgid "Five + Wheel" +msgstr "Pet + kotač" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 serijski / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) serijski" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Onemogući BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr " 8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klasičan" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Kompozitni" + +msgid "Old" +msgstr "Stara" + +msgid "New" +msgstr "Nova" + +msgid "Color (generic)" +msgstr "Bojni (generični)" + +msgid "Green Monochrome" +msgstr "Crno-bijeli zeleni" + +msgid "Amber Monochrome" +msgstr "Crno-bijeli jantarni" + +msgid "Gray Monochrome" +msgstr "Crno-biljeli sivi" + +msgid "Color (no brown)" +msgstr "Bojni (bez smeđe)" + +msgid "Color (IBM 5153)" +msgstr "Bojni (IBM 5153)" + +msgid "Simple doubling" +msgstr "Jednostavno udvostručenje" + +msgid "sRGB interpolation" +msgstr "Interpolacija sRGB" + +msgid "Linear interpolation" +msgstr "Linearna interpolacija" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Crno-biljeli (5151/MDA) (bijeli)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Crno-biljeli (5151/MDA) (zeleni)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Crno-biljeli (5151/MDA) (jantarni)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Bojni 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Bojni 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Bojni pojačani - normalni način (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Bojni pojačani - pojačani način (5154/ECD)" + +msgid "Green" +msgstr "Zelena" + +msgid "Amber" +msgstr "Jantarna" + +msgid "Gray" +msgstr "Siva" + +msgid "Color" +msgstr "Bojna" + +msgid "U.S. English" +msgstr "Američki engleski" + +msgid "Scandinavian" +msgstr "Skandinavski" + +msgid "Other languages" +msgstr "Ostali jezici" + +msgid "Bochs latest" +msgstr "Bochs poslednji" + +msgid "Mono Non-Interlaced" +msgstr "Crno-biljeli bez preplitanja" + +msgid "Color Interlaced" +msgstr "Bojni s preplitanjem" + +msgid "Color Non-Interlaced" +msgstr "Bojni bez preplitanja" + +msgid "3Dfx Voodoo Graphics" +msgstr "3dfx Voodoo grafika" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 jednote TMU)" + +msgid "8-bit" +msgstr "8-bitna" + +msgid "16-bit" +msgstr "16-bitna" + +msgid "Standard (150ns)" +msgstr "Standardna (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Visoka brzina (120ns)" + +msgid "Enabled" +msgstr "Omogoći" + +msgid "Standard" +msgstr "Standardna" + +msgid "High-Speed" +msgstr "Visoka brzina" + +msgid "Stereo LPT DAC" +msgstr "Stereo DAC za LPT" + +msgid "Generic Text Printer" +msgstr "Generični tekstovni pisač" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Generični matrični ESC/P" + +msgid "Generic PostScript Printer" +msgstr "Generični pisač PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Generični pisač PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Internet protokol za paralelnu liniju" + +msgid "Protection Dongle for Savage Quest" +msgstr "Zaštitni uređaj za Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Uređaj prolaza serijskih vrata" + +msgid "Passthrough Mode" +msgstr "Način prolaza" + +msgid "Host Serial Device" +msgstr "Serijska vrata nositelja" + +msgid "Name of pipe" +msgstr "Ime voda" + +msgid "Data bits" +msgstr "Bitovi podataka" + +msgid "Stop bits" +msgstr "Stop bitovi" + +msgid "Baud Rate of Passthrough" +msgstr "Baudova brzina prolaza" + +msgid "Named Pipe (Server)" +msgstr "Imenovani vod (server)" + +msgid "Host Serial Passthrough" +msgstr "Prolaz serijskih vrata nositelja" From 1b9949c4e2d95d1cd21638960025970e782aaf15 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 01:07:41 +0100 Subject: [PATCH 576/624] Hungarian, Italian, Japanese, Korean, and Polish. --- src/qt/languages/hu-HU.po | 951 ++++++++++++++++++++++++++++++++++++- src/qt/languages/it-IT.po | 952 +++++++++++++++++++++++++++++++++++++- src/qt/languages/ja-JP.po | 947 ++++++++++++++++++++++++++++++++++++- src/qt/languages/ko-KR.po | 949 ++++++++++++++++++++++++++++++++++++- src/qt/languages/pl-PL.po | 951 ++++++++++++++++++++++++++++++++++++- 5 files changed, 4691 insertions(+), 59 deletions(-) diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index ac088e148..96f5260ee 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -259,7 +259,7 @@ msgid "Target &framerate" msgstr "Cél &képkockasebesség" msgid "&Sync with video" -msgstr "&Szinkronizálás a videóval " +msgstr "&Szinkronizálás a videóval" msgid "&25 fps" msgstr "&25 fps" @@ -390,8 +390,11 @@ msgstr "Dinamikus újrafordítás" msgid "Video:" msgstr "Videokártya:" -msgid "Voodoo Graphics" -msgstr "Voodoo-gyorsítókártya" +msgid "Video #2:" +msgstr "Videokártya 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 vagy 2-gyorsítókártya" msgid "IBM 8514/A Graphics" msgstr "IBM 8514/A-gyorsítókártya" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Végzetes hiba" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - SZÜNETELT" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Használja a Ctrl+Alt+PgDn gombokat az ablakhoz való visszatéréshez." @@ -684,6 +687,9 @@ msgstr "A számítógép \"%hs\" nem elérhető a \"roms/machines\" mappából h msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "A videokártya \"%hs\" nem elérhető a \"roms/video\" mappából hiányzó ROM-képek miatt. Ehelyett egy másik kártya kerül futtatásra." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "A videokártya 2 \"%hs\" nem elérhető a \"roms/video\" mappából hiányzó ROM-képek miatt. Ehelyett egy másik kártya kerül futtatásra." + msgid "Machine" msgstr "Számítógép" @@ -762,17 +768,26 @@ msgstr "Nem találhatóak PCap eszközök" msgid "Invalid PCap device" msgstr "Érvénytelen PCap eszköz" -msgid "Standard 2-button joystick(s)" -msgstr "Szabványos 2-gombos játékvezérlő(k)" +msgid "2-axis, 2-button joystick(s)" +msgstr "2-tengelyes, 2-gombos játékvezérlő(k)" -msgid "Standard 4-button joystick" -msgstr "Szabványos 4-gombos játékvezérlő" +msgid "2-axis, 4-button joystick" +msgstr "2-tengelyes, 4-gombos játékvezérlő" -msgid "Standard 6-button joystick" -msgstr "Szabványos 6-gombos játékvezérlő" +msgid "2-axis, 6-button joystick" +msgstr "2-tengelyes, 6-gombos játékvezérlő" -msgid "Standard 8-button joystick" -msgstr "Szabványos 8-gombos játékvezérlő" +msgid "2-axis, 8-button joystick" +msgstr "2-tengelyes, 8-gombos játékvezérlő" + +msgid "3-axis, 2-button joystick(s)" +msgstr "3-tengelyes, 2-gombos játékvezérlő(k)" + +msgid "3-axis, 4-button joystick" +msgstr "3-tengelyes, 4-gombos játékvezérlő" + +msgid "4-axis, 4-button joystick" +msgstr "4-tengelyes, 4-gombos játékvezérlő" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Biztos benne, hogy ki szeretne lépni a 86Box-ból?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Érvénytelen konfiguráció" 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 szükséges a PostScript fájlok PDF formátumba való automatikus konvertálásához.\n\nAz általános PostScript nyomtatóra küldött dokumentumok PostScript (.ps) fájlként kerülnek mentésre." +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 Lnaugage (.pcl) files." +msgstr "%1 szükséges a PCL fájlok PDF formátumba való automatikus konvertálásához.\n\nAz általános PCL nyomtatóra küldött dokumentumok Printer Command Language (.pcl) fájlként kerülnek mentésre." + msgid "Entering fullscreen mode" msgstr "Teljes képernyős módra váltás" @@ -999,6 +1020,27 @@ msgstr "Felülírás" msgid "Don't overwrite" msgstr "Ne írja felül" +msgid "Raw image" +msgstr "Nyers lemezkép" + +msgid "HDI image" +msgstr "HDI-lemezkép" + +msgid "HDX image" +msgstr "HDX-lemezkép" + +msgid "Fixed-size VHD" +msgstr "Rögzített méretű VHD" + +msgid "Dynamic-size VHD" +msgstr "Dinamikusan bővülő VHD" + +msgid "Differencing VHD" +msgstr "Különbség-VHD" + +msgid "(N/A)" +msgstr "(Nincs)" + msgid "Raw image (.img)" msgstr "Nyers lemezkép (.img)" @@ -1172,3 +1214,888 @@ msgstr "A WinBox már nem támogatott" 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 "A WinBox menedzser fejlesztése 2022-ben leállt karbantartók hiányában. Mivel erőfeszítéseinket a 86Box még jobbá tételére irányítjuk, úgy döntöttünk, hogy a WinBox-ot mint menedzsert nem támogatjuk tovább.\n\nA WinBoxon keresztül nem lesznek további frissítések, és hibás viselkedéssel találkozhat, ha továbbra is a 86Box újabb verzióival használja. A WinBox viselkedésével kapcsolatos hibajelentéseket érvénytelennek nyilvánítjuk.\n\nA 86box.net oldalon talál egy listát más kezelőkről, amelyeket használhat." + +msgid "Generate" +msgstr "Generálja" + +msgid "Joystick configuration" +msgstr "Joystick konfiguráció" + +msgid "Device" +msgstr "Eszköz" + +msgid "%1 (X axis)" +msgstr "%1 (X tengely)" + +msgid "%1 (Y axis)" +msgstr "%1 (Y tengely)" + +msgid "MCA devices" +msgstr "MCA eszközök" + +msgid "List of MCA devices:" +msgstr "Az MCA-eszközök listája:" + +msgid "Tablet tool" +msgstr "Tablet eszköz" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "A Qt-ről" + +msgid "MCA devices..." +msgstr "MCA eszközök..." + +msgid "Show non-primary monitors" +msgstr "Nem elsődleges monitorok megjelenítése" + +msgid "Open screenshots folder..." +msgstr "Nyissa meg a képernyőképek mappát..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Teljes képernyős méretezés alkalmazása maximalizáláskor" + +msgid "Cursor/Puck" +msgstr "Cursor/Puck" + +msgid "Pen" +msgstr "Toll" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Gazdag CD/DVD-meghajtó (%1:)" + +msgid "&Connected" +msgstr "&Connected" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Renderelési viselkedés" + +msgid "Use target framerate:" +msgstr "Cél képkockasebesség használata:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Nem tudott OpenGL-kontextusra váltani." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Az OpenGL 3.0 vagy magasabb verziója szükséges. Az aktuális verzió %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Az OpenGL inicializálása sikertelen. Hiba %1." + +msgid "Error initializing OpenGL" +msgstr "Hiba az OpenGL inicializálásában" + +msgid "Falling back to software rendering.\n" +msgstr "Visszatérés a szoftveres rendereléshez.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "A memória kiosztása a kicsomagolási pufferhez sikertelen.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>A médiaképek (CD-ROM, floppy stb.) kiválasztásakor a megnyitási párbeszédpanel ugyanabban a könyvtárban indul, mint a 86Box konfigurációs fájl. Ez a beállítás valószínűleg csak a macOS rendszerben jelent különbséget.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Lehet, hogy ezt a gépet áthelyezték vagy lemásolták." + +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 "A megfelelő hálózati működés biztosítása érdekében a 86Box-nak tudnia kell, hogy a gépet áthelyezték vagy másolták-e.\n\nVálassza a \"Lemásoltam\" lehetőséget, ha nem biztos benne." + +msgid "I Moved It" +msgstr "Elmozdítottam" + +msgid "I Copied It" +msgstr "Lemásoltam" + +msgid "86Box Monitor #" +msgstr "86Box Monitor " + +msgid "No MCA devices." +msgstr "Nincsenek MCA eszközök." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Hálózati kártya 1" + +msgid "Network Card #2" +msgstr "Hálózati kártya 2" + +msgid "Network Card #3" +msgstr "Hálózati kártya 3" + +msgid "Network Card #4" +msgstr "Hálózati kártya 4" + +msgid "Mode" +msgstr "Mód" + +msgid "Interface" +msgstr "Interfész" + +msgid "Adapter" +msgstr "Adapter" + +msgid "VDE Socket" +msgstr "VDE aljzat" + +msgid "86Box Unit Tester" +msgstr "86Box Unit Tester" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x kulcskártya" + +msgid "Serial port passthrough 1" +msgstr "Soros port áthaladás 1" + +msgid "Serial port passthrough 2" +msgstr "Soros port áthaladás 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft busz egér" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft buszos egér (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Egérrendszerek Soros egér" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft soros egér" + +msgid "Logitech Serial Mouse" +msgstr "Logitech soros egér" + +msgid "PS/2 Mouse" +msgstr "PS/2 egér" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (soros)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Szabványos Hayes-kompatibilis modem" + +msgid "Roland MT-32 Emulation" +msgstr "Roland MT-32 emuláció" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Roland MT-32 (Új) Emuláció" + +msgid "Roland CM-32L Emulation" +msgstr "Roland CM-32L emuláció" + +msgid "Roland CM-32LN Emulation" +msgstr "Roland CM-32LN emuláció" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML alaplap" + +msgid "System MIDI" +msgstr "Rendszer MIDI" + +msgid "MIDI Input Device" +msgstr "MIDI bemeneti eszköz" + +msgid "BIOS Address" +msgstr "BIOS cím" + +msgid "Enable BIOS extension ROM Writes" +msgstr "BIOS bővítés ROM írások engedélyezése" + +msgid "Address" +msgstr "Cím:" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS felülvizsgálata" + +msgid "Translate 26 -> 17" +msgstr "Fordítsd le 26 -> 17" + +msgid "Language" +msgstr "Nyelv" + +msgid "Enable backlight" +msgstr "Háttérvilágítás engedélyezése" + +msgid "Invert colors" +msgstr "Invertált színek" + +msgid "BIOS size" +msgstr "BIOS mérete" + +msgid "Map C0000-C7FFF as UMB" +msgstr "C0000-C7FFF mint UMB leképezése" + +msgid "Map C8000-CFFFF as UMB" +msgstr "C8000-CFFFF mint UMB leképezése" + +msgid "Map D0000-D7FFF as UMB" +msgstr "D0000-D7FFF mint UMB leképezése" + +msgid "Map D8000-DFFFF as UMB" +msgstr "D8000-DFFFF mint UMB leképezése" + +msgid "Map E0000-E7FFF as UMB" +msgstr "E0000-E7FFF mint UMB leképezése" + +msgid "Map E8000-EFFFF as UMB" +msgstr "E8000-EFFFF mint UMB leképezése" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 Jumper (JIM)" + +msgid "MIDI Output Device" +msgstr "MIDI kimeneti eszköz" + +msgid "MIDI Real time" +msgstr "MIDI Valós idő" + +msgid "MIDI Thru" +msgstr "A MIDI bemenet átmenete" + +msgid "MIDI Clockout" +msgstr "A MIDI óra kimenete" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Kimeneti erősítés" + +msgid "Chorus" +msgstr "Kórus" + +msgid "Chorus Voices" +msgstr "Kórus hangok" + +msgid "Chorus Level" +msgstr "Kórus szint" + +msgid "Chorus Speed" +msgstr "Kórus sebesség" + +msgid "Chorus Depth" +msgstr "Kórus mélység" + +msgid "Chorus Waveform" +msgstr "Kórus hullámforma" + +msgid "Reverb" +msgstr "Visszhang" + +msgid "Reverb Room Size" +msgstr "Visszhangterem mérete" + +msgid "Reverb Damping" +msgstr "Visszhang csillapítás" + +msgid "Reverb Width" +msgstr "Visszhang szélessége" + +msgid "Reverb Level" +msgstr "Visszhang szint" + +msgid "Interpolation Method" +msgstr "Interpolációs módszer" + +msgid "Reverb Output Gain" +msgstr "Visszhang kimenetének erősítése" + +msgid "Reversed stereo" +msgstr "Fordított sztereó" + +msgid "Nice ramp" +msgstr "Szép rámpa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Gombok" + +msgid "Serial Port" +msgstr "Soros port" + +msgid "RTS toggle" +msgstr "RTS kapcsoló" + +msgid "Revision" +msgstr "Felülvizsgálat" + +msgid "Controller" +msgstr "Vezérlő" + +msgid "Show Crosshair" +msgstr "Keresztmetszet megjelenítése" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC cím" + +msgid "MAC Address OUI" +msgstr "MAC cím OUI" + +msgid "Enable BIOS" +msgstr "BIOS engedélyezése" + +msgid "Baud Rate" +msgstr "Baud-ráta" + +msgid "TCP/IP listening port" +msgstr "TCP/IP figyelő port" + +msgid "Phonebook File" +msgstr "Telefonkönyv fájl" + +msgid "Telnet emulation" +msgstr "Telnet emuláció" + +msgid "RAM Address" +msgstr "RAM cím" + +msgid "RAM size" +msgstr "RAM mérete" + +msgid "Initial RAM size" +msgstr "RAM kezdeti mérete" + +msgid "Serial Number" +msgstr "Sorszám" + +msgid "Host ID" +msgstr "Host azonosító" + +msgid "FDC Address" +msgstr "FDC cím" + +msgid "MPU-401 Address" +msgstr "MPU-401 cím" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "MIDI bemenet fogadása" + +msgid "Low DMA" +msgstr "Alacsony DMA" + +msgid "Enable Game port" +msgstr "Játékport engedélyezése" + +msgid "Surround module" +msgstr "Surround modul" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "CODEC megszakítás felemelése CODEC beállításakor (néhány illesztőprogramnak szükséges)" + +msgid "SB Address" +msgstr "SB cím" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "OPL engedélyezése" + +msgid "Receive MIDI input (MPU-401)" +msgstr "MIDI bemenet fogadása (MPU-401)" + +msgid "SB low DMA" +msgstr "SB alacsony DMA" + +msgid "6CH variant (6-channel)" +msgstr "6CH változat (6 csatornás)" + +msgid "Enable CMS" +msgstr "CMS engedélyezése" + +msgid "Mixer" +msgstr "Keverő" + +msgid "High DMA" +msgstr "Magas DMA" + +msgid "Control PC speaker" +msgstr "Control PC hangszóró" + +msgid "Memory size" +msgstr "Memória mérete" + +msgid "EMU8000 Address" +msgstr "EMU8000 cím" + +msgid "IDE Controller" +msgstr "IDE vezérlő" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "GUS típus" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "A 0x04 parancs engedélyezése \"Lépni a 86Box-ból\"" + +msgid "Display type" +msgstr "Megjelenítés típusa" + +msgid "Composite type" +msgstr "Összetett típus" + +msgid "RGB type" +msgstr "RGB típus" + +msgid "Line doubling type" +msgstr "Vonal megduplázásának típusa" + +msgid "Snow emulation" +msgstr "Hó emulációja" + +msgid "Monitor type" +msgstr "Monitor típusa" + +msgid "Character set" +msgstr "Karakterkészlet" + +msgid "XGA type" +msgstr "XGA típus" + +msgid "Instance" +msgstr "Példa" + +msgid "MMIO Address" +msgstr "MMIO cím" + +msgid "RAMDAC type" +msgstr "RAMDAC típus" + +msgid "Blend" +msgstr "Blend" + +msgid "Bilinear filtering" +msgstr "Bilineáris szűrés" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "NMI engedélyezése a CGA emulációhoz" + +msgid "Voodoo type" +msgstr "Voodoo típus" + +msgid "Framebuffer memory size" +msgstr "A keretpuffer memória mérete" + +msgid "Texture memory size" +msgstr "Textúra memória mérete" + +msgid "Dither subtraction" +msgstr "Dither kivonás" + +msgid "Screen Filter" +msgstr "Szűrő szűrő" + +msgid "Render threads" +msgstr "Renderelési szálak" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Kezdeti cím" + +msgid "Contiguous Size" +msgstr "Összefüggő méret" + +msgid "I/O Width" +msgstr "I/O szélesség" + +msgid "Transfer Speed" +msgstr "Átviteli sebesség" + +msgid "EMS mode" +msgstr "EMS üzemmód" + +msgid "Address for > 2 MB" +msgstr "Cím > 2 MB" + +msgid "Frame Address" +msgstr "Keret címe" + +msgid "USA" +msgstr "USA" + +msgid "Danish" +msgstr "Dán" + +msgid "Always at selected speed" +msgstr "Mindig a kiválasztott sebességen" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS beállítás + gyorsbillentyűk (kikapcsolva POST alatt)" + +msgid "64 kB starting from F0000" +msgstr "64 kB F0000-től kezdődően" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB E0000-től kezdődően (cím MSB invertálva, először az utolsó 64KB)" + +msgid "Sine" +msgstr "Sine" + +msgid "Triangle" +msgstr "Háromszög" + +msgid "Linear" +msgstr "Lineáris" + +msgid "4th Order" +msgstr "4. rend" + +msgid "7th Order" +msgstr "7. rend" + +msgid "Non-timed (original)" +msgstr "Időzítő nélkül (eredeti)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (nincs jumper a JMP2-nél)" + +msgid "Two" +msgstr "Két" + +msgid "Three" +msgstr "Három" + +msgid "Wheel" +msgstr "Kerék" + +msgid "Five + Wheel" +msgstr "Öt + kerék" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 soros / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) soros" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "BIOS letiltása" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (sztereó)" + +msgid "Classic" +msgstr "Klasszikus" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Összetett" + +msgid "Old" +msgstr "Régi" + +msgid "New" +msgstr "Új" + +msgid "Color (generic)" +msgstr "Szín (általános)" + +msgid "Green Monochrome" +msgstr "Zöld monokróm" + +msgid "Amber Monochrome" +msgstr "Sárga monokróm" + +msgid "Gray Monochrome" +msgstr "Szürke monokróm" + +msgid "Color (no brown)" +msgstr "Szín (nem barna)" + +msgid "Color (IBM 5153)" +msgstr "Színes (IBM 5153)" + +msgid "Simple doubling" +msgstr "Egyszerű duplázás" + +msgid "sRGB interpolation" +msgstr "sRGB interpoláció" + +msgid "Linear interpolation" +msgstr "Lineáris interpoláció" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monokróm (5151/MDA) (fehér)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monokróm (5151/MDA) (zöld)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monokróm (5151/MDA) (sárga)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Színes 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Színes 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Fokozott szín - normál üzemmód (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Továbbfejlesztett szín - továbbfejlesztett üzemmód (5154/ECD)" + +msgid "Green" +msgstr "Zöld" + +msgid "Amber" +msgstr "Sárga" + +msgid "Gray" +msgstr "Szürke" + +msgid "Color" +msgstr "Színes" + +msgid "U.S. English" +msgstr "Amerikai angol" + +msgid "Scandinavian" +msgstr "Skandináv" + +msgid "Other languages" +msgstr "Egyéb nyelvek" + +msgid "Bochs latest" +msgstr "Bochs legújabb" + +msgid "Mono Non-Interlaced" +msgstr "Monokróm nem átlapolt" + +msgid "Color Interlaced" +msgstr "Színes átlapolt" + +msgid "Color Non-Interlaced" +msgstr "Színes nem átlapolt" + +msgid "3Dfx Voodoo Graphics" +msgstr "3dfx Voodoo-gyorsítókártya" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU)" + +msgid "8-bit" +msgstr "8 bites" + +msgid "16-bit" +msgstr "16 bites" + +msgid "Standard (150ns)" +msgstr "Standard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Nagy sebességű (120ns)" + +msgid "Enabled" +msgstr "Engedélyezve" + +msgid "Standard" +msgstr "Standard" + +msgid "High-Speed" +msgstr "Nagy sebességű" + +msgid "Stereo LPT DAC" +msgstr "Sztereó LPT DAC" + +msgid "Generic Text Printer" +msgstr "Általános szövegnyomtató" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Általános ESC/P pontmátrix" + +msgid "Generic PostScript Printer" +msgstr "Általános PostScript nyomtató" + +msgid "Generic PCL5e Printer" +msgstr "Általános PCL5e nyomtató" + +msgid "Parallel Line Internet Protocol" +msgstr "Párhuzamos vonalas internetprotokoll" + +msgid "Protection Dongle for Savage Quest" +msgstr "Védelmi dongle a Savage Questhez" + +msgid "Serial Passthrough Device" +msgstr "Soros port áthaladó eszköz" + +msgid "Passthrough Mode" +msgstr "Áthaladó mód" + +msgid "Host Serial Device" +msgstr "Host soros eszköz" + +msgid "Name of pipe" +msgstr "A cső neve" + +msgid "Data bits" +msgstr "Adat bitek" + +msgid "Stop bits" +msgstr "Stop bitek" + +msgid "Baud Rate of Passthrough" +msgstr "Az átmenő átviteli sebesség Baud-rátája" + +msgid "Named Pipe (Server)" +msgstr "Megnevezett cső (kiszolgáló)" + +msgid "Host Serial Passthrough" +msgstr "Az állomás soros portjának áthaladása" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 0ce1efabb..017c75c28 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -37,7 +37,7 @@ msgid "&Hide status bar" msgstr "&Nascondi barra di stato" msgid "Hide &toolbar" -msgstr "Hide &toolbar" +msgstr "Nascondi &barra degli strumenti" msgid "&Resizeable window" msgstr "&Finestra ridimensionabile" @@ -256,7 +256,7 @@ msgid "&Folder..." msgstr "&Cartella..." msgid "Target &framerate" -msgstr "Imposta obiettivo &fotogrammi" +msgstr "Obiettivo &fotogrammi" msgid "&Sync with video" msgstr "&Sincronizza col video" @@ -390,8 +390,11 @@ msgstr "Ricompilatore dinamico" msgid "Video:" msgstr "Video:" -msgid "Voodoo Graphics" -msgstr "Grafica Voodoo" +msgid "Video #2:" +msgstr "Video 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Grafica Voodoo 1 o 2" msgid "IBM 8514/A Graphics" msgstr "Grafica IBM 8514/A" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Errore fatale" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - IN PAUSA" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Usa Ctrl+Alt+PgDn per tornare alla modalità finestra." @@ -762,17 +765,26 @@ msgstr "Nessun dispositivo PCap trovato" msgid "Invalid PCap device" msgstr "Dispositivo PCap invalido" -msgid "Standard 2-button joystick(s)" -msgstr "Joystick comune da 2 pulsanti" +msgid "2-axis, 2-button joystick(s)" +msgstr "Joystick da 2 assi, 2 pulsanti" -msgid "Standard 4-button joystick" -msgstr "Joystick comune da 4 pulsanti" +msgid "2-axis, 4-button joystick" +msgstr "Joystick da 2 assi, 4 pulsanti" -msgid "Standard 6-button joystick" -msgstr "Joystick comune da 6 pulsanti" +msgid "2-axis, 6-button joystick" +msgstr "Joystick da 2 assi, 6 pulsanti" -msgid "Standard 8-button joystick" -msgstr "Joystick comune da 8 pulsanti" +msgid "2-axis, 8-button joystick" +msgstr "Joystick da 2 assi, 8 pulsanti" + +msgid "3-axis, 2-button joystick" +msgstr "Joystick da 3 assi, 2 pulsanti" + +msgid "3-axis, 4-button joystick" +msgstr "Joystick da 3 assi, 4 pulsanti" + +msgid "4-axis, 4-button joystick" +msgstr "Joystick da 4 assi, 4 pulsanti" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +819,9 @@ msgstr "Sei sicuro di voler uscire da 86Box?" msgid "Unable to initialize Ghostscript" msgstr "Impossibile inizializzare Ghostscript" +msgid "Unable to initialize GhostPCL" +msgstr "Impossibile inizializzare GhostPCL" + msgid "MO %i (%ls): %ls" msgstr "MO %i (%ls): %ls" @@ -853,7 +868,10 @@ msgid "Invalid configuration" msgstr "Configurazione invalida" 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 è richiesto per la conversione automatica di file PostScript a file PDF.\n\nQualsiasi documento mandato alla stampante generica PostScript sarà salvato come file PostScript. (.ps)" +msgstr "%1 è richiesto per la conversione automatica di file PostScript a file PDF.\n\nQualsiasi documento mandato alla stampante generica PostScript sarà salvato come file PostScript (.ps)." + +msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as Printer Command Language (.pcl) files." +msgstr "%1 è richiesto per la conversione automatica di file PCL a file PDF.\n\nQualsiasi documento mandato alla stampante generica PCL sarà salvato come file Printer Command Language (.cl)." msgid "Entering fullscreen mode" msgstr "Entrando nella modalità schermo intero" @@ -999,6 +1017,27 @@ msgstr "Sovrascrivi" msgid "Don't overwrite" msgstr "Non sovrascrivere" +msgid "Raw image" +msgstr "Immagine raw" + +msgid "HDI image" +msgstr "Immagine HDI" + +msgid "HDX image" +msgstr "Immagine HDX" + +msgid "Fixed-size VHD" +msgstr "VHD di dimensioni fisse" + +msgid "Dynamic-size VHD" +msgstr "VHD di dimensioni dinamiche" + +msgid "Differencing VHD" +msgstr "VHD differenziato" + +msgid "(N/A)" +msgstr "(N/D)" + msgid "Raw image (.img)" msgstr "Immagine raw (.img)" @@ -1172,3 +1211,888 @@ msgstr "WinBox non è più supportato" 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 "Lo sviluppo del gestore WinBox si è interrotto nel 2022 per mancanza di manutentori. Poiché i nostri sforzi sono rivolti a rendere 86Box ancora migliore, abbiamo deciso di non supportare più WinBox come gestore.\n\nNon saranno forniti ulteriori aggiornamenti tramite WinBox e si potrebbe riscontrare un comportamento non corretto se si continua a utilizzarlo con versioni più recenti di 86Box. Tutte le segnalazioni di bug relative al comportamento di WinBox saranno chiuse in quanto non valide.\n\nPer un elenco di altri gestori utilizzabili, visitare 86box.net." + +msgid "Generate" +msgstr "Generare" + +msgid "Joystick configuration" +msgstr "Configurazione del joystick" + +msgid "Device" +msgstr "Dispositivo" + +msgid "%1 (X axis)" +msgstr "%1 (asse X)" + +msgid "%1 (Y axis)" +msgstr "%1 (asse Y)" + +msgid "MCA devices" +msgstr "Dispositivi MCA" + +msgid "List of MCA devices:" +msgstr "Elenco dei dispositivi MCA:" + +msgid "Tablet tool" +msgstr "Strumento tablet" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Informazioni su Qt" + +msgid "MCA devices..." +msgstr "Dispositivi MCA..." + +msgid "Show non-primary monitors" +msgstr "Mostra i monitor non primari" + +msgid "Open screenshots folder..." +msgstr "Aprire la cartella screenshot..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Applica la modalità adattamento schermo intero in modalità massimizzata" + +msgid "Cursor/Puck" +msgstr "Cursore/Puck" + +msgid "Pen" +msgstr "Penna" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Unità CD/DVD host (%1:)" + +msgid "&Connected" +msgstr "&Connesso" + +msgid "Clear image history" +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" + +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 "Render behavior" +msgstr "Comportamento di rendering" + +msgid "Use target framerate:" +msgstr "Utilizza l'obiettivo &fotogrammi:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Impossibile passare al contesto OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "È richiesta la versione OpenGL 3.0 o superiore. La versione attuale è %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Inizializzazione OpenGL non riuscita. Errore %1." + +msgid "Error initializing OpenGL" +msgstr "Errore nell'inizializzazione di OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Ricaduta sul rendering software." + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "L'allocazione della memoria per il buffer di disimballaggio non è riuscita." + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Quando si selezionano immagini multimediali (CD-ROM, floppy, ecc.) la finestra di dialogo di apertura si avvia nella stessa directory del file di configurazione di 86Box. Questa impostazione probabilmente farà la differenza solo su macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Questa macchina potrebbe essere stata spostata o copiata." + +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 "Per garantire la corretta funzionalità di rete, 86Box deve sapere se la macchina è stata spostata o copiata.\"nSelezionare \"L'ho copiata\" se non si è sicuri." + +msgid "I Moved It" +msgstr "L'ho spostato" + +msgid "I Copied It" +msgstr "L'ho copiato" + +msgid "86Box Monitor #" +msgstr "Monitor 86Box #" + +msgid "No MCA devices." +msgstr "Nessun dispositivo MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Scheda di rete n. 1" + +msgid "Network Card #2" +msgstr "Scheda di rete n. 2" + +msgid "Network Card #3" +msgstr "Scheda di rete n. 3" + +msgid "Network Card #4" +msgstr "Scheda di rete n. 4" + +msgid "Mode" +msgstr "Modalità" + +msgid "Interface" +msgstr "Interfaccia" + +msgid "Adapter" +msgstr "Adattatore" + +msgid "VDE Socket" +msgstr "Presa VDE" + +msgid "86Box Unit Tester" +msgstr "Tester di unità 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Scheda chiave Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Passaggio della porta seriale 1" + +msgid "Serial port passthrough 2" +msgstr "Passaggio della porta seriale 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Mouse bus Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Mouse bus Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse seriale Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Mouse seriale Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Mouse seriale Logitech" + +msgid "PS/2 Mouse" +msgstr "Mouse PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (seriale)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Modem standard conforme a Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Emulazione Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulazione Roland MT-32 (nuovo)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulazione Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulazione Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Scheda figlia OPL4-ML" + +msgid "System MIDI" +msgstr "MIDI di sistema" + +msgid "MIDI Input Device" +msgstr "Dispositivo di ingresso MIDI" + +msgid "BIOS Address" +msgstr "Indirizzo BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Abilita scrittura al ROM dell'estensione del BIOS" + +msgid "Address" +msgstr "Indirizzo" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revisione del BIOS" + +msgid "Translate 26 -> 17" +msgstr "Tradurre 26 -> 17" + +msgid "Language" +msgstr "Lingua" + +msgid "Enable backlight" +msgstr "Abilita la retroilluminazione" + +msgid "Invert colors" +msgstr "Invertire i colori" + +msgid "BIOS size" +msgstr "Dimensione del BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mappa C0000-C7FFF come UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mappa C8000-CFFFF come UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mappa D0000-D7FFF come UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mappa D8000-DFFFF come UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mappa E0000-E7FFF come UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mappa E8000-EFFFF come UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 ponticello (JIM)" + +msgid "MIDI Output Device" +msgstr "Dispositivo di uscita MIDI" + +msgid "MIDI Real time" +msgstr "MIDI in empo reale" + +msgid "MIDI Thru" +msgstr "Passaggio dell'ingresso MIDI" + +msgid "MIDI Clockout" +msgstr "Uscita del clock MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Guadagno di uscita" + +msgid "Chorus" +msgstr "Coro" + +msgid "Chorus Voices" +msgstr "Voci del coro" + +msgid "Chorus Level" +msgstr "Livello del coro" + +msgid "Chorus Speed" +msgstr "Velocità del coro" + +msgid "Chorus Depth" +msgstr "Profondità del coro" + +msgid "Chorus Waveform" +msgstr "Forma d'onda del coro" + +msgid "Reverb" +msgstr "Riverbero" + +msgid "Reverb Room Size" +msgstr "Dimensioni della sala di riverbero" + +msgid "Reverb Damping" +msgstr "Smorzamento del riverbero" + +msgid "Reverb Width" +msgstr "Larghezza del riverbero" + +msgid "Reverb Level" +msgstr "Livello di riverbero" + +msgid "Interpolation Method" +msgstr "Metodo di interpolazione" + +msgid "Reverb Output Gain" +msgstr "Guadagno dell'uscita del riverbero" + +msgid "Reversed stereo" +msgstr "Stereo invertito" + +msgid "Nice ramp" +msgstr "Bella rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Pulsanti" + +msgid "Serial Port" +msgstr "Porta seriale" + +msgid "RTS toggle" +msgstr "Commutazione RTS" + +msgid "Revision" +msgstr "Revisione" + +msgid "Controller" +msgstr "Controllore" + +msgid "Show Crosshair" +msgstr "Mostra mirino" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Indirizzo MAC" + +msgid "MAC Address OUI" +msgstr "Indirizzo MAC OUI" + +msgid "Enable BIOS" +msgstr "Abilita il BIOS" + +msgid "Baud Rate" +msgstr "Velocità di trasmissione" + +msgid "TCP/IP listening port" +msgstr "Porta di ascolto TCP/IP" + +msgid "Phonebook File" +msgstr "File rubrica" + +msgid "Telnet emulation" +msgstr "Emulazione Telnet" + +msgid "RAM Address" +msgstr "Indirizzo RAM" + +msgid "RAM size" +msgstr "Dimensione della RAM" + +msgid "Initial RAM size" +msgstr "Dimensione iniziale della RAM" + +msgid "Serial Number" +msgstr "Numero di serie" + +msgid "Host ID" +msgstr "ID host" + +msgid "FDC Address" +msgstr "Indirizzo FDC" + +msgid "MPU-401 Address" +msgstr "Indirizzo MPU-401" + +msgid "MPU-401 IRQ" +msgstr "IRQ MPU-401" + +msgid "Receive MIDI input" +msgstr "Ricezione dell'ingresso MIDI" + +msgid "Low DMA" +msgstr "DMA basso" + +msgid "Enable Game port" +msgstr "Abilita la porta giochi" + +msgid "Surround module" +msgstr "Modulo surround" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Solleva l'interrupt del CODEC all'impostazione del CODEC (necessario per alcuni driver)" + +msgid "SB Address" +msgstr "Indirizzo SB" + +msgid "WSS IRQ" +msgstr "IRQ WSS" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "Abilita l'OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Ricezione dell'ingresso MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "SB basso DMA" + +msgid "6CH variant (6-channel)" +msgstr "Variante 6CH (6 canali)" + +msgid "Enable CMS" +msgstr "Abilita il CMS" + +msgid "Mixer" +msgstr "Miscelatore" + +msgid "High DMA" +msgstr "DMA alto" + +msgid "Control PC speaker" +msgstr "Altoparlante del PC di controllo" + +msgid "Memory size" +msgstr "Dimensione della memoria" + +msgid "EMU8000 Address" +msgstr "Indirizzo EMU8000" + +msgid "IDE Controller" +msgstr "Controllore IDE" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "Tipo GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Abilita il comando 0x04 \"Esci da 86Box\"" + +msgid "Display type" +msgstr "Tipo di display" + +msgid "Composite type" +msgstr "Tipo composito" + +msgid "RGB type" +msgstr "Tipo RGB" + +msgid "Line doubling type" +msgstr "Tipo di raddoppio della linea" + +msgid "Snow emulation" +msgstr "Emulazione della neve" + +msgid "Monitor type" +msgstr "Tipo di monitor" + +msgid "Character set" +msgstr "Set di caratteri" + +msgid "XGA type" +msgstr "Tipo XGA" + +msgid "Instance" +msgstr "Istanza" + +msgid "MMIO Address" +msgstr "Indirizzo MMIO" + +msgid "RAMDAC type" +msgstr "Tipo di RAMDAC" + +msgid "Blend" +msgstr "Miscela" + +msgid "Bilinear filtering" +msgstr "Filtraggio bilineare" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Abilita l'NMI per l'emulazione CGA" + +msgid "Voodoo type" +msgstr "Tipo Voodoo" + +msgid "Framebuffer memory size" +msgstr "Dimensione della memoria del framebuffer" + +msgid "Texture memory size" +msgstr "Dimensione della memoria della texture" + +msgid "Dither subtraction" +msgstr "Sottrazione della retinatura" + +msgid "Screen Filter" +msgstr "Filtro a schermo" + +msgid "Render threads" +msgstr "Fili di rendering" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Indirizzo di partenza" + +msgid "Contiguous Size" +msgstr "Dimensione contigua" + +msgid "I/O Width" +msgstr "Larghezza I/O" + +msgid "Transfer Speed" +msgstr "Velocità di trasferimento" + +msgid "EMS mode" +msgstr "Modalità EMS" + +msgid "Address for > 2 MB" +msgstr "Indirizzo per > 2 MB" + +msgid "Frame Address" +msgstr "Indirizzo del telaio" + +msgid "USA" +msgstr "Stati Uniti" + +msgid "Danish" +msgstr "Danese" + +msgid "Always at selected speed" +msgstr "Sempre alla velocità selezionata" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Impostazione BIOS + Tasti di scelta rapida (disattivati durante il POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB a partire da F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB a partire da E0000 (indirizzo MSB invertito, prima gli ultimi 64KB)" + +msgid "Sine" +msgstr "Sinusoide" + +msgid "Triangle" +msgstr "Triangolo" + +msgid "Linear" +msgstr "Lineare" + +msgid "4th Order" +msgstr "4° Ordine" + +msgid "7th Order" +msgstr "7° Ordine" + +msgid "Non-timed (original)" +msgstr "Senza timer (originale)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (nessun ponticello su JMP2)" + +msgid "Two" +msgstr "Due" + +msgid "Three" +msgstr "Tre" + +msgid "Wheel" +msgstr "Ruota" + +msgid "Five + Wheel" +msgstr "Cinque + ruota" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 seriale / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) seriale" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Disattivare il BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Classico" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Composito" + +msgid "Old" +msgstr "Vecchio" + +msgid "New" +msgstr "Nuovo" + +msgid "Color (generic)" +msgstr "Colore (generico)" + +msgid "Green Monochrome" +msgstr "Verde Monocromatico" + +msgid "Amber Monochrome" +msgstr "Ambra monocromatica" + +msgid "Gray Monochrome" +msgstr "Grigio monocromatico" + +msgid "Color (no brown)" +msgstr "Colore (no marrone)" + +msgid "Color (IBM 5153)" +msgstr "Colore (IBM 5153)" + +msgid "Simple doubling" +msgstr "Raddoppio semplice" + +msgid "sRGB interpolation" +msgstr "Interpolazione sRGB" + +msgid "Linear interpolation" +msgstr "Interpolazione lineare" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monocromatico (5151/MDA) (bianco)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monocromatico (5151/MDA) (verde)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monocromatico (5151/MDA) (ambra)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Colore 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Colore 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Colore avanzato - Modalità normale (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Colore migliorato - Modalità migliorata (5154/ECD)" + +msgid "Green" +msgstr "Verde" + +msgid "Amber" +msgstr "Ambra" + +msgid "Gray" +msgstr "Grigio" + +msgid "Color" +msgstr "Colore" + +msgid "U.S. English" +msgstr "Inglese statunitense" + +msgid "Scandinavian" +msgstr "Scandinavo" + +msgid "Other languages" +msgstr "Altre lingue" + +msgid "Bochs latest" +msgstr "Bochs ultima versione" + +msgid "Mono Non-Interlaced" +msgstr "Mono non interlacciato" + +msgid "Color Interlaced" +msgstr "Colore interlacciato" + +msgid "Color Non-Interlaced" +msgstr "Colore non interlacciato" + +msgid "3Dfx Voodoo Graphics" +msgstr "Grafica 3Dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU)" + +msgid "8-bit" +msgstr "8-bit" + +msgid "16-bit" +msgstr "16 bit" + +msgid "Standard (150ns)" +msgstr "Standard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Alta velocità (120ns)" + +msgid "Enabled" +msgstr "Abilitato" + +msgid "Standard" +msgstr "Standard" + +msgid "High-Speed" +msgstr "Alta velocità" + +msgid "Stereo LPT DAC" +msgstr "DAC LPT stereo" + +msgid "Generic Text Printer" +msgstr "Stampante di testo generica" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "A matrice di punti ESC/P generica" + +msgid "Generic PostScript Printer" +msgstr "Stampante PostScript generica" + +msgid "Generic PCL5e Printer" +msgstr "Stampante PCL5e generica" + +msgid "Parallel Line Internet Protocol" +msgstr "Linea parallela Protocollo Internet" + +msgid "Protection Dongle for Savage Quest" +msgstr "Dongle di protezione per Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Dispositivo del passaggio della porta seriale" + +msgid "Passthrough Mode" +msgstr "Modalità del passaggio" + +msgid "Host Serial Device" +msgstr "Dispositivo seriale host" + +msgid "Name of pipe" +msgstr "Nome del tubo" + +msgid "Data bits" +msgstr "Bit di dati" + +msgid "Stop bits" +msgstr "Bit di stop" + +msgid "Baud Rate of Passthrough" +msgstr "Velocità di trasmissione in baud del passaggio" + +msgid "Named Pipe (Server)" +msgstr "Tubo denominato (Server)" + +msgid "Host Serial Passthrough" +msgstr "Passaggio della porta seriale host" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index c20848be6..195d25c4d 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -390,8 +390,11 @@ msgstr "動的再コンパイル" msgid "Video:" msgstr "ビデオカード:" -msgid "Voodoo Graphics" -msgstr "Voodooグラフィック" +msgid "Video #2:" +msgstr "ビデオカード2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo1または2グラフィック" msgid "IBM 8514/A Graphics" msgstr "IBM 8514/Aグラフィック" @@ -684,6 +687,9 @@ msgstr "roms/machines ディレクトリにROMがないため、マシン「%hs msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "roms/video ディレクトリにROMがないため、ビデオ カード「%hs」は使用できません。使用可能なビデオカードに切り替えます。" +msgid "Video card 2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "roms/video ディレクトリにROMがないため、ビデオ カード2「%hs」は使用できません。使用可能なビデオカードに切り替えます。" + msgid "Machine" msgstr "マシン" @@ -762,17 +768,26 @@ msgstr "PCapデバイスがありません" msgid "Invalid PCap device" msgstr "不正なPCapデバイス" -msgid "Standard 2-button joystick(s)" -msgstr "標準ジョイスティック(2ボタン)" +msgid "2-axis, 2-button joystick(s)" +msgstr "ジョイスティック(2軸、2ボタン)" -msgid "Standard 4-button joystick" -msgstr "標準ジョイスティック(4ボタン)" +msgid "2-axis, 4-button joystick" +msgstr "ジョイスティック(2軸、4ボタン)" -msgid "Standard 6-button joystick" -msgstr "標準ジョイスティック(6ボタン)" +msgid "2-axis, 6-button joystick" +msgstr "ジョイスティック(2軸、6ボタン)" -msgid "Standard 8-button joystick" -msgstr "標準ジョイスティック(8ボタン)" +msgid "2-axis, 8-button joystick" +msgstr "ジョイスティック(2軸、8ボタン)" + +msgid "3-axis, 2-button joystick" +msgstr "ジョイスティック(3軸、2ボタン)" + +msgid "3-axis, 4-button joystick" +msgstr "ジョイスティック(3軸、4ボタン)" + +msgid "4-axis, 4-button joystick" +msgstr "ジョイスティック(4軸、4ボタン)" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "86Boxを終了しますか?" msgid "Unable to initialize Ghostscript" msgstr "Ghostscriptが初期化できません" +msgid "Unable to initialize GhostPCL" +msgstr "GhostPCLが初期化できません" + msgid "MO %i (%ls): %ls" msgstr "光磁気 %i (%ls): %ls" @@ -855,6 +873,9 @@ msgstr "不正な設定です" 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 "PostScriptファイルをPDFに自動変換するには%1が必要です。\n\n汎用PostScriptプリンターに送信された文書は、PostScript (.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." +msgstr "PCLファイルをPDFに自動変換するには%1が必要です。\n\n汎用PCLプリンターに送信された文書は、Printer Command Language (.pcl) ファイルとして保存されます。" + msgid "Entering fullscreen mode" msgstr "全画面モードを入力" @@ -999,6 +1020,27 @@ msgstr "上書き" msgid "Don't overwrite" msgstr "上書きしない" +msgid "Raw image" +msgstr "Rawイメージ" + +msgid "HDI image" +msgstr "HDIイメージ" + +msgid "HDX image" +msgstr "HDXイメージ" + +msgid "Fixed-size VHD" +msgstr "VHD (容量固定)" + +msgid "Dynamic-size VHD" +msgstr "VHD (容量可変)" + +msgid "Differencing VHD" +msgstr "VHD (差分)" + +msgid "(N/A)" +msgstr "(該当なし)" + msgid "Raw image (.img)" msgstr "Rawイメージ (.img)" @@ -1172,3 +1214,888 @@ msgstr "WinBoxはサポート終了" 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 "WinBoxマネージャーの開発は、メンテナ不足のため2022年に停止しました。86Boxをより良いものにするため、WinBoxをマネージャーとしてサポートしないことを決定しました。\n\nWinBoxを使ったアップデートは今後提供されませんし、86Boxの新しいバージョンでWinBoxを使い続けると、正しくない動作に遭遇するかもしれません。WinBoxの動作に関連するバグレポートは無効としてクローズされます。\n\n86box.netに他のマネージャのリストがあります。" + +msgid "Generate" +msgstr "生成する" + +msgid "Joystick configuration" +msgstr "ジョイスティックの構成" + +msgid "Device" +msgstr "装置" + +msgid "%1 (X axis)" +msgstr "1(X軸)" + +msgid "%1 (Y axis)" +msgstr "1(Y軸)" + +msgid "MCA devices" +msgstr "MCA装置" + +msgid "List of MCA devices:" +msgstr "MCA装置のリスト:" + +msgid "Tablet tool" +msgstr "タブレットツール" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Qtについて" + +msgid "MCA devices..." +msgstr "MCAデバイス..." + +msgid "Show non-primary monitors" +msgstr "プライマリーモニター以外のモニターを表示する" + +msgid "Open screenshots folder..." +msgstr "スクリーンショットフォルダを開く" + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "最大化時にフルスクリーンストレッチモードを適用" + +msgid "Cursor/Puck" +msgstr "カーソル/パック" + +msgid "Pen" +msgstr "ペン" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "ホスト CD/DVD ドライブ (%1:)" + +msgid "&Connected" +msgstr "コネクテッド" + +msgid "Clear image history" +msgstr "クリア画像履歴" + +msgid "Create..." +msgstr "作成..." + +msgid "previous image" +msgstr "前の画像" + +msgid "Host CD/DVD Drive (%1)" +msgstr "ホスト CD/DVD ドライブ (%1)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "レンダリング動作" + +msgid "Use target framerate:" +msgstr "目標フレームレートを使用する:" + +msgid " fps" +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 "ビデオと同期" + +msgid "Shaders" +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コンテキストを作成できませんでした。" + +msgid "Couldn't switch to OpenGL context." +msgstr "OpenGLコンテキストに切り替えられなかった。" + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "OpenGLのバージョン3.0以上が必要です。現在のバージョンは %1.%2 です。" + +msgid "OpenGL initialization failed. Error %1." +msgstr "OpenGL の初期化に失敗しました。エラー %1。" + +msgid "Error initializing OpenGL" +msgstr "OpenGLの初期化エラー" + +msgid "Falling back to software rendering.\n" +msgstr "ソフトウェアレンダリングに逆戻り。" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "アンパックバッファのメモリ確保に失敗しました。" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>メディアイメージ(CD-ROM、フロッピーなど)を選択するとき、オープンダイアログは86Box設定ファイルと同じディレクトリで開始します。この設定は、おそらく macOS でのみ違いがあります。</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "このマシンは移動されたかコピーされた可能性がある。" + +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 "ネットワーク機能を正しく動作させるために、86Boxはこのマシンが移動されたかコピーされたかを知る必要があります。「コピーした」を選択してください。" + +msgid "I Moved It" +msgstr "動かした" + +msgid "I Copied It" +msgstr "コピーした" + +msgid "86Box Monitor #" +msgstr "86Box モニター" + +msgid "No MCA devices." +msgstr "MCA装置はない。" + +msgid "MiB" +msgstr "MB" + +msgid "Network Card #1" +msgstr "ネットワークカード 1" + +msgid "Network Card #2" +msgstr "ネットワークカード 2" + +msgid "Network Card #3" +msgstr "ネットワークカード 3" + +msgid "Network Card #4" +msgstr "ネットワークカード 4" + +msgid "Mode" +msgstr "モード" + +msgid "Interface" +msgstr "インターフェース" + +msgid "Adapter" +msgstr "アダプター" + +msgid "VDE Socket" +msgstr "VDEソケット" + +msgid "86Box Unit Tester" +msgstr "86Boxユニットテスター" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.xキーカード" + +msgid "Serial port passthrough 1" +msgstr "シリアル・ポート・パススルー 1" + +msgid "Serial port passthrough 2" +msgstr "シリアル・ポート・パススルー 2" + +msgid "Serial port passthrough 3" +msgstr "シリアル・ポート・パススルー 3" + +msgid "Serial port passthrough 4" +msgstr "シリアル・ポート・パススルー 4" + +msgid "Vision Systems LBA Enhancer" +msgstr "ビジョン・システムズ LBAエンハンサー" + +msgid "Renderer options..." +msgstr "レンダラー設定..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft バスマウス" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft バスマウス(InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse Systems シリアルマウス" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft シリアルマウス" + +msgid "Logitech Serial Mouse" +msgstr "Logitech シリアルマウス" + +msgid "PS/2 Mouse" +msgstr "PS/2マウス" + +msgid "3M MicroTouch (Serial)" +msgstr "3Mマイクロタッチ(シリアル)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] 標準ヘイズ準拠モデム" + +msgid "Roland MT-32 Emulation" +msgstr "Roland MT-32エミュレーション" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Roland MT-32(新しい)エミュレーション" + +msgid "Roland CM-32L Emulation" +msgstr "Roland CM-32Lエミュレーション" + +msgid "Roland CM-32LN Emulation" +msgstr "Roland CM-32LNエミュレーション" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-MLドーターボード" + +msgid "System MIDI" +msgstr "システムMIDI" + +msgid "MIDI Input Device" +msgstr "MIDI入力デバイス" + +msgid "BIOS Address" +msgstr "BIOSアドレス" + +msgid "Enable BIOS extension ROM Writes" +msgstr "BIOS拡張ROM書き込みを有効にする" + +msgid "Address" +msgstr "住所" + +msgid "IRQ" +msgstr "割り込み要求" + +msgid "BIOS Revision" +msgstr "BIOSリビジョン" + +msgid "Translate 26 -> 17" +msgstr "26→17を翻訳" + +msgid "Language" +msgstr "言語" + +msgid "Enable backlight" +msgstr "バックライトを有効にする" + +msgid "Invert colors" +msgstr "色の反転" + +msgid "BIOS size" +msgstr "BIOSサイズ" + +msgid "Map C0000-C7FFF as UMB" +msgstr "C0000-C7FFFをUMBとしてマップ" + +msgid "Map C8000-CFFFF as UMB" +msgstr "C8000-CFFFFをUMBとしてマップ" + +msgid "Map D0000-D7FFF as UMB" +msgstr "D0000-D7FFFをUMBとしてマップ" + +msgid "Map D8000-DFFFF as UMB" +msgstr "D8000-DFFFFをUMBとしてマップ" + +msgid "Map E0000-E7FFF as UMB" +msgstr "E0000~E7FFFをUMBとしてマップ" + +msgid "Map E8000-EFFFF as UMB" +msgstr "E8000-EFFFFをUMBとしてマップ" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9ジャンパ(JIM)" + +msgid "MIDI Output Device" +msgstr "MIDI出力デバイス" + +msgid "MIDI Real time" +msgstr "MIDI リアルタイム" + +msgid "MIDI Thru" +msgstr "MIDI入力のパススルー" + +msgid "MIDI Clockout" +msgstr "MIDIクロックの出力" + +msgid "SoundFont" +msgstr "サウンドフォント" + +msgid "Output Gain" +msgstr "出力ゲイン" + +msgid "Chorus" +msgstr "コーラス" + +msgid "Chorus Voices" +msgstr "コーラスの声" + +msgid "Chorus Level" +msgstr "コーラス・レベル" + +msgid "Chorus Speed" +msgstr "コーラス・スピード" + +msgid "Chorus Depth" +msgstr "コーラスの深さ" + +msgid "Chorus Waveform" +msgstr "コーラス波形" + +msgid "Reverb" +msgstr "リバーブ" + +msgid "Reverb Room Size" +msgstr "リバーブ・ルームの大きさ" + +msgid "Reverb Damping" +msgstr "リバーブ・ダンピング" + +msgid "Reverb Width" +msgstr "リバーブ幅" + +msgid "Reverb Level" +msgstr "リバーブ・レベル" + +msgid "Interpolation Method" +msgstr "補間法" + +msgid "Reverb Output Gain" +msgstr "リバーブ出力のゲイン" + +msgid "Reversed stereo" +msgstr "逆ステレオ" + +msgid "Nice ramp" +msgstr "ナイス・スロープ" + +msgid "Hz" +msgstr "ヘルツ" + +msgid "Buttons" +msgstr "ボタン" + +msgid "Serial Port" +msgstr "シリアルポート" + +msgid "RTS toggle" +msgstr "RTSトグル" + +msgid "Revision" +msgstr "改訂" + +msgid "Controller" +msgstr "コントローラー" + +msgid "Show Crosshair" +msgstr "十字線を表示" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MACアドレス" + +msgid "MAC Address OUI" +msgstr "MACアドレスのOUI" + +msgid "Enable BIOS" +msgstr "BIOSを有効にする" + +msgid "Baud Rate" +msgstr "ボーレート" + +msgid "TCP/IP listening port" +msgstr "TCP/IPリスニングポート" + +msgid "Phonebook File" +msgstr "電話帳ファイル" + +msgid "Telnet emulation" +msgstr "Telnetエミュレーション" + +msgid "RAM Address" +msgstr "RAMアドレス" + +msgid "RAM size" +msgstr "RAMサイズ" + +msgid "Initial RAM size" +msgstr "初期RAMサイズ" + +msgid "Serial Number" +msgstr "シリアル番号" + +msgid "Host ID" +msgstr "ホストID" + +msgid "FDC Address" +msgstr "FDCアドレス" + +msgid "MPU-401 Address" +msgstr "MPU-401 アドレス" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "MIDI入力を受信する" + +msgid "Low DMA" +msgstr "低DMA" + +msgid "Enable Game port" +msgstr "ゲームポートを有効にする" + +msgid "Surround module" +msgstr "サラウンド・モジュール" + +msgid "CODEC" +msgstr "コーデック" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "CODECセットアップ時にCODEC割り込みを発生させる(一部のドライバで必要)" + +msgid "SB Address" +msgstr "SBアドレス" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "OPLを有効にする" + +msgid "Receive MIDI input (MPU-401)" +msgstr "MIDI入力を受信する(MPU-401)" + +msgid "SB low DMA" +msgstr "SBローDMA" + +msgid "6CH variant (6-channel)" +msgstr "6CHバリアント(6チャンネル)" + +msgid "Enable CMS" +msgstr "CMSを有効にする" + +msgid "Mixer" +msgstr "ミキサー" + +msgid "High DMA" +msgstr "ハイDMA" + +msgid "Control PC speaker" +msgstr "コントロールPCスピーカー" + +msgid "Memory size" +msgstr "メモリーサイズ" + +msgid "EMU8000 Address" +msgstr "EMU8000 アドレス" + +msgid "IDE Controller" +msgstr "IDEコントローラ" + +msgid "Codec" +msgstr "コーデック" + +msgid "GUS type" +msgstr "GUSタイプ" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "コマンド 0x04 \"86Boxを終了する\"を有効にする" + +msgid "Display type" +msgstr "表示タイプ" + +msgid "Composite type" +msgstr "コンポジット・タイプ" + +msgid "RGB type" +msgstr "RGBタイプ" + +msgid "Line doubling type" +msgstr "ライン倍増タイプ" + +msgid "Snow emulation" +msgstr "スノー・エミュレーション" + +msgid "Monitor type" +msgstr "モニタータイプ" + +msgid "Character set" +msgstr "文字セット" + +msgid "XGA type" +msgstr "XGAタイプ" + +msgid "Instance" +msgstr "インスタンス" + +msgid "MMIO Address" +msgstr "MMIOアドレス" + +msgid "RAMDAC type" +msgstr "RAMDACタイプ" + +msgid "Blend" +msgstr "ブレンド" + +msgid "Bilinear filtering" +msgstr "バイリニア・フィルタリング" + +msgid "Dithering" +msgstr "ディザリング" + +msgid "Enable NMI for CGA emulation" +msgstr "CGAエミュレーションのNMIを有効にする" + +msgid "Voodoo type" +msgstr "ブードゥー教タイプ" + +msgid "Framebuffer memory size" +msgstr "フレームバッファのメモリサイズ" + +msgid "Texture memory size" +msgstr "テクスチャメモリサイズ" + +msgid "Dither subtraction" +msgstr "ディザ減算" + +msgid "Screen Filter" +msgstr "スクリーンフィルター" + +msgid "Render threads" +msgstr "レンダリングスレッド" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "開始アドレス" + +msgid "Contiguous Size" +msgstr "連続サイズ" + +msgid "I/O Width" +msgstr "I/O幅" + +msgid "Transfer Speed" +msgstr "転送速度" + +msgid "EMS mode" +msgstr "EMSモード" + +msgid "Address for > 2 MB" +msgstr "2MB以上のアドレス" + +msgid "Frame Address" +msgstr "フレームアドレス" + +msgid "USA" +msgstr "アメリカ" + +msgid "Danish" +msgstr "デンマーク語" + +msgid "Always at selected speed" +msgstr "常に選択された速度" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS設定+ホットキー(POST中はオフ)" + +msgid "64 kB starting from F0000" +msgstr "F0000から始まる64キロバイト" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "E0000から始まる128キロバイト(アドレスMSBが反転、最後の64キロバイトが最初)" + +msgid "Sine" +msgstr "正弦波" + +msgid "Triangle" +msgstr "三角波" + +msgid "Linear" +msgstr "線形" + +msgid "4th Order" +msgstr "4位" + +msgid "7th Order" +msgstr "7位" + +msgid "Non-timed (original)" +msgstr "タイマーなし(オリジナル)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz(JMP2にジャンパーなし)" + +msgid "Two" +msgstr "二つ" + +msgid "Three" +msgstr "三つ" + +msgid "Wheel" +msgstr "ホイール" + +msgid "Five + Wheel" +msgstr "五つ+ホイール" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 シリアル / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R)シリアル" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "BIOSを無効にする" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "シグマテル STAC9721T(ステレオ)" + +msgid "Classic" +msgstr "クラシック" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "コンポジット" + +msgid "Old" +msgstr "古い" + +msgid "New" +msgstr "新しい" + +msgid "Color (generic)" +msgstr "カラー(ジェネリック)" + +msgid "Green Monochrome" +msgstr "みどりのモノクローム" + +msgid "Amber Monochrome" +msgstr "鼈甲色のモノクローム" + +msgid "Gray Monochrome" +msgstr "ねずみ色のモノクローム" + +msgid "Color (no brown)" +msgstr "カラー(ブラウンなし)" + +msgid "Color (IBM 5153)" +msgstr "カラー(IBM 5153)" + +msgid "Simple doubling" +msgstr "単純な倍加" + +msgid "sRGB interpolation" +msgstr "sRGB補間" + +msgid "Linear interpolation" +msgstr "線形補間" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "モノクローム(5151/MDA)(白い)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "モノクローム(5151/MDA)(みどり)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "モノクローム(5151/MDA)(鼈甲色)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "カラー40x25(5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "カラー80x25(5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "エンハンスト・カラー - ノーマルモード(5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "エンハンスト・カラー - エンハンスト・モード(5154/ECD)" + +msgid "Green" +msgstr "みどり" + +msgid "Amber" +msgstr "鼈甲色" + +msgid "Gray" +msgstr "ねずみ色" + +msgid "Color" +msgstr "カラー" + +msgid "U.S. English" +msgstr "アメリカ英語" + +msgid "Scandinavian" +msgstr "スカンジナビア" + +msgid "Other languages" +msgstr "その他の言語" + +msgid "Bochs latest" +msgstr "ボッフス最新作" + +msgid "Mono Non-Interlaced" +msgstr "モノラル・ノンインターレース" + +msgid "Color Interlaced" +msgstr "カラー・インターレース" + +msgid "Color Non-Interlaced" +msgstr "カラーノンインターレース" + +msgid "3Dfx Voodoo Graphics" +msgstr "3dfx Voodooグラフィック" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst(2 TMU単位)" + +msgid "8-bit" +msgstr "8ビット" + +msgid "16-bit" +msgstr "16ビット" + +msgid "Standard (150ns)" +msgstr "標準(150ns)" + +msgid "High-Speed (120ns)" +msgstr "高速(120ns)" + +msgid "Enabled" +msgstr "有効" + +msgid "Standard" +msgstr "スタンダード" + +msgid "High-Speed" +msgstr "高速" + +msgid "Stereo LPT DAC" +msgstr "ステレオLPT DAC" + +msgid "Generic Text Printer" +msgstr "汎用テキスト・プリンタ" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "汎用ESC/Pドットマトリクスプリンタ" + +msgid "Generic PostScript Printer" +msgstr "汎用ポストスクリプトプリンタ" + +msgid "Generic PCL5e Printer" +msgstr "汎用PCL5eプリンタ" + +msgid "Parallel Line Internet Protocol" +msgstr "パラレルライン・インターネット・プロトコル" + +msgid "Protection Dongle for Savage Quest" +msgstr "サベージ・クエスト用プロテクション・ドングル" + +msgid "Serial Passthrough Device" +msgstr "シリアル・ポート・パススルー・デバイス" + +msgid "Passthrough Mode" +msgstr "パススルーモード" + +msgid "Host Serial Device" +msgstr "ホスト・シリアル・デバイス" + +msgid "Name of pipe" +msgstr "パイプ名" + +msgid "Data bits" +msgstr "データ・ビット" + +msgid "Stop bits" +msgstr "ストップビット" + +msgid "Baud Rate of Passthrough" +msgstr "パススルーのボーレート" + +msgid "Named Pipe (Server)" +msgstr "名前付きパイプ(サーバー)" + +msgid "Host Serial Passthrough" +msgstr "ホストシリアルポートのパススルー" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index afecf78f6..7a6b76d2f 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -390,8 +390,11 @@ msgstr "동적 재컴파일" msgid "Video:" msgstr "비디오 카드:" -msgid "Voodoo Graphics" -msgstr "Voodoo 그래픽" +msgid "Video 2:" +msgstr "비디오 카드 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 또는 2 그래픽" msgid "IBM 8514/A Graphics" msgstr "IBM 8514/A 그래픽" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "치명적인 오류" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - 일시 중지됨" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Ctrl+Alt+PgDn 키를 누르면 창 모드로 전환합니다." @@ -684,6 +687,9 @@ msgstr "roms/machines 디렉토리에 필요한 롬파일이 없어 기종 \"%hs msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "roms/video 디렉토리에 필요한 롬파일이 없어 비디오 카드 \"%hs\"을(를) 사용할 수 없습니다. 사용 가능한 기종으로 변경합니다." +msgid "Video card 2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "roms/video 디렉토리에 필요한 롬파일이 없어 비디오 카드 2 \"%hs\"을(를) 사용할 수 없습니다. 사용 가능한 기종으로 변경합니다." + msgid "Machine" msgstr "기종" @@ -762,17 +768,26 @@ msgstr "PCap 장치가 없습니다" msgid "Invalid PCap device" msgstr "PCap 장치가 올바르지 않습니다" -msgid "Standard 2-button joystick(s)" -msgstr "표준 2버튼 조이스틱" +msgid "2-axis, 2-button joystick(s)" +msgstr "2축, 2버튼 조이스틱" -msgid "Standard 4-button joystick" -msgstr "표준 4버튼 조이스틱" +msgid "2-axis, 4-button joystick" +msgstr "2축, 4버튼 조이스틱" -msgid "Standard 6-button joystick" -msgstr "표준 6버튼 조이스틱" +msgid "2-axis, 6-button joystick" +msgstr "2축, 6버튼 조이스틱" -msgid "Standard 8-button joystick" -msgstr "표준 8버튼 조이스틱" +msgid "2-axis, 8-button joystick" +msgstr "2축, 8버튼 조이스틱" + +msgid "3-axis, 2-button joystick" +msgstr "3축, 2버튼 조이스틱" + +msgid "3-axis, 4-button joystick" +msgstr "3축, 4버튼 조이스틱" + +msgid "4-axis, 4-button joystick" +msgstr "4축, 4버튼 조이스틱" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "86Box를 끝내시겠습니까?" msgid "Unable to initialize Ghostscript" msgstr "Ghostscript를 초기화할 수 없습니다" +msgid "Unable to initialize GhostPCL" +msgstr "GhostPCL를 초기화할 수 없습니다" + msgid "MO %i (%ls): %ls" msgstr "광자기 %i (%ls): %ls" @@ -855,6 +873,9 @@ msgstr "올바르지 않은 설정입니다" 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은(는) PostScript 파일을 PDF로 자동변환하는 데에 필요합니다.\n\n표준 PostScript 프린터로 보내신 임의의 문서는 PostScript (.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." +msgstr "%1은(는) PCL 파일을 PDF로 자동변환하는 데에 필요합니다.\n\n표준 PCL 프린터로 보내신 임의의 문서는 Printer Command Language (.pcl) 파일로 저장됩니다." + msgid "Entering fullscreen mode" msgstr "전체 화면으로 전환" @@ -999,6 +1020,27 @@ msgstr "덮어쓰기" msgid "Don't overwrite" msgstr "덮어쓰지 않음" +msgid "Raw image" +msgstr "Raw 이미지" + +msgid "HDI image" +msgstr "HDI 이미지" + +msgid "HDX image" +msgstr "HDX 이미지" + +msgid "Fixed-size VHD" +msgstr "고정 사이즈 VHD" + +msgid "Dynamic-size VHD" +msgstr "동적 사이즈 VHD" + +msgid "Differencing VHD" +msgstr "디퍼런싱 VHD" + +msgid "(N/A)" +msgstr "(해당 없음)" + msgid "Raw image (.img)" msgstr "Raw 이미지 (.img)" @@ -1172,3 +1214,888 @@ msgstr "WinBox는 더 이상 지원되지 않습니다" 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 "WinBox 매니저의 개발은 유지 관리자의 부족으로 인해 2022년에 중단되었습니다. 86Box를 더욱 개선하기 위한 노력의 일환으로 WinBox 매니저를 더 이상 지원하지 않기로 결정했습니다.\n\nWinBox를 통해 더 이상의 업데이트는 제공되지 않으며, 최신 버전의 86Box를 계속 사용할 경우 잘못된 동작이 발생할 수 있습니다. WinBox 동작과 관련된 모든 버그 보고는 유효하지 않은 것으로 종료됩니다.\n\n사용할 수 있는 다른 관리자 목록을 보려면 86box.net으로 이동하세요." + +msgid "Generate" +msgstr "생성" + +msgid "Joystick configuration" +msgstr "조이스틱 구성" + +msgid "Device" +msgstr "장치" + +msgid "%1 (X axis)" +msgstr "1(X 축)" + +msgid "%1 (Y axis)" +msgstr "1(Y 축)" + +msgid "MCA devices" +msgstr "MCA 장치" + +msgid "List of MCA devices:" +msgstr "MCA 장치 목록:" + +msgid "Tablet tool" +msgstr "태블릿 도구" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt(OpenGL &ES)" + +msgid "About Qt" +msgstr "Qt 소개" + +msgid "MCA devices..." +msgstr "MCA 장치..." + +msgid "Show non-primary monitors" +msgstr "기본 모니터가 아닌 모니터 표시" + +msgid "Open screenshots folder..." +msgstr "스크린샷 폴더 열기..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "최대화 시 전체 화면 비율 적용" + +msgid "Cursor/Puck" +msgstr "커서/퍽" + +msgid "Pen" +msgstr "펜" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "호스트 CD/DVD 드라이브(%1:)" + +msgid "&Connected" +msgstr "&커넥티드" + +msgid "Clear image history" +msgstr "이미지 기록 지우기" + +msgid "Create..." +msgstr "만들기..." + +msgid "previous image" +msgstr "이전 이미지" + +msgid "Host CD/DVD Drive (%1)" +msgstr "호스트 CD/DVD 드라이브 (%1)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "렌더링 동작" + +msgid "Use target framerate:" +msgstr "목표 프레임 레이트를 사용합니다:" + +msgid " fps" +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 "비디오와 동기" + +msgid "Shaders" +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 컨텍스트를 만들 수 없습니다." + +msgid "Couldn't switch to OpenGL context." +msgstr "OpenGL 컨텍스트로 전환할 수 없습니다." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "OpenGL 버전 3.0 이상이 필요합니다. 현재 버전은 %1.%2입니다." + +msgid "OpenGL initialization failed. Error %1." +msgstr "OpenGL 초기화에 실패했습니다. 오류 %1입니다." + +msgid "Error initializing OpenGL" +msgstr "OpenGL 초기화 중 오류 발생" + +msgid "Falling back to software rendering.\n" +msgstr "소프트웨어 렌더링으로 돌아가기.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "압축 해제 버퍼에 메모리를 할당하지 못했습니다.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>미디어 이미지(CD-ROM, 플로피 등)를 선택하면 86Box 구성 파일과 동일한 디렉터리에서 열기 대화 상자가 시작됩니다. 이 설정은 macOS에서만 차이가 있을 수 있습니다.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "이 컴퓨터가 이동되었거나 복사되었을 수 있습니다." + +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 "적절한 네트워킹 기능을 보장하기 위해 86Box는 이 머신이 이동 또는 복사되었는지 여부를 알아야 합니다.\n\n확실하지 않은 경우 \"복사했습니다\"를 선택합니다." + +msgid "I Moved It" +msgstr "옮겼어요" + +msgid "I Copied It" +msgstr "복사했습니다" + +msgid "86Box Monitor #" +msgstr "86Box 모니터 #" + +msgid "No MCA devices." +msgstr "MCA 장치가 없습니다." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "네트워크 카드 1" + +msgid "Network Card #2" +msgstr "네트워크 카드 2" + +msgid "Network Card #3" +msgstr "네트워크 카드 3" + +msgid "Network Card #4" +msgstr "네트워크 카드 4" + +msgid "Mode" +msgstr "모드" + +msgid "Interface" +msgstr "인터페이스" + +msgid "Adapter" +msgstr "어댑터" + +msgid "VDE Socket" +msgstr "VDE 소켓" + +msgid "86Box Unit Tester" +msgstr "86Box 유닛 테스터" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x 키 카드" + +msgid "Serial port passthrough 1" +msgstr "직렬 포트 패스스루 1" + +msgid "Serial port passthrough 2" +msgstr "직렬 포트 패스스루 2" + +msgid "Serial port passthrough 3" +msgstr "직렬 포트 패스스루 3" + +msgid "Serial port passthrough 4" +msgstr "직렬 포트 패스스루 4" + +msgid "Vision Systems LBA Enhancer" +msgstr "비전 시스템 LBA 인핸서" + +msgid "Renderer options..." +msgstr "렌더러 옵션..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "로지텍/마이크로소프트 버스 마우스" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "마이크로소프트 버스 마우스 (인포트)" + +msgid "Mouse Systems Serial Mouse" +msgstr "마우스 시스템 시리얼 마우스" + +msgid "Microsoft Serial Mouse" +msgstr "마이크로소프트 직렬 마우스" + +msgid "Logitech Serial Mouse" +msgstr "로지텍 직렬 마우스" + +msgid "PS/2 Mouse" +msgstr "PS/2 마우스" + +msgid "3M MicroTouch (Serial)" +msgstr "3M 마이크로터치 (직렬)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] 표준 헤이즈 호환 모뎀" + +msgid "Roland MT-32 Emulation" +msgstr "롤랜드 MT-32 에뮬레이션" + +msgid "Roland MT-32 (New) Emulation" +msgstr "롤랜드 MT-32 (신규) 에뮬레이션" + +msgid "Roland CM-32L Emulation" +msgstr "롤랜드 CM-32L 에뮬레이션" + +msgid "Roland CM-32LN Emulation" +msgstr "롤랜드 CM-32LN 에뮬레이션" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML 도터보드" + +msgid "System MIDI" +msgstr "시스템 미디" + +msgid "MIDI Input Device" +msgstr "미디 입력 장치" + +msgid "BIOS Address" +msgstr "BIOS 주소" + +msgid "Enable BIOS extension ROM Writes" +msgstr "BIOS 확장 ROM 쓰기 활성화" + +msgid "Address" +msgstr "주소" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS 개정" + +msgid "Translate 26 -> 17" +msgstr "번역 26 -> 17" + +msgid "Language" +msgstr "언어" + +msgid "Enable backlight" +msgstr "백라이트 사용" + +msgid "Invert colors" +msgstr "색상 반전" + +msgid "BIOS size" +msgstr "BIOS 크기" + +msgid "Map C0000-C7FFF as UMB" +msgstr "C0000-C7FFF를 UMB로 매핑하기" + +msgid "Map C8000-CFFFF as UMB" +msgstr "C8000-CFFFF를 UMB로 매핑하기" + +msgid "Map D0000-D7FFF as UMB" +msgstr "D0000-D7FFF를 UMB로 매핑하기" + +msgid "Map D8000-DFFFF as UMB" +msgstr "D8000-DFFFF를 UMB로 매핑하기" + +msgid "Map E0000-E7FFF as UMB" +msgstr "E0000-E7FFF를 UMB로 매핑하기" + +msgid "Map E8000-EFFFF as UMB" +msgstr "E8000-EFFFF를 UMB로 매핑하기" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 점퍼(JIM)" + +msgid "MIDI Output Device" +msgstr "미디 출력 장치" + +msgid "MIDI Real time" +msgstr "MIDI 실시간" + +msgid "MIDI Thru" +msgstr "미디 입력 패스스루" + +msgid "MIDI Clockout" +msgstr "미디 클럭 출력" + +msgid "SoundFont" +msgstr "사운드 글꼴" + +msgid "Output Gain" +msgstr "출력 게인" + +msgid "Chorus" +msgstr "코러스" + +msgid "Chorus Voices" +msgstr "코러스 보이스" + +msgid "Chorus Level" +msgstr "코러스 레벨" + +msgid "Chorus Speed" +msgstr "코러스 속도" + +msgid "Chorus Depth" +msgstr "코러스 깊이" + +msgid "Chorus Waveform" +msgstr "코러스 파형" + +msgid "Reverb" +msgstr "리버브" + +msgid "Reverb Room Size" +msgstr "리버브 룸의 크기" + +msgid "Reverb Damping" +msgstr "리버브 댐핑" + +msgid "Reverb Width" +msgstr "리버브 폭" + +msgid "Reverb Level" +msgstr "리버브 레벨" + +msgid "Interpolation Method" +msgstr "보간 방법" + +msgid "Reverb Output Gain" +msgstr "리버브 출력의 게인" + +msgid "Reversed stereo" +msgstr "리버시블 스테레오" + +msgid "Nice ramp" +msgstr "멋진 경사로" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "버튼" + +msgid "Serial Port" +msgstr "직렬 포트" + +msgid "RTS toggle" +msgstr "RTS 토글" + +msgid "Revision" +msgstr "개정" + +msgid "Controller" +msgstr "컨트롤러" + +msgid "Show Crosshair" +msgstr "십자선 표시" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC 주소" + +msgid "MAC Address OUI" +msgstr "MAC 주소 OUI" + +msgid "Enable BIOS" +msgstr "BIOS 활성화" + +msgid "Baud Rate" +msgstr "전송 속도" + +msgid "TCP/IP listening port" +msgstr "TCP/IP 수신 포트" + +msgid "Phonebook File" +msgstr "전화번호부 파일" + +msgid "Telnet emulation" +msgstr "텔넷 에뮬레이션" + +msgid "RAM Address" +msgstr "RAM 주소" + +msgid "RAM size" +msgstr "RAM 크기" + +msgid "Initial RAM size" +msgstr "초기 RAM 크기" + +msgid "Serial Number" +msgstr "일련 번호" + +msgid "Host ID" +msgstr "호스트 ID" + +msgid "FDC Address" +msgstr "FDC 주소" + +msgid "MPU-401 Address" +msgstr "MPU-401 주소" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "미디 입력 받기" + +msgid "Low DMA" +msgstr "낮은 DMA" + +msgid "Enable Game port" +msgstr "게임 포트 사용" + +msgid "Surround module" +msgstr "서라운드 모듈" + +msgid "CODEC" +msgstr "코덱" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "코덱 설정 시 코덱 인터럽트 올리기(일부 드라이버에 필요)" + +msgid "SB Address" +msgstr "SB 주소" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "OPL 사용" + +msgid "Receive MIDI input (MPU-401)" +msgstr "미디 입력 수신(MPU-401)" + +msgid "SB low DMA" +msgstr "SB 낮은 DMA" + +msgid "6CH variant (6-channel)" +msgstr "6채널 변형(6채널)" + +msgid "Enable CMS" +msgstr "CMS 사용" + +msgid "Mixer" +msgstr "믹서" + +msgid "High DMA" +msgstr "높은 DMA" + +msgid "Control PC speaker" +msgstr "PC 스피커 제어" + +msgid "Memory size" +msgstr "메모리 크기" + +msgid "EMU8000 Address" +msgstr "EMU8000 주소" + +msgid "IDE Controller" +msgstr "IDE 컨트롤러" + +msgid "Codec" +msgstr "코덱" + +msgid "GUS type" +msgstr "GUS 유형" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "명령 0x04 활성화 \"86Box 종료\"" + +msgid "Display type" +msgstr "디스플레이 유형" + +msgid "Composite type" +msgstr "복합 유형" + +msgid "RGB type" +msgstr "RGB 유형" + +msgid "Line doubling type" +msgstr "라인 두 배 유형" + +msgid "Snow emulation" +msgstr "눈 에뮬레이션" + +msgid "Monitor type" +msgstr "모니터 유형" + +msgid "Character set" +msgstr "문자 집합" + +msgid "XGA type" +msgstr "XGA 유형" + +msgid "Instance" +msgstr "인스턴스" + +msgid "MMIO Address" +msgstr "MMIO 주소" + +msgid "RAMDAC type" +msgstr "램닥 유형" + +msgid "Blend" +msgstr "블렌드" + +msgid "Bilinear filtering" +msgstr "이중선형 필터링" + +msgid "Dithering" +msgstr "디더링" + +msgid "Enable NMI for CGA emulation" +msgstr "CGA 에뮬레이션을 위한 NMI 활성화" + +msgid "Voodoo type" +msgstr "부두 유형" + +msgid "Framebuffer memory size" +msgstr "프레임버퍼 메모리 크기" + +msgid "Texture memory size" +msgstr "텍스처 메모리 크기" + +msgid "Dither subtraction" +msgstr "디더 빼기" + +msgid "Screen Filter" +msgstr "화면 필터" + +msgid "Render threads" +msgstr "렌더 스레드" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "시작 주소" + +msgid "Contiguous Size" +msgstr "연속 크기" + +msgid "I/O Width" +msgstr "I/O 폭" + +msgid "Transfer Speed" +msgstr "전송 속도" + +msgid "EMS mode" +msgstr "EMS 모드" + +msgid "Address for > 2 MB" +msgstr "2MB 이상의 주소" + +msgid "Frame Address" +msgstr "프레임 주소" + +msgid "USA" +msgstr "미국" + +msgid "Danish" +msgstr "덴마크어" + +msgid "Always at selected speed" +msgstr "항상 선택한 속도로" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS 설정 + 핫키(POST 중 꺼짐)" + +msgid "64 kB starting from F0000" +msgstr "64kB부터 F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "E0000에서 시작하는 128kB(주소 MSB 반전, 마지막 64KB 먼저)" + +msgid "Sine" +msgstr "사인" + +msgid "Triangle" +msgstr "트라이앵글" + +msgid "Linear" +msgstr "리니어" + +msgid "4th Order" +msgstr "4번째 주문" + +msgid "7th Order" +msgstr "7차 주문" + +msgid "Non-timed (original)" +msgstr "타이머 없음(원본)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45Hz(JMP2에서 점퍼 없음)" + +msgid "Two" +msgstr "Two" + +msgid "Three" +msgstr "세" + +msgid "Wheel" +msgstr "휠" + +msgid "Five + Wheel" +msgstr "5개 + 휠" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 직렬/SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) 직렬" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "BIOS 비활성화" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2MB" + +msgid "8 MB" +msgstr "8MB" + +msgid "28 MB" +msgstr "28MB" + +msgid "1 MB" +msgstr "1MB" + +msgid "4 MB" +msgstr "4MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16MB" + +msgid "20 MB" +msgstr "20MB" + +msgid "24 MB" +msgstr "24MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "시그마텔 STAC9721T(스테레오)" + +msgid "Classic" +msgstr "클래식" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "합성" + +msgid "Old" +msgstr "Old" + +msgid "New" +msgstr "신규" + +msgid "Color (generic)" +msgstr "색상(일반)" + +msgid "Green Monochrome" +msgstr "녹색 단색" + +msgid "Amber Monochrome" +msgstr "앰버 모노크롬" + +msgid "Gray Monochrome" +msgstr "회색 단색" + +msgid "Color (no brown)" +msgstr "색상(갈색 없음)" + +msgid "Color (IBM 5153)" +msgstr "색상(IBM 5153)" + +msgid "Simple doubling" +msgstr "간단한 두 배로 늘리기" + +msgid "sRGB interpolation" +msgstr "sRGB 보간" + +msgid "Linear interpolation" +msgstr "선형 보간" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "흑백(5151/MDA)(흰색)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "흑백(5151/MDA)(녹색)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "흑백(5151/MDA)(호박색)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "컬러 40x25(5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "컬러 80x25(5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "향상된 색상 - 일반 모드(5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "향상된 색상 - 향상된 모드(5154/ECD)" + +msgid "Green" +msgstr "녹색" + +msgid "Amber" +msgstr "Amber" + +msgid "Gray" +msgstr "회색" + +msgid "Color" +msgstr "색상" + +msgid "U.S. English" +msgstr "미국 영어" + +msgid "Scandinavian" +msgstr "스칸디나비아" + +msgid "Other languages" +msgstr "기타 언어" + +msgid "Bochs latest" +msgstr "Bochs 최신 정보" + +msgid "Mono Non-Interlaced" +msgstr "모노 비인터레이스" + +msgid "Color Interlaced" +msgstr "컬러 인터레이스" + +msgid "Color Non-Interlaced" +msgstr "비인터레이스 컬러" + +msgid "3Dfx Voodoo Graphics" +msgstr "3Dfx 부두 그래픽" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "옵시디언 SB50 + 자수정(TMU 2개)" + +msgid "8-bit" +msgstr "8비트" + +msgid "16-bit" +msgstr "16비트" + +msgid "Standard (150ns)" +msgstr "표준(150ns)" + +msgid "High-Speed (120ns)" +msgstr "고속(120ns)" + +msgid "Enabled" +msgstr "활성화됨" + +msgid "Standard" +msgstr "표준" + +msgid "High-Speed" +msgstr "고속" + +msgid "Stereo LPT DAC" +msgstr "스테레오 LPT DAC" + +msgid "Generic Text Printer" +msgstr "일반 텍스트 프린터" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "일반 ESC/P 도트 매트릭스 프린터" + +msgid "Generic PostScript Printer" +msgstr "일반 포스트스크립트 프린터" + +msgid "Generic PCL5e Printer" +msgstr "일반 PCL5e 프린터" + +msgid "Parallel Line Internet Protocol" +msgstr "병렬 인터넷 프로토콜" + +msgid "Protection Dongle for Savage Quest" +msgstr "새비지 퀘스트용 보호 동글" + +msgid "Serial Passthrough Device" +msgstr "직렬 포트 패스스루 장치" + +msgid "Passthrough Mode" +msgstr "패스스루 모드" + +msgid "Host Serial Device" +msgstr "호스트 직렬 장치" + +msgid "Name of pipe" +msgstr "파이프 이름" + +msgid "Data bits" +msgstr "데이터 비트" + +msgid "Stop bits" +msgstr "비트 중지" + +msgid "Baud Rate of Passthrough" +msgstr "통과 속도" + +msgid "Named Pipe (Server)" +msgstr "네임드 파이프(서버)" + +msgid "Host Serial Passthrough" +msgstr "호스트 직렬 포트 패스스루" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 993e6633a..4d6407983 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -115,10 +115,10 @@ msgid "&Fullscreen\tCtrl+Alt+PgUp" msgstr "&Pełny ekran\tCtrl+Alt+PgUp" msgid "Fullscreen &stretch mode" -msgstr "Fullscreen &stretch mode" +msgstr "Tryb rozciągania na pełnym ekranie" msgid "&Full screen stretch" -msgstr "&Tryb rozciągania na pełnym ekranie" +msgstr "&Rozciągnij na pełny ekran" msgid "&4:3" msgstr "&4:3" @@ -390,8 +390,11 @@ msgstr "Dynamiczny rekompilator" msgid "Video:" msgstr "Wideo:" -msgid "Voodoo Graphics" -msgstr "Grafika Voodoo" +msgid "Video #2:" +msgstr "Wideo 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Grafika Voodoo 1 czy 2" msgid "IBM 8514/A Graphics" msgstr "Grafika IBM 8514/A" @@ -684,6 +687,9 @@ msgstr "Maszyna \"%hs\" nie jest dostępna, ponieważ brakuje obrazów ROM w kat msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Karta wideo \"%hs\" nie jest dostępna, ponieważ brakuje obrazów ROM w katalogu roms/video. Przełączanie na dostępną kartę wideo." +msgid "Video card 2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Karta wideo 2 \"%hs\" nie jest dostępna, ponieważ brakuje obrazów ROM w katalogu roms/video. Przełączanie na dostępną kartę wideo." + msgid "Machine" msgstr "Maszyna" @@ -762,17 +768,26 @@ msgstr "Nie znaleziono urządzeń PCap" msgid "Invalid PCap device" msgstr "Nieprawidłowe urządzenie PCap" -msgid "Standard 2-button joystick(s)" -msgstr "Standardowe joysticki 2-przyciskowe" +msgid "2-axis, 2-button joystick(s)" +msgstr "Joysticki 2-osiowe, 2-przyciskowe" -msgid "Standard 4-button joystick" -msgstr "Standardowy joystick 4-przyciskowy" +msgid "2-axis, 4-button joystick" +msgstr "Joystick 2-osiowy, 4-przyciskowy" -msgid "Standard 6-button joystick" -msgstr "Standardowy joystick 6-przyciskowy" +msgid "2-axis, 6-button joystick" +msgstr "Joystick 2-osiowy, 6-przyciskowy" -msgid "Standard 8-button joystick" -msgstr "Standardowy joystick 8-przyciskowy" +msgid "2-axis, 8-button joystick" +msgstr "Joystick 2-osiowy, 8-przyciskowy" + +msgid "3-axis, 2-button joystick" +msgstr "Joystick 3-osiowy, 2-przyciskowy" + +msgid "3-axis, 4-button joystick" +msgstr "Joystick 3-osiowy, 4-przyciskowy" + +msgid "4-axis, 4-button joystick" +msgstr "Joystick 4-osiowy, 4-przyciskowy" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Jesteś pewien że chcesz zakończyć 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Nieprawidłowa konfiguracja" 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 jest wymagany do automatycznej konwersji plików PostScript do PDF.\n\nDokumenty wysłane do ogólnej drukarki PostScript zostaną zapisane jako pliki PostScript (.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." +msgstr "%1 jest wymagany do automatycznej konwersji plików PCL do PDF.\n\nDokumenty wysłane do ogólnej drukarki PCL zostaną zapisane jako pliki Printer Command Language (.pcl)." + msgid "Entering fullscreen mode" msgstr "Przechodzenie do trybu pełnoekranowego" @@ -999,6 +1020,27 @@ msgstr "Nadpisz" msgid "Don't overwrite" msgstr "Nie nadpisuj" +msgid "Raw image" +msgstr "Obraz surowy" + +msgid "HDI image" +msgstr "Obraz HDI" + +msgid "HDX image" +msgstr "Obraz HDX" + +msgid "Fixed-size VHD" +msgstr "VHD o stałym rozmiarze" + +msgid "Dynamic-size VHD" +msgstr "VHD o dynamicznym rozmiarze" + +msgid "Differencing VHD" +msgstr "VHD różnicujący" + +msgid "(N/A)" +msgstr "(Bez)" + msgid "Raw image (.img)" msgstr "Obraz surowy (.img)" @@ -1172,3 +1214,888 @@ msgstr "WinBox nie jest już wspierany" 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 "Rozwój menedżera WinBox został zatrzymany w 2022 roku z powodu braku opiekunów. Ponieważ kierujemy nasze wysiłki na uczynienie 86Box jeszcze lepszym, podjęliśmy decyzję o zaprzestaniu wspierania WinBox jako menedżera.\n\nŻadne dalsze aktualizacje nie będą dostarczane za pośrednictwem WinBox i możesz napotkać nieprawidłowe zachowanie, jeśli będziesz go nadal używać z nowszymi wersjami 86Box. Wszelkie zgłoszenia błędów związane z działaniem WinBox zostaną zamknięte jako nieważne.\n\nLista innych menedżerów, z których można korzystać, znajduje się na stronie 86box.net." + +msgid "Generate" +msgstr "Generuj" + +msgid "Joystick configuration" +msgstr "Konfiguracja joysticka" + +msgid "Device" +msgstr "Urządzenie" + +msgid "%1 (X axis)" +msgstr "%1 (oś X)" + +msgid "%1 (Y axis)" +msgstr "%1 (oś Y)" + +msgid "MCA devices" +msgstr "Urządzenia MCA" + +msgid "List of MCA devices:" +msgstr "Lista urządzeń MCA:" + +msgid "Tablet tool" +msgstr "Narzędzie do tabletów" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "O Qt" + +msgid "MCA devices..." +msgstr "Urządzenia MCA..." + +msgid "Show non-primary monitors" +msgstr "Pokaż monitory inne niż podstawowe" + +msgid "Open screenshots folder..." +msgstr "Otwórz folder zrzutów ekranu..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Zastosowanie trybu rozciągania na pełnym ekranie w stanie zmaksymalizowanym" + +msgid "Cursor/Puck" +msgstr "Kursor/krążek" + +msgid "Pen" +msgstr "Pióro" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Napęd CD/DVD hosta (%1:)" + +msgid "&Connected" +msgstr "&Connected" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Zachowanie renderowania" + +msgid "Use target framerate:" +msgstr "Użyj docelowej liczby klatek na sekundę:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Nie można przełączyć na kontekst OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Wymagana jest wersja OpenGL 3.0 lub wyższa. Aktualna wersja to %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Inicjalizacja OpenGL nie powiodła się. Błąd %1." + +msgid "Error initializing OpenGL" +msgstr "Błąd inicjalizacji OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Powrót do renderowania oprogramowania.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Przydzielenie pamięci dla bufora rozpakowywania nie powiodło się.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Podczas wybierania obrazów nośników (CD-ROM, dyskietka itp.) otwarte okno dialogowe rozpocznie się w tym samym katalogu, co plik konfiguracyjny 86Box. To ustawienie prawdopodobnie będzie miało znaczenie tylko na macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "To urządzenie mogło zostać przeniesione lub skopiowane." + +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 "Aby zapewnić prawidłową funkcjonalność sieci, 86Box musi wiedzieć, czy to urządzenie zostało przeniesione lub skopiowane.\n\nW przypadku braku pewności, wybrać opcję \"Zostało skopiowane\"." + +msgid "I Moved It" +msgstr "Zostało przeniesione" + +msgid "I Copied It" +msgstr "Zostało skopiowane" + +msgid "86Box Monitor #" +msgstr "86Box Monitor " + +msgid "No MCA devices." +msgstr "Brak urządzeń MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Karta sieciowa 1" + +msgid "Network Card #2" +msgstr "Karta sieciowa 2" + +msgid "Network Card #3" +msgstr "Karta sieciowa 3" + +msgid "Network Card #4" +msgstr "Karta sieciowa 4" + +msgid "Mode" +msgstr "Tryb" + +msgid "Interface" +msgstr "Interfejs" + +msgid "Adapter" +msgstr "Adapter" + +msgid "VDE Socket" +msgstr "Gniazdo VDE" + +msgid "86Box Unit Tester" +msgstr "Tester urządzeń 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Karta klucza Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Przełączanie portu szeregowego 1" + +msgid "Serial port passthrough 2" +msgstr "Przełączanie portu szeregowego 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Mysz magistralna Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Mysz magistralna Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mysz szeregowa Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Mysz szeregowa Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Mysz szeregowa Logitech" + +msgid "PS/2 Mouse" +msgstr "Mysz PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (szeregowa)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Standardowy modem zgodny z Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Emulacja Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulacja Roland MT-32 (nowego)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulacja Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulacja Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Płyta córka OPL4-ML" + +msgid "System MIDI" +msgstr "System MIDI" + +msgid "MIDI Input Device" +msgstr "Urządzenie wejściowe MIDI" + +msgid "BIOS Address" +msgstr "Adres BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Włączenie zapisu do pamięci ROM rozszerzenia BIOS" + +msgid "Address" +msgstr "Adres" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Wersja BIOS-u" + +msgid "Translate 26 -> 17" +msgstr "Przetłumacz 26 -> 17" + +msgid "Language" +msgstr "Język" + +msgid "Enable backlight" +msgstr "Włącz podświetlenie" + +msgid "Invert colors" +msgstr "Odwracanie kolorów" + +msgid "BIOS size" +msgstr "Rozmiar BIOS-u" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapowanie C0000-C7FFF jako UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapowanie C8000-CFFFF jako UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapowanie D0000-D7FFF jako UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapowanie D8000-DFFFF jako UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapowanie E0000-E7FFF jako UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapowanie E8000-EFFFF jako UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Zworka JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Urządzenie wyjściowe MIDI" + +msgid "MIDI Real time" +msgstr "MIDI w czasie rzeczywistym" + +msgid "MIDI Thru" +msgstr "Przejście wejścia MIDI" + +msgid "MIDI Clockout" +msgstr "Wyjście zegara MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Wzmocnienie wyjściowe" + +msgid "Chorus" +msgstr "Chór" + +msgid "Chorus Voices" +msgstr "Głosy chóru" + +msgid "Chorus Level" +msgstr "Poziom chóru" + +msgid "Chorus Speed" +msgstr "Prędkość chóru" + +msgid "Chorus Depth" +msgstr "Głębokość chóru" + +msgid "Chorus Waveform" +msgstr "Kształt fali chóru" + +msgid "Reverb" +msgstr "Pogłos" + +msgid "Reverb Room Size" +msgstr "Rozmiar pomieszczenia pogłosu" + +msgid "Reverb Damping" +msgstr "Tłumienie pogłosu" + +msgid "Reverb Width" +msgstr "Szerokość pogłosu" + +msgid "Reverb Level" +msgstr "Poziom pogłosu" + +msgid "Interpolation Method" +msgstr "Metoda interpolacji" + +msgid "Reverb Output Gain" +msgstr "Wzmocnienie sygnału wyjściowego pogłosu" + +msgid "Reversed stereo" +msgstr "Odwrócone stereo" + +msgid "Nice ramp" +msgstr "Niezła rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Przyciski" + +msgid "Serial Port" +msgstr "Port szeregowy" + +msgid "RTS toggle" +msgstr "Przełącznik RTS" + +msgid "Revision" +msgstr "Rewizja" + +msgid "Controller" +msgstr "Kontroler" + +msgid "Show Crosshair" +msgstr "Pokaż celownik" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Adres MAC" + +msgid "MAC Address OUI" +msgstr "OUI adresu MAC" + +msgid "Enable BIOS" +msgstr "Włącz BIOS" + +msgid "Baud Rate" +msgstr "Szybkość transmisji" + +msgid "TCP/IP listening port" +msgstr "Port nasłuchiwania TCP/IP" + +msgid "Phonebook File" +msgstr "Plik książki telefonicznej" + +msgid "Telnet emulation" +msgstr "Emulacja Telnet" + +msgid "RAM Address" +msgstr "Adres RAM" + +msgid "RAM size" +msgstr "Rozmiar pamięci RAM" + +msgid "Initial RAM size" +msgstr "Początkowy rozmiar pamięci RAM" + +msgid "Serial Number" +msgstr "Numer seryjny" + +msgid "Host ID" +msgstr "Identyfikator hosta" + +msgid "FDC Address" +msgstr "Adres FDC" + +msgid "MPU-401 Address" +msgstr "Adres MPU-401" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "Odbiór sygnału wejściowego MIDI" + +msgid "Low DMA" +msgstr "Niski poziom DMA" + +msgid "Enable Game port" +msgstr "Włącz port gier" + +msgid "Surround module" +msgstr "Moduł Surround" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Podniesienie przerwania CODEC przy konfiguracji CODEC (wymagane przez niektóre sterowniki)" + +msgid "SB Address" +msgstr "Adres SB" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "Włącz OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Odbiór wejścia MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "SB low DMA" + +msgid "6CH variant (6-channel)" +msgstr "Wariant 6CH (6-kanałowy)" + +msgid "Enable CMS" +msgstr "Włącz CMS" + +msgid "Mixer" +msgstr "Mikser" + +msgid "High DMA" +msgstr "Wysokie DMA" + +msgid "Control PC speaker" +msgstr "Głośnik komputera sterującego" + +msgid "Memory size" +msgstr "Rozmiar pamięci" + +msgid "EMU8000 Address" +msgstr "Adres EMU8000" + +msgid "IDE Controller" +msgstr "Kontroler IDE" + +msgid "Codec" +msgstr "Kodek" + +msgid "GUS type" +msgstr "Typ GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Włącz polecenie 0x04 \"Wyjdź z 86Box\"" + +msgid "Display type" +msgstr "Typ wyświetlacza" + +msgid "Composite type" +msgstr "Typ kompozytowy" + +msgid "RGB type" +msgstr "Typ RGB" + +msgid "Line doubling type" +msgstr "Typ podwojenia linii" + +msgid "Snow emulation" +msgstr "Emulacja śniegu" + +msgid "Monitor type" +msgstr "Typ monitora" + +msgid "Character set" +msgstr "Zestaw znaków" + +msgid "XGA type" +msgstr "Typ XGA" + +msgid "Instance" +msgstr "Instancja" + +msgid "MMIO Address" +msgstr "Adres MMIO" + +msgid "RAMDAC type" +msgstr "Typ RAMDAC" + +msgid "Blend" +msgstr "Mieszanka" + +msgid "Bilinear filtering" +msgstr "Filtrowanie dwuliniowe" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Włącz NMI dla emulacji CGA" + +msgid "Voodoo type" +msgstr "Typ Voodoo" + +msgid "Framebuffer memory size" +msgstr "Rozmiar pamięci bufora ramki" + +msgid "Texture memory size" +msgstr "Rozmiar pamięci tekstur" + +msgid "Dither subtraction" +msgstr "Odejmowanie ditheru" + +msgid "Screen Filter" +msgstr "Filtr ekranowy" + +msgid "Render threads" +msgstr "Wątki renderowania" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Adres początkowy" + +msgid "Contiguous Size" +msgstr "Przyległy rozmiar" + +msgid "I/O Width" +msgstr "Szerokość wejścia/wyjścia" + +msgid "Transfer Speed" +msgstr "Prędkość transferu" + +msgid "EMS mode" +msgstr "Tryb EMS" + +msgid "Address for > 2 MB" +msgstr "Adres dla > 2 MB" + +msgid "Frame Address" +msgstr "Adres ramki" + +msgid "USA" +msgstr "USA" + +msgid "Danish" +msgstr "Duński" + +msgid "Always at selected speed" +msgstr "Zawsze z wybraną prędkością" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Ustawienia BIOS + klawisze skrótu (wyłączone podczas testu POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB począwszy od F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB począwszy od E0000 (adres MSB odwrócony, najpierw ostatnie 64KB)" + +msgid "Sine" +msgstr "Sinus" + +msgid "Triangle" +msgstr "Trójkąt" + +msgid "Linear" +msgstr "Liniowy" + +msgid "4th Order" +msgstr "4. kolejność" + +msgid "7th Order" +msgstr "7. kolejność" + +msgid "Non-timed (original)" +msgstr "Bez timera (oryginał)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (bez zworki na JMP2)" + +msgid "Two" +msgstr "Dwa" + +msgid "Three" +msgstr "Trzy" + +msgid "Wheel" +msgstr "Koło" + +msgid "Five + Wheel" +msgstr "Five + Wheel" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 szeregowa / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) szeregowa" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Wyłącz BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klasyczny" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Kompozyt" + +msgid "Old" +msgstr "Stary" + +msgid "New" +msgstr "Nowość" + +msgid "Color (generic)" +msgstr "Kolor (ogólny)" + +msgid "Green Monochrome" +msgstr "Zielony monochromatyczny" + +msgid "Amber Monochrome" +msgstr "Bursztynowy monochromatyczny" + +msgid "Gray Monochrome" +msgstr "Szary monochromatyczny" + +msgid "Color (no brown)" +msgstr "Kolor (bez brązowego)" + +msgid "Color (IBM 5153)" +msgstr "Kolor (IBM 5153)" + +msgid "Simple doubling" +msgstr "Proste podwojenie" + +msgid "sRGB interpolation" +msgstr "Interpolacja sRGB" + +msgid "Linear interpolation" +msgstr "Interpolacja liniowa" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monochromatyczny (5151/MDA) (biały)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monochromatyczny (5151/MDA) (zielony)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monochromatyczny (5151/MDA) (bursztynowy)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Kolor 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Kolor 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Rozszerzone kolory - tryb normalny (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Rozszerzony kolor - tryb rozszerzony (5154/ECD)" + +msgid "Green" +msgstr "Zielony" + +msgid "Amber" +msgstr "Bursztynowy" + +msgid "Gray" +msgstr "Szary" + +msgid "Color" +msgstr "Kolor" + +msgid "U.S. English" +msgstr "Amerykański angielski" + +msgid "Scandinavian" +msgstr "Skandynawski" + +msgid "Other languages" +msgstr "Inne języki" + +msgid "Bochs latest" +msgstr "Bochs najnowsze" + +msgid "Mono Non-Interlaced" +msgstr "Mono bez przeplotu" + +msgid "Color Interlaced" +msgstr "Kolor z przeplotem" + +msgid "Color Non-Interlaced" +msgstr "Kolor bez przeplotu" + +msgid "3Dfx Voodoo Graphics" +msgstr "Grafika 3Dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsydian SB50 + Ametyst (2 jednostki TMU)" + +msgid "8-bit" +msgstr "8-bitowy" + +msgid "16-bit" +msgstr "16-bitowy" + +msgid "Standard (150ns)" +msgstr "Standard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Wysoka prędkość (120ns)" + +msgid "Enabled" +msgstr "Włączone" + +msgid "Standard" +msgstr "Standard" + +msgid "High-Speed" +msgstr "Wysoka prędkość" + +msgid "Stereo LPT DAC" +msgstr "Stereofoniczny przetwornik cyfrowo-analogowy LPT" + +msgid "Generic Text Printer" +msgstr "Ogólna drukarka tekstowa" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Generyczna drukarka igłowa ESC/P" + +msgid "Generic PostScript Printer" +msgstr "Ogólna drukarka PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Drukarka PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Protokół internetowy linii równoległej" + +msgid "Protection Dongle for Savage Quest" +msgstr "Klucz ochronny dla Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Urządzenie przelotowe portu szeregowego" + +msgid "Passthrough Mode" +msgstr "Tryb przelotowy" + +msgid "Host Serial Device" +msgstr "Urządzenie szeregowe hosta" + +msgid "Name of pipe" +msgstr "Nazwa rury" + +msgid "Data bits" +msgstr "Bity danych" + +msgid "Stop bits" +msgstr "Bity stopu" + +msgid "Baud Rate of Passthrough" +msgstr "Szybkość transmisji Passthrough" + +msgid "Named Pipe (Server)" +msgstr "Nazwana rura (serwer)" + +msgid "Host Serial Passthrough" +msgstr "Przejście przez port szeregowy hosta" From c52a2131e63b14739e496f13a42ce5e375522d36 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 02:40:46 +0100 Subject: [PATCH 577/624] Both variants of Portuguese and added 4 missing strings to all the previous languages. --- src/qt/languages/ca-ES.po | 12 + src/qt/languages/cs-CZ.po | 12 + src/qt/languages/de-DE.po | 14 +- src/qt/languages/es-ES.po | 12 + src/qt/languages/fi-FI.po | 12 + src/qt/languages/fr-FR.po | 12 + src/qt/languages/hr-HR.po | 12 + src/qt/languages/hu-HU.po | 12 + src/qt/languages/it-IT.po | 12 + src/qt/languages/ja-JP.po | 12 + src/qt/languages/ko-KR.po | 20 +- src/qt/languages/pl-PL.po | 12 + src/qt/languages/pt-BR.po | 1064 +++++++++++++++++++++++++++++++++---- src/qt/languages/pt-PT.po | 963 ++++++++++++++++++++++++++++++++- 14 files changed, 2046 insertions(+), 135 deletions(-) diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 8a98cccbd..4c7eab253 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -2099,3 +2099,15 @@ msgstr "Pipe anomenat (servidor)" msgid "Host Serial Passthrough" msgstr "Pas del port sèrie amfitrió" + +msgid "Eject %s" +msgstr "Explulsar %s" + +msgid "&Unmute" +msgstr "&Saver" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Alt impact en el rendiment" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 5c9dd4811..e5bb2634d 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2099,3 +2099,15 @@ msgstr "Pojmenované potrubí (server)" msgid "Host Serial Passthrough" msgstr "Průchod sériového portu hostitele" + +msgid "Eject %s" +msgstr "Vysunout %s" + +msgid "&Unmute" +msgstr "&Roztišit" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Vysoký dopad na výkon" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 385edf9ab..b5e984c2f 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1411,7 +1411,7 @@ msgid "Interface" msgstr "Schnittstelle" msgid "Adapter" -msgstr "Adaptér" +msgstr "Adapter" msgid "VDE Socket" msgstr "VDE-Steckdose" @@ -2102,3 +2102,15 @@ msgstr "Benannte Leitung (Server)" msgid "Host Serial Passthrough" msgstr "Passthrough der seriellen Schnittstelle des Hosts" + +msgid "Eject %s" +msgstr "%s auswerfen" + +msgid "&Unmute" +msgstr "&Ton einschalten" + +msgid "Softfloat FPU" +msgstr "Softfloat-FPU" + +msgid "High performance impact" +msgstr "Hohe Auswirkung auf die Leistung" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 7613033e7..1c23dfda3 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2098,3 +2098,15 @@ msgstr "Tubería con nombre (servidor)" msgid "Host Serial Passthrough" msgstr "Paso del puerto serie del host" + +msgid "Eject %s" +msgstr "Expulsar %s" + +msgid "&Unmute" +msgstr "&Reactivar sonido" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Alto impact en el rendimiento" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 172bef41e..83635711b 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -2099,3 +2099,15 @@ msgstr "Nimetty putki (palvelin)" msgid "Host Serial Passthrough" msgstr "Isännän sarjaportin läpivienti" + +msgid "Eject %s" +msgstr "Pudota %s:n" + +msgid "&Unmute" +msgstr "&Poista mykistys" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Suuri vaikutus suorituskykyyn" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 69e9a46e0..e46044c45 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -2099,3 +2099,15 @@ 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 "&Unmute" +msgstr "&Réactiver son" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Impact important sur la performance" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index d3506f5aa..86f139e5c 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2099,3 +2099,15 @@ msgstr "Imenovani vod (server)" msgid "Host Serial Passthrough" msgstr "Prolaz serijskih vrata nositelja" + +msgid "Eject %s" +msgstr "Izbaci %s" + +msgid "&Unmute" +msgstr "&Uključi zvuk" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Visoki učinak na brzinu izvršavanja" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 96f5260ee..4cd62c566 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -2099,3 +2099,15 @@ msgstr "Megnevezett cső (kiszolgáló)" msgid "Host Serial Passthrough" msgstr "Az állomás soros portjának áthaladása" + +msgid "Eject %s" +msgstr "Dobj ki %s" + +msgid "&Unmute" +msgstr "&Hang újra bekapcsolása" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Nagy hatással van a teljesítményre" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 017c75c28..651c2e93c 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -2096,3 +2096,15 @@ msgstr "Tubo denominato (Server)" msgid "Host Serial Passthrough" msgstr "Passaggio della porta seriale host" + +msgid "Eject %s" +msgstr "Espelli %s" + +msgid "&Unmute" +msgstr "&Riattiva l'audio" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Impatto elevato sulla prestazione" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 195d25c4d..becb91707 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2099,3 +2099,15 @@ msgstr "名前付きパイプ(サーバー)" msgid "Host Serial Passthrough" msgstr "ホストシリアルポートのパススルー" + +msgid "Eject %s" +msgstr "%sを取り出す" + +msgid "&Unmute" +msgstr "ミュート解除(&U)" + +msgid "Softfloat FPU" +msgstr "소프트플로트 FPU" + +msgid "High performance impact" +msgstr "パフォーマンスへの影響が大きい" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 7a6b76d2f..1acd3b16d 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -1381,7 +1381,7 @@ msgid "I Copied It" msgstr "복사했습니다" msgid "86Box Monitor #" -msgstr "86Box 모니터 #" +msgstr "86Box 모니터 " msgid "No MCA devices." msgstr "MCA 장치가 없습니다." @@ -1441,7 +1441,7 @@ msgid "Logitech/Microsoft Bus Mouse" msgstr "로지텍/마이크로소프트 버스 마우스" msgid "Microsoft Bus Mouse (InPort)" -msgstr "마이크로소프트 버스 마우스 (인포트)" +msgstr "마이크로소프트 버스 마우스(인포트)" msgid "Mouse Systems Serial Mouse" msgstr "마우스 시스템 시리얼 마우스" @@ -1456,7 +1456,7 @@ msgid "PS/2 Mouse" msgstr "PS/2 마우스" msgid "3M MicroTouch (Serial)" -msgstr "3M 마이크로터치 (직렬)" +msgstr "3M 마이크로터치(직렬)" msgid "[COM] Standard Hayes-compliant Modem" msgstr "[COM] 표준 헤이즈 호환 모뎀" @@ -1465,7 +1465,7 @@ msgid "Roland MT-32 Emulation" msgstr "롤랜드 MT-32 에뮬레이션" msgid "Roland MT-32 (New) Emulation" -msgstr "롤랜드 MT-32 (신규) 에뮬레이션" +msgstr "롤랜드 MT-32(신규) 에뮬레이션" msgid "Roland CM-32L Emulation" msgstr "롤랜드 CM-32L 에뮬레이션" @@ -2099,3 +2099,15 @@ msgstr "네임드 파이프(서버)" msgid "Host Serial Passthrough" msgstr "호스트 직렬 포트 패스스루" + +msgid "Eject %s" +msgstr "%s 꺼내기" + +msgid "&Unmute" +msgstr "음소거 해제(&U)" + +msgid "Softfloat FPU" +msgstr "소프트플로트 FPU" + +msgid "High performance impact" +msgstr "성능에 미치는 영향" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 4d6407983..dce9ffbef 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2099,3 +2099,15 @@ msgstr "Nazwana rura (serwer)" msgid "Host Serial Passthrough" msgstr "Przejście przez port szeregowy hosta" + +msgid "Eject %s" +msgstr "Wysuń %s" + +msgid "&Unmute" +msgstr "&Wycisz" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Wysoki wpływ na wydajność" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 9e6bb4016..c48c7e0ea 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -39,9 +39,6 @@ msgstr "&Ocultar barra de status" msgid "Hide &toolbar" msgstr "Ocultar &barra de ferramenta" -msgid "Show non-primary monitors" -msgstr "Mostrar monitores não primários" - msgid "&Resizeable window" msgstr "&Janela redimensionável" @@ -63,30 +60,6 @@ msgstr "Open&GL (Núcleo 3.0)" msgid "&VNC" msgstr "&VNC" -msgid "Renderer options..." -msgstr "Opções de renderização..." - -msgid "OpenGL 3.0 renderer options" -msgstr "Opções de renderização OpenGL 3.0" - -msgid "Render behavior" -msgstr "Comportamento de renderização" - -msgid "Synchronize with video" -msgstr "Sincronizar com vídeo" - -msgid "Use target framerate:" -msgstr "Usar taxa de quadros alvo:" - -msgid "VSync" -msgstr "VSync (sincronização vertical)" - -msgid "Shaders" -msgstr "Shaders" - -msgid "No shader selected" -msgstr "Nenhum shader selecionado" - msgid "Specify dimensions..." msgstr "Especificar as dimensões..." @@ -159,9 +132,6 @@ msgstr "&Redimensionamento com valores inteiros" msgid "4:&3 Integer scale" msgstr "Redimensionamento com valores inteiros 4:&3" -msgid "Apply fullscreen stretch mode when maximized" -msgstr "Aplicar modo de ampliação em tela cheia quando maximizado" - msgid "E&GA/(S)VGA settings" msgstr "Configurações de E&GA/(S)VGA" @@ -228,9 +198,6 @@ msgstr "Ativar integração com o &Discord" msgid "Sound &gain..." msgstr "&Ganho de som..." -msgid "Open screenshots folder..." -msgstr "Abrir pasta de capturas de tela..." - msgid "Begin trace\tCtrl+T" msgstr "Inicio do rastreamento\tCtrl+T" @@ -270,9 +237,6 @@ msgstr "&Avançar até o fim" msgid "E&ject" msgstr "E&jetar" -msgid "Eject %s" -msgstr "Ejetar %s" - msgid "&Image..." msgstr "&Imagem..." @@ -282,9 +246,6 @@ msgstr "E&xportar para 86F..." msgid "&Mute" msgstr "&Silenciar" -msgid "&Unmute" -msgstr "&Reativar som" - msgid "E&mpty" msgstr "&Vazio" @@ -426,27 +387,18 @@ msgstr "Ativar (UTC)" msgid "Dynamic Recompiler" msgstr "Recompilador dinâmico" -msgid "Softfloat FPU" -msgstr "FPU Softfloat" - -msgid "High performance impact" -msgstr "Alto impacto no desempenho" - msgid "Video:" msgstr "Vídeo:" msgid "Video #2:" msgstr "Vídeo 2:" -msgid "Voodoo Graphics" -msgstr "3DFX Voodoo" +msgid "Voodoo 1 or 2 Graphics" +msgstr "Gráficos Voodoo 1 ou 2" msgid "IBM 8514/A Graphics" msgstr "Gráficos IBM 8514/A" -msgid "Voodoo 1 or 2 Graphics" -msgstr "Gráficos Voodoo 1 ou 2" - msgid "XGA Graphics" msgstr "Gráficos XGA" @@ -510,30 +462,6 @@ msgstr "Dispositivo PCap:" msgid "Network adapter:" msgstr "Adaptador de rede:" -msgid "Network Card #1" -msgstr "Placa de rede 1:" - -msgid "Network Card #2" -msgstr "Placa de rede 2:" - -msgid "Network Card #3" -msgstr "Placa de rede 3:" - -msgid "Network Card #4" -msgstr "Placa de rede 4:" - -msgid "Mode" -msgstr "Modo:" - -msgid "Interface" -msgstr "Interface:" - -msgid "Adapter" -msgstr "Adaptador:" - -msgid "VDE Socket" -msgstr "Socket VDE:" - msgid "COM1 Device:" msgstr "Dispositivo COM1:" @@ -570,18 +498,6 @@ msgstr "Porta serial 3" msgid "Serial port 4" msgstr "Porta serial 4" -msgid "Serial port passthrough 1" -msgstr "Passagem de porta serial 1" - -msgid "Serial port passthrough 2" -msgstr "Passagem de porta serial 2" - -msgid "Serial port passthrough 3" -msgstr "Passagem de porta serial 3" - -msgid "Serial port passthrough 4" -msgstr "Passagem de porta serial 4" - msgid "Parallel port 1" msgstr "Porta paralela 1" @@ -624,9 +540,6 @@ msgstr "Controlador 4:" msgid "Cassette" msgstr "Cassete" -msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancer" - msgid "Hard disks:" msgstr "Discos rígidos:" @@ -636,15 +549,9 @@ msgstr "&Novo..." msgid "&Existing..." msgstr "&Existente..." -msgid "Browse..." -msgstr "Procurar..." - msgid "&Remove" msgstr "&Remover" -msgid "Remove" -msgstr "Remover" - msgid "Bus:" msgstr "Barramento:" @@ -723,12 +630,6 @@ msgstr "Dispositivo ISABugger" msgid "POST card" msgstr "Placa de diagnóstico" -msgid "86Box Unit Tester" -msgstr "Testador de unidade 86Box" - -msgid "Novell NetWare 2.x Key Card" -msgstr "Cartão de Autenticação Novell NetWare 2.x" - msgid "86Box" msgstr "86Box" @@ -759,9 +660,6 @@ msgstr "O 86Box não conseguiu encontrar nenhuma imagem de ROM utilizável.\n\nP msgid "(empty)" msgstr "(vazio)" -msgid "Clear image history" -msgstr "Limpar histórico de imagens" - msgid "All files" msgstr "Todos os arquivos" @@ -789,6 +687,9 @@ msgstr "A máquina \"%hs\" não está disponível devido à falta de ROMs no dir msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "A placa de vídeo \"%hs\" não está disponível devido à falta de ROMs no diretório roms/video. Mudando para uma placa de vídeo disponível." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "A placa de vídeo 2 \"%hs\" não está disponível devido à falta de ROMs no diretório roms/video. Mudando para uma placa de vídeo disponível." + msgid "Machine" msgstr "Máquina" @@ -846,9 +747,6 @@ msgstr "CA" msgid "S" msgstr "SE" -msgid "MiB" -msgstr "MiB" - msgid "KB" msgstr "KB" @@ -870,17 +768,26 @@ msgstr "Nenhum dispositivo PCap encontrado" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" -msgid "Standard 2-button joystick(s)" -msgstr "Joystick padrão de 2 botões" +msgid "2-axis, 2-button joystick(s)" +msgstr "Joystick(s) de 2 eixos, 2 botões" -msgid "Standard 4-button joystick" -msgstr "Joystick padrão de 4 botões" +msgid "2-axis, 4-button joystick" +msgstr "Joystick de 2 eixos, 4 botões" -msgid "Standard 6-button joystick" -msgstr "Joystick padrão de 6 botões" +msgid "2-axis, 6-button joystick" +msgstr "Joystick de 2 eixos, 6 botões" -msgid "Standard 8-button joystick" -msgstr "Joystick padrão de 8 botões" +msgid "2-axis, 8-button joystick" +msgstr "Joystick de 2 eixos, 8 botões" + +msgid "3-axis, 2-button joystick" +msgstr "Joystick padrão de 3 eixos, 2 botões" + +msgid "3-axis, 4-button joystick" +msgstr "Joystick padrão de 3 eixos, 4 botões" + +msgid "4-axis, 4-button joystick" +msgstr "Joystick padrão de 4 eixos, 4 botões" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -915,6 +822,9 @@ msgstr "Tem certeza de que deseja sair do 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -963,6 +873,9 @@ msgstr "Configuração inválida" 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 é necessário para a conversão automática de arquivos PostScript para PDF.\n\nQualquer documento enviado para a impressora genérica PostScript será salvo como arquivos PostScript (.ps)." +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 é necessário para a conversão automática de arquivos PCL para PDF.\n\nQualquer documento enviado para a impressora genérica PCL será salvo como arquivos Printer Command Language (.pcl)." + msgid "Entering fullscreen mode" msgstr "Entrando no modo de tela cheia" @@ -981,9 +894,6 @@ msgstr "Não reiniciar" msgid "CD-ROM images" msgstr "Imagens de CD-ROM" -msgid "Host CD/DVD Drive (%1)" -msgstr "Unidade de CD/DVD do anfitrião (%1)" - msgid "%1 Device Configuration" msgstr "Configuração do dispositivo %1" @@ -1110,6 +1020,27 @@ msgstr "Sobrescrever" msgid "Don't overwrite" msgstr "Não sobrescrever" +msgid "Raw image" +msgstr "Imagem bruta" + +msgid "HDI image" +msgstr "Imagem HDI" + +msgid "HDX image" +msgstr "Imagem HDX" + +msgid "Fixed-size VHD" +msgstr "VHD de tamanho fixo" + +msgid "Dynamic-size VHD" +msgstr "VHD de tamanho dinâmico" + +msgid "Differencing VHD" +msgstr "VHD diferencial" + +msgid "(N/A)" +msgstr "(N/D)" + msgid "Raw image (.img)" msgstr "Imagem bruta (.img)" @@ -1283,3 +1214,900 @@ msgstr "O WinBox não é mais suportado" 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 "O desenvolvimento do gerenciador WinBox foi interrompido em 2022 devido à falta de mantenedores. À medida que direcionamos nossos esforços para tornar o 86Box ainda melhor, tomamos a decisão de não oferecer mais suporte ao WinBox como gerenciador.\n\nNão serão mais fornecidas atualizações através do WinBox, e você poderá encontrar comportamentos incorretos caso continue a usá-lo com versões mais recentes do 86Box. Quaisquer relatórios de erros relacionados ao comportamento do WinBox serão fechados como inválidos.\n\nAcesse 86box.net para obter uma lista de outros gerenciadores que você pode usar." + +msgid "Generate" +msgstr "Gerar" + +msgid "Joystick configuration" +msgstr "Configuração do joystick" + +msgid "Device" +msgstr "Dispositivo" + +msgid "%1 (X axis)" +msgstr "%1 (eixo X)" + +msgid "%1 (Y axis)" +msgstr "%1 (eixo Y)" + +msgid "MCA devices" +msgstr "Dispositivos MCA" + +msgid "List of MCA devices:" +msgstr "Lista de dispositivos MCA:" + +msgid "Tablet tool" +msgstr "Ferramenta para tablet" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL e ES)" + +msgid "About Qt" +msgstr "Sobre o Qt" + +msgid "MCA devices..." +msgstr "Dispositivos MCA..." + +msgid "Show non-primary monitors" +msgstr "Mostrar monitores não primários" + +msgid "Open screenshots folder..." +msgstr "Abrir pasta de capturas de tela..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Aplicar modo de ampliação em tela cheia quando maximizado" + +msgid "Cursor/Puck" +msgstr "Cursor/Puck" + +msgid "Pen" +msgstr "Caneta" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Unidade de CD/DVD do anfitrião (%1:)" + +msgid "&Connected" +msgstr "&Conectado" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 de renderização OpenGL 3.0" + +msgid "Render behavior" +msgstr "Comportamento de renderização" + +msgid "Use target framerate:" +msgstr "Usar taxa de quadros pretendida:" + +msgid " fps" +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 vídeo" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Não foi possível alternar para o contexto OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "É necessária a versão 3.0 ou superior do OpenGL. A versão atual é %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Falha na inicialização do OpenGL. Erro %1." + +msgid "Error initializing OpenGL" +msgstr "Erro ao inicializar o OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Voltando à renderização de software.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Falha na alocação de memória para o buffer de descompactação.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Ao selecionar imagens de mídia (CD-ROM, disquete, etc.), a caixa de diálogo de abertura será iniciada no mesmo diretório do arquivo de configuração do 86Box. Essa configuração provavelmente só fará diferença no macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Essa máquina pode ter sido movida ou copiada." + +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 "Para garantir a funcionalidade adequada da rede, o 86Box precisa saber se essa máquina foi movida ou copiada.\n\nSelecione \"A copiei\" se não tiver certeza." + +msgid "I Moved It" +msgstr "O movi" + +msgid "I Copied It" +msgstr "A copiei" + +msgid "86Box Monitor #" +msgstr "Monitor 86Box " + +msgid "No MCA devices." +msgstr "Nenhum dispositivo MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Placa de rede 1" + +msgid "Network Card #2" +msgstr "Placa de rede 2" + +msgid "Network Card #3" +msgstr "Placa de rede 3" + +msgid "Network Card #4" +msgstr "Placa de rede 4" + +msgid "Mode" +msgstr "Modo" + +msgid "Interface" +msgstr "Interface" + +msgid "Adapter" +msgstr "Adaptador" + +msgid "VDE Socket" +msgstr "Socket VDE" + +msgid "86Box Unit Tester" +msgstr "Testador de unidade 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Cartão de Autenticação Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Passagem de porta serial 1" + +msgid "Serial port passthrough 2" +msgstr "Passagem de porta serial 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Mouse de barramento Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Mouse de barramento Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse serial Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Mouse serial Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Mouse serial Logitech" + +msgid "PS/2 Mouse" +msgstr "Mouse PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (serial)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Modem padrão compatível com Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Emulação do Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulação do Roland MT-32 (novo)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulação do Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulação do Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Placa-mãe OPL4-ML" + +msgid "System MIDI" +msgstr "Sistema MIDI" + +msgid "MIDI Input Device" +msgstr "Dispositivo de entrada MIDI" + +msgid "BIOS Address" +msgstr "Endereço do BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Habilitar gravações na ROM de extensão do BIOS" + +msgid "Address" +msgstr "Endereço" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revisão do BIOS" + +msgid "Translate 26 -> 17" +msgstr "Traduzir 26 -> 17" + +msgid "Language" +msgstr "Idioma" + +msgid "Enable backlight" +msgstr "Ativar luz de fundo" + +msgid "Invert colors" +msgstr "Inverter cores" + +msgid "BIOS size" +msgstr "Tamanho do BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapear C0000-C7FFF como UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapear C8000-CFFFF como UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapear D0000-D7FFF como UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapear D8000-DFFFF como UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapear E0000-E7FFF como UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapear E8000-EFFFF como UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Jumper JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Dispositivo de saída MIDI" + +msgid "MIDI Real time" +msgstr "MIDI Tempo real" + +msgid "MIDI Thru" +msgstr "Passagem da entrada MIDI" + +msgid "MIDI Clockout" +msgstr "Saída do relógio MIDI" + +msgid "SoundFont" +msgstr "Fonte de som" + +msgid "Output Gain" +msgstr "Ganho de saída" + +msgid "Chorus" +msgstr "Coro" + +msgid "Chorus Voices" +msgstr "Vozes do coro" + +msgid "Chorus Level" +msgstr "Nível de coro" + +msgid "Chorus Speed" +msgstr "Velocidade do chorus" + +msgid "Chorus Depth" +msgstr "Profundidade do chorus" + +msgid "Chorus Waveform" +msgstr "Forma de onda do chorus" + +msgid "Reverb" +msgstr "Reverberação" + +msgid "Reverb Room Size" +msgstr "Tamanho da sala de reverberação" + +msgid "Reverb Damping" +msgstr "Amortecimento de reverberação" + +msgid "Reverb Width" +msgstr "Largura de reverberação" + +msgid "Reverb Level" +msgstr "Nível de reverberação" + +msgid "Interpolation Method" +msgstr "Método de interpolação" + +msgid "Reverb Output Gain" +msgstr "Ganho da saída do reverb" + +msgid "Reversed stereo" +msgstr "Estéreo invertido" + +msgid "Nice ramp" +msgstr "Bela rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Botões" + +msgid "Serial Port" +msgstr "Porta serial" + +msgid "RTS toggle" +msgstr "Alternância de RTS" + +msgid "Revision" +msgstr "Revisão" + +msgid "Controller" +msgstr "Controlador" + +msgid "Show Crosshair" +msgstr "Mostrar mira" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Endereço MAC" + +msgid "MAC Address OUI" +msgstr "Endereço MAC OUI" + +msgid "Enable BIOS" +msgstr "Habilitar BIOS" + +msgid "Baud Rate" +msgstr "Taxa de transmissão" + +msgid "TCP/IP listening port" +msgstr "Porta de escuta TCP/IP" + +msgid "Phonebook File" +msgstr "Arquivo de lista telefônica" + +msgid "Telnet emulation" +msgstr "Emulação Telnet" + +msgid "RAM Address" +msgstr "Endereço da RAM" + +msgid "RAM size" +msgstr "Tamanho da RAM" + +msgid "Initial RAM size" +msgstr "Tamanho inicial da RAM" + +msgid "Serial Number" +msgstr "Número de série" + +msgid "Host ID" +msgstr "ID do host" + +msgid "FDC Address" +msgstr "Endereço da FDC" + +msgid "MPU-401 Address" +msgstr "Endereço da MPU-401" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "Receber entrada MIDI" + +msgid "Low DMA" +msgstr "DMA baixo" + +msgid "Enable Game port" +msgstr "Ativar a porta do jogo" + +msgid "Surround module" +msgstr "Módulo surround" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Aumentar a interrupção do CODEC na configuração do CODEC (necessário para alguns drivers)" + +msgid "SB Address" +msgstr "Endereço do SB" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "Ativar OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Receber entrada MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "SB low DMA" + +msgid "6CH variant (6-channel)" +msgstr "Variante 6CH (6 canais)" + +msgid "Enable CMS" +msgstr "Ativar o CMS" + +msgid "Mixer" +msgstr "Misturador" + +msgid "High DMA" +msgstr "DMA alto" + +msgid "Control PC speaker" +msgstr "Controle do alto-falante do PC" + +msgid "Memory size" +msgstr "Tamanho da memória" + +msgid "EMU8000 Address" +msgstr "Endereço da EMU8000" + +msgid "IDE Controller" +msgstr "Controlador IDE" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "Tipo GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Ativar o comando 0x04 \"Sair do 86Box\"" + +msgid "Display type" +msgstr "Tipo de tela" + +msgid "Composite type" +msgstr "Tipo composto" + +msgid "RGB type" +msgstr "Tipo RGB" + +msgid "Line doubling type" +msgstr "Tipo de duplicação de linha" + +msgid "Snow emulation" +msgstr "Emulação de neve" + +msgid "Monitor type" +msgstr "Tipo de monitor" + +msgid "Character set" +msgstr "Conjunto de caracteres" + +msgid "XGA type" +msgstr "Tipo XGA" + +msgid "Instance" +msgstr "Instância" + +msgid "MMIO Address" +msgstr "Endereço da MMIO" + +msgid "RAMDAC type" +msgstr "Tipo de RAMDAC" + +msgid "Blend" +msgstr "Mistura" + +msgid "Bilinear filtering" +msgstr "Filtragem bilinear" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Ativar NMI para emulação CGA" + +msgid "Voodoo type" +msgstr "Tipo vodu" + +msgid "Framebuffer memory size" +msgstr "Tamanho da memória do framebuffer" + +msgid "Texture memory size" +msgstr "Tamanho da memória da textura" + +msgid "Dither subtraction" +msgstr "Subtração de dither" + +msgid "Screen Filter" +msgstr "Filtro de tela" + +msgid "Render threads" +msgstr "Renderizar threads" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Endereço inicial" + +msgid "Contiguous Size" +msgstr "Tamanho contíguo" + +msgid "I/O Width" +msgstr "Largura de E/S" + +msgid "Transfer Speed" +msgstr "Velocidade de transferência" + +msgid "EMS mode" +msgstr "Modo EMS" + +msgid "Address for > 2 MB" +msgstr "Endereço para > 2 MB" + +msgid "Frame Address" +msgstr "Endereço do quadro" + +msgid "USA" +msgstr "EUA" + +msgid "Danish" +msgstr "Dinamarquês" + +msgid "Always at selected speed" +msgstr "Sempre na velocidade selecionada" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Configuração do BIOS + teclas de atalho (desativadas durante o POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB a partir de F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB a partir de E0000 (endereço MSB invertido, os últimos 64 kB primeiro)" + +msgid "Sine" +msgstr "Sine" + +msgid "Triangle" +msgstr "Triângulo" + +msgid "Linear" +msgstr "Linear" + +msgid "4th Order" +msgstr "4ª ordem" + +msgid "7th Order" +msgstr "7º Pedido" + +msgid "Non-timed (original)" +msgstr "Sem cronômetro (original)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (sem jumper em JMP2)" + +msgid "Two" +msgstr "Dois" + +msgid "Three" +msgstr "Três" + +msgid "Wheel" +msgstr "Roda" + +msgid "Five + Wheel" +msgstr "Cinco + roda" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 Serial / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) Serial" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Desativar o BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (estéreo)" + +msgid "Classic" +msgstr "Clássico" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Composto" + +msgid "Old" +msgstr "Antiga" + +msgid "New" +msgstr "Novo" + +msgid "Color (generic)" +msgstr "Cor (genérico)" + +msgid "Green Monochrome" +msgstr "Monocromático verde" + +msgid "Amber Monochrome" +msgstr "Monocromático âmbar" + +msgid "Gray Monochrome" +msgstr "Monocromático cinza" + +msgid "Color (no brown)" +msgstr "Cor (sem marrom)" + +msgid "Color (IBM 5153)" +msgstr "Cor (IBM 5153)" + +msgid "Simple doubling" +msgstr "Duplicação simples" + +msgid "sRGB interpolation" +msgstr "Interpolação sRGB" + +msgid "Linear interpolation" +msgstr "Interpolação linear" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monocromático (5151/MDA) (branco)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monocromático (5151/MDA) (verde)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monocromático (5151/MDA) (âmbar)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Colorido 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Cor 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Cor aprimorada - Modo normal (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Cor aprimorada - Modo aprimorado (5154/ECD)" + +msgid "Green" +msgstr "Verde" + +msgid "Amber" +msgstr "Âmbar" + +msgid "Gray" +msgstr "Cinza" + +msgid "Color" +msgstr "Cor" + +msgid "U.S. English" +msgstr "Inglês dos EUA" + +msgid "Scandinavian" +msgstr "Escandinavo" + +msgid "Other languages" +msgstr "Outros idiomas" + +msgid "Bochs latest" +msgstr "Bochs mais recente" + +msgid "Mono Non-Interlaced" +msgstr "Monocromático não entrelaçado" + +msgid "Color Interlaced" +msgstr "Cor entrelaçado" + +msgid "Color Non-Interlaced" +msgstr "Cor não entrelaçado" + +msgid "3Dfx Voodoo Graphics" +msgstr "Gráficos 3Dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 unidades TMU)" + +msgid "8-bit" +msgstr "8 bits" + +msgid "16-bit" +msgstr "16 bits" + +msgid "Standard (150ns)" +msgstr "Padrão (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Alta velocidade (120 ns)" + +msgid "Enabled" +msgstr "Ativado" + +msgid "Standard" +msgstr "Padrão" + +msgid "High-Speed" +msgstr "Alta velocidade" + +msgid "Stereo LPT DAC" +msgstr "DAC estéreo LPT" + +msgid "Generic Text Printer" +msgstr "Impressora de texto genérica" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Impressora matricial de pontos ESC/P genérica" + +msgid "Generic PostScript Printer" +msgstr "Impressora PostScript genérica" + +msgid "Generic PCL5e Printer" +msgstr "Impressora genérica PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Protocolo de Internet de linha paralela" + +msgid "Protection Dongle for Savage Quest" +msgstr "Dongle de proteção para Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Dispositivo de passagem de porta serial" + +msgid "Passthrough Mode" +msgstr "Modo de passagem" + +msgid "Host Serial Device" +msgstr "Dispositivo serial host" + +msgid "Name of pipe" +msgstr "Nome do tubo" + +msgid "Data bits" +msgstr "Bits de dados" + +msgid "Stop bits" +msgstr "Bits de parada" + +msgid "Baud Rate of Passthrough" +msgstr "Taxa de transmissão de passagem" + +msgid "Named Pipe (Server)" +msgstr "Tubo nomeado (servidor)" + +msgid "Host Serial Passthrough" +msgstr "Passagem da porta serial do host" + +msgid "Eject %s" +msgstr "Ejetar %s" + +msgid "&Unmute" +msgstr "&Reativar som" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Alto impacto no desempenho" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 3aa004e83..113779643 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -244,7 +244,7 @@ msgid "E&xport to 86F..." msgstr "E&xportar para 86F..." msgid "&Mute" -msgstr "&Mute" +msgstr "&Desativar som" msgid "E&mpty" msgstr "&CDROM vazio" @@ -390,8 +390,11 @@ msgstr "Recompilador dinâmico" msgid "Video:" msgstr "Vídeo:" -msgid "Voodoo Graphics" -msgstr "Gráficos Voodoo" +msgid "Video #2:" +msgstr "Vídeo 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Gráficos Voodoo 1 ou 2" msgid "IBM 8514/A Graphics" msgstr "Gráficos IBM 8514/A" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Erro fatal" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - EM PAUSA" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Pressione Ctrl+Alt+PgDn para voltar ao modo de janela." @@ -684,6 +687,9 @@ msgstr "A máquina \"%hs\" não está disponível devido à falta de ROMs na pas msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "A placa vídeo \"%hs\" não está disponível devido à falta de ROMs na pasta roms/video. A mudar para uma placa vídeo disponível." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "A placa vídeo 2 \"%hs\" não está disponível devido à falta de ROMs na pasta roms/video. A mudar para uma placa vídeo disponível." + msgid "Machine" msgstr "Máquina" @@ -762,17 +768,26 @@ msgstr "Não foi encontrado um dispositivo PCap" msgid "Invalid PCap device" msgstr "Dispositivo PCap inválido" -msgid "Standard 2-button joystick(s)" -msgstr "Joystick(s) standard de 2 botões" +msgid "2-axis, 2-button joystick(s)" +msgstr "Joystick(s) de 2 eixos, 2 botões" -msgid "Standard 4-button joystick" -msgstr "Joystick(s) standard de 4 botões" +msgid "2-axis, 4-button joystick" +msgstr "Joystick de 2 eixos, 4 botões" -msgid "Standard 6-button joystick" -msgstr "Joystick(s) standard de 6 botões" +msgid "2-axis, 6-button joystick" +msgstr "Joystick de 2 eixos, 6 botões" -msgid "Standard 8-button joystick" -msgstr "Joystick(s) standard de 8 botões" +msgid "2-axis, 8-button joystick" +msgstr "Joystick de 2 eixos, 8 botões" + +msgid "3-axis, 2-button joystick" +msgstr "Joystick de 3 eixos, 2 botões" + +msgid "3-axis, 4-button joystick" +msgstr "Joystick de 3 eixos, 4 botões" + +msgid "4-axis, 4-button joystick" +msgstr "Joystick de 4 eixos, 4 botões" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Tem a certeza de que quer sair do 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Configuração inválida" 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 é requerido para a conversão automática de ficheiros PostScript para ficheiros PDF.\n\nQualquer documento enviado para a impressora PostScript genérica será gravado como um ficheiro PostScript (.ps)." +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 é requerido para a conversão automática de ficheiros PCL para ficheiros PDF.\n\nQualquer documento enviado para a impressora PCL genérica será gravado como um ficheiro Printer Command Language (.pcl)." + msgid "Entering fullscreen mode" msgstr "A entrar no modo de ecrã cheio" @@ -999,6 +1020,27 @@ msgstr "Sobrescrever" msgid "Don't overwrite" msgstr "Não sobrescrever" +msgid "Raw image" +msgstr "Imagem bruta" + +msgid "HDI image" +msgstr "Imagem HDI" + +msgid "HDX image" +msgstr "Imagem HDX" + +msgid "Fixed-size VHD" +msgstr "VHD com tamanho fixo" + +msgid "Dynamic-size VHD" +msgstr "VHD com tamanho dinâmico" + +msgid "Differencing VHD" +msgstr "VHD diferenciador" + +msgid "(N/A)" +msgstr "(N/D)" + msgid "Raw image (.img)" msgstr "Imagem bruta (.img)" @@ -1172,3 +1214,900 @@ msgstr "O WinBox não é mais suportado" 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 "O desenvolvimento do gerenciador WinBox parou em 2022 devido à falta de mantenedores. Como direcionamos nossos esforços para tornar o 86Box ainda melhor, tomamos a decisão de não mais suportar o WinBox como um gerenciador.\n\nNão serão fornecidas mais actualizações através do WinBox, e poderá encontrar um comportamento incorreto se continuar a usá-lo com versões mais recentes do 86Box. Quaisquer relatórios de erros relacionados com o comportamento do WinBox serão fechados como inválidos.\n\nVá a 86box.net para uma lista de outros gestores que pode utilizar." + +msgid "Generate" +msgstr "Gerar" + +msgid "Joystick configuration" +msgstr "Configuração do joystick" + +msgid "Device" +msgstr "Dispositivo" + +msgid "%1 (X axis)" +msgstr "%1 (eixo X)" + +msgid "%1 (Y axis)" +msgstr "%1 (eixo Y)" + +msgid "MCA devices" +msgstr "Dispositivos MCA" + +msgid "List of MCA devices:" +msgstr "Lista de dispositivos MCA:" + +msgid "Tablet tool" +msgstr "Ferramenta para tablet" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Acerca do Qt" + +msgid "MCA devices..." +msgstr "Dispositivos MCA..." + +msgid "Show non-primary monitors" +msgstr "Mostrar monitores não primários" + +msgid "Open screenshots folder..." +msgstr "Abrir a pasta de capturas de ecrã..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Aplicar o modo de estiramento em ecrã cheio quando maximizado" + +msgid "Cursor/Puck" +msgstr "Cursor/Puck" + +msgid "Pen" +msgstr "Caneta" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Unidade de CD/DVD do anfitrião (%1:)" + +msgid "&Connected" +msgstr "&Conectado" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Comportamento de renderização" + +msgid "Use target framerate:" +msgstr "Utilizar a taxa de quadros de destino:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Não foi possível mudar para o contexto OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "É necessária a versão 3.0 ou superior do OpenGL. A versão atual é %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Falha na inicialização do OpenGL. Erro %1." + +msgid "Error initializing OpenGL" +msgstr "Erro ao inicializar o OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Recuando para a renderização de software." + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Falha na atribuição de memória para a memória intermédia de descompactação.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Ao selecionar imagens multimédia (CD-ROM, disquete, etc.) a caixa de diálogo de abertura irá começar no mesmo diretório que o ficheiro de configuração da 86Box. Esta configuração provavelmente só fará diferença no macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Esta máquina pode ter sido deslocada ou copiada." + +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 "Para garantir a funcionalidade de rede adequada, o 86Box precisa de saber se esta máquina foi movida ou copiada.\n\nSeleccione \"Copiei-a\" se não tiver a certeza." + +msgid "I Moved It" +msgstr "Movi-a" + +msgid "I Copied It" +msgstr "Copiei-a" + +msgid "86Box Monitor #" +msgstr "Monitor 86Box " + +msgid "No MCA devices." +msgstr "Não há dispositivos MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Placa de rede 1" + +msgid "Network Card #2" +msgstr "Placa de rede 2" + +msgid "Network Card #3" +msgstr "Placa de rede 3" + +msgid "Network Card #4" +msgstr "Placa de rede 4" + +msgid "Mode" +msgstr "Modo" + +msgid "Interface" +msgstr "Interface" + +msgid "Adapter" +msgstr "Adaptador" + +msgid "VDE Socket" +msgstr "Tomada VDE" + +msgid "86Box Unit Tester" +msgstr "Testador de unidades 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Cartão-chave do Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Passagem da porta de série 1" + +msgid "Serial port passthrough 2" +msgstr "Passagem da porta de série 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Rato Logitech/Microsoft Bus" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Rato Microsoft Bus (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Sistemas de ratos Rato de série" + +msgid "Microsoft Serial Mouse" +msgstr "Rato de série Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Rato de série Logitech" + +msgid "PS/2 Mouse" +msgstr "Rato PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (série)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Modem padrão compatível com Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Emulação do Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulação do Roland MT-32 (novo)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulação Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulação Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Placa filha OPL4-ML" + +msgid "System MIDI" +msgstr "Sistema MIDI" + +msgid "MIDI Input Device" +msgstr "Dispositivo de entrada MIDI" + +msgid "BIOS Address" +msgstr "Endereço da BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Ativar as escritas de ROM de extensão da BIOS" + +msgid "Address" +msgstr "Endereço" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revisão da BIOS" + +msgid "Translate 26 -> 17" +msgstr "Traduzir 26 -> 17" + +msgid "Language" +msgstr "Língua" + +msgid "Enable backlight" +msgstr "Ativar a retroiluminação" + +msgid "Invert colors" +msgstr "Inverter cores" + +msgid "BIOS size" +msgstr "Tamanho da BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapear C0000-C7FFF como UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapear C8000-CFFFF como UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapear D0000-D7FFF como UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapear D8000-DFFFF como UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapear E0000-E7FFF como UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapear E8000-EFFFF como UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Jumper JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Dispositivo de saída MIDI" + +msgid "MIDI Real time" +msgstr "MIDI Tempo real" + +msgid "MIDI Thru" +msgstr "Passagem da entrada MIDI" + +msgid "MIDI Clockout" +msgstr "Saída do relógio MIDI" + +msgid "SoundFont" +msgstr "Fonte de som" + +msgid "Output Gain" +msgstr "Ganho de saída" + +msgid "Chorus" +msgstr "Coro" + +msgid "Chorus Voices" +msgstr "Vozes do coro" + +msgid "Chorus Level" +msgstr "Nível de coro" + +msgid "Chorus Speed" +msgstr "Velocidade do coral" + +msgid "Chorus Depth" +msgstr "Profundidade do coro" + +msgid "Chorus Waveform" +msgstr "Forma de onda do coro" + +msgid "Reverb" +msgstr "Reverberação" + +msgid "Reverb Room Size" +msgstr "Tamanho da sala de reverberação" + +msgid "Reverb Damping" +msgstr "Amortecimento de reverberação" + +msgid "Reverb Width" +msgstr "Largura de reverberação" + +msgid "Reverb Level" +msgstr "Nível de reverberação" + +msgid "Interpolation Method" +msgstr "Método de interpolação" + +msgid "Reverb Output Gain" +msgstr "Ganho da saída do reverb" + +msgid "Reversed stereo" +msgstr "Estéreo invertido" + +msgid "Nice ramp" +msgstr "Bela rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Botões" + +msgid "Serial Port" +msgstr "Porta de série" + +msgid "RTS toggle" +msgstr "Alternância RTS" + +msgid "Revision" +msgstr "Revisão" + +msgid "Controller" +msgstr "Controlador" + +msgid "Show Crosshair" +msgstr "Mostrar mira" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Endereço MAC" + +msgid "MAC Address OUI" +msgstr "OUI do endereço MAC" + +msgid "Enable BIOS" +msgstr "Ativar a BIOS" + +msgid "Baud Rate" +msgstr "Taxa de transmissão" + +msgid "TCP/IP listening port" +msgstr "Porta de escuta TCP/IP" + +msgid "Phonebook File" +msgstr "Ficheiro da lista telefónica" + +msgid "Telnet emulation" +msgstr "Emulação Telnet" + +msgid "RAM Address" +msgstr "Endereço RAM" + +msgid "RAM size" +msgstr "Tamanho da RAM" + +msgid "Initial RAM size" +msgstr "Tamanho inicial da RAM" + +msgid "Serial Number" +msgstr "Número de série" + +msgid "Host ID" +msgstr "ID do anfitrião" + +msgid "FDC Address" +msgstr "Endereço da FDC" + +msgid "MPU-401 Address" +msgstr "Endereço MPU-401" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "Receber entrada MIDI" + +msgid "Low DMA" +msgstr "DMA baixo" + +msgid "Enable Game port" +msgstr "Ativar a porta de jogos" + +msgid "Surround module" +msgstr "Módulo Surround" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Ativar a interrupção do CODEC na configuração do CODEC (necessário para alguns controladores)" + +msgid "SB Address" +msgstr "Endereço SB" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "Ativar OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Receber entrada MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "SB baixo DMA" + +msgid "6CH variant (6-channel)" +msgstr "Variante 6CH (6 canais)" + +msgid "Enable CMS" +msgstr "Ativar CMS" + +msgid "Mixer" +msgstr "Misturador" + +msgid "High DMA" +msgstr "DMA elevado" + +msgid "Control PC speaker" +msgstr "Controlo do altifalante do PC" + +msgid "Memory size" +msgstr "Tamanho da memória" + +msgid "EMU8000 Address" +msgstr "Endereço da EMU8000" + +msgid "IDE Controller" +msgstr "Controlador IDE" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "Tipo GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Ativar o comando 0x04 \"Sair do 86Box\"" + +msgid "Display type" +msgstr "Tipo de ecrã" + +msgid "Composite type" +msgstr "Tipo composto" + +msgid "RGB type" +msgstr "Tipo RGB" + +msgid "Line doubling type" +msgstr "Tipo de duplicação de linha" + +msgid "Snow emulation" +msgstr "Emulação de neve" + +msgid "Monitor type" +msgstr "Tipo de monitor" + +msgid "Character set" +msgstr "Conjunto de caracteres" + +msgid "XGA type" +msgstr "Tipo XGA" + +msgid "Instance" +msgstr "Instância" + +msgid "MMIO Address" +msgstr "Endereço MMIO" + +msgid "RAMDAC type" +msgstr "Tipo de RAMDAC" + +msgid "Blend" +msgstr "Mistura" + +msgid "Bilinear filtering" +msgstr "Filtragem bilinear" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Ativar NMI para emulação CGA" + +msgid "Voodoo type" +msgstr "Tipo Voodoo" + +msgid "Framebuffer memory size" +msgstr "Tamanho da memória do framebuffer" + +msgid "Texture memory size" +msgstr "Tamanho da memória da textura" + +msgid "Dither subtraction" +msgstr "Subtração de dither" + +msgid "Screen Filter" +msgstr "Filtro de tela" + +msgid "Render threads" +msgstr "Renderizar threads" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Endereço inicial" + +msgid "Contiguous Size" +msgstr "Tamanho contíguo" + +msgid "I/O Width" +msgstr "Largura de E/S" + +msgid "Transfer Speed" +msgstr "Velocidade de transferência" + +msgid "EMS mode" +msgstr "Modo EMS" + +msgid "Address for > 2 MB" +msgstr "Endereço para > 2 MB" + +msgid "Frame Address" +msgstr "Endereço do quadro" + +msgid "USA" +msgstr "EUA" + +msgid "Danish" +msgstr "Dinamarquesa" + +msgid "Always at selected speed" +msgstr "Sempre à velocidade selecionada" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Definição da BIOS + Teclas de atalho (desligadas durante o POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB a partir de F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB a partir de E0000 (endereço MSB invertido, os últimos 64KB primeiro)" + +msgid "Sine" +msgstr "Sinusoidal" + +msgid "Triangle" +msgstr "Triângular" + +msgid "Linear" +msgstr "Linear" + +msgid "4th Order" +msgstr "4ª ordem" + +msgid "7th Order" +msgstr "7ª ordem" + +msgid "Non-timed (original)" +msgstr "Sem temporizador (original)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (sem jumper em JMP2)" + +msgid "Two" +msgstr "Dois" + +msgid "Three" +msgstr "Três" + +msgid "Wheel" +msgstr "Roda" + +msgid "Five + Wheel" +msgstr "Cinco + Roda" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 série / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) série" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Desativar a BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (estéreo)" + +msgid "Classic" +msgstr "Clássico" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Compósito" + +msgid "Old" +msgstr "Antigo" + +msgid "New" +msgstr "Novo" + +msgid "Color (generic)" +msgstr "Cor (genérico)" + +msgid "Green Monochrome" +msgstr "Monocromático verde" + +msgid "Amber Monochrome" +msgstr "Monocromático âmbar" + +msgid "Gray Monochrome" +msgstr "Monocromático cinzento" + +msgid "Color (no brown)" +msgstr "Cor (sem castanho)" + +msgid "Color (IBM 5153)" +msgstr "Cor (IBM 5153)" + +msgid "Simple doubling" +msgstr "Duplicação simples" + +msgid "sRGB interpolation" +msgstr "interpolação sRGB" + +msgid "Linear interpolation" +msgstr "Interpolação linear" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monocromático (5151/MDA) (branco)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monocromático (5151/MDA) (verde)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monocromático (5151/MDA) (âmbar)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Cor 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Cor 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Cor melhorada - Modo normal (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Cor melhorada - Modo melhorado (5154/ECD)" + +msgid "Green" +msgstr "Verde" + +msgid "Amber" +msgstr "Âmbar" + +msgid "Gray" +msgstr "Cinzento" + +msgid "Color" +msgstr "Cor" + +msgid "U.S. English" +msgstr "Inglês dos E.U.A." + +msgid "Scandinavian" +msgstr "Escandinavo" + +msgid "Other languages" +msgstr "Outros idiomas" + +msgid "Bochs latest" +msgstr "Bochs mais recente" + +msgid "Mono Non-Interlaced" +msgstr "Monocromático não entrelaçado" + +msgid "Color Interlaced" +msgstr "Cor entrelaçado" + +msgid "Color Non-Interlaced" +msgstr "Cor não entrelaçado" + +msgid "3Dfx Voodoo Graphics" +msgstr "Gráficos 3Dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 unidades TMU)" + +msgid "8-bit" +msgstr "8 bits" + +msgid "16-bit" +msgstr "16 bits" + +msgid "Standard (150ns)" +msgstr "Padrão (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Alta velocidade (120ns)" + +msgid "Enabled" +msgstr "Ativado" + +msgid "Standard" +msgstr "Padrão" + +msgid "High-Speed" +msgstr "Alta velocidade" + +msgid "Stereo LPT DAC" +msgstr "DAC LPT estéreo" + +msgid "Generic Text Printer" +msgstr "Impressora de texto genérica" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Matricial de pontos ESC/P genérica" + +msgid "Generic PostScript Printer" +msgstr "Impressora PostScript genérica" + +msgid "Generic PCL5e Printer" +msgstr "Impressora genérica PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Protocolo Internet de linha paralela" + +msgid "Protection Dongle for Savage Quest" +msgstr "Dongle de proteção para Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Dispositivo de passagem de porta série" + +msgid "Passthrough Mode" +msgstr "Modo de passagem" + +msgid "Host Serial Device" +msgstr "Dispositivo de série anfitrião" + +msgid "Name of pipe" +msgstr "Nome do tubo" + +msgid "Data bits" +msgstr "Bits de dados" + +msgid "Stop bits" +msgstr "Bits de paragem" + +msgid "Baud Rate of Passthrough" +msgstr "Taxa de transmissão de passagem" + +msgid "Named Pipe (Server)" +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 "&Unmute" +msgstr "&Reativar som" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Elevado impacto no desempenho" From c3702dd87b68da9b02c2f14cb8467931d950beb6 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 02:53:11 +0100 Subject: [PATCH 578/624] JMP 2 -> JMP2. --- src/device/mouse_bus.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/mouse_bus.c b/src/device/mouse_bus.c index 554704c9d..fdd58b404 100644 --- a/src/device/mouse_bus.c +++ b/src/device/mouse_bus.c @@ -730,7 +730,7 @@ static const device_config_t lt_config[] = { { .description = "Non-timed (original)", .value = 0 }, { .description = "30 Hz (JMP2 = 1)", .value = 30 }, { .description = "45 Hz (JMP2 not populated)", .value = 45 }, - { .description = "60 Hz (JMP 2 = 2)", .value = 60 }, + { .description = "60 Hz (JMP2 = 2)", .value = 60 }, { .description = "" } } }, From ae140b0fe16f1ed25433799a0f47a83e38ab2b26 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 06:18:53 +0100 Subject: [PATCH 579/624] More language fixes and Russian, Slovak, Slovenian, and Turkish. --- src/qt/languages/ca-ES.po | 6 +- src/qt/languages/cs-CZ.po | 10 +- src/qt/languages/de-DE.po | 6 +- src/qt/languages/es-ES.po | 8 +- src/qt/languages/fi-FI.po | 8 +- src/qt/languages/fr-FR.po | 4 +- src/qt/languages/hr-HR.po | 6 +- src/qt/languages/hu-HU.po | 10 +- src/qt/languages/it-IT.po | 10 +- src/qt/languages/ja-JP.po | 10 +- src/qt/languages/ko-KR.po | 8 +- src/qt/languages/pl-PL.po | 12 +- src/qt/languages/pt-BR.po | 10 +- src/qt/languages/pt-PT.po | 20 +- src/qt/languages/ru-RU.po | 1052 +++++++++++++++++++++++++++++++++---- src/qt/languages/sk-SK.po | 959 ++++++++++++++++++++++++++++++++- src/qt/languages/sl-SI.po | 973 +++++++++++++++++++++++++++++++++- src/qt/languages/tr-TR.po | 969 +++++++++++++++++++++++++++++++++- 18 files changed, 3875 insertions(+), 206 deletions(-) diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 4c7eab253..ddbb345ff 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -1849,10 +1849,10 @@ msgid "Linear" msgstr "Lineal" msgid "4th Order" -msgstr "4t ordre" +msgstr "Del 4t ordre" msgid "7th Order" -msgstr "7è ordre" +msgstr "Del 7è ordre" msgid "Non-timed (original)" msgstr "No cronometrat (original)" @@ -2101,7 +2101,7 @@ msgid "Host Serial Passthrough" msgstr "Pas del port sèrie amfitrió" msgid "Eject %s" -msgstr "Explulsar %s" +msgstr "Extreure %s" msgid "&Unmute" msgstr "&Saver" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index e5bb2634d..a6a7d3d6a 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -1840,19 +1840,19 @@ msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "128 kB od E0000 (invertovaný MSB adresy, nejprve posledních 64 kB)" msgid "Sine" -msgstr "Sinusoví" +msgstr "Sinusový" msgid "Triangle" -msgstr "Trojúhelní" +msgstr "Trojúhelníkový" msgid "Linear" msgstr "Lineární" msgid "4th Order" -msgstr "4. řád" +msgstr "4. řádu" msgid "7th Order" -msgstr "7. řád" +msgstr "7. řádu" msgid "Non-timed (original)" msgstr "Bez časování (originální)" @@ -2101,7 +2101,7 @@ msgid "Host Serial Passthrough" msgstr "Průchod sériového portu hostitele" msgid "Eject %s" -msgstr "Vysunout %s" +msgstr "Vyjmout %s" msgid "&Unmute" msgstr "&Roztišit" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index b5e984c2f..9f50dbae1 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1849,13 +1849,13 @@ msgid "Triangle" msgstr "Dreieck" msgid "Linear" -msgstr "Linear" +msgstr "Lineare" msgid "4th Order" -msgstr "4. Bestellung" +msgstr "4. Ordnung" msgid "7th Order" -msgstr "7. Bestellung" +msgstr "7. Ordnung" msgid "Non-timed (original)" msgstr "Nicht zeitgesteuert (Original)" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 1c23dfda3..fc419713e 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -1845,13 +1845,13 @@ msgid "Triangle" msgstr "Triangular" msgid "Linear" -msgstr "Linear" +msgstr "Lineal" msgid "4th Order" -msgstr "4ª Orden" +msgstr "De 4º orden" msgid "7th Order" -msgstr "7ª Orden" +msgstr "De 7º orden" msgid "Non-timed (original)" msgstr "No cronometrado (original)" @@ -2100,7 +2100,7 @@ msgid "Host Serial Passthrough" msgstr "Paso del puerto serie del host" msgid "Eject %s" -msgstr "Expulsar %s" +msgstr "Extraer %s" msgid "&Unmute" msgstr "&Reactivar sonido" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 83635711b..51bcd4884 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -1840,7 +1840,7 @@ msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "128 kB alkaen E0000:sta (osoitteen käänteinen MSB, viimeiset 64 kB ensin)" msgid "Sine" -msgstr "Sinus" +msgstr "Sini" msgid "Triangle" msgstr "Kolmio" @@ -1849,10 +1849,10 @@ msgid "Linear" msgstr "Lineaarinen" msgid "4th Order" -msgstr "4. tilaus" +msgstr "4. kertaluvun" msgid "7th Order" -msgstr "7. tilaus" +msgstr "7. kertaluvun" msgid "Non-timed (original)" msgstr "Ajastamaton (alkuperäinen)" @@ -2101,7 +2101,7 @@ msgid "Host Serial Passthrough" msgstr "Isännän sarjaportin läpivienti" msgid "Eject %s" -msgstr "Pudota %s:n" +msgstr "Poista kasettipesästä %s" msgid "&Unmute" msgstr "&Poista mykistys" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index e46044c45..d621a60a1 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -1849,10 +1849,10 @@ msgid "Linear" msgstr "Linéaire" msgid "4th Order" -msgstr "4ème ordre" +msgstr "Du 4e ordre" msgid "7th Order" -msgstr "7ème ordre" +msgstr "Du 7e ordre" msgid "Non-timed (original)" msgstr "Non temporisé (original)" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 86f139e5c..d33e9eec2 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -1846,13 +1846,13 @@ msgid "Triangle" msgstr "Trokutni" msgid "Linear" -msgstr "Linearni" +msgstr "Linearna" msgid "4th Order" -msgstr "4. red" +msgstr "4. reda" msgid "7th Order" -msgstr "7. red" +msgstr "7. reda" msgid "Non-timed (original)" msgstr "Bez tajmera (originalni)" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 4cd62c566..06366a4ff 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -1537,7 +1537,7 @@ msgid "MIDI Output Device" msgstr "MIDI kimeneti eszköz" msgid "MIDI Real time" -msgstr "MIDI Valós idő" +msgstr "MIDI valós időben" msgid "MIDI Thru" msgstr "A MIDI bemenet átmenete" @@ -1840,7 +1840,7 @@ msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "128 kB E0000-től kezdődően (cím MSB invertálva, először az utolsó 64KB)" msgid "Sine" -msgstr "Sine" +msgstr "Szinuszos" msgid "Triangle" msgstr "Háromszög" @@ -1849,10 +1849,10 @@ msgid "Linear" msgstr "Lineáris" msgid "4th Order" -msgstr "4. rend" +msgstr "4. rendű" msgid "7th Order" -msgstr "7. rend" +msgstr "7. rendű" msgid "Non-timed (original)" msgstr "Időzítő nélkül (eredeti)" @@ -2101,7 +2101,7 @@ msgid "Host Serial Passthrough" msgstr "Az állomás soros portjának áthaladása" msgid "Eject %s" -msgstr "Dobj ki %s" +msgstr "%s kiadás" msgid "&Unmute" msgstr "&Hang újra bekapcsolása" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 651c2e93c..6d08b73fd 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -1816,7 +1816,7 @@ msgid "Address for > 2 MB" msgstr "Indirizzo per > 2 MB" msgid "Frame Address" -msgstr "Indirizzo del telaio" +msgstr "Indirizzo del frame" msgid "USA" msgstr "Stati Uniti" @@ -1837,19 +1837,19 @@ msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "128 kB a partire da E0000 (indirizzo MSB invertito, prima gli ultimi 64KB)" msgid "Sine" -msgstr "Sinusoide" +msgstr "Sinusoidale" msgid "Triangle" -msgstr "Triangolo" +msgstr "Triangolare" msgid "Linear" msgstr "Lineare" msgid "4th Order" -msgstr "4° Ordine" +msgstr "Del 4° ordine" msgid "7th Order" -msgstr "7° Ordine" +msgstr "Del 7° ordine" msgid "Non-timed (original)" msgstr "Senza timer (originale)" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index becb91707..49018ba9c 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -1537,7 +1537,7 @@ msgid "MIDI Output Device" msgstr "MIDI出力デバイス" msgid "MIDI Real time" -msgstr "MIDI リアルタイム" +msgstr "リアルタイムMIDI" msgid "MIDI Thru" msgstr "MIDI入力のパススルー" @@ -1840,19 +1840,19 @@ msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "E0000から始まる128キロバイト(アドレスMSBが反転、最後の64キロバイトが最初)" msgid "Sine" -msgstr "正弦波" +msgstr "正弦" msgid "Triangle" -msgstr "三角波" +msgstr "三角" msgid "Linear" msgstr "線形" msgid "4th Order" -msgstr "4位" +msgstr "4次" msgid "7th Order" -msgstr "7位" +msgstr "7次" msgid "Non-timed (original)" msgstr "タイマーなし(オリジナル)" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 1acd3b16d..6be66f143 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -1537,7 +1537,7 @@ msgid "MIDI Output Device" msgstr "미디 출력 장치" msgid "MIDI Real time" -msgstr "MIDI 실시간" +msgstr "실시간 MIDI" msgid "MIDI Thru" msgstr "미디 입력 패스스루" @@ -1843,13 +1843,13 @@ msgid "Sine" msgstr "사인" msgid "Triangle" -msgstr "트라이앵글" +msgstr "삼각형" msgid "Linear" -msgstr "리니어" +msgstr "선형" msgid "4th Order" -msgstr "4번째 주문" +msgstr "4차 주문" msgid "7th Order" msgstr "7차 주문" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index dce9ffbef..384251872 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -1840,19 +1840,19 @@ msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "128 kB począwszy od E0000 (adres MSB odwrócony, najpierw ostatnie 64KB)" msgid "Sine" -msgstr "Sinus" +msgstr "Sinusoidalny" msgid "Triangle" -msgstr "Trójkąt" +msgstr "Trójkątny" msgid "Linear" -msgstr "Liniowy" +msgstr "Liniowa" msgid "4th Order" -msgstr "4. kolejność" +msgstr "4. rzędu" msgid "7th Order" -msgstr "7. kolejność" +msgstr "7. rzędu" msgid "Non-timed (original)" msgstr "Bez timera (oryginał)" @@ -2101,7 +2101,7 @@ msgid "Host Serial Passthrough" msgstr "Przejście przez port szeregowy hosta" msgid "Eject %s" -msgstr "Wysuń %s" +msgstr "Wyjmij %s" msgid "&Unmute" msgstr "&Wycisz" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index c48c7e0ea..4d2eb2c84 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -1537,7 +1537,7 @@ msgid "MIDI Output Device" msgstr "Dispositivo de saída MIDI" msgid "MIDI Real time" -msgstr "MIDI Tempo real" +msgstr "MIDI em tempo real" msgid "MIDI Thru" msgstr "Passagem da entrada MIDI" @@ -1840,19 +1840,19 @@ msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "128 kB a partir de E0000 (endereço MSB invertido, os últimos 64 kB primeiro)" msgid "Sine" -msgstr "Sine" +msgstr "Senoidal" msgid "Triangle" -msgstr "Triângulo" +msgstr "Triangular" msgid "Linear" msgstr "Linear" msgid "4th Order" -msgstr "4ª ordem" +msgstr "De 4ª ordem" msgid "7th Order" -msgstr "7º Pedido" +msgstr "De 7º order" msgid "Non-timed (original)" msgstr "Sem cronômetro (original)" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 113779643..4eafb5919 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -115,10 +115,10 @@ msgid "&Fullscreen\tCtrl+Alt+PgUp" msgstr "E&crã cheio\tCtrl+Alt+PgUp" msgid "Fullscreen &stretch mode" -msgstr "Modo &de estiramento em ecrã cheio" +msgstr "Modo &de estiramento na tela cheia" msgid "&Full screen stretch" -msgstr "&Estiramento em ecrã cheio" +msgstr "&Estiramento na tela cheia" msgid "&4:3" msgstr "&4:3" @@ -877,7 +877,7 @@ msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny docum msgstr "%1 é requerido para a conversão automática de ficheiros PCL para ficheiros PDF.\n\nQualquer documento enviado para a impressora PCL genérica será gravado como um ficheiro Printer Command Language (.pcl)." msgid "Entering fullscreen mode" -msgstr "A entrar no modo de ecrã cheio" +msgstr "A entrar no modo de tela cheia" msgid "Don't show this message again" msgstr "Não mostrar mais esta mensagem" @@ -1255,7 +1255,7 @@ msgid "Open screenshots folder..." msgstr "Abrir a pasta de capturas de ecrã..." msgid "Apply fullscreen stretch mode when maximized" -msgstr "Aplicar o modo de estiramento em ecrã cheio quando maximizado" +msgstr "Aplicar o modo de estiramento na tela cheia quando maximizado" msgid "Cursor/Puck" msgstr "Cursor/Puck" @@ -1537,7 +1537,7 @@ msgid "MIDI Output Device" msgstr "Dispositivo de saída MIDI" msgid "MIDI Real time" -msgstr "MIDI Tempo real" +msgstr "MIDI em tempo real" msgid "MIDI Thru" msgstr "Passagem da entrada MIDI" @@ -1561,7 +1561,7 @@ msgid "Chorus Level" msgstr "Nível de coro" msgid "Chorus Speed" -msgstr "Velocidade do coral" +msgstr "Velocidade do coro" msgid "Chorus Depth" msgstr "Profundidade do coro" @@ -1843,16 +1843,16 @@ msgid "Sine" msgstr "Sinusoidal" msgid "Triangle" -msgstr "Triângular" +msgstr "Triangular" msgid "Linear" msgstr "Linear" msgid "4th Order" -msgstr "4ª ordem" +msgstr "De 4ª ordem" msgid "7th Order" -msgstr "7ª ordem" +msgstr "De 7ª ordem" msgid "Non-timed (original)" msgstr "Sem temporizador (original)" @@ -2074,7 +2074,7 @@ msgid "Protection Dongle for Savage Quest" msgstr "Dongle de proteção para Savage Quest" msgid "Serial Passthrough Device" -msgstr "Dispositivo de passagem de porta série" +msgstr "Dispositivo de passagem de porta de série" msgid "Passthrough Mode" msgstr "Modo de passagem" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index eb3c89174..4e1984d4c 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -39,9 +39,6 @@ msgstr "&Скрыть строку состояния" msgid "Hide &toolbar" msgstr "С&крыть панель инструментов" -msgid "Show non-primary monitors" -msgstr "&Показывать неосновные мониторы" - msgid "&Resizeable window" msgstr "&Изменяемый размер окна" @@ -63,30 +60,6 @@ msgstr "Open&GL (3.0)" msgid "&VNC" msgstr "&VNC" -msgid "Renderer options..." -msgstr "Параметры рендеринга..." - -msgid "OpenGL 3.0 renderer options" -msgstr "Параметры рендеринга OpenGL 3.0" - -msgid "Render behavior" -msgstr "Режим рендеринга" - -msgid "Synchronize with video" -msgstr "Синхронизировать с видео" - -msgid "Use target framerate:" -msgstr "Использовать целевую частоту кадров:" - -msgid "VSync" -msgstr "Вертикальная синхронизация" - -msgid "Shaders" -msgstr "Шейдеры" - -msgid "No shader selected" -msgstr "Шейдер не выбран" - msgid "Specify dimensions..." msgstr "&Указать размеры главного окна..." @@ -159,9 +132,6 @@ msgstr "&Целочисленное масштабирование" msgid "4:&3 Integer scale" msgstr "4:&3 Целочисленное масштабирование" -msgid "Apply fullscreen stretch mode when maximized" -msgstr "Применить полноэкранный режим растяжения при разворачивании окна" - msgid "E&GA/(S)VGA settings" msgstr "Настройки E&GA/(S)VGA" @@ -228,9 +198,6 @@ msgstr "Включить интеграцию &Discord" msgid "Sound &gain..." msgstr "&Усиление звука..." -msgid "Open screenshots folder..." -msgstr "Открыть папку скриншотов..." - msgid "Begin trace\tCtrl+T" msgstr "Начать трассировку\tCtrl+T" @@ -270,9 +237,6 @@ msgstr "&Перемотка в конец" msgid "E&ject" msgstr "И&звлечь" -msgid "Eject %s" -msgstr "Извлечь %s" - msgid "&Image..." msgstr "&Образ..." @@ -282,9 +246,6 @@ msgstr "Э&кспорт в 86F..." msgid "&Mute" msgstr "О&тключить звук" -msgid "&Unmute" -msgstr "В&ключить звук" - msgid "E&mpty" msgstr "П&устой" @@ -432,8 +393,8 @@ msgstr "Видеокарта 1:" msgid "Video #2:" msgstr "Видеокарта 2:" -msgid "Voodoo Graphics" -msgstr "Ускоритель Voodoo" +msgid "Voodoo 1 or 2 Graphics" +msgstr "Ускоритель Voodoo 1 или 2" msgid "IBM 8514/A Graphics" msgstr "Ускоритель IBM 8514/A" @@ -501,30 +462,6 @@ msgstr "Устройство PCap:" msgid "Network adapter:" msgstr "Сетевая карта:" -msgid "Network Card #1" -msgstr "Сетевая карта 1:" - -msgid "Network Card #2" -msgstr "Сетевая карта 2:" - -msgid "Network Card #3" -msgstr "Сетевая карта 3:" - -msgid "Network Card #4" -msgstr "Сетевая карта 4:" - -msgid "Mode" -msgstr "Режим:" - -msgid "Interface" -msgstr "Интерфейс:" - -msgid "Adapter" -msgstr "Адаптер:" - -msgid "VDE Socket" -msgstr "VDE Socket:" - msgid "COM1 Device:" msgstr "Устройство COM1:" @@ -561,18 +498,6 @@ msgstr "Последовательный порт COM3" msgid "Serial port 4" msgstr "Последовательный порт COM4" -msgid "Serial port passthrough 1" -msgstr "Сквозной последовательный порт COM1" - -msgid "Serial port passthrough 2" -msgstr "Сквозной последовательный порт COM2" - -msgid "Serial port passthrough 3" -msgstr "Сквозной последовательный порт COM3" - -msgid "Serial port passthrough 4" -msgstr "Сквозной последовательный порт COM4" - msgid "Parallel port 1" msgstr "Параллельный порт LPT1" @@ -624,15 +549,9 @@ msgstr "&Создать..." msgid "&Existing..." msgstr "&Выбрать..." -msgid "Browse..." -msgstr "Выбрать..." - msgid "&Remove" msgstr "&Удалить" -msgid "Remove" -msgstr "Удалить" - msgid "Bus:" msgstr "Шина:" @@ -711,9 +630,6 @@ msgstr "Устройство ISABugger" msgid "POST card" msgstr "Карта POST" -msgid "86Box Unit Tester" -msgstr "Модульный Тестер 86Box" - msgid "86Box" msgstr "86Box" @@ -744,9 +660,6 @@ msgstr "86Box не смог найти ни одного подходящего msgid "(empty)" msgstr "(пусто)" -msgid "Clear image history" -msgstr "Очистить историю образов" - msgid "All files" msgstr "Все файлы" @@ -774,6 +687,9 @@ msgstr "Системная плата \"%hs\" недоступна из-за о msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Видеокарта \"%hs\" недоступна из-за отсутствия файла её ПЗУ в каталоге roms/video. Переключение на доступную видеокарту." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Видеокарта 2 \"%hs\" недоступна из-за отсутствия файла её ПЗУ в каталоге roms/video. Переключение на доступную видеокарту." + msgid "Machine" msgstr "Компьютер" @@ -831,9 +747,6 @@ msgstr "H" msgid "S" msgstr "S" -msgid "MiB" -msgstr "МиБ" - msgid "KB" msgstr "КБ" @@ -855,17 +768,26 @@ msgstr "Устройства PCap не найдены" msgid "Invalid PCap device" msgstr "Неверное устройство PCap" -msgid "Standard 2-button joystick(s)" -msgstr "Стандартный 2-кнопочный джойстик" +msgid "2-axis, 2-button joystick(s)" +msgstr "2-осевой, 2-кнопочный джойстик" -msgid "Standard 4-button joystick" -msgstr "Стандартный 4-кнопочный джойстик" +msgid "2-axis, 4-button joystick" +msgstr "2-осевой, 4-кнопочный джойстик" -msgid "Standard 6-button joystick" -msgstr "Стандартный 6-кнопочный джойстик" +msgid "2-axis, 6-button joystick" +msgstr "2-осевой, 6-кнопочный джойстик" -msgid "Standard 8-button joystick" -msgstr "Стандартный 8-кнопочный джойстик" +msgid "2-axis, 8-button joystick" +msgstr "2-осевой, 8-кнопочный джойстик" + +msgid "3-axis, 2-button joystick" +msgstr "3-осевой, 2-кнопочный джойстик" + +msgid "3-axis, 4-button joystick" +msgstr "3-осевой, 4-кнопочный джойстик" + +msgid "4-axis, 4-button joystick" +msgstr "4-осевой, 4-кнопочный джойстик" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -900,6 +822,9 @@ msgstr "Вы уверены, что хотите выйти из 86Box?" msgid "Unable to initialize Ghostscript" msgstr "Невозможно инициализировать Ghostscript" +msgid "Unable to initialize GhostPCL" +msgstr "Невозможно инициализировать GhostPCL" + msgid "MO %i (%ls): %ls" msgstr "Магнитооптический %i (%ls): %ls" @@ -948,6 +873,9 @@ msgstr "Недопустимая конфигурация" 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 "Для автоматического преобразования файлов PostScript в PDF требуется %1.\n\nВсе документы, отправленные на общий принтер PostScript, будут сохранены в виде файлов PostScript (.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." +msgstr "Для автоматического преобразования файлов PCL в PDF требуется %1.\n\nВсе документы, отправленные на общий принтер PCL, будут сохранены в виде файлов Printer Command Language (.pcl)." + msgid "Entering fullscreen mode" msgstr "Вход в полноэкранный режим" @@ -1092,6 +1020,27 @@ msgstr "Перезаписать" msgid "Don't overwrite" msgstr "Не перезаписывать" +msgid "Raw image" +msgstr "RAW образ" + +msgid "HDI image" +msgstr "Образ HDI" + +msgid "HDX image" +msgstr "Образ HDX" + +msgid "Fixed-size VHD" +msgstr "VHD фиксированного размера" + +msgid "Dynamic-size VHD" +msgstr "VHD динамического размера" + +msgid "Differencing VHD" +msgstr "Дифференцированный образ VHD" + +msgid "(N/A)" +msgstr "(Нет)" + msgid "Raw image (.img)" msgstr "RAW образ (.img)" @@ -1265,3 +1214,906 @@ msgstr "WinBox больше не поддерживается" 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 "Разработка менеджера WinBox прекратилась в 2022 году из-за отсутствия сопровождающих. Поскольку мы направляем наши усилия на то, чтобы сделать 86Box еще лучше, мы приняли решение больше не поддерживать WinBox в качестве менеджера.\n\nWinBox больше не будет обновляться, и вы можете столкнуться с некорректным поведением, если продолжите использовать его с новыми версиями 86Box. Любые сообщения об ошибках, связанных с поведением WinBox, будут закрыты как недействительные.\n\nПерейдите на сайт 86box.net для получения списка других менеджеров, которые вы можете использовать." + +msgid "Generate" +msgstr "Создать" + +msgid "Joystick configuration" +msgstr "Конфигурация джойстика" + +msgid "Device" +msgstr "Устройство" + +msgid "%1 (X axis)" +msgstr "%1 (ось X)" + +msgid "%1 (Y axis)" +msgstr "%1 (ось Y)" + +msgid "MCA devices" +msgstr "Устройства MCA" + +msgid "List of MCA devices:" +msgstr "Список устройств MCA:" + +msgid "Tablet tool" +msgstr "Планшетный инструмент" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "О Qt" + +msgid "MCA devices..." +msgstr "Устройства MCA..." + +msgid "Show non-primary monitors" +msgstr "&Показывать неосновные мониторы" + +msgid "Open screenshots folder..." +msgstr "Открыть папку скриншотов..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Применить полноэкранный режим растяжения при разворачивании окна" + +msgid "Cursor/Puck" +msgstr "Курсор/шайба" + +msgid "Pen" +msgstr "Ручка" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Главный CD/DVD-привод (%1:)" + +msgid "&Connected" +msgstr "&Connected" + +msgid "Clear image history" +msgstr "Очистить историю образов" + +msgid "Create..." +msgstr "Создайте..." + +msgid "previous image" +msgstr "предыдущее изображение" + +msgid "Host CD/DVD Drive (%1)" +msgstr "Главный CD/DVD-привод (%1)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Режим рендеринга" + +msgid "Use target framerate:" +msgstr "Использовать целевую частоту кадров:" + +msgid " fps" +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 "Синхронизация с видео" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Не удалось переключиться на контекст OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Требуется OpenGL версии 3.0 или выше. Текущая версия %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Не удалось выполнить инициализацию OpenGL. Ошибка %1." + +msgid "Error initializing OpenGL" +msgstr "Ошибка инициализации OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Возвращаясь к программному рендерингу.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Выделение памяти для буфера распаковки не удалось.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>При выборе образов носителей (CD-ROM, дискет и т. д.) диалог открытия будет запускаться в том же каталоге, что и файл конфигурации 86Box. Эта настройка, скорее всего, будет иметь значение только на macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Возможно, эта машина была перемещена или скопирована." + +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 "Чтобы обеспечить правильную работу сети, 86Box должен знать, была ли эта машина перемещена или скопирована.\n\nЕсли вы не уверены, выберите \"Я скопировал его\"." + +msgid "I Moved It" +msgstr "Я переместил его" + +msgid "I Copied It" +msgstr "Я скопировал его" + +msgid "86Box Monitor #" +msgstr "86Box Monitor #" + +msgid "No MCA devices." +msgstr "Нет устройств MCA." + +msgid "MiB" +msgstr "МиБ" + +msgid "Network Card #1" +msgstr "Сетевая карта 1" + +msgid "Network Card #2" +msgstr "Сетевая карта 2" + +msgid "Network Card #3" +msgstr "Сетевая карта 3" + +msgid "Network Card #4" +msgstr "Сетевая карта 4" + +msgid "Mode" +msgstr "Режим" + +msgid "Interface" +msgstr "Интерфейс" + +msgid "Adapter" +msgstr "Адаптер" + +msgid "VDE Socket" +msgstr "VDE Socket" + +msgid "86Box Unit Tester" +msgstr "Модульный Тестер 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Карта ключей Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Сквозной последовательный порт COM1" + +msgid "Serial port passthrough 2" +msgstr "Сквозной последовательный порт COM2" + +msgid "Serial port passthrough 3" +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 Bus Mouse" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Мышь Microsoft Bus Mouse (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Серийная мышь Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Серийная мышь Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Серийная мышь Logitech" + +msgid "PS/2 Mouse" +msgstr "Мышь PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (серийная)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Стандартный Hayes-совместимый модем" + +msgid "Roland MT-32 Emulation" +msgstr "Эмуляция Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Эмуляция Roland MT-32 (Новый)" + +msgid "Roland CM-32L Emulation" +msgstr "Эмуляция Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Эмуляция Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Дочерняя плата OPL4-ML" + +msgid "System MIDI" +msgstr "Системный MIDI" + +msgid "MIDI Input Device" +msgstr "Устройство ввода MIDI" + +msgid "BIOS Address" +msgstr "Адрес BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Разрешить запись в ПЗУ расширения BIOS" + +msgid "Address" +msgstr "Адрес" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Ревизия BIOS" + +msgid "Translate 26 -> 17" +msgstr "Перевести 26 -> 17" + +msgid "Language" +msgstr "Язык" + +msgid "Enable backlight" +msgstr "Включить подсветку" + +msgid "Invert colors" +msgstr "Инвертировать цвета" + +msgid "BIOS size" +msgstr "Размер BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Карта C0000-C7FFF как UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Отображение C8000-CFFFF в качестве UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Отображение D0000-D7FFF в качестве UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Отображение D8000-DFFFF в качестве UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Отображение E0000-E7FFF в качестве UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Отображение E8000-EFFFF в качестве UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Перемычка JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Устройство вывода MIDI" + +msgid "MIDI Real time" +msgstr "MIDI в реальному времени" + +msgid "MIDI Thru" +msgstr "Пропускание MIDI-входа" + +msgid "MIDI Clockout" +msgstr "Выход MIDI-часов" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Усиление выхода" + +msgid "Chorus" +msgstr "Хор" + +msgid "Chorus Voices" +msgstr "Голоса хора" + +msgid "Chorus Level" +msgstr "Уровень хора" + +msgid "Chorus Speed" +msgstr "Скорость хоруса" + +msgid "Chorus Depth" +msgstr "Глубина хора" + +msgid "Chorus Waveform" +msgstr "Форма волны хора" + +msgid "Reverb" +msgstr "Реверберация" + +msgid "Reverb Room Size" +msgstr "Размер комнаты реверберации" + +msgid "Reverb Damping" +msgstr "Демпфирование реверберации" + +msgid "Reverb Width" +msgstr "Ширина реверберации" + +msgid "Reverb Level" +msgstr "Уровень реверберации" + +msgid "Interpolation Method" +msgstr "Метод интерполяции" + +msgid "Reverb Output Gain" +msgstr "Усиление выходного сигнала ревербератора" + +msgid "Reversed stereo" +msgstr "Перевернутое стерео" + +msgid "Nice ramp" +msgstr "Хорошая рампа" + +msgid "Hz" +msgstr "Гц" + +msgid "Buttons" +msgstr "Кнопки" + +msgid "Serial Port" +msgstr "Последовательный порт" + +msgid "RTS toggle" +msgstr "Переключение RTS" + +msgid "Revision" +msgstr "Пересмотр" + +msgid "Controller" +msgstr "Контроллер" + +msgid "Show Crosshair" +msgstr "Показать перекрестие" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC-адрес" + +msgid "MAC Address OUI" +msgstr "OUI MAC-адреса" + +msgid "Enable BIOS" +msgstr "Включить BIOS" + +msgid "Baud Rate" +msgstr "Скорость передачи данных" + +msgid "TCP/IP listening port" +msgstr "Порт прослушивания TCP/IP" + +msgid "Phonebook File" +msgstr "Файл телефонной книги" + +msgid "Telnet emulation" +msgstr "Эмуляция Telnet" + +msgid "RAM Address" +msgstr "Адрес оперативной памяти" + +msgid "RAM size" +msgstr "Объем оперативной памяти" + +msgid "Initial RAM size" +msgstr "Начальный размер оперативной памяти" + +msgid "Serial Number" +msgstr "Серийный номер" + +msgid "Host ID" +msgstr "Идентификатор хоста" + +msgid "FDC Address" +msgstr "Адрес FDC" + +msgid "MPU-401 Address" +msgstr "Адрес MPU-401" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "Прием входного сигнала MIDI" + +msgid "Low DMA" +msgstr "Низкий уровень DMA" + +msgid "Enable Game port" +msgstr "Включить игровой порт" + +msgid "Surround module" +msgstr "Модуль объемного звучания" + +msgid "CODEC" +msgstr "КОДЕК" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Поднимать прерывание CODEC при настройке CODEC (необходимо некоторым драйверам)." + +msgid "SB Address" +msgstr "Адрес СБ" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "Включить OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Прием входного сигнала MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "Низкий уровень SB DMA" + +msgid "6CH variant (6-channel)" +msgstr "Вариант 6CH (6-канальный)" + +msgid "Enable CMS" +msgstr "Включить CMS" + +msgid "Mixer" +msgstr "Смеситель" + +msgid "High DMA" +msgstr "Высокий уровень DMA" + +msgid "Control PC speaker" +msgstr "Управление динамиком ПК" + +msgid "Memory size" +msgstr "Объем памяти" + +msgid "EMU8000 Address" +msgstr "Адрес EMU8000" + +msgid "IDE Controller" +msgstr "Контроллер IDE" + +msgid "Codec" +msgstr "Кодек" + +msgid "GUS type" +msgstr "Тип GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Включить команду 0x04 \"Выход 86Box\"." + +msgid "Display type" +msgstr "Тип дисплея" + +msgid "Composite type" +msgstr "Композитный тип" + +msgid "RGB type" +msgstr "Тип RGB" + +msgid "Line doubling type" +msgstr "Тип удвоения линии" + +msgid "Snow emulation" +msgstr "Эмуляция снега" + +msgid "Monitor type" +msgstr "Тип монитора" + +msgid "Character set" +msgstr "Набор символов" + +msgid "XGA type" +msgstr "Тип XGA" + +msgid "Instance" +msgstr "Экземпляр" + +msgid "MMIO Address" +msgstr "Адрес MMIO" + +msgid "RAMDAC type" +msgstr "Тип RAMDAC" + +msgid "Blend" +msgstr "Смесь" + +msgid "Bilinear filtering" +msgstr "Билинейная фильтрация" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Включение NMI для эмуляции CGA" + +msgid "Voodoo type" +msgstr "Тип Вуду" + +msgid "Framebuffer memory size" +msgstr "Размер памяти фреймбуфера" + +msgid "Texture memory size" +msgstr "Размер памяти текстур" + +msgid "Dither subtraction" +msgstr "Вычитание с вычитанием" + +msgid "Screen Filter" +msgstr "Сетчатый фильтр" + +msgid "Render threads" +msgstr "Потоки рендеринга" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Стартовый адрес" + +msgid "Contiguous Size" +msgstr "Смежный размер" + +msgid "I/O Width" +msgstr "Ширина ввода/вывода" + +msgid "Transfer Speed" +msgstr "Скорость передачи данных" + +msgid "EMS mode" +msgstr "Режим EMS" + +msgid "Address for > 2 MB" +msgstr "Адрес для > 2 МБ" + +msgid "Frame Address" +msgstr "Адрес кадра" + +msgid "USA" +msgstr "США" + +msgid "Danish" +msgstr "Датский" + +msgid "Always at selected speed" +msgstr "Всегда на выбранной скорости" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Настройка BIOS + горячие клавиши (отключается во время POST)" + +msgid "64 kB starting from F0000" +msgstr "64 кБ, начиная с F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 кБ, начиная с E0000 (адрес MSB инвертирован, сначала последние 64 КБ)" + +msgid "Sine" +msgstr "Синусоидальная" + +msgid "Triangle" +msgstr "Треугольная" + +msgid "Linear" +msgstr "Линейный" + +msgid "4th Order" +msgstr "4-го порядка" + +msgid "7th Order" +msgstr "7-го порядка" + +msgid "Non-timed (original)" +msgstr "Без таймера (оригинал)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Гц (без перемычки на JMP2)" + +msgid "Two" +msgstr "Два" + +msgid "Three" +msgstr "Три" + +msgid "Wheel" +msgstr "Колесо" + +msgid "Five + Wheel" +msgstr "Пять + колесо" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 серийная / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) серийная" + +msgid "8 kB" +msgstr "8 кб" + +msgid "32 kB" +msgstr "32 кб" + +msgid "16 kB" +msgstr "16 кб" + +msgid "64 kB" +msgstr "64 кб" + +msgid "Disable BIOS" +msgstr "Отключить BIOS" + +msgid "512 kB" +msgstr "512 кб" + +msgid "2 MB" +msgstr "2 МБ" + +msgid "8 MB" +msgstr "8 МБ" + +msgid "28 MB" +msgstr "28 МБ" + +msgid "1 MB" +msgstr "1 МБ" + +msgid "4 MB" +msgstr "4 МБ" + +msgid "12 MB" +msgstr "12 МБ" + +msgid "16 MB" +msgstr "16 МБ" + +msgid "20 MB" +msgstr "20 МБ" + +msgid "24 MB" +msgstr "24 МБ" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (стерео)" + +msgid "Classic" +msgstr "Классика" + +msgid "256 kB" +msgstr "256 кб" + +msgid "Composite" +msgstr "Композит" + +msgid "Old" +msgstr "Старый" + +msgid "New" +msgstr "Новый" + +msgid "Color (generic)" +msgstr "Цвет (общий)" + +msgid "Green Monochrome" +msgstr "Зеленый монохром" + +msgid "Amber Monochrome" +msgstr "Янтарный монохром" + +msgid "Gray Monochrome" +msgstr "Серый монохром" + +msgid "Color (no brown)" +msgstr "Цвет (без коричневого)" + +msgid "Color (IBM 5153)" +msgstr "Цвет (IBM 5153)" + +msgid "Simple doubling" +msgstr "Простое удвоение" + +msgid "sRGB interpolation" +msgstr "Интерполяция sRGB" + +msgid "Linear interpolation" +msgstr "Линейная интерполяция" + +msgid "128 kB" +msgstr "128 кб" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Монохромный (5151/MDA) (белый)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Монохромный (5151/MDA) (зеленый)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Монохром (5151/MDA) (янтарный)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Цветной 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Цветной 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Улучшенный цветной - нормальный режим (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Улучшенный цветной - улучшенный режим (5154/ECD)" + +msgid "Green" +msgstr "Зеленый" + +msgid "Amber" +msgstr "Янтарный" + +msgid "Gray" +msgstr "Серый" + +msgid "Color" +msgstr "Цветной" + +msgid "U.S. English" +msgstr "Английский США" + +msgid "Scandinavian" +msgstr "Скандинавский" + +msgid "Other languages" +msgstr "Другие языки" + +msgid "Bochs latest" +msgstr "Бохс последний" + +msgid "Mono Non-Interlaced" +msgstr "Моно без чересстрочной развертки" + +msgid "Color Interlaced" +msgstr "Цветная чересстрочная развертка" + +msgid "Color Non-Interlaced" +msgstr "Цвет без вкраплений" + +msgid "3Dfx Voodoo Graphics" +msgstr "Ускоритель 3Dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU)" + +msgid "8-bit" +msgstr "8-битный" + +msgid "16-bit" +msgstr "16-бит" + +msgid "Standard (150ns)" +msgstr "Стандартный (150 нс)" + +msgid "High-Speed (120ns)" +msgstr "Высокоскоростной (120 нс)" + +msgid "Enabled" +msgstr "Включено" + +msgid "Standard" +msgstr "Стандарт" + +msgid "High-Speed" +msgstr "Высокоскоростной" + +msgid "Stereo LPT DAC" +msgstr "Стереофонический ЦАП LPT" + +msgid "Generic Text Printer" +msgstr "Текстовый принтер общего назначения" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Матричный принтер Generic ESC/P" + +msgid "Generic PostScript Printer" +msgstr "Generic PostScript Printer" + +msgid "Generic PCL5e Printer" +msgstr "Общий принтер PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Параллельная линия Интернет-протокола" + +msgid "Protection Dongle for Savage Quest" +msgstr "Защитный донгл для Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Устройство прохода через последовательный порт" + +msgid "Passthrough Mode" +msgstr "Проходной режим" + +msgid "Host Serial Device" +msgstr "Последовательное устройство хоста" + +msgid "Name of pipe" +msgstr "Название трубы" + +msgid "Data bits" +msgstr "Биты данных" + +msgid "Stop bits" +msgstr "Стоп-биты" + +msgid "Baud Rate of Passthrough" +msgstr "Скорость передачи данных через канал" + +msgid "Named Pipe (Server)" +msgstr "Именованный трубопровод (сервер)" + +msgid "Host Serial Passthrough" +msgstr "Последовательный порт хоста" + +msgid "Eject %s" +msgstr "Извлечь %s" + +msgid "&Unmute" +msgstr "В&ключить звук" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Сильное влияние на производительность" + +msgid "30 Hz (JMP2 = 1)" +msgstr "30 Гц (JMP2 = 1)" + +msgid "60 Hz (JMP2 = 2)" +msgstr "60 Гц (JMP2 = 2)" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 8aeb0f082..687d5491d 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -390,8 +390,11 @@ msgstr "Dynamický prekladač" msgid "Video:" msgstr "Grafika:" -msgid "Voodoo Graphics" -msgstr "Použiť grafický akcelerátor Voodoo" +msgid "Video #2:" +msgstr "Grafika 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Grafický akcelerátor Voodoo 1 alebo 2" msgid "IBM 8514/A Graphics" msgstr "Grafika IBM 8514/A" @@ -684,6 +687,9 @@ msgstr "Počítač \"%hs\" ie je dostupný, pretože chýba obraz jeho pamäte R msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Video adaptér \"%hs\" nie je dostupný, pretože chýba obraz jeho pamäte ROM v zložke \"roms/video\". Konfigurácia sa prepne na iný dostupný adaptér." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Video adaptér 2 \"%hs\" nie je dostupný, pretože chýba obraz jeho pamäte ROM v zložke \"roms/video\". Konfigurácia sa prepne na iný dostupný adaptér." + msgid "Machine" msgstr "Počítač" @@ -762,17 +768,26 @@ msgstr "Neboli nájdené žiadne PCap zariadenia" msgid "Invalid PCap device" msgstr "Neplatné PCap zariadenie" -msgid "Standard 2-button joystick(s)" -msgstr "Štandardný 2tlačidlový joystick" +msgid "2-axis, 2-button joystick(s)" +msgstr "2-osový, 2-tlačidlový joystick" -msgid "Standard 4-button joystick" -msgstr "Štandardný 4tlačidlový joystick" +msgid "2-axis, 4-button joystick" +msgstr "2-osový, 4-tlačidlový joystick" -msgid "Standard 6-button joystick" -msgstr "Štandardný 6tlačidlový joystick" +msgid "2-axis, 6-button joystick" +msgstr "2-osový, 6-tlačidlový joystick" -msgid "Standard 8-button joystick" -msgstr "Štandardný 8tlačidlový joystick" +msgid "2-axis, 8-button joystick" +msgstr "2-osový, 8-tlačidlový joystick" + +msgid "3-axis, 2-button joystick" +msgstr "3-osový, 2-tlačidlový joystick" + +msgid "3-axis, 4-button joystick" +msgstr "3-osový, 4-tlačidlový joystick" + +msgid "4-axis, 4-button joystick" +msgstr "4-osový, 4-tlačidlový joystick" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Naozaj chcete ukončiť 86Box?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Neplatná konfigurácia" 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 je potrebná pre automatický prevod PostScript dokumentov do PDF.\n\nAkékoľvek dokumenty vytlačené cez všeobecnú PostScriptovú tlačiareň budú uložené ako PostScript (.ps) súbory." +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 Lnaugage (.pcl) files." +msgstr "%1 je potrebná pre automatický prevod PCL dokumentov do PDF.\n\nAkékoľvek dokumenty vytlačené cez všeobecnú PCLovú tlačiareň budú uložené ako Printer Command Language (.pcl) súbory." + msgid "Entering fullscreen mode" msgstr "Vstup do režimu celej obrazovky" @@ -999,6 +1020,27 @@ msgstr "Prepísať" msgid "Don't overwrite" msgstr "Neprepisovať" +msgid "Raw image" +msgstr "Surový obraz" + +msgid "HDI image" +msgstr "HDI obraz" + +msgid "HDX image" +msgstr "HDX obraz" + +msgid "Fixed-size VHD" +msgstr "VHD s pevnou veľkosťou" + +msgid "Dynamic-size VHD" +msgstr "VHD s dynamickou veľkosťou" + +msgid "Differencing VHD" +msgstr "Rozdielový VHD" + +msgid "(N/A)" +msgstr "(Žiadne)" + msgid "Raw image (.img)" msgstr "Surový obraz (.img)" @@ -1172,3 +1214,900 @@ msgstr "WinBox už nie je podporovaný" 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 "Vývoj správcu WinBox sa zastavil v roku 2022 z dôvodu nedostatku správcov. Keďže naše úsilie smerujeme k ešte lepšiemu systému 86Box, rozhodli sme sa, že správca WinBox už nebude podporovaný.\n\nProstredníctvom WinBoxu nebudú poskytované žiadne ďalšie aktualizácie a v prípade, že ho budete naďalej používať s novšími verziami programu 86Box, môžete sa stretnúť s nesprávnym správaním. Všetky hlásenia o chybách týkajúce sa správania WinBoxu budú uzavreté ako neplatné.\n\nNa stránke 86box.net nájdete zoznam iných správcov, ktoré môžete používať." + +msgid "Generate" +msgstr "Generovať" + +msgid "Joystick configuration" +msgstr "Konfigurácia joysticku" + +msgid "Device" +msgstr "Zariadenie" + +msgid "%1 (X axis)" +msgstr "%1 (os X)" + +msgid "%1 (Y axis)" +msgstr "%1 (os Y)" + +msgid "MCA devices" +msgstr "Zariadenia MCA" + +msgid "List of MCA devices:" +msgstr "Zoznam zariadení MCA:" + +msgid "Tablet tool" +msgstr "Nástroj pre tablety" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "O Qt" + +msgid "MCA devices..." +msgstr "Zariadenia MCA..." + +msgid "Show non-primary monitors" +msgstr "Zobrazenie iných ako primárnych monitorov" + +msgid "Open screenshots folder..." +msgstr "Otvorte priečinok so snímkami obrazovky..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Použitie režimu roztiahnutia na celú obrazovku pri maximalizácii" + +msgid "Cursor/Puck" +msgstr "Kurzor/Puck" + +msgid "Pen" +msgstr "Pero" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Hostiteľská jednotka CD/DVD (%1:)" + +msgid "&Connected" +msgstr "&Connected" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +msgstr "Neznáma zbernica" + +msgid "Null Driver" +msgstr "Nulový ovládač" + +msgid "NIC %02i (%ls) %ls" +msgstr "NIC %02i (%ls) %ls" + +msgid "Error opening \"%1\": %2" +msgstr "Chyba pri otváraní \"%1\": %2" + +msgid "Error compiling vertex shader in file \"%1\"" +msgstr "Chyba kompilácie vertex shadera v súbore \"%1\"" + +msgid "Error compiling fragment shader in file \"%1\"" +msgstr "Chyba kompilácie fragment shadera v súbore \"%1\"" + +msgid "Error linking shader program in file \"%1\"" +msgstr "Chyba pri prepojení shader programu v súbore \"%1\"" + +msgid "OpenGL 3.0 renderer options" +msgstr "Možnosti vykresľovania OpenGL 3.0" + +msgid "Render behavior" +msgstr "Správanie pri vykresľovaní" + +msgid "Use target framerate:" +msgstr "Použite cieľovú snímkovú frekvenciu:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Nepodarilo sa prepnúť na kontext OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Vyžaduje sa verzia OpenGL 3.0 alebo vyššia. Aktuálna verzia je %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Inicializácia OpenGL zlyhala. Chyba %1." + +msgid "Error initializing OpenGL" +msgstr "Chyba pri inicializácii OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Návrat k softvérovému vykresľovaniu.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Alokácia pamäte pre rozbaľovaciu vyrovnávaciu pamäť zlyhala.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Pri výbere multimediálnych obrazov (CD-ROM, disketa atď.) sa dialógové okno otvorenia spustí v rovnakom adresári ako konfiguračný súbor 86Box. Toto nastavenie bude mať pravdepodobne význam len v systéme MacOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Tento stroj mohol byť premiestnený alebo skopírovaný." + +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 "Aby sa zabezpečila správna funkčnosť siete, 86Box potrebuje vedieť, či bol tento počítač presunutý alebo skopírovaný.\n\nAk si nie ste istí, vyberte možnosť \"Skopíroval som ho." + +msgid "I Moved It" +msgstr "Presunul som ho" + +msgid "I Copied It" +msgstr "Skopíroval som ho" + +msgid "86Box Monitor #" +msgstr "86Box Monitor " + +msgid "No MCA devices." +msgstr "Žiadne zariadenia MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Sieťová karta 1" + +msgid "Network Card #2" +msgstr "Sieťová karta 2" + +msgid "Network Card #3" +msgstr "Sieťová karta 3" + +msgid "Network Card #4" +msgstr "Sieťová karta 4" + +msgid "Mode" +msgstr "Režim" + +msgid "Interface" +msgstr "Rozhranie" + +msgid "Adapter" +msgstr "Adaptér" + +msgid "VDE Socket" +msgstr "Zásuvka VDE" + +msgid "86Box Unit Tester" +msgstr "86Box Unit Tester" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Kľúčová karta Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Priechod sériového portu 1" + +msgid "Serial port passthrough 2" +msgstr "Priechod sériového portu 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Zbernicová myš Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Zbernicová myš Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Zbernicová myš Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Sériová myš Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Sériová myš Logitech" + +msgid "PS/2 Mouse" +msgstr "Myš PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (sériová)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Štandardný modem kompatibilný s Hayesom" + +msgid "Roland MT-32 Emulation" +msgstr "Emulácia Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulácia Roland MT-32 (nová)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulácia Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulácia Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Dcérska doska OPL4-ML" + +msgid "System MIDI" +msgstr "Systém MIDI" + +msgid "MIDI Input Device" +msgstr "Vstupné zariadenie MIDI" + +msgid "BIOS Address" +msgstr "Adresa BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Povolenie zápisu do pamäte ROM s rozšírením BIOS" + +msgid "Address" +msgstr "Adresa" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revízia systému BIOS" + +msgid "Translate 26 -> 17" +msgstr "Preložiť 26 -> 17" + +msgid "Language" +msgstr "Jazyk" + +msgid "Enable backlight" +msgstr "Povolenie podsvietenia" + +msgid "Invert colors" +msgstr "Invertovanie farieb" + +msgid "BIOS size" +msgstr "Veľkosť systému BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapa C0000-C7FFF ako UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapa C8000-CFFFF ako UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapa D0000-D7FFF ako UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapa D8000-DFFFF ako UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapa E0000-E7FFF ako UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapa E8000-EFFFF ako UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Prepojka JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Výstupné zariadenie MIDI" + +msgid "MIDI Real time" +msgstr "MIDI v reálnom čase" + +msgid "MIDI Thru" +msgstr "Priechodnosť vstupu MIDI" + +msgid "MIDI Clockout" +msgstr "Výstup hodín MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Zosilnenie výstupu" + +msgid "Chorus" +msgstr "Zbor" + +msgid "Chorus Voices" +msgstr "Hlasy zboru" + +msgid "Chorus Level" +msgstr "Úroveň zboru" + +msgid "Chorus Speed" +msgstr "Rýchlosť zboru" + +msgid "Chorus Depth" +msgstr "Hĺbka zboru" + +msgid "Chorus Waveform" +msgstr "Priebeh zboru" + +msgid "Reverb" +msgstr "Dozvuk" + +msgid "Reverb Room Size" +msgstr "Veľkosť dozvukovej miestnosti" + +msgid "Reverb Damping" +msgstr "Tlmenie dozvuku" + +msgid "Reverb Width" +msgstr "Šírka dozvuku" + +msgid "Reverb Level" +msgstr "Úroveň dozvuku" + +msgid "Interpolation Method" +msgstr "Metóda interpolácie" + +msgid "Reverb Output Gain" +msgstr "Zosilnenie výstupu dozvuku" + +msgid "Reversed stereo" +msgstr "Obrátené stereo" + +msgid "Nice ramp" +msgstr "Pekná rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Tlačidlá" + +msgid "Serial Port" +msgstr "Sériový port" + +msgid "RTS toggle" +msgstr "Prepínač RTS" + +msgid "Revision" +msgstr "Revízia" + +msgid "Controller" +msgstr "Ovládač" + +msgid "Show Crosshair" +msgstr "Zobrazenie kríža" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Adresa MAC" + +msgid "MAC Address OUI" +msgstr "Adresa MAC OUI" + +msgid "Enable BIOS" +msgstr "Povolenie systému BIOS" + +msgid "Baud Rate" +msgstr "Prenosová rýchlosť" + +msgid "TCP/IP listening port" +msgstr "Počúvajúci port TCP/IP" + +msgid "Phonebook File" +msgstr "Súbor telefónneho zoznamu" + +msgid "Telnet emulation" +msgstr "Emulácia siete Telnet" + +msgid "RAM Address" +msgstr "Adresa pamäte RAM" + +msgid "RAM size" +msgstr "Veľkosť pamäte RAM" + +msgid "Initial RAM size" +msgstr "Počiatočná veľkosť pamäte RAM" + +msgid "Serial Number" +msgstr "Sériové číslo" + +msgid "Host ID" +msgstr "ID hostiteľa" + +msgid "FDC Address" +msgstr "Adresa FDC" + +msgid "MPU-401 Address" +msgstr "Adresa MPU-401" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "Príjem vstupu MIDI" + +msgid "Low DMA" +msgstr "Nízka hodnota DMA" + +msgid "Enable Game port" +msgstr "Povolenie herného portu" + +msgid "Surround module" +msgstr "Surround modul" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Zvýšenie prerušenia CODEC pri nastavení CODEC (potrebné v niektorých ovládačoch)" + +msgid "SB Address" +msgstr "Adresa SB" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "Povolenie OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Príjem vstupu MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "SB low DMA" + +msgid "6CH variant (6-channel)" +msgstr "Variant 6CH (6-kanálový)" + +msgid "Enable CMS" +msgstr "Povolenie CMS" + +msgid "Mixer" +msgstr "Mixér" + +msgid "High DMA" +msgstr "Vysoký DMA" + +msgid "Control PC speaker" +msgstr "Ovládací reproduktor PC" + +msgid "Memory size" +msgstr "Veľkosť pamäte" + +msgid "EMU8000 Address" +msgstr "Adresa EMU8000" + +msgid "IDE Controller" +msgstr "Radič IDE" + +msgid "Codec" +msgstr "Kodek" + +msgid "GUS type" +msgstr "Typ GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Povolenie príkazu 0x04 \"Ukončiť 86Box\"" + +msgid "Display type" +msgstr "Typ displeja" + +msgid "Composite type" +msgstr "Kompozitný typ" + +msgid "RGB type" +msgstr "Typ RGB" + +msgid "Line doubling type" +msgstr "Typ zdvojenia linky" + +msgid "Snow emulation" +msgstr "Emulácia snehu" + +msgid "Monitor type" +msgstr "Typ monitora" + +msgid "Character set" +msgstr "Súbor znakov" + +msgid "XGA type" +msgstr "Typ XGA" + +msgid "Instance" +msgstr "Inštancia" + +msgid "MMIO Address" +msgstr "Adresa MMIO" + +msgid "RAMDAC type" +msgstr "Typ RAMDAC" + +msgid "Blend" +msgstr "Zmes" + +msgid "Bilinear filtering" +msgstr "Bilineárne filtrovanie" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "Povolenie NMI pre emuláciu CGA" + +msgid "Voodoo type" +msgstr "Typ Voodoo" + +msgid "Framebuffer memory size" +msgstr "Veľkosť pamäte Framebuffer" + +msgid "Texture memory size" +msgstr "Veľkosť pamäte textúr" + +msgid "Dither subtraction" +msgstr "Odčítanie ditheru" + +msgid "Screen Filter" +msgstr "Filter obrazovky" + +msgid "Render threads" +msgstr "Vlákna vykresľovania" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Počiatočná adresa" + +msgid "Contiguous Size" +msgstr "Súvislá veľkosť" + +msgid "I/O Width" +msgstr "Šírka I/O" + +msgid "Transfer Speed" +msgstr "Rýchlosť prenosu" + +msgid "EMS mode" +msgstr "Režim EMS" + +msgid "Address for > 2 MB" +msgstr "Adresa pre > 2 MB" + +msgid "Frame Address" +msgstr "Adresa rámu" + +msgid "USA" +msgstr "Spojené štáty" + +msgid "Danish" +msgstr "Dánsky" + +msgid "Always at selected speed" +msgstr "Vždy pri zvolenej rýchlosti" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Nastavenie BIOS + klávesové skratky (vypnuté počas POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB od F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB od E0000 (adresa MSB invertovaná, najprv posledných 64 kB)" + +msgid "Sine" +msgstr "Sinusový" + +msgid "Triangle" +msgstr "Trojuholníkový" + +msgid "Linear" +msgstr "Lineárna" + +msgid "4th Order" +msgstr "4. rádu" + +msgid "7th Order" +msgstr "7. rádu" + +msgid "Non-timed (original)" +msgstr "Bez časovača (originál)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (bez prepojky na JMP2)" + +msgid "Two" +msgstr "Dve stránky" + +msgid "Three" +msgstr "Tri" + +msgid "Wheel" +msgstr "Koleso" + +msgid "Five + Wheel" +msgstr "Päť + koleso" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 sériová / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) sériová" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Zakázať BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klasické" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Kompozitný" + +msgid "Old" +msgstr "Staré" + +msgid "New" +msgstr "Nový" + +msgid "Color (generic)" +msgstr "Farebný (všeobecný)" + +msgid "Green Monochrome" +msgstr "Zelený jednofarebný" + +msgid "Amber Monochrome" +msgstr "Oranžový jednofarebný" + +msgid "Gray Monochrome" +msgstr "Šedý jednofarebný" + +msgid "Color (no brown)" +msgstr "Farebný (bez hnedej)" + +msgid "Color (IBM 5153)" +msgstr "Farebný (IBM 5153)" + +msgid "Simple doubling" +msgstr "Jednoduché zdvojenie" + +msgid "sRGB interpolation" +msgstr "Interpolácia sRGB" + +msgid "Linear interpolation" +msgstr "Lineárna interpolácia" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Jednofarebný (5151/MDA) (biely)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Jednofarebný (5151/MDA) (zelený)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Jednofarebný (5151/MDA) (oranžový)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Farebný 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Farebný 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Rozšírený farebný - normálny režim (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Rozšírený farebný - rozšírený režim (5154/ECD)" + +msgid "Green" +msgstr "Zelený" + +msgid "Amber" +msgstr "Oranžový" + +msgid "Gray" +msgstr "Šedý" + +msgid "Color" +msgstr "Farebný" + +msgid "U.S. English" +msgstr "Americká angličtina" + +msgid "Scandinavian" +msgstr "Škandinávske" + +msgid "Other languages" +msgstr "Ostatné jazyky" + +msgid "Bochs latest" +msgstr "Bochs najnovšie" + +msgid "Mono Non-Interlaced" +msgstr "Mono bez prelínania" + +msgid "Color Interlaced" +msgstr "Farebné prelínanie" + +msgid "Color Non-Interlaced" +msgstr "Farba bez prelínania" + +msgid "3Dfx Voodoo Graphics" +msgstr "Grafický akcelerátor 3dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 zariadenia TMU)" + +msgid "8-bit" +msgstr "8-bitové" + +msgid "16-bit" +msgstr "16-bitové" + +msgid "Standard (150ns)" +msgstr "Štandardné (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Vysoká rýchlosť (120ns)" + +msgid "Enabled" +msgstr "Povolené" + +msgid "Standard" +msgstr "Štandard" + +msgid "High-Speed" +msgstr "Vysokorýchlostný" + +msgid "Stereo LPT DAC" +msgstr "Stereofónny prevodník LPT DAC" + +msgid "Generic Text Printer" +msgstr "Generická textová tlačiareň" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Generická ihličková tlačiareň ESC/P" + +msgid "Generic PostScript Printer" +msgstr "Generická tlačiareň PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Generická tlačiareň PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Internetový protokol paralelnej linky" + +msgid "Protection Dongle for Savage Quest" +msgstr "Ochranný kľúč pre Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Zariadenie priechodu sériového portu" + +msgid "Passthrough Mode" +msgstr "Režim priechodu" + +msgid "Host Serial Device" +msgstr "Hostiteľské sériové zariadenie" + +msgid "Name of pipe" +msgstr "Názov potrubia" + +msgid "Data bits" +msgstr "Dátové bity" + +msgid "Stop bits" +msgstr "Stop bity" + +msgid "Baud Rate of Passthrough" +msgstr "Prenosová rýchlosť priechodu" + +msgid "Named Pipe (Server)" +msgstr "Pomenované potrubie (server)" + +msgid "Host Serial Passthrough" +msgstr "Priechod sériového portu hostiteľa" + +msgid "Eject %s" +msgstr "Vystrihnúť %s" + +msgid "&Unmute" +msgstr "&Roztíšiť" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Vysoký vplyv na výkon" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 2a4b68e46..fb6fb40a2 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -235,7 +235,7 @@ msgid "&Fast forward to the end" msgstr "Preskoči na konec" msgid "E&ject" -msgstr "Izvrzi" +msgstr "I&zvrzi" msgid "&Image..." msgstr "Slika..." @@ -390,14 +390,17 @@ msgstr "Dinamični prevajalnik" msgid "Video:" msgstr "Video:" -msgid "Voodoo Graphics" -msgstr "Voodoo grafika" +msgid "Video #2:" +msgstr "Video 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Grafika Voodoo 1 ali 2" msgid "IBM 8514/A Graphics" -msgstr "IBM 8514/A grafika" +msgstr "Grafika IBM 8514/A" msgid "XGA Graphics" -msgstr "XGA grafika" +msgstr "Grafika XGA" msgid "Mouse:" msgstr "Miška:" @@ -607,7 +610,7 @@ msgid "ISA RTC:" msgstr "Ura v realnem času ISA:" msgid "ISA Memory Expansion" -msgstr "Razširitev spomina ISA" +msgstr "Razširitev pomnilnika ISA" msgid "Card 1:" msgstr "Kartica 1:" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Kritična napaka" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - ZAUSTAVLJEN" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Pritisnite Ctrl+Alt+PgDn za povratek iz celozaslonskega načina." @@ -684,6 +687,9 @@ msgstr "Sistem \"%hs\" ni na voljo zaradi manjkajočih ROM-ov v mapi roms/machin msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Grafična kartica \"%hs\" ni na voljo zaradi manjkajočih ROM-ov v mapi roms/video. Preklapljam na drugo grafično kartico, ki je na voljo.." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Grafična kartica 2 \"%hs\" ni na voljo zaradi manjkajočih ROM-ov v mapi roms/video. Preklapljam na drugo grafično kartico, ki je na voljo.." + msgid "Machine" msgstr "Sistem" @@ -745,7 +751,7 @@ msgid "KB" msgstr "KB" msgid "Could not initialize the video renderer." -msgstr "Ne morem inicializirati pogona upodabljanja." +msgstr "Ne morem inicializirati sistema za upodabljanje." msgid "Default" msgstr "Privzeto" @@ -762,17 +768,26 @@ msgstr "Nobena naprava PCap ni bila najdena" msgid "Invalid PCap device" msgstr "Neveljavna naprava PCap" -msgid "Standard 2-button joystick(s)" -msgstr "Standardna krmilna palica z 2 gumboma" +msgid "2-axis, 2-button joystick(s)" +msgstr "Igralna palica z 2 osema, 2 gumboma" -msgid "Standard 4-button joystick" -msgstr "Standardna krmilna palica s 4 gumbi" +msgid "2-axis, 4-button joystick" +msgstr "Igralna palica z 2 osema, 4 gumbi" -msgid "Standard 6-button joystick" -msgstr "Standardna krmilna palica s 6 gumbi" +msgid "2-axis, 6-button joystick" +msgstr "Igralna palica z 2 osema, 6 gumbi" -msgid "Standard 8-button joystick" -msgstr "Standardna krmilna palica z 8 gumbi" +msgid "2-axis, 8-button joystick" +msgstr "Igralna palica z 2 osema, 8 gumbi" + +msgid "3-axis, 2-button joystick" +msgstr "Igralna palica s 3 osmi, 2 gumboma" + +msgid "3-axis, 4-button joystick" +msgstr "Igralna palica z 3 osmi, 4 gumbi" + +msgid "4-axis, 4-button joystick" +msgstr "Igralna palica z 4 osmi, 4 gumbi" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "Ste prepričani, da želite zapreti 86Box?" msgid "Unable to initialize Ghostscript" msgstr "Ne morem inicializirati Ghostscript" +msgid "Unable to initialize GhostPCL" +msgstr "Ne morem inicializirati GhostPCL" + msgid "MO %i (%ls): %ls" msgstr "MO %i (%ls): %ls" @@ -853,7 +871,10 @@ msgid "Invalid configuration" msgstr "Neveljavna konfiguracija" 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 je potreben za samodejno pretvorbo PostScript datotek v PDF.\n\nVsi dokumenti, poslani generičnemu PostScript tiskalniku bodo shranjeni kot PostScript (.ps) datoteke." +msgstr "%1 je potreben za samodejno pretvorbo datotek PostScript v PDF.\n\nVsi dokumenti, poslani generičnemu tiskalniku PostScript bodo shranjeni kot datoteke PostScript (.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 Lnaugage (.pcl) files." +msgstr "%1 je potreben za samodejno pretvorbo datotek PCL v PDF.\n\nVsi dokumenti, poslani generičnemu tiskalniku PCL bodo shranjeni kot datoteke Printer Command Language (.pcl)." msgid "Entering fullscreen mode" msgstr "Preklapljam v celozaslonski način" @@ -999,6 +1020,27 @@ msgstr "Prepiši" msgid "Don't overwrite" msgstr "Ne prepiši" +msgid "Raw image" +msgstr "Surova slika" + +msgid "HDI image" +msgstr "Slika HDI" + +msgid "HDX image" +msgstr "Slika HDX" + +msgid "Fixed-size VHD" +msgstr "VHD fiksne velikosti" + +msgid "Dynamic-size VHD" +msgstr "Dinamičen VHD" + +msgid "Differencing VHD" +msgstr "Diferencialni VHD" + +msgid "(N/A)" +msgstr "(Ni na voljo)" + msgid "Raw image (.img)" msgstr "Surova slika (.img)" @@ -1172,3 +1214,900 @@ msgstr "WinBox ni več podprt" 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 "Razvoj upravitelja WinBox se je leta 2022 ustavil zaradi pomanjkanja vzdrževalcev. Ker svoja prizadevanja usmerjamo v še boljše delovanje programa 86Box, smo se odločili, da programa WinBox kot upravitelja ne bomo več podpirali.\n\nWinBox ne bo več zagotavljal posodobitev, če ga boste še naprej uporabljali z novejšimi različicami programa 86Box, pa lahko naletite na nepravilno obnašanje. Vsa poročila o napakah, povezana z obnašanjem programa WinBox, bodo zaprta kot neveljavna.\n\nZa seznam drugih upraviteljev, ki jih lahko uporabite, obiščite spletno stran 86box.net." + +msgid "Generate" +msgstr "Ustvarjanje" + +msgid "Joystick configuration" +msgstr "Konfiguracija igralne palice" + +msgid "Device" +msgstr "Naprava" + +msgid "%1 (X axis)" +msgstr "%1 (os X)" + +msgid "%1 (Y axis)" +msgstr "%1 (os Y)" + +msgid "MCA devices" +msgstr "Naprave MCA" + +msgid "List of MCA devices:" +msgstr "Seznam naprav MCA:" + +msgid "Tablet tool" +msgstr "Orodje za tablico" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "O programu Qt" + +msgid "MCA devices..." +msgstr "Naprave MCA..." + +msgid "Show non-primary monitors" +msgstr "Prikaži neprimarne monitorje" + +msgid "Open screenshots folder..." +msgstr "Odprite mapo s posnetki zaslona..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Uporabi način celozaslonskega raztezanja v povečanem stanju" + +msgid "Cursor/Puck" +msgstr "Kazalec/ključ" + +msgid "Pen" +msgstr "Pisalo" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Pogon CD/DVD gostitelja (%1:)" + +msgid "&Connected" +msgstr "&Povezan" + +msgid "Clear image history" +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)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Obnašanje pri upodabljanju" + +msgid "Use target framerate:" +msgstr "Uporabi ciljno št. sličic na sekundo:" + +msgid " fps" +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" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Ni bilo mogoče preklopiti na kontekst OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Zahteva se različica OpenGL 3.0 ali novejša. Trenutna različica je %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Inicializacija OpenGL ni uspela. Napaka %1." + +msgid "Error initializing OpenGL" +msgstr "Napaka pri inicializaciji OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Vrnitev k programskemu upodabljanju.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Dodelitev pomnilnika za razpakirni predpomnilnik ni uspela.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Pri izbiri medijskih slik (CD-ROM, disketa itd.) se bo odprto pogovorno okno začelo v istem imeniku kot konfiguracijska datoteka 86Box. Ta nastavitev bo verjetno imela pomen le v operacijskem sistemu MacOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Ta naprava je bila morda premeščena ali kopirana." + +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 "Da bi zagotovili pravilno delovanje omrežja, mora 86Box vedeti, ali je bil ta stroj prestavljen ali kopiran.\n\nČe niste prepričani, izberite \"Kopiral sem jo\"." + +msgid "I Moved It" +msgstr "Premaknil sem jo" + +msgid "I Copied It" +msgstr "Kopiral sem jo" + +msgid "86Box Monitor #" +msgstr "86Box Monitor " + +msgid "No MCA devices." +msgstr "Ni naprav MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Omrežna kartica 1" + +msgid "Network Card #2" +msgstr "Omrežna kartica 2" + +msgid "Network Card #3" +msgstr "Omrežna kartica 3" + +msgid "Network Card #4" +msgstr "Omrežna kartica 4" + +msgid "Mode" +msgstr "Način" + +msgid "Interface" +msgstr "Vmesnik" + +msgid "Adapter" +msgstr "Adapter" + +msgid "VDE Socket" +msgstr "Vtičnica VDE" + +msgid "86Box Unit Tester" +msgstr "Tester enote 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x Key Card" + +msgid "Serial port passthrough 1" +msgstr "Prepust za serijska vrata 1" + +msgid "Serial port passthrough 2" +msgstr "Prepust za serijska vrata 2" + +msgid "Serial port passthrough 3" +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..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Miška na vodilu Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Miška na vodilu Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Serijska miška Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Serijska miška Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Serijska miška Logitech" + +msgid "PS/2 Mouse" +msgstr "Miška PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (serijska)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Standardni modem v skladu s standardom Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Emulacija Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulacija Roland MT-32 (novo)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulacija Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulacija Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Hčerinska plošča OPL4-ML" + +msgid "System MIDI" +msgstr "Sistem MIDI" + +msgid "MIDI Input Device" +msgstr "Vhodna naprava MIDI" + +msgid "BIOS Address" +msgstr "Naslov BIOS-a" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Omogočanje razširitve BIOS-a ROM piše" + +msgid "Address" +msgstr "Naslov" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Revizija BIOS-a" + +msgid "Translate 26 -> 17" +msgstr "Prevesti 26 -> 17" + +msgid "Language" +msgstr "Jezik" + +msgid "Enable backlight" +msgstr "Omogoči osvetlitev ozadja" + +msgid "Invert colors" +msgstr "Invertiraj barve" + +msgid "BIOS size" +msgstr "Velikost BIOS-a" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Zemljevid C0000-C7FFF kot UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Zemljevid C8000-CFFFF kot UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Zemljevid D0000-D7FFF kot UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Zemljevid D8000-DFFFF kot UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Zemljevid E0000-E7FFF kot UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Zemljevid E8000-EFFFF kot UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 Jumper (JIM)" + +msgid "MIDI Output Device" +msgstr "Izhodna naprava MIDI" + +msgid "MIDI Real time" +msgstr "MIDI v realnem času" + +msgid "MIDI Thru" +msgstr "Prepust vhoda MIDI" + +msgid "MIDI Clockout" +msgstr "Izhod ure MIDI" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Ojačanje izhoda" + +msgid "Chorus" +msgstr "Zbor" + +msgid "Chorus Voices" +msgstr "Glasovi zbora" + +msgid "Chorus Level" +msgstr "Raven zbora" + +msgid "Chorus Speed" +msgstr "Hitrost zbora" + +msgid "Chorus Depth" +msgstr "Globina zbora" + +msgid "Chorus Waveform" +msgstr "Valovna oblika zbora" + +msgid "Reverb" +msgstr "Odmev" + +msgid "Reverb Room Size" +msgstr "Velikost prostora za odmev" + +msgid "Reverb Damping" +msgstr "Dušenje odmeva" + +msgid "Reverb Width" +msgstr "Širina odmeva" + +msgid "Reverb Level" +msgstr "Raven odmeva" + +msgid "Interpolation Method" +msgstr "Metoda interpolacije" + +msgid "Reverb Output Gain" +msgstr "Ojačanje izhoda odmeva" + +msgid "Reversed stereo" +msgstr "Obrnjeni stereo" + +msgid "Nice ramp" +msgstr "Lepa rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Gumbi" + +msgid "Serial Port" +msgstr "Serijska vrata" + +msgid "RTS toggle" +msgstr "Preklapljanje RTS" + +msgid "Revision" +msgstr "Revizija" + +msgid "Controller" +msgstr "Krmilnik" + +msgid "Show Crosshair" +msgstr "Prikaži križišče" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Naslov MAC" + +msgid "MAC Address OUI" +msgstr "OUI naslova MAC" + +msgid "Enable BIOS" +msgstr "Omogoči BIOS" + +msgid "Baud Rate" +msgstr "Hitrost Baud" + +msgid "TCP/IP listening port" +msgstr "Vrata TCP/IP za poslušanje" + +msgid "Phonebook File" +msgstr "Datoteka s telefonskim imenikom" + +msgid "Telnet emulation" +msgstr "Emulacija Telneta" + +msgid "RAM Address" +msgstr "Naslov RAM" + +msgid "RAM size" +msgstr "Velikost pomnilnika RAM" + +msgid "Initial RAM size" +msgstr "Začetna velikost pomnilnika RAM" + +msgid "Serial Number" +msgstr "Serijska številka" + +msgid "Host ID" +msgstr "ID gostitelja" + +msgid "FDC Address" +msgstr "Naslov FDC" + +msgid "MPU-401 Address" +msgstr "MPU-401 Naslov" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "Sprejemaj vhod MIDI" + +msgid "Low DMA" +msgstr "Nizki DMA" + +msgid "Enable Game port" +msgstr "Omogočanje igralnih vrat" + +msgid "Surround module" +msgstr "Prostorski modul" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Dvigni prekinitev za CODEC ob nastavitvi CODEC-a (to potrebujejo nekateri gonilniki)" + +msgid "SB Address" +msgstr "Naslov SB" + +msgid "WSS IRQ" +msgstr "IRQ WSS" + +msgid "WSS DMA" +msgstr "DMA WSS" + +msgid "Enable OPL" +msgstr "Omogoči OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Sprejemaj vhod MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "Nizki DMA SB" + +msgid "6CH variant (6-channel)" +msgstr "Različica 6CH (6-kanalni)" + +msgid "Enable CMS" +msgstr "Omogoči CMS" + +msgid "Mixer" +msgstr "Mešalnik" + +msgid "High DMA" +msgstr "Visoki DMA" + +msgid "Control PC speaker" +msgstr "Nadzoruj zvočnik računalnika" + +msgid "Memory size" +msgstr "Velikost pomnilnika" + +msgid "EMU8000 Address" +msgstr "Naslov EMU8000" + +msgid "IDE Controller" +msgstr "Krmilnik IDE" + +msgid "Codec" +msgstr "Kodek" + +msgid "GUS type" +msgstr "Tip GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Omogoči ukaz 0x04 \"Zapusti 86Box\"" + +msgid "Display type" +msgstr "Vrsta zaslona" + +msgid "Composite type" +msgstr "Vsta kompozitnega zaslona" + +msgid "RGB type" +msgstr "Vrsta RGB zaslona" + +msgid "Line doubling type" +msgstr "Vrsta podvojitve črt" + +msgid "Snow emulation" +msgstr "Emulacija snega" + +msgid "Monitor type" +msgstr "Vrsta monitorja" + +msgid "Character set" +msgstr "Nabor znakov" + +msgid "XGA type" +msgstr "Tip kartice XGA" + +msgid "Instance" +msgstr "Primer" + +msgid "MMIO Address" +msgstr "Naslov MMIO" + +msgid "RAMDAC type" +msgstr "Vrsta čipa RAMDAC" + +msgid "Blend" +msgstr "Mešanica" + +msgid "Bilinear filtering" +msgstr "Bilinearno filtriranje" + +msgid "Dithering" +msgstr "Barvno stresanje" + +msgid "Enable NMI for CGA emulation" +msgstr "Omogočite NMI za emulacijo CGA" + +msgid "Voodoo type" +msgstr "Tip kartice Voodoo" + +msgid "Framebuffer memory size" +msgstr "Velikost pomnilnika predpomnilnika okvirja" + +msgid "Texture memory size" +msgstr "Velikost pomnilnika tekstur" + +msgid "Dither subtraction" +msgstr "Odštevanje barvnega stresanja" + +msgid "Screen Filter" +msgstr "Filter zaslona" + +msgid "Render threads" +msgstr "Nitke za upodabljanje" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Začetni naslov" + +msgid "Contiguous Size" +msgstr "Pripadajoča velikost" + +msgid "I/O Width" +msgstr "Širina V/I" + +msgid "Transfer Speed" +msgstr "Hitrost prenosa" + +msgid "EMS mode" +msgstr "Način EMS" + +msgid "Address for > 2 MB" +msgstr "Naslov za > 2 MB" + +msgid "Frame Address" +msgstr "Naslov okvirja" + +msgid "USA" +msgstr "ZDA" + +msgid "Danish" +msgstr "Danski" + +msgid "Always at selected speed" +msgstr "Vedno pri izbrani hitrosti" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Nastavitev BIOS-a + Vroče tipke (izklopljeno med POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB od F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB od E0000 (MSB naslova invertiran, najprej zadnjih 64 kB)" + +msgid "Sine" +msgstr "Sinusna" + +msgid "Triangle" +msgstr "Trikotna" + +msgid "Linear" +msgstr "Linearna" + +msgid "4th Order" +msgstr "4. reda" + +msgid "7th Order" +msgstr "7. reda" + +msgid "Non-timed (original)" +msgstr "Brez časovnika (izvirnik)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (brez mostička na JMP2)" + +msgid "Two" +msgstr "Dva" + +msgid "Three" +msgstr "Tri" + +msgid "Wheel" +msgstr "Kolesa" + +msgid "Five + Wheel" +msgstr "Pet + kolo" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 serijska / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) serijska" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "Onemogoči BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klasični" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Kompozitni" + +msgid "Old" +msgstr "Stari" + +msgid "New" +msgstr "Novi" + +msgid "Color (generic)" +msgstr "Barvni (generični)" + +msgid "Green Monochrome" +msgstr "Zeleni enobvarni" + +msgid "Amber Monochrome" +msgstr "Jantarni enobarvni" + +msgid "Gray Monochrome" +msgstr "Sivi enobarvni" + +msgid "Color (no brown)" +msgstr "Barvni (brez rjave)" + +msgid "Color (IBM 5153)" +msgstr "Barvni (IBM 5153)" + +msgid "Simple doubling" +msgstr "Enostavno podvajanje" + +msgid "sRGB interpolation" +msgstr "Interpolacija sRGB" + +msgid "Linear interpolation" +msgstr "Linearna interpolacija" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Enobarvni (5151/MDA) (beli)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Enobarvni (5151/MDA) (zeleni)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Enobarvni (5151/MDA) (jantarni)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Barvni 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Barvni 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Izboljšani barvni - običajni način (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Izboljšani barvni - Izboljšani način (5154/ECD)" + +msgid "Green" +msgstr "Zeleni" + +msgid "Amber" +msgstr "Jantarni" + +msgid "Gray" +msgstr "Sivi" + +msgid "Color" +msgstr "Barvni" + +msgid "U.S. English" +msgstr "Ameriška angleščina" + +msgid "Scandinavian" +msgstr "Skandinavščina" + +msgid "Other languages" +msgstr "Drugi jeziki" + +msgid "Bochs latest" +msgstr "Bochs najnovejše" + +msgid "Mono Non-Interlaced" +msgstr "Enobarvni brez prepletanja" + +msgid "Color Interlaced" +msgstr "Barvni s prepletanjem" + +msgid "Color Non-Interlaced" +msgstr "Barvni brez prepletanja" + +msgid "3Dfx Voodoo Graphics" +msgstr "3Dfx Voodoo Graphics" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 enoti TMU)" + +msgid "8-bit" +msgstr "8-bitni" + +msgid "16-bit" +msgstr "16-bitni" + +msgid "Standard (150ns)" +msgstr "Standardna (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Visoka hitrost (120ns)" + +msgid "Enabled" +msgstr "Omogočeno" + +msgid "Standard" +msgstr "Standardni" + +msgid "High-Speed" +msgstr "Visoke hitrosti" + +msgid "Stereo LPT DAC" +msgstr "Stereo DAC LPT" + +msgid "Generic Text Printer" +msgstr "Generični besedilni tiskalnik" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Generični matrični ESC/P" + +msgid "Generic PostScript Printer" +msgstr "Generični tiskalnik PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Generični tiskalnik PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Internetni protokol za paralelno linijo" + +msgid "Protection Dongle for Savage Quest" +msgstr "Zaščitni ključek za Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Naprava za prepust serijskih vrat" + +msgid "Passthrough Mode" +msgstr "Način prepusta" + +msgid "Host Serial Device" +msgstr "Gostiteljska serijska naprava" + +msgid "Name of pipe" +msgstr "Ime cevi" + +msgid "Data bits" +msgstr "Podatkovni biti" + +msgid "Stop bits" +msgstr "Stop biti" + +msgid "Baud Rate of Passthrough" +msgstr "Baudna hitrost prepusta" + +msgid "Named Pipe (Server)" +msgstr "Poimenovana cev (Strežnik)" + +msgid "Host Serial Passthrough" +msgstr "Prepustno serijskih vrat gostitelja" + +msgid "Eject %s" +msgstr "Izvrzi %s" + +msgid "&Unmute" +msgstr "&Vklopi zvok" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Visok učinek na hitrost delovanja" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index ada5ff87f..885ee7a80 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -157,7 +157,7 @@ msgid "&White monitor" msgstr "&Beyaz renk monitör" msgid "Grayscale &conversion type" -msgstr "&Gri tonlama dönüştürme tipi" +msgstr "&Gri tonlama dönüştürme türü" msgid "BT&601 (NTSC/PAL)" msgstr "BT&601 (NTSC/PAL)" @@ -390,8 +390,11 @@ msgstr "Dinamik Derleyici" msgid "Video:" msgstr "Ekran kartı:" -msgid "Voodoo Graphics" -msgstr "Voodoo Grafikleri" +msgid "Video #2:" +msgstr "Ekran kartı 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 veya 2 Grafikleri" msgid "IBM 8514/A Graphics" msgstr "IBM 8514/A Grafikleri" @@ -451,7 +454,7 @@ msgid "YMFM (faster)" msgstr "YMFM (daha hızlı)" msgid "Network type:" -msgstr "Ağ tipi:" +msgstr "Ağ türü:" msgid "PCap device:" msgstr "PCap cihazı:" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Kritik hata" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - DURAKLATILMIŞ" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Pencere moduna geri dönmek için Ctrl+Alt+PgDn tuşlarına basın." @@ -684,6 +687,9 @@ msgstr "\"%hs\" makinesi roms/machines klasöründe mevcut olmayan ROM imajı y msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "\"%hs\" ekran kartı roms/video klasöründe mevcut olmayan ROM imajı yüzünden mevcut değil. Mevcut olan bir ekran kartına geçiş yapılıyor." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "\"%hs\" ekran 2 kartı roms/video klasöründe mevcut olmayan ROM imajı yüzünden mevcut değil. Mevcut olan bir ekran kartına geçiş yapılıyor." + msgid "Machine" msgstr "Makine" @@ -762,17 +768,26 @@ msgstr "Herhangi bir PCap cihazı bulunamadı" msgid "Invalid PCap device" msgstr "Geçersiz PCap cihazı" -msgid "Standard 2-button joystick(s)" -msgstr "Standart 2-button oyun kolları" +msgid "2-axis, 2-button joystick(s)" +msgstr "2 eksenli, 2 düğmeli oyun kolları" -msgid "Standard 4-button joystick" -msgstr "Standart 4-button oyun kolu" +msgid "2-axis, 4-button joystick" +msgstr "2 eksenli, 4 düğmeli oyun kolu" -msgid "Standard 6-button joystick" -msgstr "Standart 6-button oyun kolu" +msgid "2-axis, 6-button joystick" +msgstr "2 eksenli, 6 düğmeli oyun kolu" -msgid "Standard 8-button joystick" -msgstr "Standart 8-button oyun kolu" +msgid "2-axis, 8-button joystick" +msgstr "2 eksenli, 8 düğmeli oyun kolu" + +msgid "3-axis, 2-button joystick" +msgstr "3 eksenli, 2 düğmeli oyun kollu" + +msgid "3-axis, 4-button joystick" +msgstr "3 eksenli, 4 düğmeli oyun kolu" + +msgid "4-axis, 4-button joystick" +msgstr "4 eksenli, 4 düğmeli oyun kolu" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "86Box'tan çıkmak istediğinize emin misiniz?" msgid "Unable to initialize Ghostscript" 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" @@ -855,6 +873,9 @@ msgstr "Geçersiz konfigürasyon" 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 PostScript dosyalarının otomatik olarak PDF dosyalarına çevirilmesi için gereklidir.\n\nGenel PostScript yazıcısına gönderilen tüm dökümanlar PostScript (.ps) dosyaları olarak kaydedilecektir." +msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as Printer Command Language (.pcl) files." +msgstr "%1 PCL dosyalarının otomatik olarak PDF dosyalarına çevirilmesi için gereklidir.\n\nGenel PCL yazıcısına gönderilen tüm dökümanlar Printer Command Language (.pcl) dosyaları olarak kaydedilecektir." + msgid "Entering fullscreen mode" msgstr "Tam ekran moduna geçiliyor" @@ -907,10 +928,10 @@ msgid "Cartridge images" msgstr "Kartuş imajları" msgid "Error initializing renderer" -msgstr "Oluşturucu başlatılırken hata oluştu" +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) görüntüleyici başlatılamadı. Başka bir görüntüleyici kullanın." +msgstr "OpenGL (3.0 Core) işleyici başlatılamadı. Başka bir görüntüleyici kullanın." msgid "Resume execution" msgstr "Yürütmeye devam et" @@ -999,6 +1020,27 @@ msgstr "Üzerine yaz" msgid "Don't overwrite" msgstr "Üzerine yazma" +msgid "Raw image" +msgstr "Ham imaj" + +msgid "HDI image" +msgstr "HDI imajı" + +msgid "HDX image" +msgstr "HDX imajı" + +msgid "Fixed-size VHD" +msgstr "Sabit-boyutlu VHD" + +msgid "Dynamic-size VHD" +msgstr "Dinamik-boyutlu VHD" + +msgid "Differencing VHD" +msgstr "Differencing VHD" + +msgid "(N/A)" +msgstr "(Yok)" + msgid "Raw image (.img)" msgstr "Ham imaj (.img)" @@ -1172,3 +1214,900 @@ msgstr "WinBox artık desteklenmiyor" 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 "WinBox yöneticisinin geliştirilmesi, bakımcı eksikliği nedeniyle 2022 yılında durduruldu. Çabalarımızı 86Box'ı daha da iyi hale getirmeye yönlendirdiğimiz için, WinBox'ı artık bir yönetici olarak desteklememe kararı aldık.\n\nWinBox aracılığıyla daha fazla güncelleme sağlanmayacak ve 86Box'ın daha yeni sürümleriyle kullanmaya devam ederseniz hatalı davranışlarla karşılaşabilirsiniz. WinBox davranışıyla ilgili tüm hata raporları geçersiz olarak kapatılacaktır.\n\nKullanabileceğiniz diğer yöneticilerin bir listesi için 86box.net adresine gidin." + +msgid "Generate" +msgstr "Oluştur" + +msgid "Joystick configuration" +msgstr "Oyun kolu yapılandırması" + +msgid "Device" +msgstr "Cihaz" + +msgid "%1 (X axis)" +msgstr "1 (X ekseni)" + +msgid "%1 (Y axis)" +msgstr "1 (Y ekseni)" + +msgid "MCA devices" +msgstr "MCA cihazları" + +msgid "List of MCA devices:" +msgstr "MCA cihazlarının listesi:" + +msgid "Tablet tool" +msgstr "Tablet aracı" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Qt Hakkında" + +msgid "MCA devices..." +msgstr "MCA cihazları..." + +msgid "Show non-primary monitors" +msgstr "Birincil olmayan monitörleri göster" + +msgid "Open screenshots folder..." +msgstr "Ekran görüntüleri klasörünü açın..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Büyütüldüğünde tam ekran genişletme modu uygula" + +msgid "Cursor/Puck" +msgstr "İmleç/Puck" + +msgid "Pen" +msgstr "Kalem" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Ana bilgisayar CD/DVD sürücüsü (%1:)" + +msgid "&Connected" +msgstr "&Connected" + +msgid "Clear image history" +msgstr "Görüntü geçmişini temizleyin" + +msgid "Create..." +msgstr "Yarat..." + +msgid "previous image" +msgstr "önceki resim" + +msgid "Host CD/DVD Drive (%1)" +msgstr "Ana bilgisayar CD/DVD sürücüsü (%1)" + +msgid "Unknown Bus" +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 "Hata açılıyor \"%1\": %2" + +msgid "Error compiling vertex shader in file \"%1\"" +msgstr "Dosyada tepe gölgelendirici derlenirken hata oluştu \"%1\"" + +msgid "Error compiling fragment shader in file \"%1\"" +msgstr "Dosyada parça gölgelendirici derlenirken hata oluştu \"%1\"" + +msgid "Error linking shader program in file \"%1\"" +msgstr "Dosyadaki gölgelendirici programı bağlanırken hata oluştu \"%1\"" + +msgid "OpenGL 3.0 renderer options" +msgstr "OpenGL 3.0 işleyici seçenekleri" + +msgid "Render behavior" +msgstr "Render davranışı" + +msgid "Use target framerate:" +msgstr "Hedef kare oranı kullanın:" + +msgid " fps" +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>Taklit 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" + +msgid "Shaders" +msgstr "Gölgelendiriciler" + +msgid "Remove" +msgstr "Kaldırmak" + +msgid "No shader selected" +msgstr "Gölgelendirici seçili değil" + +msgid "Browse..." +msgstr "Göz atın..." + +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 için tıklayınız." + +msgid "Couldn't create OpenGL context." +msgstr "OpenGL bağlamı oluşturulamadı." + +msgid "Couldn't switch to OpenGL context." +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şlatma başarısız oldu. 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 oluşturmaya geri dönüyoruz.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Paket açma arabelleği için bellek ayırma başarısız oldu.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Medya görüntülerini (CD-ROM, disket, vb.) seçerken, açma iletişim kutusu 86Box yapılandırma dosyasıyla aynı dizinde başlayacaktır. Bu ayar muhtemelen sadece macOS üzerinde bir fark yaratacaktır.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Bu makine taşınmış veya kopyalanmış olabilir." + +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 "Doğru ağ işlevselliğini sağlamak için 86Box'ın bu makinenin taşınıp taşınmadığını veya kopyalanıp kopyalanmadığını bilmesi gerekir.\n\nEmin değilseniz \"Kopyaladım\" öğesini seçin." + +msgid "I Moved It" +msgstr "Taşıdım" + +msgid "I Copied It" +msgstr "Kopyaladım" + +msgid "86Box Monitor #" +msgstr "86Box Monitör " + +msgid "No MCA devices." +msgstr "MCA cihazı yok." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Ağ kartı 1" + +msgid "Network Card #2" +msgstr "Ağ kartı 2" + +msgid "Network Card #3" +msgstr "Ağ kartı 3" + +msgid "Network Card #4" +msgstr "Ağ kartı 4" + +msgid "Mode" +msgstr "Mod" + +msgid "Interface" +msgstr "Arayüz" + +msgid "Adapter" +msgstr "Adaptör" + +msgid "VDE Socket" +msgstr "VDE Soket" + +msgid "86Box Unit Tester" +msgstr "86Box Ünite Test" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x Anahtar Kartı" + +msgid "Serial port passthrough 1" +msgstr "Seri port geçişi 1" + +msgid "Serial port passthrough 2" +msgstr "Seri port geçişi 2" + +msgid "Serial port passthrough 3" +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 Enhancers" + +msgid "Renderer options..." +msgstr "İşleyici seçenekleri..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft veri yolu fare" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft (InPort) veri yolu fare" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse Systems seri fare" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft seri fare" + +msgid "Logitech Serial Mouse" +msgstr "Logitech seri fare" + +msgid "PS/2 Mouse" +msgstr "PS/2 fare" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (seri)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Standart Hayes uyumlu modem" + +msgid "Roland MT-32 Emulation" +msgstr "Roland MT-32 emülasyonu" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Roland MT-32 (Yeni) emülasyonu" + +msgid "Roland CM-32L Emulation" +msgstr "Roland CM-32L emülasyonu" + +msgid "Roland CM-32LN Emulation" +msgstr "Roland CM-32LN emülasyonu" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML Kızak" + +msgid "System MIDI" +msgstr "Sistem MIDI" + +msgid "MIDI Input Device" +msgstr "MIDI giriş cihazı" + +msgid "BIOS Address" +msgstr "BIOS adresi" + +msgid "Enable BIOS extension ROM Writes" +msgstr "BIOS uzantılı ROM yazmalarını etkinleştir" + +msgid "Address" +msgstr "Adres" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS revizyonu" + +msgid "Translate 26 -> 17" +msgstr "26 -> 17 çevir" + +msgid "Language" +msgstr "Dil" + +msgid "Enable backlight" +msgstr "Arka ışığı etkinleştir" + +msgid "Invert colors" +msgstr "Renkleri ters çevirin" + +msgid "BIOS size" +msgstr "BIOS boyutu" + +msgid "Map C0000-C7FFF as UMB" +msgstr "C0000-C7FFF'yi UMB olarak eşleyin" + +msgid "Map C8000-CFFFF as UMB" +msgstr "C8000-CFFFF'yi UMB olarak eşleyin" + +msgid "Map D0000-D7FFF as UMB" +msgstr "D0000-D7FFF'yi UMB olarak eşleyin" + +msgid "Map D8000-DFFFF as UMB" +msgstr "D8000-DFFFF'yi UMB olarak eşleyin" + +msgid "Map E0000-E7FFF as UMB" +msgstr "E0000-E7FFF'yi UMB olarak eşleyin" + +msgid "Map E8000-EFFFF as UMB" +msgstr "E8000-EFFFF'yi UMB olarak eşleyin" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 Jumper (JIM)" + +msgid "MIDI Output Device" +msgstr "MIDI çıkış cihazı" + +msgid "MIDI Real time" +msgstr "MIDI gerçek zamanlı" + +msgid "MIDI Thru" +msgstr "MIDI girişinin geçişi" + +msgid "MIDI Clockout" +msgstr "MIDI saatinin çıkışı" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Çıkış kazancı" + +msgid "Chorus" +msgstr "Koro" + +msgid "Chorus Voices" +msgstr "Koro sesleri" + +msgid "Chorus Level" +msgstr "Koro seviyesi" + +msgid "Chorus Speed" +msgstr "Koro hızı" + +msgid "Chorus Depth" +msgstr "Koro derinliği" + +msgid "Chorus Waveform" +msgstr "Koro dalga formu" + +msgid "Reverb" +msgstr "Yankı" + +msgid "Reverb Room Size" +msgstr "Yankı odasının boyutu" + +msgid "Reverb Damping" +msgstr "Yankı sönümleme" + +msgid "Reverb Width" +msgstr "Yankı genişliği" + +msgid "Reverb Level" +msgstr "Yankı seviyesi" + +msgid "Interpolation Method" +msgstr "İnterpolasyon Yöntemi" + +msgid "Reverb Output Gain" +msgstr "Yankı çıkışının kazancı" + +msgid "Reversed stereo" +msgstr "Tersine çevrilmiş stereo" + +msgid "Nice ramp" +msgstr "Güzel rampa" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Düğmeler" + +msgid "Serial Port" +msgstr "Seri port" + +msgid "RTS toggle" +msgstr "RTS geçişi" + +msgid "Revision" +msgstr "Revizyon" + +msgid "Controller" +msgstr "Kontrolcü" + +msgid "Show Crosshair" +msgstr "Artı işaretini göster" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC Adresi" + +msgid "MAC Address OUI" +msgstr "MAC adresinin OUI'si" + +msgid "Enable BIOS" +msgstr "BIOS'u etkinleştir" + +msgid "Baud Rate" +msgstr "Baud hızı" + +msgid "TCP/IP listening port" +msgstr "TCP/IP dinleme bağlantı noktası" + +msgid "Phonebook File" +msgstr "Telefon defteri dosyası" + +msgid "Telnet emulation" +msgstr "Telnet emülasyonu" + +msgid "RAM Address" +msgstr "RAM adresi" + +msgid "RAM size" +msgstr "RAM boyutu" + +msgid "Initial RAM size" +msgstr "İlk RAM boyutu" + +msgid "Serial Number" +msgstr "Seri numarası" + +msgid "Host ID" +msgstr "Ana bilgisayar kimliği" + +msgid "FDC Address" +msgstr "FDC adresi" + +msgid "MPU-401 Address" +msgstr "MPU-401 adresi" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "MIDI girişi alma" + +msgid "Low DMA" +msgstr "Düşük DMA" + +msgid "Enable Game port" +msgstr "Oyun bağlantı noktasını etkinleştir" + +msgid "Surround module" +msgstr "Surround modülü" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "CODEC kurulumunda CODEC kesmesini yükselt (bazı sürücüler tarafından gereklidir)" + +msgid "SB Address" +msgstr "SB adresi" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "OPL'yi etkinleştir" + +msgid "Receive MIDI input (MPU-401)" +msgstr "MIDI girişi alma (MPU-401)" + +msgid "SB low DMA" +msgstr "SB düşük DMA" + +msgid "6CH variant (6-channel)" +msgstr "6CH varyantı (6 kanallı)" + +msgid "Enable CMS" +msgstr "CMS'yi Etkinleştir" + +msgid "Mixer" +msgstr "Karıştırıcı" + +msgid "High DMA" +msgstr "Yüksek DMA" + +msgid "Control PC speaker" +msgstr "PC hoparlörünü kontrol etme" + +msgid "Memory size" +msgstr "Bellek boyutu" + +msgid "EMU8000 Address" +msgstr "EMU8000 adresi" + +msgid "IDE Controller" +msgstr "IDE Kontrolcüsü" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "GUS türü" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "0x04 komutunu \"86Box'tan çık\" etkinleştir" + +msgid "Display type" +msgstr "Ekran türü" + +msgid "Composite type" +msgstr "Kompozit türü" + +msgid "RGB type" +msgstr "RGB türü" + +msgid "Line doubling type" +msgstr "Hat ikiye katlama türü" + +msgid "Snow emulation" +msgstr "Kar emülasyonu" + +msgid "Monitor type" +msgstr "Monitör türü" + +msgid "Character set" +msgstr "Karakter seti" + +msgid "XGA type" +msgstr "XGA türü" + +msgid "Instance" +msgstr "Örnek" + +msgid "MMIO Address" +msgstr "MMIO adresi" + +msgid "RAMDAC type" +msgstr "RAMDAC türü" + +msgid "Blend" +msgstr "Karışım" + +msgid "Bilinear filtering" +msgstr "Bilineer filtreleme" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "CGA öykünmesi için NMI'yi etkinleştirin" + +msgid "Voodoo type" +msgstr "Voodoo türü" + +msgid "Framebuffer memory size" +msgstr "Çerçeve arabelleği bellek boyutu" + +msgid "Texture memory size" +msgstr "Doku bellek boyutu" + +msgid "Dither subtraction" +msgstr "Dither çıkarma" + +msgid "Screen Filter" +msgstr "Ekran filtresi" + +msgid "Render threads" +msgstr "İş parçacıkları oluşturma" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Başlangıç adresi" + +msgid "Contiguous Size" +msgstr "Bitişik boyut" + +msgid "I/O Width" +msgstr "G/Ç genişliği" + +msgid "Transfer Speed" +msgstr "Transfer hızı" + +msgid "EMS mode" +msgstr "EMS modu" + +msgid "Address for > 2 MB" +msgstr "> 2 MB için adres" + +msgid "Frame Address" +msgstr "Çerçeve adresi" + +msgid "USA" +msgstr "ABD" + +msgid "Danish" +msgstr "Danimarka" + +msgid "Always at selected speed" +msgstr "Her zaman seçilen hızda" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS ayarı + Kısayol tuşları (POST sırasında kapalı)" + +msgid "64 kB starting from F0000" +msgstr "F0000'dan başlayarak 64 kB" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "E0000'dan başlayarak 128 kB (adres MSB ters çevrilmiş, önce son 64KB)" + +msgid "Sine" +msgstr "Sinüs" + +msgid "Triangle" +msgstr "Üçgen" + +msgid "Linear" +msgstr "Doğrusal" + +msgid "4th Order" +msgstr "4. dereceden" + +msgid "7th Order" +msgstr "7. dereceden" + +msgid "Non-timed (original)" +msgstr "Zamanlayıcı olmadan (orijinal)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2'de jumper yok)" + +msgid "Two" +msgstr "İki" + +msgid "Three" +msgstr "Üç" + +msgid "Wheel" +msgstr "Tekerlek" + +msgid "Five + Wheel" +msgstr "Beş + tekerlek" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 Seri / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) Seri" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "BIOS'u Devre Dışı Bırak" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klasik" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "Kompozit" + +msgid "Old" +msgstr "Eski" + +msgid "New" +msgstr "Yeni" + +msgid "Color (generic)" +msgstr "Renk (jenerik)" + +msgid "Green Monochrome" +msgstr "Yeşil monokrom" + +msgid "Amber Monochrome" +msgstr "Kehribar monokrom" + +msgid "Gray Monochrome" +msgstr "Gri monokrom" + +msgid "Color (no brown)" +msgstr "Renk (kahverengi yok)" + +msgid "Color (IBM 5153)" +msgstr "Renkli (IBM 5153)" + +msgid "Simple doubling" +msgstr "Basit ikiye katlama" + +msgid "sRGB interpolation" +msgstr "sRGB enterpolasyonu" + +msgid "Linear interpolation" +msgstr "Doğrusal enterpolasyon" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monokrom (5151/MDA) (beyaz)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monokrom (5151/MDA) (yeşil)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monokrom (5151/MDA) (kehribar)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Renkli 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Renkli 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Geliştirilmiş renkli - Normal mod (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Geliştirilmiş renkli - Geliştirilmiş mod (5154/ECD)" + +msgid "Green" +msgstr "Yeşil" + +msgid "Amber" +msgstr "Kehribar" + +msgid "Gray" +msgstr "Gri" + +msgid "Color" +msgstr "Renk" + +msgid "U.S. English" +msgstr "A.B.D. İngilizcesi" + +msgid "Scandinavian" +msgstr "İskandinav" + +msgid "Other languages" +msgstr "Diğer diller" + +msgid "Bochs latest" +msgstr "Bochs son" + +msgid "Mono Non-Interlaced" +msgstr "Mono Araya Girmeyen" + +msgid "Color Interlaced" +msgstr "Renkli Taramalı" + +msgid "Color Non-Interlaced" +msgstr "Renkli Araya Girmeyen" + +msgid "3Dfx Voodoo Graphics" +msgstr "3Dfx Voodoo Grafikleri" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU)" + +msgid "8-bit" +msgstr "8-bit" + +msgid "16-bit" +msgstr "16-bit" + +msgid "Standard (150ns)" +msgstr "Standart (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Yüksek Hızlı (120ns)" + +msgid "Enabled" +msgstr "Etkin" + +msgid "Standard" +msgstr "Standart" + +msgid "High-Speed" +msgstr "Yüksek Hızlı" + +msgid "Stereo LPT DAC" +msgstr "Stereo LPT DAC" + +msgid "Generic Text Printer" +msgstr "Genel metin yazıcısı" + +msgid "Generic ESC/P Dot-Matrix" +msgstr "Jenerik ESC/P nokta vuruşlu" + +msgid "Generic PostScript Printer" +msgstr "Jenerik PostScript yazıcısı" + +msgid "Generic PCL5e Printer" +msgstr "Jenerik PCL5e yazıcısı" + +msgid "Parallel Line Internet Protocol" +msgstr "Paralel Hat İnternet Protokolü" + +msgid "Protection Dongle for Savage Quest" +msgstr "Savage Quest için koruma dongle'ı" + +msgid "Serial Passthrough Device" +msgstr "Seri port geçiş cihazı" + +msgid "Passthrough Mode" +msgstr "Geçişi modu" + +msgid "Host Serial Device" +msgstr "Ana bilgisayar seri cihazı" + +msgid "Name of pipe" +msgstr "Borunun adı" + +msgid "Data bits" +msgstr "Veri bitleri" + +msgid "Stop bits" +msgstr "Dur bitleri" + +msgid "Baud Rate of Passthrough" +msgstr "Geçiş Baud hızı" + +msgid "Named Pipe (Server)" +msgstr "Adlandırılmış boru (Sunucu)" + +msgid "Host Serial Passthrough" +msgstr "Ana bilgisayar seri port geçişi" + +msgid "Eject %s" +msgstr "%s çıkari" + +msgid "&Unmute" +msgstr "&Sesi açın" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Performans üzerinde yüksek etki" From 8d6c11ba5d209bb19c5cc46f288185f436e9f5ae Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 14:41:48 +0100 Subject: [PATCH 580/624] German translation fixes per the comments by Darkstar. --- src/qt/languages/de-DE.po | 50 +++++++++++++++++++-------------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 9f50dbae1..284bf8653 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1189,7 +1189,7 @@ msgid "Failed to initialize network driver" msgstr "Netzwerktreiber konnte nicht initialisiert werden" msgid "The network configuration will be switched to the null driver" -msgstr "Die Netzwerkkonfiguration wird auf den Nulltreiber (Packete werden vom Host gelöscht) umgestellt" +msgstr "Die Netzwerkkonfiguration wird auf den Nulltreiber umgestellt" msgid "Mouse sensitivity:" msgstr "Empfindlichkeit der Maus:" @@ -1237,10 +1237,10 @@ msgid "MCA devices" msgstr "MCA-Geräte" msgid "List of MCA devices:" -msgstr "Leiste die MCA-Geräte:" +msgstr "Liste die MCA-Geräte:" msgid "Tablet tool" -msgstr "Nástroj pro tablety" +msgstr "Tablet-Werkzeug" msgid "Qt (OpenGL &ES)" msgstr "Qt (OpenGL &ES)" @@ -1288,7 +1288,7 @@ msgid "Unknown Bus" msgstr "Unbekannter Bus" msgid "Null Driver" -msgstr "Nulltreiber (Packete werden vom Host gelöscht)" +msgstr "Nulltreiber" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" @@ -1321,7 +1321,7 @@ 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>Rendern Sie jedes Bild sofort, 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>" +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" @@ -1366,19 +1366,19 @@ msgid "Falling back to software rendering.\n" msgstr "Rückgriff auf Software-Rendering.\n" msgid "Allocating memory for unpack buffer failed.\n" -msgstr "Die Zuweisung von Speicher für den Entpackungspuffer ist fehlgeschlagen.\n" +msgstr "Nicht genug Speicher zum Entpacken.\n" msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" msgstr "<html><head/><body><p>Bei der Auswahl von Medien-Images (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>" msgid "This machine might have been moved or copied." -msgstr "Dieses Gerät wurde möglicherweise verschoben oder kopiert." +msgstr "Dieses System wurde möglicherweise verschoben oder kopiert." 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 "Um eine ordnungsgemäße Netzwerkfunktionalität zu gewährleisten, muss 86Box wissen, ob dieses Gerät verschoben oder kopiert wurde. \n\nWählen Sie \"Ich habe es kopiert\", wenn Sie sich nicht sicher sind." +msgstr "Um eine ordnungsgemäße Netzwerkfunktionalität zu gewährleisten, muss 86Box wissen, ob dieses System verschoben oder kopiert wurde. \n\nWählen Sie \"Ich habe es kopiert\", wenn Sie sich nicht sicher sind." msgid "I Moved It" -msgstr "Ich habe es bewegt" +msgstr "Ich habe es verschoben" msgid "I Copied It" msgstr "Ich habe es kopiert" @@ -1414,7 +1414,7 @@ msgid "Adapter" msgstr "Adapter" msgid "VDE Socket" -msgstr "VDE-Steckdose" +msgstr "VDE Port" msgid "86Box Unit Tester" msgstr "86Box-Gerätetester" @@ -1423,16 +1423,16 @@ msgid "Novell NetWare 2.x Key Card" msgstr "Novell NetWare 2.x Schlüsselkarte" msgid "Serial port passthrough 1" -msgstr "Passthrough der Serielle Schnittstelle 1" +msgstr "Durchreichen der Serielle Schnittstelle 1" msgid "Serial port passthrough 2" -msgstr "Passthrough der Serielle Schnittstelle 2" +msgstr "Durchreichen der Serielle Schnittstelle 2" msgid "Serial port passthrough 3" -msgstr "Passthrough der Serielle Schnittstelle 3" +msgstr "Durchreichen der Serielle Schnittstelle 3" msgid "Serial port passthrough 4" -msgstr "Passthrough der Serielle Schnittstelle 4" +msgstr "Durchreichen der Serielle Schnittstelle 4" msgid "Vision Systems LBA Enhancer" msgstr "Vision Systems LBA Enhancer" @@ -1459,7 +1459,7 @@ msgid "PS/2 Mouse" msgstr "PS/2-Maus" msgid "3M MicroTouch (Serial)" -msgstr "3M MicroTouch (Serielle)" +msgstr "3M MicroTouch (Seriell)" msgid "[COM] Standard Hayes-compliant Modem" msgstr "[COM] Standard Hayes-kompatibles Modem" @@ -1489,7 +1489,7 @@ msgid "BIOS Address" msgstr "BIOS-Adresse" msgid "Enable BIOS extension ROM Writes" -msgstr "BIOS-Erweiterung ROM-Schreiben einschalten" +msgstr "Schreiben in BIOS Erweiterungs ROMs zulassen" msgid "Address" msgstr "Adresse" @@ -1711,7 +1711,7 @@ msgid "Enable CMS" msgstr "CMS einschalten" msgid "Mixer" -msgstr "Mischanlage" +msgstr "Mixer" msgid "High DMA" msgstr "Hohe DMA" @@ -1876,10 +1876,10 @@ msgid "Five + Wheel" msgstr "Fünf + Rad" msgid "A3 - SMT2 Serial / SMT3(R)V" -msgstr "A3 - SMT2 Serielle / SMT3(R)V" +msgstr "A3 - SMT2 Seriell / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" -msgstr "Q1 - SMT3(R) Serielle" +msgstr "Q1 - SMT3(R) Seriell" msgid "8 kB" msgstr "8 kB" @@ -2020,13 +2020,13 @@ msgid "Bochs latest" msgstr "Bochs neueste" msgid "Mono Non-Interlaced" -msgstr "Monochrom nicht verschachtelt" +msgstr "Monochrom nicht interlacet" msgid "Color Interlaced" -msgstr "Farbe verschachtelt" +msgstr "Farbe interlacet" msgid "Color Non-Interlaced" -msgstr "Farbe nicht verschachtelt" +msgstr "Farbe nicht interlacet" msgid "3Dfx Voodoo Graphics" msgstr "3dfx Voodoo Grafik" @@ -2074,7 +2074,7 @@ msgid "Parallel Line Internet Protocol" msgstr "Parallel Line Internet Protocol" msgid "Protection Dongle for Savage Quest" -msgstr "Schutz-Dongle für Savage Quest" +msgstr "Kopierschutz-Dongle für Savage Quest" msgid "Serial Passthrough Device" msgstr "Gerät des Passthroughs der Serielle Schnittstelle" @@ -2086,7 +2086,7 @@ msgid "Host Serial Device" msgstr "Host Serielles Gerät" msgid "Name of pipe" -msgstr "Name der Leitung" +msgstr "Name der Pipe" msgid "Data bits" msgstr "Datenbits" @@ -2098,7 +2098,7 @@ msgid "Baud Rate of Passthrough" msgstr "Baudrate des Passthroughs" msgid "Named Pipe (Server)" -msgstr "Benannte Leitung (Server)" +msgstr "Benanntes Pipe (Server)" msgid "Host Serial Passthrough" msgstr "Passthrough der seriellen Schnittstelle des Hosts" From 84a60930f0c66d4a475c8e0cd6b4df50c54a3527 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 15:03:31 +0100 Subject: [PATCH 581/624] Current Russian translation fixes per the review by lemondrops. --- src/qt/languages/ru-RU.po | 88 +++++++++++++++++++-------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 4e1984d4c..f5f005d2d 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -871,10 +871,10 @@ msgid "Invalid configuration" msgstr "Недопустимая конфигурация" 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 "Для автоматического преобразования файлов PostScript в PDF требуется %1.\n\nВсе документы, отправленные на общий принтер PostScript, будут сохранены в виде файлов PostScript (.ps)." +msgstr "Для автоматического преобразования файлов PostScript в PDF требуется %1.\n\nВсе документы, отправленные на стандартный принтер PostScript, будут сохранены в виде файлов PostScript (.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." -msgstr "Для автоматического преобразования файлов PCL в PDF требуется %1.\n\nВсе документы, отправленные на общий принтер PCL, будут сохранены в виде файлов Printer Command Language (.pcl)." +msgstr "Для автоматического преобразования файлов PCL в PDF требуется %1.\n\nВсе документы, отправленные на стандартный принтер PCL, будут сохранены в виде файлов Printer Command Language (.pcl)." msgid "Entering fullscreen mode" msgstr "Вход в полноэкранный режим" @@ -1030,10 +1030,10 @@ msgid "HDX image" msgstr "Образ HDX" msgid "Fixed-size VHD" -msgstr "VHD фиксированного размера" +msgstr "Образ VHD фиксированного размера" msgid "Dynamic-size VHD" -msgstr "VHD динамического размера" +msgstr "Образ VHD динамического размера" msgid "Differencing VHD" msgstr "Дифференцированный образ VHD" @@ -1051,10 +1051,10 @@ msgid "HDX image (.hdx)" msgstr "Образ HDX (.hdx)" msgid "Fixed-size VHD (.vhd)" -msgstr "VHD фиксированного размера (.vhd)" +msgstr "Образ VHD фиксированного размера (.vhd)" msgid "Dynamic-size VHD (.vhd)" -msgstr "VHD динамического размера (.vhd)" +msgstr "Образ VHD динамического размера (.vhd)" msgid "Differencing VHD (.vhd)" msgstr "Дифференцированный образ VHD (.vhd)" @@ -1300,7 +1300,7 @@ msgid "Error compiling fragment shader in file \"%1\"" msgstr "Ошибка компиляции фрагментного шейдера в файле \"%1\"" msgid "Error linking shader program in file \"%1\"" -msgstr "Ошибка связывания программы шейдера в файле \"%1\"" +msgstr "Ошибка компоновки программы шейдера в файле \"%1\"" msgid "OpenGL 3.0 renderer options" msgstr "Параметры рендеринга OpenGL 3.0" @@ -1333,7 +1333,7 @@ msgid "No shader selected" msgstr "Шейдер не выбран" msgid "Browse..." -msgstr "Выбрать..." +msgstr "Обзор..." msgid "Shader error" msgstr "Ошибка шейдера" @@ -1360,7 +1360,7 @@ msgid "Error initializing OpenGL" msgstr "Ошибка инициализации OpenGL" msgid "Falling back to software rendering.\n" -msgstr "Возвращаясь к программному рендерингу.\n" +msgstr "Переключение на программный рендеринг.\n" msgid "Allocating memory for unpack buffer failed.\n" msgstr "Выделение памяти для буфера распаковки не удалось.\n" @@ -1372,13 +1372,13 @@ msgid "This machine might have been moved or copied." msgstr "Возможно, эта машина была перемещена или скопирована." 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 "Чтобы обеспечить правильную работу сети, 86Box должен знать, была ли эта машина перемещена или скопирована.\n\nЕсли вы не уверены, выберите \"Я скопировал его\"." +msgstr "Чтобы обеспечить правильную работу сети, 86Box должен знать, была ли эта машина перемещена или скопирована.\n\nЕсли вы не уверены, выберите \"Скопирована\"." msgid "I Moved It" -msgstr "Я переместил его" +msgstr "Перемещена" msgid "I Copied It" -msgstr "Я скопировал его" +msgstr "Скопирована" msgid "86Box Monitor #" msgstr "86Box Monitor #" @@ -1411,7 +1411,7 @@ msgid "Adapter" msgstr "Адаптер" msgid "VDE Socket" -msgstr "VDE Socket" +msgstr "VDE сокет" msgid "86Box Unit Tester" msgstr "Модульный Тестер 86Box" @@ -1444,19 +1444,19 @@ msgid "Microsoft Bus Mouse (InPort)" msgstr "Мышь Microsoft Bus Mouse (InPort)" msgid "Mouse Systems Serial Mouse" -msgstr "Серийная мышь Mouse Systems" +msgstr "Последовательнная мышь Mouse Systems" msgid "Microsoft Serial Mouse" -msgstr "Серийная мышь Microsoft" +msgstr "Последовательнная мышь мышь Microsoft" msgid "Logitech Serial Mouse" -msgstr "Серийная мышь Logitech" +msgstr "Последовательнная мышь мышь 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-совместимый модем" @@ -1495,7 +1495,7 @@ msgid "IRQ" msgstr "IRQ" msgid "BIOS Revision" -msgstr "Ревизия BIOS" +msgstr "Версия BIOS" msgid "Translate 26 -> 17" msgstr "Перевести 26 -> 17" @@ -1513,7 +1513,7 @@ msgid "BIOS size" msgstr "Размер BIOS" msgid "Map C0000-C7FFF as UMB" -msgstr "Карта C0000-C7FFF как UMB" +msgstr "Отображение C0000-C7FFF в качестве UMB" msgid "Map C8000-CFFFF as UMB" msgstr "Отображение C8000-CFFFF в качестве UMB" @@ -1531,19 +1531,19 @@ msgid "Map E8000-EFFFF as UMB" msgstr "Отображение E8000-EFFFF в качестве UMB" msgid "JS9 Jumper (JIM)" -msgstr "Перемычка JS9 (JIM)" +msgstr "Джампер JS9 (JIM)" msgid "MIDI Output Device" msgstr "Устройство вывода MIDI" msgid "MIDI Real time" -msgstr "MIDI в реальному времени" +msgstr "MIDI в реальном времени" msgid "MIDI Thru" msgstr "Пропускание MIDI-входа" msgid "MIDI Clockout" -msgstr "Выход MIDI-часов" +msgstr "MIDI Clockout" msgid "SoundFont" msgstr "SoundFont" @@ -1552,22 +1552,22 @@ msgid "Output Gain" msgstr "Усиление выхода" msgid "Chorus" -msgstr "Хор" +msgstr "Хорус" msgid "Chorus Voices" -msgstr "Голоса хора" +msgstr "Голоса хоруса" msgid "Chorus Level" -msgstr "Уровень хора" +msgstr "Уровень хоруса" msgid "Chorus Speed" msgstr "Скорость хоруса" msgid "Chorus Depth" -msgstr "Глубина хора" +msgstr "Глубина хоруса" msgid "Chorus Waveform" -msgstr "Форма волны хора" +msgstr "Форма волны хоруса" msgid "Reverb" msgstr "Реверберация" @@ -1591,10 +1591,10 @@ msgid "Reverb Output Gain" msgstr "Усиление выходного сигнала ревербератора" msgid "Reversed stereo" -msgstr "Перевернутое стерео" +msgstr "Реверс стерео" msgid "Nice ramp" -msgstr "Хорошая рампа" +msgstr "Nice ramp" msgid "Hz" msgstr "Гц" @@ -1606,10 +1606,10 @@ msgid "Serial Port" msgstr "Последовательный порт" msgid "RTS toggle" -msgstr "Переключение RTS" +msgstr "Переключатель RTS" msgid "Revision" -msgstr "Пересмотр" +msgstr "Версия" msgid "Controller" msgstr "Контроллер" @@ -1873,28 +1873,28 @@ msgid "Five + Wheel" msgstr "Пять + колесо" msgid "A3 - SMT2 Serial / SMT3(R)V" -msgstr "A3 - SMT2 серийная / SMT3(R)V" +msgstr "A3 - SMT2 последовательнная / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" -msgstr "Q1 - SMT3(R) серийная" +msgstr "Q1 - SMT3(R) последовательнная" msgid "8 kB" -msgstr "8 кб" +msgstr "8 кБ" msgid "32 kB" -msgstr "32 кб" +msgstr "32 кБ" msgid "16 kB" -msgstr "16 кб" +msgstr "16 кБ" msgid "64 kB" -msgstr "64 кб" +msgstr "64 кБ" msgid "Disable BIOS" msgstr "Отключить BIOS" msgid "512 kB" -msgstr "512 кб" +msgstr "512 кБ" msgid "2 MB" msgstr "2 МБ" @@ -1930,7 +1930,7 @@ msgid "Classic" msgstr "Классика" msgid "256 kB" -msgstr "256 кб" +msgstr "256 кБ" msgid "Composite" msgstr "Композит" @@ -1969,7 +1969,7 @@ msgid "Linear interpolation" msgstr "Линейная интерполяция" msgid "128 kB" -msgstr "128 кб" +msgstr "128 кБ" msgid "Monochrome (5151/MDA) (white)" msgstr "Монохромный (5151/MDA) (белый)" @@ -2059,16 +2059,16 @@ msgid "Generic Text Printer" msgstr "Текстовый принтер общего назначения" msgid "Generic ESC/P Dot-Matrix" -msgstr "Матричный принтер Generic ESC/P" +msgstr "Стандартный матричный ESC/P" msgid "Generic PostScript Printer" -msgstr "Generic PostScript Printer" +msgstr "Стандартный PostScript Printer" msgid "Generic PCL5e Printer" -msgstr "Общий принтер PCL5e" +msgstr "Стандартный принтер PCL5e" msgid "Parallel Line Internet Protocol" -msgstr "Параллельная линия Интернет-протокола" +msgstr "Интернет-протокол для параллельной линии" msgid "Protection Dongle for Savage Quest" msgstr "Защитный донгл для Savage Quest" From bda3206469eaea3ae66d0bdb0d8a38824ce9785a Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 15:06:10 +0100 Subject: [PATCH 582/624] Fixed some typo's in the Russian translation. --- src/qt/languages/ru-RU.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index f5f005d2d..dacb8543c 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1444,19 +1444,19 @@ msgid "Microsoft Bus Mouse (InPort)" msgstr "Мышь Microsoft Bus Mouse (InPort)" msgid "Mouse Systems Serial Mouse" -msgstr "Последовательнная мышь Mouse Systems" +msgstr "Последовательная мышь Mouse Systems" msgid "Microsoft Serial Mouse" -msgstr "Последовательнная мышь мышь Microsoft" +msgstr "Последовательная мышь мышь Microsoft" msgid "Logitech Serial Mouse" -msgstr "Последовательнная мышь мышь Logitech" +msgstr "Последовательная мышь мышь 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-совместимый модем" @@ -1873,10 +1873,10 @@ msgid "Five + Wheel" msgstr "Пять + колесо" msgid "A3 - SMT2 Serial / SMT3(R)V" -msgstr "A3 - SMT2 последовательнная / SMT3(R)V" +msgstr "A3 - SMT2 последовательная / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" -msgstr "Q1 - SMT3(R) последовательнная" +msgstr "Q1 - SMT3(R) последовательная" msgid "8 kB" msgstr "8 кБ" From 64e099085c505a16b038aca69789f8081975eed4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 15:11:28 +0100 Subject: [PATCH 583/624] More Russian translation fixes. --- src/qt/languages/ru-RU.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index dacb8543c..e49204b8e 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1438,19 +1438,19 @@ msgid "Renderer options..." msgstr "Параметры рендеринга..." msgid "Logitech/Microsoft Bus Mouse" -msgstr "Мышь Logitech/Microsoft Bus Mouse" +msgstr "Шинная мышь Logitech/Microsoft" msgid "Microsoft Bus Mouse (InPort)" -msgstr "Мышь Microsoft Bus Mouse (InPort)" +msgstr "Шинная мышь Microsoft (InPort)" msgid "Mouse Systems Serial Mouse" msgstr "Последовательная мышь Mouse Systems" msgid "Microsoft Serial Mouse" -msgstr "Последовательная мышь мышь Microsoft" +msgstr "Последовательная мышь Microsoft" msgid "Logitech Serial Mouse" -msgstr "Последовательная мышь мышь Logitech" +msgstr "Последовательная мышь Logitech" msgid "PS/2 Mouse" msgstr "Мышь PS/2" @@ -1663,13 +1663,13 @@ msgid "MPU-401 Address" msgstr "Адрес MPU-401" msgid "MPU-401 IRQ" -msgstr "MPU-401 IRQ" +msgstr "IRQ MPU-401" msgid "Receive MIDI input" msgstr "Прием входного сигнала MIDI" msgid "Low DMA" -msgstr "Низкий уровень DMA" +msgstr "Низкий DMA" msgid "Enable Game port" msgstr "Включить игровой порт" @@ -1684,13 +1684,13 @@ msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" msgstr "Поднимать прерывание CODEC при настройке CODEC (необходимо некоторым драйверам)." msgid "SB Address" -msgstr "Адрес СБ" +msgstr "Адрес SB" msgid "WSS IRQ" -msgstr "WSS IRQ" +msgstr "IRQ WSS" msgid "WSS DMA" -msgstr "WSS DMA" +msgstr "DMA WSS" msgid "Enable OPL" msgstr "Включить OPL" @@ -1699,7 +1699,7 @@ msgid "Receive MIDI input (MPU-401)" msgstr "Прием входного сигнала MIDI (MPU-401)" msgid "SB low DMA" -msgstr "Низкий уровень SB DMA" +msgstr "Низкий DMA SB" msgid "6CH variant (6-channel)" msgstr "Вариант 6CH (6-канальный)" @@ -1711,7 +1711,7 @@ msgid "Mixer" msgstr "Смеситель" msgid "High DMA" -msgstr "Высокий уровень DMA" +msgstr "Высокий DMA" msgid "Control PC speaker" msgstr "Управление динамиком ПК" From 61b875abae212d7b071bd2531d9c9a827c7b7b49 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 15:14:01 +0100 Subject: [PATCH 584/624] And two more. --- src/qt/languages/ru-RU.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index e49204b8e..174678b99 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1666,7 +1666,7 @@ msgid "MPU-401 IRQ" msgstr "IRQ MPU-401" msgid "Receive MIDI input" -msgstr "Прием входного сигнала MIDI" +msgstr "Прием входна MIDI" msgid "Low DMA" msgstr "Низкий DMA" @@ -1696,7 +1696,7 @@ msgid "Enable OPL" msgstr "Включить OPL" msgid "Receive MIDI input (MPU-401)" -msgstr "Прием входного сигнала MIDI (MPU-401)" +msgstr "Прием входна MIDI (MPU-401)" msgid "SB low DMA" msgstr "Низкий DMA SB" From 9d556f6010da09f928a8ad822dea0aa93021402a Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 15:17:20 +0100 Subject: [PATCH 585/624] And fixed them again. --- src/qt/languages/ru-RU.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 174678b99..42c194986 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1666,7 +1666,7 @@ msgid "MPU-401 IRQ" msgstr "IRQ MPU-401" msgid "Receive MIDI input" -msgstr "Прием входна MIDI" +msgstr "Включить MIDI-вход" msgid "Low DMA" msgstr "Низкий DMA" @@ -1696,7 +1696,7 @@ msgid "Enable OPL" msgstr "Включить OPL" msgid "Receive MIDI input (MPU-401)" -msgstr "Прием входна MIDI (MPU-401)" +msgstr "Включить MIDI-вход (MPU-401)" msgid "SB low DMA" msgstr "Низкий DMA SB" From 69db5bec680b8dac2206ddaa64e035d547bd6aee Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 16:17:21 +0100 Subject: [PATCH 586/624] More Russian translation fixes. --- src/qt/languages/ru-RU.po | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 42c194986..09a3a0445 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1738,10 +1738,10 @@ msgid "Display type" msgstr "Тип дисплея" msgid "Composite type" -msgstr "Композитный тип" +msgstr "Тип композитного видео" msgid "RGB type" -msgstr "Тип RGB" +msgstr "Тип видео RGB" msgid "Line doubling type" msgstr "Тип удвоения линии" @@ -1792,7 +1792,7 @@ msgid "Dither subtraction" msgstr "Вычитание с вычитанием" msgid "Screen Filter" -msgstr "Сетчатый фильтр" +msgstr "Фильтр экрана" msgid "Render threads" msgstr "Потоки рендеринга" @@ -1858,7 +1858,7 @@ msgid "Non-timed (original)" msgstr "Без таймера (оригинал)" msgid "45 Hz (JMP2 not populated)" -msgstr "45 Гц (без перемычки на JMP2)" +msgstr "45 Гц (без джампера на JMP2)" msgid "Two" msgstr "Два" @@ -1927,13 +1927,13 @@ msgid "SigmaTel STAC9721T (stereo)" msgstr "SigmaTel STAC9721T (стерео)" msgid "Classic" -msgstr "Классика" +msgstr "Классический" msgid "256 kB" msgstr "256 кБ" msgid "Composite" -msgstr "Композит" +msgstr "Композитное видео" msgid "Old" msgstr "Старый" @@ -2014,7 +2014,7 @@ msgid "Other languages" msgstr "Другие языки" msgid "Bochs latest" -msgstr "Бохс последний" +msgstr "Bochs последний" msgid "Mono Non-Interlaced" msgstr "Моно без чересстрочной развертки" @@ -2032,7 +2032,7 @@ msgid "Obsidian SB50 + Amethyst (2 TMUs)" msgstr "Obsidian SB50 + Amethyst (2 TMU)" msgid "8-bit" -msgstr "8-битный" +msgstr "8-бит" msgid "16-bit" msgstr "16-бит" @@ -2056,19 +2056,19 @@ msgid "Stereo LPT DAC" msgstr "Стереофонический ЦАП LPT" msgid "Generic Text Printer" -msgstr "Текстовый принтер общего назначения" +msgstr "Стандартный текстовый принтер" msgid "Generic ESC/P Dot-Matrix" -msgstr "Стандартный матричный ESC/P" +msgstr "Стандартный матричный принтер ESC/P" msgid "Generic PostScript Printer" -msgstr "Стандартный PostScript Printer" +msgstr "Стандартный принтер PostScript" msgid "Generic PCL5e Printer" msgstr "Стандартный принтер PCL5e" msgid "Parallel Line Internet Protocol" -msgstr "Интернет-протокол для параллельной линии" +msgstr "Parallel Line Internet Protocol" msgid "Protection Dongle for Savage Quest" msgstr "Защитный донгл для Savage Quest" @@ -2083,7 +2083,7 @@ msgid "Host Serial Device" msgstr "Последовательное устройство хоста" msgid "Name of pipe" -msgstr "Название трубы" +msgstr "Название пайпа" msgid "Data bits" msgstr "Биты данных" @@ -2095,7 +2095,7 @@ msgid "Baud Rate of Passthrough" msgstr "Скорость передачи данных через канал" msgid "Named Pipe (Server)" -msgstr "Именованный трубопровод (сервер)" +msgstr "Именованный пайп (Сервер)" msgid "Host Serial Passthrough" msgstr "Последовательный порт хоста" From 5abc12c776a050a59b2fe2d64cf6159f66efbf14 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sat, 16 Nov 2024 16:24:54 +0100 Subject: [PATCH 587/624] The final batch of the Russian language fixes. --- src/qt/languages/ru-RU.po | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 09a3a0445..945c78e72 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1942,22 +1942,22 @@ msgid "New" msgstr "Новый" msgid "Color (generic)" -msgstr "Цвет (общий)" +msgstr "Цветной (стандартный)" msgid "Green Monochrome" -msgstr "Зеленый монохром" +msgstr "Зеленый монохромный" msgid "Amber Monochrome" -msgstr "Янтарный монохром" +msgstr "Янтарный монохромный" msgid "Gray Monochrome" -msgstr "Серый монохром" +msgstr "Серый монохромный" msgid "Color (no brown)" -msgstr "Цвет (без коричневого)" +msgstr "Цветной (без коричневого)" msgid "Color (IBM 5153)" -msgstr "Цвет (IBM 5153)" +msgstr "Цветной (IBM 5153)" msgid "Simple doubling" msgstr "Простое удвоение" @@ -1978,7 +1978,7 @@ msgid "Monochrome (5151/MDA) (green)" msgstr "Монохромный (5151/MDA) (зеленый)" msgid "Monochrome (5151/MDA) (amber)" -msgstr "Монохром (5151/MDA) (янтарный)" +msgstr "Монохромный (5151/MDA) (янтарный)" msgid "Color 40x25 (5153/CGA)" msgstr "Цветной 40x25 (5153/CGA)" @@ -2017,13 +2017,13 @@ msgid "Bochs latest" msgstr "Bochs последний" msgid "Mono Non-Interlaced" -msgstr "Моно без чересстрочной развертки" +msgstr "Монохромный без чересстрочной развертки" msgid "Color Interlaced" -msgstr "Цветная чересстрочная развертка" +msgstr "Цветной с чересстрочной разверткой" msgid "Color Non-Interlaced" -msgstr "Цвет без вкраплений" +msgstr "Цветной без чересстрочной развертки" msgid "3Dfx Voodoo Graphics" msgstr "Ускоритель 3Dfx Voodoo" From 5d03a703b3c0226738e23ca27416276978a35d4b Mon Sep 17 00:00:00 2001 From: The BombSquad <35253266+TheBombSquad@users.noreply.github.com> Date: Sat, 16 Nov 2024 15:56:10 -0500 Subject: [PATCH 588/624] Add .idea folder to .gitignore for CLion --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 5a43dffdb..5935efd38 100644 --- a/.gitignore +++ b/.gitignore @@ -62,3 +62,6 @@ CMakeLists.txt.user # clangd .cache + +# Jetbrains CLion +.idea From 516945d829b2007491a1261c6dce52aff02b657e Mon Sep 17 00:00:00 2001 From: The BombSquad <35253266+TheBombSquad@users.noreply.github.com> Date: Sat, 16 Nov 2024 16:47:07 -0500 Subject: [PATCH 589/624] Check for mouse_capture before handling XInput events --- src/qt/xinput2_mouse.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/qt/xinput2_mouse.cpp b/src/qt/xinput2_mouse.cpp index 1be6ec826..4d79ce66d 100644 --- a/src/qt/xinput2_mouse.cpp +++ b/src/qt/xinput2_mouse.cpp @@ -132,7 +132,7 @@ xinput2_proc() XGenericEventCookie *cookie = (XGenericEventCookie *) &ev.xcookie; XNextEvent(disp, (XEvent *) &ev); - if (XGetEventData(disp, cookie) && (cookie->type == GenericEvent) && (cookie->extension == xi2opcode)) { + if (XGetEventData(disp, cookie) && (cookie->type == GenericEvent) && (cookie->extension == xi2opcode) && mouse_capture) { const XIRawEvent *rawev = (const XIRawEvent *) cookie->data; double coords[2] = { 0.0 }; @@ -214,8 +214,6 @@ common_motion: } prev_time = rawev->time; - if (!mouse_capture) - break; XWindowAttributes winattrib {}; if (XGetWindowAttributes(disp, main_window->winId(), &winattrib)) { auto globalPoint = main_window->mapToGlobal(QPoint(main_window->width() / 2, main_window->height() / 2)); From aa7d68f1134ee827956cdb9b82d39e1689beb4f7 Mon Sep 17 00:00:00 2001 From: The BombSquad <35253266+TheBombSquad@users.noreply.github.com> Date: Sat, 16 Nov 2024 18:05:45 -0500 Subject: [PATCH 590/624] Check for mouse_capture before handling a QWheelEvent --- src/qt/qt_rendererstack.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_rendererstack.cpp b/src/qt/qt_rendererstack.cpp index fd22b5173..a8bd47a79 100644 --- a/src/qt/qt_rendererstack.cpp +++ b/src/qt/qt_rendererstack.cpp @@ -200,10 +200,14 @@ RendererStack::mousePressEvent(QMouseEvent *event) void RendererStack::wheelEvent(QWheelEvent *event) { + if (!mouse_capture) { + event->ignore(); + return; + } + double numSteps = (double) event->angleDelta().y() / 120.0; mouse_set_z((int) numSteps); - event->accept(); } From cf2daf8fbbc8e333f4ecc3a30cd68f5b49d0a0da Mon Sep 17 00:00:00 2001 From: Sasamiya <117635969+kzmidze@users.noreply.github.com> Date: Sun, 17 Nov 2024 23:33:43 +0800 Subject: [PATCH 591/624] Update ja-JP.po --- src/qt/languages/ja-JP.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 49018ba9c..e6e4f7d50 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -1222,7 +1222,7 @@ msgid "Joystick configuration" msgstr "ジョイスティックの構成" msgid "Device" -msgstr "装置" +msgstr "デバイス" msgid "%1 (X axis)" msgstr "1(X軸)" @@ -1231,10 +1231,10 @@ msgid "%1 (Y axis)" msgstr "1(Y軸)" msgid "MCA devices" -msgstr "MCA装置" +msgstr "MCAデバイス" msgid "List of MCA devices:" -msgstr "MCA装置のリスト:" +msgstr "MCAデバイスのリスト:" msgid "Tablet tool" msgstr "タブレットツール" @@ -1384,10 +1384,10 @@ msgid "86Box Monitor #" msgstr "86Box モニター" msgid "No MCA devices." -msgstr "MCA装置はない。" +msgstr "MCAデバイスはない。" msgid "MiB" -msgstr "MB" +msgstr "MiB" msgid "Network Card #1" msgstr "ネットワークカード 1" @@ -1489,7 +1489,7 @@ msgid "Enable BIOS extension ROM Writes" msgstr "BIOS拡張ROM書き込みを有効にする" msgid "Address" -msgstr "住所" +msgstr "アドレス" msgid "IRQ" msgstr "割り込み要求" @@ -1780,7 +1780,7 @@ msgid "Enable NMI for CGA emulation" msgstr "CGAエミュレーションのNMIを有効にする" msgid "Voodoo type" -msgstr "ブードゥー教タイプ" +msgstr "Voodooタイプ" msgid "Framebuffer memory size" msgstr "フレームバッファのメモリサイズ" @@ -2014,7 +2014,7 @@ msgid "Other languages" msgstr "その他の言語" msgid "Bochs latest" -msgstr "ボッフス最新作" +msgstr "Bochs latest" msgid "Mono Non-Interlaced" msgstr "モノラル・ノンインターレース" @@ -2023,7 +2023,7 @@ msgid "Color Interlaced" msgstr "カラー・インターレース" msgid "Color Non-Interlaced" -msgstr "カラーノンインターレース" +msgstr "カラー・ノンインターレース" msgid "3Dfx Voodoo Graphics" msgstr "3dfx Voodooグラフィック" @@ -2086,7 +2086,7 @@ msgid "Name of pipe" msgstr "パイプ名" msgid "Data bits" -msgstr "データ・ビット" +msgstr "データビット" msgid "Stop bits" msgstr "ストップビット" @@ -2107,7 +2107,7 @@ msgid "&Unmute" msgstr "ミュート解除(&U)" msgid "Softfloat FPU" -msgstr "소프트플로트 FPU" +msgstr "Softfloat FPU" msgid "High performance impact" msgstr "パフォーマンスへの影響が大きい" From 81283ac848e0184beab766eb50eb677d99f02d74 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Mon, 18 Nov 2024 02:33:55 +0500 Subject: [PATCH 592/624] Embed Qt base translations in the executable Fixes standard messagebox buttons not being translated --- .ci/build.sh | 2 +- .github/workflows/cmake_linux.yml | 1 + .github/workflows/codeql_linux.yml | 1 + src/qt/CMakeLists.txt | 42 ++++++++++++++++++- src/qt/qt_progsettings.cpp | 9 +++- ...ranslations.qrc => qt_translations.qrc.in} | 1 + 6 files changed, 52 insertions(+), 4 deletions(-) rename src/qt/{qt_translations.qrc => qt_translations.qrc.in} (97%) diff --git a/.ci/build.sh b/.ci/build.sh index c60016d51..2a48d564b 100755 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -593,7 +593,7 @@ else grep -q " bullseye " /etc/apt/sources.list || echo [!] WARNING: System not running the expected Debian version # Establish general dependencies. - pkgs="cmake ninja-build pkg-config git wget p7zip-full extra-cmake-modules wayland-protocols tar gzip file appstream" + pkgs="cmake ninja-build pkg-config git wget p7zip-full extra-cmake-modules wayland-protocols tar gzip file appstream qttranslations5-l10n" if [ "$(dpkg --print-architecture)" = "$arch_deb" ] then pkgs="$pkgs build-essential" diff --git a/.github/workflows/cmake_linux.yml b/.github/workflows/cmake_linux.yml index ed0f055a2..859a38899 100644 --- a/.github/workflows/cmake_linux.yml +++ b/.github/workflows/cmake_linux.yml @@ -63,6 +63,7 @@ jobs: qtbase5-dev qtbase5-private-dev qttools5-dev + qttranslations5-l10n libevdev-dev libxkbcommon-x11-dev diff --git a/.github/workflows/codeql_linux.yml b/.github/workflows/codeql_linux.yml index fee26a0a6..396ccd4fe 100644 --- a/.github/workflows/codeql_linux.yml +++ b/.github/workflows/codeql_linux.yml @@ -66,6 +66,7 @@ jobs: qtbase5-dev qtbase5-private-dev qttools5-dev + qttranslations5-l10n libevdev-dev libxkbcommon-x11-dev diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index c21dfd5bb..a99209273 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -454,10 +454,49 @@ if (UNIX AND NOT APPLE AND NOT HAIKU) endif() endif() endif() + +# Get the Qt translations directory +get_target_property(QT_QMAKE_EXECUTABLE Qt${QT_MAJOR}::qmake IMPORTED_LOCATION) +execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS OUTPUT_VARIABLE QT_TRANSLATIONS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) + set(QM_FILES) file(GLOB po_files "${CMAKE_CURRENT_SOURCE_DIR}/languages/*.po") foreach(po_file ${po_files}) get_filename_component(PO_FILE_NAME ${po_file} NAME_WE) + + # Get the language and country + string(REGEX MATCH "^[a-z]+" PO_LANGUAGE ${PO_FILE_NAME}) + string(REGEX MATCH "[A-Z]+$" PO_COUNTRY ${PO_FILE_NAME}) + + # Find the base Qt translation for the language and country + set(qt_translation_file_dest "qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + if (EXISTS "${QT_TRANSLATIONS_DIR}/qtbase_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + set(qt_translation_file "qtbase_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + # Fall back to just the language if country isn't found + elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qtbase_${PO_LANGUAGE}.qm") + set(qt_translation_file "qtbase_${PO_LANGUAGE}.qm") + # If the translation is still not found, try the legacy Qt one + elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + set(qt_translation_file "qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + # Fall back to just the language again + elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qt_${PO_LANGUAGE}.qm") + set(qt_translation_file "qt_${PO_LANGUAGE}.qm") + else() + unset(qt_translation_file) + endif() + + # Copy the translation file to the build directory + if (qt_translation_file) + file(COPY "${QT_TRANSLATIONS_DIR}/${qt_translation_file}" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + if (NOT (qt_translation_file STREQUAL qt_translation_file_dest)) + # Rename the file for consistency + file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file}" "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file_dest}") + endif() + # Add the file to the translations list + string(APPEND QT_TRANSLATIONS_LIST " ${qt_translation_file_dest}\n") + list(APPEND QM_FILES "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file_dest}") + endif() + add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/86box_${PO_FILE_NAME}.qm" COMMAND "$" -i ${po_file} -o ${CMAKE_CURRENT_BINARY_DIR}/86box_${PO_FILE_NAME}.qm WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" @@ -465,5 +504,6 @@ foreach(po_file ${po_files}) list(APPEND QM_FILES "${CMAKE_CURRENT_BINARY_DIR}/86box_${PO_FILE_NAME}.qm") list(APPEND QM_FILES "${po_file}") endforeach() -configure_file(qt_translations.qrc ${CMAKE_CURRENT_BINARY_DIR} COPYONLY) + +configure_file(qt_translations.qrc.in ${CMAKE_CURRENT_BINARY_DIR}/qt_translations.qrc) target_sources(ui PRIVATE ${QM_FILES} ${CMAKE_CURRENT_BINARY_DIR}/qt_translations.qrc) diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 4e53b2818..9e1f8c168 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -195,7 +195,9 @@ ProgSettings::loadTranslators(QObject *parent) qDebug() << "Translations loaded.\n"; QCoreApplication::installTranslator(translator); if (!qtTranslator->load(QLatin1String("qtbase_") + localetofilename.replace('-', '_'), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) - qtTranslator->load(QLatin1String("qt_") + localetofilename.replace('-', '_'), QApplication::applicationDirPath() + "/./translations/"); + if (!qtTranslator->load(QLatin1String("qtbase_") + localetofilename.left(localetofilename.indexOf('-')), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) + if (!qtTranslator->load(QLatin1String("qt_") + localetofilename.replace('-', '_'), QApplication::applicationDirPath() + "/./translations/")) + qtTranslator->load(QLatin1String("qt_") + localetofilename.replace('-', '_'), QLatin1String(":/")); if (QApplication::installTranslator(qtTranslator)) { qDebug() << "Qt translations loaded." << "\n"; @@ -207,7 +209,10 @@ ProgSettings::loadTranslators(QObject *parent) translator->load(QLatin1String("86box_") + lcid_langcode[lang_id].first, QLatin1String(":/")); QCoreApplication::installTranslator(translator); if (!qtTranslator->load(QLatin1String("qtbase_") + QString(lcid_langcode[lang_id].first).replace('-', '_'), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) - qtTranslator->load(QLatin1String("qt_") + QString(lcid_langcode[lang_id].first).replace('-', '_'), QApplication::applicationDirPath() + "/./translations/"); + if (!qtTranslator->load(QLatin1String("qtbase_") + QString(lcid_langcode[lang_id].first).left(QString(lcid_langcode[lang_id].first).indexOf('-')), QLibraryInfo::location(QLibraryInfo::TranslationsPath))) + if(!qtTranslator->load(QLatin1String("qt_") + QString(lcid_langcode[lang_id].first).replace('-', '_'), QApplication::applicationDirPath() + "/./translations/")) + qtTranslator->load(QLatin1String("qt_") + QString(lcid_langcode[lang_id].first).replace('-', '_'), QLatin1String(":/")); + QCoreApplication::installTranslator(qtTranslator); } } diff --git a/src/qt/qt_translations.qrc b/src/qt/qt_translations.qrc.in similarity index 97% rename from src/qt/qt_translations.qrc rename to src/qt/qt_translations.qrc.in index 9f75fd6d6..96f7291fc 100644 --- a/src/qt/qt_translations.qrc +++ b/src/qt/qt_translations.qrc.in @@ -24,5 +24,6 @@ 86box_vi-VN.qm 86box_zh-CN.qm 86box_zh-TW.qm +@QT_TRANSLATIONS_LIST@ From 48d4ac730c5780c8eb2aae3ee6cb367023526508 Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 18 Nov 2024 00:47:53 +0100 Subject: [PATCH 593/624] Turkish and German fixes and added the three missing strigns to all the other previously committed languages. --- src/qt/languages/ca-ES.po | 9 + src/qt/languages/cs-CZ.po | 9 + src/qt/languages/de-DE.po | 155 ++++++++------- src/qt/languages/es-ES.po | 9 + src/qt/languages/fi-FI.po | 9 + src/qt/languages/fr-FR.po | 9 + src/qt/languages/hr-HR.po | 9 + src/qt/languages/hu-HU.po | 9 + src/qt/languages/it-IT.po | 9 + src/qt/languages/ja-JP.po | 9 + src/qt/languages/ko-KR.po | 9 + src/qt/languages/pl-PL.po | 9 + src/qt/languages/pt-BR.po | 9 + src/qt/languages/pt-PT.po | 9 + src/qt/languages/ru-RU.po | 9 + src/qt/languages/sk-SK.po | 9 + src/qt/languages/sl-SI.po | 9 + src/qt/languages/tr-TR.po | 389 +++++++++++++++++++------------------- 18 files changed, 425 insertions(+), 263 deletions(-) diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index ddbb345ff..359912393 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -2111,3 +2111,12 @@ 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 "IBM 8514/A clone (ISA)" +msgstr "Clon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Frabricant" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index a6a7d3d6a..181b49165 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -2111,3 +2111,12 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Vysoký dopad na výkon" + +msgid "RAM Disk (max. speed)" +msgstr "Disk RAM (max. rychlost)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "Klon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Výrobce" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 284bf8653..99161a109 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -100,10 +100,10 @@ msgid "&8x" msgstr "&8x" msgid "Filter method" -msgstr "Filteringmethode" +msgstr "Filterungsmethode" msgid "&Nearest" -msgstr "&Nächst" +msgstr "&Nächster Nachbar" msgid "&Linear" msgstr "&Linear" @@ -115,10 +115,10 @@ msgid "&Fullscreen\tCtrl+Alt+PgUp" msgstr "&Vollbild\tStrg+Alt+Bild auf" msgid "Fullscreen &stretch mode" -msgstr "&Strecken-Modus im Vollbildmodus" +msgstr "&Vollbild-Skalierungsmodus" msgid "&Full screen stretch" -msgstr "&Vollbild-Stretching" +msgstr "&Vollbild-Streckung" msgid "&4:3" msgstr "&4:3-Seitenverhältnis erzwingen" @@ -214,13 +214,13 @@ msgid "&About 86Box..." msgstr "&Über 86Box..." msgid "&New image..." -msgstr "&Neues Image..." +msgstr "&Neues Abbild..." msgid "&Existing image..." -msgstr "&Bestehendes Image..." +msgstr "&Bestehendes Abbild..." msgid "Existing image (&Write-protected)..." -msgstr "Bestehendes Image (&schreibgeschützt)..." +msgstr "Bestehendes Abbild (&schreibgeschützt)..." msgid "&Record" msgstr "&Aufnehmen" @@ -238,7 +238,7 @@ msgid "E&ject" msgstr "A&uswerfen" msgid "&Image..." -msgstr "&Cartridgeimage..." +msgstr "&Cartridgeabbild..." msgid "E&xport to 86F..." msgstr "&In das 86F-Format e&xportieren..." @@ -250,7 +250,7 @@ msgid "E&mpty" msgstr "L&eer" msgid "&Reload previous image" -msgstr "&Voriges Image neu laden" +msgstr "&Voriges Abbild neu laden" msgid "&Folder..." msgstr "&Verzeichnis..." @@ -292,7 +292,7 @@ msgid "Sound Gain" msgstr "Klangverstärkung" msgid "New Image" -msgstr "Neues Image" +msgstr "Neues Abbild" msgid "Settings" msgstr "Optionen" @@ -325,7 +325,7 @@ msgid "File name:" msgstr "Dateiname:" msgid "Disk size:" -msgstr "Plattengröße:" +msgstr "Datenträgergröße:" msgid "RPM mode:" msgstr "Drehzahlmodus:" @@ -355,7 +355,7 @@ msgid "CPU type:" msgstr "CPU-Typ:" msgid "Speed:" -msgstr "Takt:" +msgstr "Geschwindigkeit:" msgid "Frequency:" msgstr "Frequenz:" @@ -433,10 +433,10 @@ msgid "Sound card #4:" msgstr "Soundkarte 4:" msgid "MIDI Out Device:" -msgstr "MIDI Out-Gerät:" +msgstr "MIDI Ausgabegerät:" msgid "MIDI In Device:" -msgstr "MIDI In-Gerät:" +msgstr "MIDI Eingabegerät:" msgid "Standalone MPU-401" msgstr "Eigenständiges-MPU-401-Gerät" @@ -580,7 +580,7 @@ msgid "Type:" msgstr "Typ:" msgid "Image Format:" -msgstr "Imageformat:" +msgstr "Abbildformat:" msgid "Block Size:" msgstr "Blockgröße:" @@ -652,7 +652,7 @@ msgid "ZIP %03i %i (%s): %ls" msgstr "ZIP %03i %i (%s): %ls" msgid "ZIP images" -msgstr "ZIP-Images" +msgstr "ZIP-Abbilder" msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." msgstr "86Box konnte keine nutzbaren ROM-Dateien finden.\n\nBitte besuchen Sie download, laden ein ROM-Set herunter und extrahieren dies in das \"roms\"-Verzeichnis." @@ -673,13 +673,13 @@ msgid "Off" msgstr "Aus" msgid "All images" -msgstr "Alle Images" +msgstr "Alle Abbilder" msgid "Basic sector images" -msgstr "Basissektorimages" +msgstr "Basissektorabbilder" msgid "Surface images" -msgstr "Oberflächenimages" +msgstr "Oberflächenabbilder" msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." msgstr "Das System \"%hs\" ist aufgrund von fehlenden ROMs im Verzeichnis roms/machines nicht verfügbar. Es wird auf ein verfügbares System gewechselt." @@ -811,10 +811,10 @@ msgid "Floppy %i (%s): %ls" msgstr "Diskette %i (%s): %ls" msgid "Advanced sector images" -msgstr "Fortgeschrittene Sektorimages" +msgstr "Fortgeschrittene Sektorabbilder" msgid "Flux images" -msgstr "Fluximages" +msgstr "Fluxabbilder" msgid "Are you sure you want to hard reset the emulated machine?" msgstr "Sind Sie sich sicher, dass Sie einen Kaltstart für das emulierte System durchführen wollen?" @@ -832,7 +832,7 @@ msgid "MO %i (%ls): %ls" msgstr "MO %i (%ls): %ls" msgid "MO images" -msgstr "MO-Images" +msgstr "MO-Abbilder" msgid "Welcome to 86Box!" msgstr "Willkommen bei 86Box!" @@ -895,7 +895,7 @@ msgid "Don't reset" msgstr "Nicht zurücksetzen" msgid "CD-ROM images" -msgstr "CD-ROM-Images" +msgstr "CD-ROM-Abbilder" msgid "%1 Device Configuration" msgstr "%1-Gerätekonfiguration" @@ -913,7 +913,7 @@ msgid "You are loading an unsupported configuration" msgstr "Zur Zeit wird eine nicht unterstützte Konfiguration geladen" 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 "Das Filtern der CPU-Typen basierend auf dem ausgewählten System ist für dieses System deaktiviert.\n\nDies ermöglicht es, dass man eine sonst nicht mit dem ausgewählten System inkompatible CPU auswählen kann. Allerdings kann dies zu Inkompatiblilitäten mit dem BIOS des Systems oder anderen Programmen kommen.\n\nDas Aktivieren dieser Einstellung wird nicht unterstützt und sämtliche Bugreports können als \"invalid\" geschlossen werden." +msgstr "Das Filtern der CPU-Typen basierend auf dem ausgewählten System ist für dieses System deaktiviert.\n\nDies ermöglicht es, dass man eine sonst nicht mit dem ausgewählten System inkompatible CPU auswählen kann. Allerdings kann dies zu Inkompatiblilitäten mit dem BIOS des Systems oder anderen Programmen kommen.\n\nDas Aktivieren dieser Einstellung wird nicht unterstützt und sämtliche Bugreports können als \"ungültig\" geschlossen werden." msgid "Continue" msgstr "Fortfahren" @@ -922,13 +922,13 @@ msgid "Cassette: %s" msgstr "Kassette: %s" msgid "Cassette images" -msgstr "Kassettenimages" +msgstr "Kassettenabbilder" msgid "Cartridge %i: %ls" msgstr "Cartridge %i: %ls" msgid "Cartridge images" -msgstr "Cartridgeimages" +msgstr "Cartridgeabbilder" msgid "Error initializing renderer" msgstr "Fehler bei der Initialisierung des Renderer" @@ -973,13 +973,13 @@ msgid "Add Existing Hard Disk" msgstr "Bestehende Festplatte hinzufügen" msgid "HDI disk images cannot be larger than 4 GB." -msgstr "HDI-Diskimages können nicht größer als 4 GB groß sein." +msgstr "HDI-Abbilder können nicht größer als 4 GB groß sein." msgid "Disk images cannot be larger than 127 GB." -msgstr "Festplattenimages können nicht größer als 127 GB groß sein." +msgstr "Festplattenabbilder können nicht größer als 127 GB groß sein." msgid "Hard disk images" -msgstr "Festplattenimages" +msgstr "Festplattenabbilder" msgid "Unable to read file" msgstr "Die Datei konnte nicht gelesen werden" @@ -988,16 +988,16 @@ msgid "Unable to write file" msgstr "Die Datei konnte nicht beschrieben werden" msgid "HDI or HDX images with a sector size other than 512 are not supported." -msgstr "HDI- oder HDX-Images mit einer Sektorgröße größer als 512 kB werden nicht unterstützt." +msgstr "HDI- oder HDX-Abbilder mit einer Sektorgröße größer als 512 kB werden nicht unterstützt." msgid "Disk image file already exists" -msgstr "Die Festplattenimagedatei existiert bereits" +msgstr "Das Festplattenabbild existiert bereits" msgid "Please specify a valid file name." msgstr "Gültiger Dateinamen eingeben." msgid "Disk image created" -msgstr "Disk-Image wurde erstellt" +msgstr "Disk-Abbild wurde erstellt" msgid "Make sure the file exists and is readable." msgstr "Stell sicher, dass die Datei existiert und lesbar ist." @@ -1006,16 +1006,16 @@ msgid "Make sure the file is being saved to a writable directory." msgstr "Stell sicher, dass die Datei in ein Verzeichnis mit Schreibberechtigungen gespeichert wird." msgid "Disk image too large" -msgstr "Das Festplattenimage ist zu groß" +msgstr "Das Festplattenabbild ist zu groß" msgid "Remember to partition and format the newly-created drive." -msgstr "Partitioniere und Formatiere das neu erstellte Laufwerk, ansonsten es nicht zu gebruachen ist." +msgstr "Stellen Sie sicher, dass das neu erstellte Laufwerk partitioniert und formatiert wird." msgid "The selected file will be overwritten. Are you sure you want to use it?" msgstr "Die ausgewählte Datei wird überschrieben. Soll diese Datei genutzen werden?" msgid "Unsupported disk image" -msgstr "Nicht unterstütztes Festplattenimage" +msgstr "Nicht unterstütztes Festplattenabbild" msgid "Overwrite" msgstr "Überschreiben" @@ -1024,13 +1024,13 @@ msgid "Don't overwrite" msgstr "Nicht überschreiben" msgid "Raw image" -msgstr "Rohdatenimages" +msgstr "Rohdatenabbilder" msgid "HDI image" -msgstr "HDI-Images" +msgstr "HDI-Abbild" msgid "HDX image" -msgstr "HDX-Images" +msgstr "HDX-Abbild" msgid "Fixed-size VHD" msgstr "VHD mit fester Größe" @@ -1045,13 +1045,13 @@ msgid "(N/A)" msgstr "(Kein)" msgid "Raw image (.img)" -msgstr "Rohdatenimages (.img)" +msgstr "Rohdatenabbild (.img)" msgid "HDI image (.hdi)" -msgstr "HDI-Images (.hdi)" +msgstr "HDI-Abbild (.hdi)" msgid "HDX image (.hdx)" -msgstr "HDX-Images (.hdx)" +msgstr "HDX-Abbild (.hdx)" msgid "Fixed-size VHD (.vhd)" msgstr "VHD mit fester Größe (.vhd)" @@ -1075,7 +1075,7 @@ msgid "Select the parent VHD" msgstr "Eltern-VHD-Datei bitte auswählen" 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 "Dies bedeutet, dass das Elternimage nach der Erstellung des differenzierenden Images erzeugt wurde.\n\nDies kann auch passieren, falls die Image-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Image erstellt hat, passieren.\n\nSoll der Zeitstempel korrigiert werden?" +msgstr "Dies bedeutet, dass das Elternabbild nach der Erstellung des differenzierenden Abbild erzeugt wurde.\n\nDies kann auch passieren, falls die Abbild-Dateien verschoben oder kopiert wurden. Ebenso kann auch dies durch einen Bug im Programm, welches das Abbild erstellt hat, passieren.\n\nSoll der Zeitstempel korrigiert werden?" msgid "Parent and child disk timestamps do not match" msgstr "Die Zeitstempel der Eltern- und der Kindesplatte stimmen nicht überein" @@ -1258,7 +1258,7 @@ msgid "Open screenshots folder..." msgstr "Ordner „screenshots“ öffnen..." msgid "Apply fullscreen stretch mode when maximized" -msgstr "Strecken-Modus im Vollbildmodus bei Maximierung anwenden" +msgstr "Vollbild-Streckmodus aktivieren, wenn das Fenster maximiert ist" msgid "Cursor/Puck" msgstr "Mauszeiger/Puck" @@ -1273,13 +1273,13 @@ msgid "&Connected" msgstr "&Verbunden" msgid "Clear image history" -msgstr "Bildverlauf löschen" +msgstr "Abbildverlauf löschen" msgid "Create..." msgstr "Erstellen..." msgid "previous image" -msgstr "Voriges Image" +msgstr "Vorheriges Abbild" msgid "Host CD/DVD Drive (%1)" msgstr "Host-CD/DVD-Laufwerk (%1)" @@ -1312,7 +1312,7 @@ msgid "Render behavior" msgstr "Rendering-Verhalten" msgid "Use target framerate:" -msgstr "Zielframerate verwenden:" +msgstr "Zielbildwiederholrate verwenden:" msgid " fps" msgstr " fps" @@ -1369,7 +1369,7 @@ msgid "Allocating memory for unpack buffer failed.\n" msgstr "Nicht genug Speicher zum Entpacken.\n" msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Bei der Auswahl von Medien-Images (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>" +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>" msgid "This machine might have been moved or copied." msgstr "Dieses System wurde möglicherweise verschoben oder kopiert." @@ -1423,16 +1423,16 @@ msgid "Novell NetWare 2.x Key Card" msgstr "Novell NetWare 2.x Schlüsselkarte" msgid "Serial port passthrough 1" -msgstr "Durchreichen der Serielle Schnittstelle 1" +msgstr "Durchreichung der Serielle Schnittstelle 1" msgid "Serial port passthrough 2" -msgstr "Durchreichen der Serielle Schnittstelle 2" +msgstr "Durchreichung der Serielle Schnittstelle 2" msgid "Serial port passthrough 3" -msgstr "Durchreichen der Serielle Schnittstelle 3" +msgstr "Durchreichung der Serielle Schnittstelle 3" msgid "Serial port passthrough 4" -msgstr "Durchreichen der Serielle Schnittstelle 4" +msgstr "Durchreichung der Serielle Schnittstelle 4" msgid "Vision Systems LBA Enhancer" msgstr "Vision Systems LBA Enhancer" @@ -1636,7 +1636,7 @@ msgid "Baud Rate" msgstr "Baudrate" msgid "TCP/IP listening port" -msgstr "TCP/IP-Abhörport" +msgstr "TCP/IP-Warteport" msgid "Phonebook File" msgstr "Telefonbuch-Datei" @@ -1975,13 +1975,13 @@ msgid "128 kB" msgstr "128 kB" msgid "Monochrome (5151/MDA) (white)" -msgstr "Monochrom (5151/MDA) (weißes)" +msgstr "Monochrom (5151/MDA) (weiß)" msgid "Monochrome (5151/MDA) (green)" -msgstr "Monochrom (5151/MDA) (grünes)" +msgstr "Monochrom (5151/MDA) (grün)" msgid "Monochrome (5151/MDA) (amber)" -msgstr "Monochrom (5151/MDA) (bernsteinfarbenes)" +msgstr "Monochrom (5151/MDA) (bernsteinfarben)" msgid "Color 40x25 (5153/CGA)" msgstr "Farbe 40x25 (5153/CGA)" @@ -1990,16 +1990,16 @@ msgid "Color 80x25 (5153/CGA)" msgstr "Farbe 80x25 (5153/CGA)" msgid "Enhanced Color - Normal Mode (5154/ECD)" -msgstr "Erhöhte Farbe - Normaler Modus (5154/ECD)" +msgstr "Erweiterte Farbe - Normaler Modus (5154/ECD)" msgid "Enhanced Color - Enhanced Mode (5154/ECD)" -msgstr "Erhöhte Farbe - Erhöhter Modus (5154/ECD)" +msgstr "Erweiterte Farbe - Erweiterter Modus (5154/ECD)" msgid "Green" -msgstr "Grünes" +msgstr "Grün" msgid "Amber" -msgstr "Bernsteinfarbenes" +msgstr "Bernsteinfarben" msgid "Gray" msgstr "Graues" @@ -2008,7 +2008,7 @@ msgid "Color" msgstr "Farbe" msgid "U.S. English" -msgstr "U.S. Englisch" +msgstr "Amerikanisches Englisch" msgid "Scandinavian" msgstr "Skandinavisch" @@ -2020,16 +2020,16 @@ msgid "Bochs latest" msgstr "Bochs neueste" msgid "Mono Non-Interlaced" -msgstr "Monochrom nicht interlacet" +msgstr "Monochrom (Kein Zeilensprungverfahren)" msgid "Color Interlaced" -msgstr "Farbe interlacet" +msgstr "Farbe (Mit Zeilensprungverfahren)" msgid "Color Non-Interlaced" -msgstr "Farbe nicht interlacet" +msgstr "Farbe (Kein Zeilensprungverfahren)" msgid "3Dfx Voodoo Graphics" -msgstr "3dfx Voodoo Grafik" +msgstr "3Dfx Voodoo Grafik" msgid "Obsidian SB50 + Amethyst (2 TMUs)" msgstr "Obsidian SB50 + Amethyst (2 TMUs)" @@ -2044,7 +2044,7 @@ msgid "Standard (150ns)" msgstr "Standard (150ns)" msgid "High-Speed (120ns)" -msgstr "Hochgeschwindigkeit (120ns)" +msgstr "Höchstgeschwindigkeit (120ns)" msgid "Enabled" msgstr "Eingeschaltet" @@ -2053,7 +2053,7 @@ msgid "Standard" msgstr "Standard" msgid "High-Speed" -msgstr "Hochgeschwindigkeit" +msgstr "Höchstgeschwindigkeit" msgid "Stereo LPT DAC" msgstr "Stereo-LPT-DAC" @@ -2062,7 +2062,7 @@ msgid "Generic Text Printer" msgstr "Generischer Textdrucker" msgid "Generic ESC/P Dot-Matrix" -msgstr "Allgemeiner ESC/P-Nadel" +msgstr "Allgemeiner ESC/P-Nadel-Drucker" msgid "Generic PostScript Printer" msgstr "Generischer PostScript-Drucker" @@ -2071,16 +2071,16 @@ msgid "Generic PCL5e Printer" msgstr "Generischer PCL5e-Drucker" msgid "Parallel Line Internet Protocol" -msgstr "Parallel Line Internet Protocol" +msgstr "Parallel Line Internet Protokoll" msgid "Protection Dongle for Savage Quest" msgstr "Kopierschutz-Dongle für Savage Quest" msgid "Serial Passthrough Device" -msgstr "Gerät des Passthroughs der Serielle Schnittstelle" +msgstr "Gerät der Durchreichung der Serielle Schnittstelle" msgid "Passthrough Mode" -msgstr "Modus des Passthroughs" +msgstr "Modus der Durchreichung" msgid "Host Serial Device" msgstr "Host Serielles Gerät" @@ -2095,16 +2095,16 @@ msgid "Stop bits" msgstr "Stoppbits" msgid "Baud Rate of Passthrough" -msgstr "Baudrate des Passthroughs" +msgstr "Baudrate der Durchreichung" msgid "Named Pipe (Server)" msgstr "Benanntes Pipe (Server)" msgid "Host Serial Passthrough" -msgstr "Passthrough der seriellen Schnittstelle des Hosts" +msgstr "Durchreichung der seriellen Schnittstelle des Hosts" msgid "Eject %s" -msgstr "%s auswerfen" +msgstr "Auswerfen %s" msgid "&Unmute" msgstr "&Ton einschalten" @@ -2114,3 +2114,12 @@ msgstr "Softfloat-FPU" msgid "High performance impact" msgstr "Hohe Auswirkung auf die Leistung" + +msgid "RAM Disk (max. speed)" +msgstr "RAM-Diskette (maximale Geschwindigkeit)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A-Klon (ISA)" + +msgid "Vendor" +msgstr "Hersteller" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index fc419713e..abcdb5daf 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -2110,3 +2110,12 @@ 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 "IBM 8514/A clone (ISA)" +msgstr "Clon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Fabricante" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 51bcd4884..2c03cce11 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -2111,3 +2111,12 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Suuri vaikutus suorituskykyyn" + +msgid "RAM Disk (max. speed)" +msgstr "RAM-levy (maksiminopeus)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A-klooni (ISA)" + +msgid "Vendor" +msgstr "Valmistaja" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index d621a60a1..8e69a03d6 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -2111,3 +2111,12 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Impact important sur la performance" + +msgid "RAM Disk (max. speed)" +msgstr "Disque RAM (vitesse maximale)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "Clon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Fabricant" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index d33e9eec2..d05dd8f60 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -2111,3 +2111,12 @@ 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 "IBM 8514/A clone (ISA)" +msgstr "Klon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Proizvođać" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 06366a4ff..471f56a03 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -2111,3 +2111,12 @@ 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 "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A klón (ISA)" + +msgid "Vendor" +msgstr "Gyártó" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 6d08b73fd..614cb0f2d 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -2108,3 +2108,12 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Impatto elevato sulla prestazione" + +msgid "RAM Disk (max. speed)" +msgstr "Disco RAM (velocità massima)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "Clone IBM 8514/A(ISA)" + +msgid "Vendor" +msgstr "Fabricante" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index e6e4f7d50..ecc901d07 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -2111,3 +2111,12 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "パフォーマンスへの影響が大きい" + +msgid "RAM Disk (max. speed)" +msgstr "RAMディスク(最高速度)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A クローン(ISA)" + +msgid "Vendor" +msgstr "業者" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 6be66f143..25d0c6034 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -2111,3 +2111,12 @@ msgstr "소프트플로트 FPU" msgid "High performance impact" msgstr "성능에 미치는 영향" + +msgid "RAM Disk (max. speed)" +msgstr "RAM 디스크(최대 속도)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A 클론(ISA)" + +msgid "Vendor" +msgstr "제조사" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 384251872..d63cbf5c8 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -2111,3 +2111,12 @@ 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 "IBM 8514/A clone (ISA)" +msgstr "Klon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Producent" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 4d2eb2c84..3084619ab 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -2111,3 +2111,12 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Alto impacto no desempenho" + +msgid "RAM Disk (max. speed)" +msgstr "Disco RAM (velocidade máxima)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "Clone IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Fabricante" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 4eafb5919..1163d690e 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -2111,3 +2111,12 @@ msgstr "FPU Softfloat" msgid "High performance impact" msgstr "Elevado impacto no desempenho" + +msgid "RAM Disk (max. speed)" +msgstr "Disco RAM (velocidade máxima)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "Clone IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Fabricante" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 945c78e72..8fa25c373 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2117,3 +2117,12 @@ msgstr "30 Гц (JMP2 = 1)" msgid "60 Hz (JMP2 = 2)" msgstr "60 Гц (JMP2 = 2)" + +msgid "RAM Disk (max. speed)" +msgstr "RAM-диск (макс. скорость)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "Клон IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Производитель" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 687d5491d..34e6248c5 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -2111,3 +2111,12 @@ 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 "IBM 8514/A clone (ISA)" +msgstr "Klon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Výrobca" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index fb6fb40a2..71efb875f 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -2111,3 +2111,12 @@ 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 "IBM 8514/A clone (ISA)" +msgstr "Klon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Proizvajalec" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 885ee7a80..9e2fb8840 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -7,7 +7,7 @@ msgstr "" "X-Source-Language: en_US\n" msgid "&Action" -msgstr "&Komutlar" +msgstr "&Eylem" msgid "&Keyboard requires capture" msgstr "&Klavye sadece fare yakalandığında çalışsın" @@ -16,28 +16,28 @@ msgid "&Right CTRL is left ALT" msgstr "&Sağ CTRL tuşunu sol ALT tuşu olarak ayarla" msgid "&Hard Reset..." -msgstr "&Makineyi yeniden başlat..." +msgstr "Yeniden başlamaya &zorla" msgid "&Ctrl+Alt+Del\tCtrl+F12" msgstr "&Ctrl+Alt+Del\tCtrl+F12" msgid "Ctrl+Alt+&Esc" -msgstr "Ctrl+Alt+&Esc" +msgstr "Ctrl+&Alt+Esc" msgid "&Pause" msgstr "&Duraklat" msgid "E&xit..." -msgstr "Emülatörden &çık..." +msgstr "&Çıkış..." msgid "&View" -msgstr "&Görüntüleme" +msgstr "&Görünüm" msgid "&Hide status bar" msgstr "&Durum çubuğunu gizle" msgid "Hide &toolbar" -msgstr "Hide &toolbar" +msgstr "Araç &çubuğunu gizle" msgid "&Resizeable window" msgstr "&Yeniden boyutlandırılabilir pencere" @@ -55,7 +55,7 @@ msgid "Qt (&OpenGL)" msgstr "Qt (&OpenGL)" msgid "Open&GL (3.0 Core)" -msgstr "Open&GL (3.0 Core)" +msgstr "OpenG&L (3.0 bazlı)" msgid "&VNC" msgstr "&VNC" @@ -64,7 +64,7 @@ msgid "Specify dimensions..." msgstr "Pencere &boyutunu belirle..." msgid "F&orce 4:3 display ratio" -msgstr "&4:3 görüntüleme oranına zorla" +msgstr "4:3 görüntü oranına &zorla" msgid "&Window scale factor" msgstr "Pencere &ölçek çarpanı" @@ -100,22 +100,22 @@ msgid "&8x" msgstr "&8x" msgid "Filter method" -msgstr "&Filtre metodu" +msgstr "&Filtreleme yöntemi" msgid "&Nearest" -msgstr "&Nearest (En yakın)" +msgstr "&En yakın" msgid "&Linear" -msgstr "&Linear (Doğrusal)" +msgstr "Doğ&rusal" msgid "Hi&DPI scaling" -msgstr "Hi&DPI ölçeklemesi" +msgstr "HiDPI ölçekle&mesi" msgid "&Fullscreen\tCtrl+Alt+PgUp" -msgstr "&Tam ekran\tCtrl+Alt+PgUp" +msgstr "Tam ekran\tCtrl+Alt+Pg&Up" msgid "Fullscreen &stretch mode" -msgstr "Tam ekran &germe modu" +msgstr "Tam e&kran germe modu" msgid "&Full screen stretch" msgstr "&Tam ekrana ger" @@ -130,13 +130,13 @@ msgid "&Integer scale" msgstr "Tam &sayı ölçeklemesi" msgid "4:&3 Integer scale" -msgstr "4:&3 Tam sayı ölçeklemesi" +msgstr "Tam sayı ölçeklemesi (4:&3)" msgid "E&GA/(S)VGA settings" msgstr "EGA/&(S)VGA ayarları" msgid "&Inverted VGA monitor" -msgstr "Ters &renk VGA monitör" +msgstr "Ters &renkli VGA monitör" msgid "VGA screen &type" msgstr "VGA ekran &tipi" @@ -148,13 +148,13 @@ msgid "&RGB Grayscale" msgstr "RGB (&gri tonlama)" msgid "&Amber monitor" -msgstr "&Kehribar rengi monitör" +msgstr "&Kehribar renkli monitör" msgid "&Green monitor" -msgstr "&Yeşil renk monitör" +msgstr "&Yeşil renkli monitör" msgid "&White monitor" -msgstr "&Beyaz renk monitör" +msgstr "&Beyaz renkli monitör" msgid "Grayscale &conversion type" msgstr "&Gri tonlama dönüştürme türü" @@ -184,7 +184,7 @@ msgid "&Settings..." msgstr "&Ayarlar..." msgid "&Update status bar icons" -msgstr "Durum &çubuğu ikonlarını güncelle" +msgstr "Durum &çubuğu simgelerini güncelle" msgid "Take s&creenshot\tCtrl+F11" msgstr "&Ekran görüntüsü al\tCtrl+F11" @@ -196,13 +196,13 @@ msgid "Enable &Discord integration" msgstr "&Discord entegrasyonunu etkinleştir" msgid "Sound &gain..." -msgstr "&Ses yükseltici..." +msgstr "&Ses düzeyi artışı..." msgid "Begin trace\tCtrl+T" -msgstr "Begin trace\tCtrl+T" +msgstr "İzlemeyi başlat\tCtrl+T" msgid "End trace\tCtrl+T" -msgstr "End trace\tCtrl+T" +msgstr "İzlemeyi bitir\tCtrl+T" msgid "&Help" msgstr "&Yardım" @@ -211,7 +211,7 @@ msgid "&Documentation..." msgstr "&Dökümanlar..." msgid "&About 86Box..." -msgstr "&86Box Hakkında..." +msgstr "&86Box hakkında..." msgid "&New image..." msgstr "&Yeni imaj oluştur..." @@ -220,7 +220,7 @@ msgid "&Existing image..." msgstr "&İmaj seç..." msgid "Existing image (&Write-protected)..." -msgstr "İmaj &seç (Yazma-korumalı)..." +msgstr "İmaj &seç (Yazma korumalı)..." msgid "&Record" msgstr "&Kaydet" @@ -241,7 +241,7 @@ msgid "&Image..." msgstr "&İmaj..." msgid "E&xport to 86F..." -msgstr "&86F dosyası olarak aktar..." +msgstr "&86F dosyası olarak kaydet..." msgid "&Mute" msgstr "&Sesi kapat" @@ -250,13 +250,13 @@ msgid "E&mpty" msgstr "İmajı &çıkar" msgid "&Reload previous image" -msgstr "&Önceki imajı seç" +msgstr "&Önceki imajı yeniden seç" msgid "&Folder..." msgstr "&Klasör..." msgid "Target &framerate" -msgstr "Hedef &kare oranı" +msgstr "Hedef &kare hızı oranı" msgid "&Sync with video" msgstr "Video ile &senkronize et" @@ -289,25 +289,25 @@ msgid "Preferences" msgstr "Tercihler" msgid "Sound Gain" -msgstr "Ses Artırma" +msgstr "Ses düzeyi artışı" msgid "New Image" -msgstr "Yeni İmaj" +msgstr "Yeni imaj" msgid "Settings" msgstr "Ayarlar" msgid "Specify Main Window Dimensions" -msgstr "Ana Pencere Boyutunu Belirle" +msgstr "Ana pencere boyutunu belirle" msgid "OK" msgstr "Tamam" msgid "Cancel" -msgstr "İptal et" +msgstr "İptal" msgid "Save these settings as &global defaults" -msgstr "Bu ayarları &varsayılan olarak kaydet" +msgstr "Ayarları &varsayılan olarak kaydet" msgid "&Default" msgstr "&Varsayılan" @@ -319,7 +319,7 @@ msgid "Icon set:" msgstr "Simge seti:" msgid "Gain" -msgstr "Artırma" +msgstr "Artış" msgid "File name:" msgstr "Dosya adı:" @@ -352,16 +352,16 @@ msgid "Configure" msgstr "Ayarla" msgid "CPU type:" -msgstr "CPU türü:" +msgstr "İşlemci türü:" msgid "Speed:" msgstr "Hız:" msgid "Frequency:" -msgstr "Sıklık:" +msgstr "Saat hızı:" msgid "FPU:" -msgstr "FPU:" +msgstr "Kayan Nokta Birimi (FPU):" msgid "Wait states:" msgstr "Bekleme süreleri:" @@ -385,7 +385,7 @@ msgid "Enabled (UTC)" msgstr "Etkin (UTC)" msgid "Dynamic Recompiler" -msgstr "Dinamik Derleyici" +msgstr "Dinamik derleyici" msgid "Video:" msgstr "Ekran kartı:" @@ -394,13 +394,13 @@ msgid "Video #2:" msgstr "Ekran kartı 2:" msgid "Voodoo 1 or 2 Graphics" -msgstr "Voodoo 1 veya 2 Grafikleri" +msgstr "Voodoo 1 veya 2 grafikleri" msgid "IBM 8514/A Graphics" -msgstr "IBM 8514/A Grafikleri" +msgstr "IBM 8514/A grafikleri" msgid "XGA Graphics" -msgstr "XGA Grafikleri" +msgstr "XGA grafikleri" msgid "Mouse:" msgstr "Fare:" @@ -433,16 +433,16 @@ msgid "Sound card #4:" msgstr "Ses kartı 4:" msgid "MIDI Out Device:" -msgstr "MIDI Çıkış Cihazı:" +msgstr "MIDI çıkış cihazı:" msgid "MIDI In Device:" -msgstr "MIDI Giriş Cihazı:" +msgstr "MIDI giriş cihazı:" msgid "Standalone MPU-401" msgstr "Bağımsız MPU-401" msgid "Use FLOAT32 sound" -msgstr "FLOAT32 ses kullan" +msgstr "FLOAT32 sesi kullan" msgid "FM synth driver" msgstr "FM sentez sürücüsü" @@ -463,28 +463,28 @@ msgid "Network adapter:" msgstr "Ağ cihazı:" msgid "COM1 Device:" -msgstr "COM1 Cihazı:" +msgstr "COM1 cihazı:" msgid "COM2 Device:" -msgstr "COM2 Cihazı:" +msgstr "COM2 cihazı:" msgid "COM3 Device:" -msgstr "COM3 Cihazı:" +msgstr "COM3 cihazı:" msgid "COM4 Device:" -msgstr "COM4 Cihazı:" +msgstr "COM4 cihazı:" msgid "LPT1 Device:" -msgstr "LPT1 Cihazı:" +msgstr "LPT1 cihazı:" msgid "LPT2 Device:" -msgstr "LPT2 Cihazı:" +msgstr "LPT2 cihazı:" msgid "LPT3 Device:" -msgstr "LPT3 Cihazı:" +msgstr "LPT3 cihazı:" msgid "LPT4 Device:" -msgstr "LPT4 Cihazı:" +msgstr "LPT4 cihazı:" msgid "Serial port 1" msgstr "Seri port 1" @@ -511,16 +511,16 @@ msgid "Parallel port 4" msgstr "Paralel port 4" msgid "HD Controller:" -msgstr "HD Kontrolcüsü:" +msgstr "Hard disk kontrolcüsü:" msgid "FD Controller:" -msgstr "FD Kontrolcüsü:" +msgstr "Disket sürücü kontrolcüsü:" msgid "Tertiary IDE Controller" -msgstr "Üçlü IDE Kontrolcüsü" +msgstr "Üçlü IDE kontrolcüsü" msgid "Quaternary IDE Controller" -msgstr "Dörtlü IDE Kontrolcüsü" +msgstr "Dörtlü IDE kontrolcüsü" msgid "SCSI" msgstr "SCSI" @@ -547,7 +547,7 @@ msgid "&New..." msgstr "&Yeni..." msgid "&Existing..." -msgstr "&Var olan..." +msgstr "&Var olanı seç..." msgid "&Remove" msgstr "&Kaldır" @@ -568,7 +568,7 @@ msgid "Sectors:" msgstr "Sektörler:" msgid "Heads:" -msgstr "Veri Kafaları:" +msgstr "Veri kafaları:" msgid "Cylinders:" msgstr "Silindirler:" @@ -577,13 +577,13 @@ msgid "Size (MB):" msgstr "Boyut (MB):" msgid "Type:" -msgstr "Tip:" +msgstr "Tür:" msgid "Image Format:" -msgstr "İmaj Düzeni:" +msgstr "İmaj düzeni:" msgid "Block Size:" -msgstr "Blok Boyutu:" +msgstr "Blok boyutu:" msgid "Floppy drives:" msgstr "Disket sürücüleri:" @@ -610,7 +610,7 @@ msgid "ISA RTC:" msgstr "ISA RTC:" msgid "ISA Memory Expansion" -msgstr "ISA Bellek Artırma" +msgstr "ISA bellek artırma" msgid "Card 1:" msgstr "Kart 1:" @@ -640,7 +640,7 @@ msgid "Fatal error" msgstr "Kritik hata" msgid " - PAUSED" -msgstr " - DURAKLATILMIŞ" +msgstr " - DURAKLATILDI" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Pencere moduna geri dönmek için Ctrl+Alt+PgDn tuşlarına basın." @@ -655,13 +655,13 @@ msgid "ZIP images" msgstr "ZIP imajları" msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." -msgstr "86Box hiç bir kullanılabilir ROM imajı bulamadı.\n\nLütfen ROM setini indirin ve onu \"Roms\" klasörüne çıkarın." +msgstr "86Box kullanılabilir hiçbir ROM imajı bulamadı.\n\nLütfen ROM setini indirin ve \"Roms\" klasörüne çıkarın." msgid "(empty)" -msgstr "(empty)" +msgstr "(boş)" msgid "All files" -msgstr "All files" +msgstr "Tüm dosyalar" msgid "Turbo" msgstr "Turbo" @@ -682,13 +682,13 @@ msgid "Surface images" msgstr "Yüzey imajları" msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." -msgstr "\"%hs\" makinesi roms/machines klasöründe mevcut olmayan ROM imajı yüzünden mevcut değil. Mevcut olan bir makineye geçiş yapılıyor." +msgstr "\"%hs\" makinesi roms/machines klasöründe gerekli ROM imajlarının mevcut olmaması nedeniyle kullanılamıyor. Bundan dolayı kullanılabilen bir makineye geçiş yapılacaktır." msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." -msgstr "\"%hs\" ekran kartı roms/video klasöründe mevcut olmayan ROM imajı yüzünden mevcut değil. Mevcut olan bir ekran kartına geçiş yapılıyor." +msgstr "\"%hs\" ekran kartı roms/video klasöründe gerekli ROM imajlarının mevcut olmaması nedeniyle kullanılamıyor. Bundan dolayı kullanılabilen bir ekran kartına geçiş yapılacaktır." msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." -msgstr "\"%hs\" ekran 2 kartı roms/video klasöründe mevcut olmayan ROM imajı yüzünden mevcut değil. Mevcut olan bir ekran kartına geçiş yapılıyor." +msgstr "\"%hs\" ikinci ekran kartı roms/video klasöründe gerekli ROM imajlarının mevcut olmaması nedeniyle kullanılamıyor. Bundan dolayı kullanılabilen bir ekran kartına geçiş yapılacaktır." msgid "Machine" msgstr "Makine" @@ -730,7 +730,7 @@ msgid "Press %1 to release mouse" msgstr "Farenin bırakılması için %1 tuşlarına basın" msgid "Press %1 or middle button to release mouse" -msgstr "Farenin bırakılması için %1 veya farenin orta tuşuna basın" +msgstr "Farenin bırakılması için %1 tuşlarına veya tekerlek tuşuna basın" msgid "Bus" msgstr "Veri yolu" @@ -796,7 +796,7 @@ msgid "Microsoft SideWinder Pad" msgstr "Microsoft SideWinder Pad" msgid "Thrustmaster Flight Control System" -msgstr "Thrustmaster Flight Kontrol Sistemi" +msgstr "Thrustmaster Flight Control System" msgid "None" msgstr "Hiçbiri" @@ -811,10 +811,10 @@ msgid "Advanced sector images" msgstr "Gelişmiş sektör imajları" msgid "Flux images" -msgstr "Flux images" +msgstr "Flux imajları" msgid "Are you sure you want to hard reset the emulated machine?" -msgstr "Emüle edilen makineyi yeniden başlatmak istediğinizden emin misiniz?" +msgstr "Makineyi yeniden başlamaya zorlamak istediğinizden emin misiniz?" msgid "Are you sure you want to exit 86Box?" msgstr "86Box'tan çıkmak istediğinize emin misiniz?" @@ -847,25 +847,25 @@ msgid "Do you want to save the settings?" msgstr "Ayarları kaydetmek istediğinizden emin misiniz?" msgid "This will hard reset the emulated machine." -msgstr "Bu makineyi yeniden başlatacak." +msgstr "Bu işlem makineyi zorla yeniden başlatacak." msgid "Save" msgstr "Kaydet" msgid "About 86Box" -msgstr "86Box Hakkında" +msgstr "86Box hakkında" 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." -msgstr "Bir eski bilgisayar emülatörü\n\nYapanlar: 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, ve diğerleri.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, ve diğerleri.\n\nGNU Genel Kamu Lisansı versiyon 2 veya sonrası altında yayınlanmıştır. Daha fazla bilgi için LICENSE'ı gözden geçirin." +msgstr "Bir eski bilgisayar emülatörü\n\nYapımcılar: 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 ve diğerleri.\n\nSarah Walker, leilei, JohnElliott, greatpsycho, ve diğerlerinin önceki katkılarıyla birlikte.\n\nGNU Genel Kamu Lisansı versiyon 2 veya sonrası altında yayınlanmıştır. Daha fazla bilgi için LICENSE'ı gözden geçirin." msgid "Hardware not available" msgstr "Donanım mevcut değil" msgid "Make sure %1 is installed and that you are on a libpcap-compatible network connection." -msgstr "%1 kurulu olduğundan ve libpcap-uyumlu bir internet ağında bulunduğunuzdan emin olun." +msgstr "%1 kurulu olduğundan ve libpcap uyumlu bir internet ağı kullandığınızdan emin olun." msgid "Invalid configuration" msgstr "Geçersiz konfigürasyon" @@ -874,10 +874,10 @@ msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAn msgstr "%1 PostScript dosyalarının otomatik olarak PDF dosyalarına çevirilmesi için gereklidir.\n\nGenel PostScript yazıcısına gönderilen tüm dökümanlar PostScript (.ps) dosyaları olarak kaydedilecektir." msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as Printer Command Language (.pcl) files." -msgstr "%1 PCL dosyalarının otomatik olarak PDF dosyalarına çevirilmesi için gereklidir.\n\nGenel PCL yazıcısına gönderilen tüm dökümanlar Printer Command Language (.pcl) dosyaları olarak kaydedilecektir." +msgstr "%1 PCL dosyalarının otomatik olarak PDF dosyalarına çevirilmesi için gereklidir.\n\nBu bulunmadığından dolayı genel PostScript yazıcısına gönderilen tüm dökümanlar Printer Command Language (.pcl) dosyası olarak kaydedilecektir." msgid "Entering fullscreen mode" -msgstr "Tam ekran moduna geçiliyor" +msgstr "Tam ekran moduna geçiş yapılıyor" msgid "Don't show this message again" msgstr "Bu mesajı bir daha gösterme" @@ -886,31 +886,31 @@ msgid "Don't exit" msgstr "Çıkış yapma" msgid "Reset" -msgstr "Yeniden başlat" +msgstr "Evet" msgid "Don't reset" -msgstr "Yeniden başlatma" +msgstr "Hayır" msgid "CD-ROM images" msgstr "CD-ROM imajları" msgid "%1 Device Configuration" -msgstr "%1 Cihaz Konfigürasyonu" +msgstr "%1 cihaz konfigürasyonu" msgid "Monitor in sleep mode" msgstr "Monitör uyku modunda" msgid "OpenGL Shaders" -msgstr "OpenGL Gölgelendiricileri" +msgstr "OpenGL gölgelendiricileri" msgid "OpenGL options" msgstr "OpenGL ayarları" msgid "You are loading an unsupported configuration" -msgstr "Desteklenmeyen bir konfigürasyon yüklüyorsunuz" +msgstr "Desteklenmeyen bir konfigürasyon kullanıyorsunuz" 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 "Seçtiğiniz makineye uygun CPU (işlemci) türü filtrelemesi bu emülasyon için devre dışı bırakıldı.\n\nBu, normalde seçilen makine ile uyumlu olmayan bir CPU seçmenizi mümkün kılmaktadır. Ancak, bundan dolayı seçilen makinenin BIOS'u veya diğer yazılımlar ile uyumsuzluk sorunu yaşayabilirsiniz.\n\nBu filtrelemeyi devre dışı bırakmak emülatör tarafından resmi olarak desteklenmemektedir ve açtığınız bug (hata) raporları geçersiz olarak kapatılabilir." +msgstr "Seçtiğiniz makineye uygun işlemci türü filtrelemesi bu emüle edilen makine için devre dışı bırakıldı.\n\nBu normalde makine ile uyumlu olmayan bir işlemci seçmenizi mümkün kılmaktadır. Ancak, bundan dolayı makinenin BIOS'u veya üzerinde kullanılan diğer yazılımlar ile uyumsuzluk sorunları yaşayabilirsiniz.\n\nBu filtrelemenin devre dışı bırakılması resmi olarak desteklenmemektedir ve açtığınız hata raporları geçersiz olarak kapatılabilir." msgid "Continue" msgstr "Devam et" @@ -934,22 +934,22 @@ 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 "Yürütmeye devam et" +msgstr "Çalıştırmaya devam et" msgid "Pause execution" -msgstr "Yürütmeyi duraklat" +msgstr "Çalıştırmayı duraklat" msgid "Press Ctrl+Alt+Del" -msgstr "Ctrl+Alt+Del" +msgstr "Ctrl+Alt+Del tuşlarına bas" msgid "Press Ctrl+Alt+Esc" -msgstr "Ctrl+Alt+Esc" +msgstr "Ctrl+Alt+Esc tuşlarına bas" msgid "Hard reset" msgstr "Makineyi yeniden başlat" msgid "ACPI shutdown" -msgstr "ACPI kapatma" +msgstr "ACPI kapanma" msgid "Hard disk (%1)" msgstr "Hard disk (%1)" @@ -964,16 +964,16 @@ msgid "Custom (large)..." msgstr "Diğer (büyük)..." msgid "Add New Hard Disk" -msgstr "Yeni Hard Disk Dosyası Oluştur" +msgstr "Yeni hard disk dosyası oluştur" msgid "Add Existing Hard Disk" -msgstr "Var Olan Hard Disk Dosyası Ekle" +msgstr "Var olan bir hard disk dosyası ekle" msgid "HDI disk images cannot be larger than 4 GB." -msgstr "HDI disk imajları 4 GB'tan daha büyük olamaz." +msgstr "HDI disk imajları 4 GB boyutundan daha büyük olamaz." msgid "Disk images cannot be larger than 127 GB." -msgstr "Disk imajları 127 GB'tan daha büyük olamaz." +msgstr "Disk imajları 127 GB boyutundan daha büyük olamaz." msgid "Hard disk images" msgstr "Hard disk imajları" @@ -988,7 +988,7 @@ msgid "HDI or HDX images with a sector size other than 512 are not supported." msgstr "512 dışında sektör boyutu olan HDI veya HDX imajları desteklenmemektedir." msgid "Disk image file already exists" -msgstr "Disk imaj dosyası zaten var olmakta" +msgstr "Bu disk imaj dosyası zaten mevcuttur" msgid "Please specify a valid file name." msgstr "Lütfen geçerli bir dosya ismi belirleyin." @@ -1006,7 +1006,7 @@ msgid "Disk image too large" msgstr "Disk imajı çok büyük" msgid "Remember to partition and format the newly-created drive." -msgstr "Yeni oluşturulan diski bölmeyi ve formatlamayı unutmayın." +msgstr "Yeni oluşturulan diskte bölümler oluşturmayı ve formatlamayı unutmayın." msgid "The selected file will be overwritten. Are you sure you want to use it?" msgstr "Seçili dosyanın üzerine yazılacaktır. Bunu yapmak istediğinizden emin misiniz?" @@ -1036,10 +1036,10 @@ msgid "Dynamic-size VHD" msgstr "Dinamik-boyutlu VHD" msgid "Differencing VHD" -msgstr "Differencing VHD" +msgstr "Farklandırılan VHD" msgid "(N/A)" -msgstr "(Yok)" +msgstr "(yok)" msgid "Raw image (.img)" msgstr "Ham imaj (.img)" @@ -1051,13 +1051,13 @@ msgid "HDX image (.hdx)" msgstr "HDX imajı (.hdx)" msgid "Fixed-size VHD (.vhd)" -msgstr "Sabit-boyutlu VHD (.vhd)" +msgstr "Sabit boyutlu VHD (.vhd)" msgid "Dynamic-size VHD (.vhd)" -msgstr "Dinamik-boyutlu VHD (.vhd)" +msgstr "Dinamik boyutlu VHD (.vhd)" msgid "Differencing VHD (.vhd)" -msgstr "Differencing VHD (.vhd)" +msgstr "Farklandırılan VHD (.vhd)" msgid "Large blocks (2 MB)" msgstr "Büyük bloklar (2 MB)" @@ -1072,10 +1072,10 @@ msgid "Select the parent VHD" msgstr "Ana VHD dosyasını seçin" 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 "Bu, farkı alınan imaj oluşturulduktan sonra ana imaj dosyasının düzenlendiği anlamına geliyor olabilir.\n\nBu durum ayrıca imaj dosyaları kopyalandığında veya yerleri değiştirildiğinde veya imaj dosyalarını oluşturan programdaki bir hatadan dolayı olmuş olabilir.\n\nZaman damgalarını düzeltmek ister misiniz?" +msgstr "Bu, farklandırılmış imaj dosyası oluşturulduktan sonra ana imaj dosyası üzerinde değişiklik yapıldığı anlamına geliyor olabilir.\n\nBu durum ayrıca imaj dosyaları kopyalandığında veya yerleri değiştirildiğinde veya imaj dosyalarını oluşturan programdaki bir hatadan dolayı da olmuş olabilir.\n\nZaman damgalarını düzeltmek ister misiniz?" msgid "Parent and child disk timestamps do not match" -msgstr "Ana ve ek disk zaman damgaları uyuşmuyor" +msgstr "Ana ve ek disklerin zaman damgaları uyuşmuyor" msgid "Could not fix VHD timestamp." msgstr "VHD zaman damgası düzeltilemedi." @@ -1126,10 +1126,10 @@ msgid "1.44 MB" msgstr "1.44 MB" msgid "DMF (cluster 1024)" -msgstr "DMF (cluster 1024)" +msgstr "DMF (1024 kümeli)" msgid "DMF (cluster 2048)" -msgstr "DMF (cluster 2048)" +msgstr "DMF (2048 kümeli)" msgid "2.88 MB" msgstr "2.88 MB" @@ -1180,7 +1180,7 @@ msgid "2% below perfect RPM" msgstr "mükemmel RPM değerinin 2% altı" msgid "(System Default)" -msgstr "(Sistem Varsayılanı)" +msgstr "(Sistem varsayılanı)" msgid "Failed to initialize network driver" msgstr "Ağ sürücüsü başlatılamadı" @@ -1192,7 +1192,7 @@ msgid "Mouse sensitivity:" msgstr "Fare hassasiyeti:" msgid "Select media images from program working directory" -msgstr "Program çalışma dizininden medya görüntülerini seçme" +msgstr "Medya görüntülerini programın çalışma dizininden seç" msgid "PIT mode:" msgstr "PIT modu:" @@ -1207,13 +1207,13 @@ msgid "Fast" msgstr "Hızlı" msgid "&Auto-pause on focus loss" -msgstr "&Odak kaybında otomatik duraklatma" +msgstr "Pencere &odağı kaybında otomatik olarak duraklat" msgid "WinBox is no longer supported" -msgstr "WinBox artık desteklenmiyor" +msgstr "WinBox artık desteklenmemektedir" 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 "WinBox yöneticisinin geliştirilmesi, bakımcı eksikliği nedeniyle 2022 yılında durduruldu. Çabalarımızı 86Box'ı daha da iyi hale getirmeye yönlendirdiğimiz için, WinBox'ı artık bir yönetici olarak desteklememe kararı aldık.\n\nWinBox aracılığıyla daha fazla güncelleme sağlanmayacak ve 86Box'ın daha yeni sürümleriyle kullanmaya devam ederseniz hatalı davranışlarla karşılaşabilirsiniz. WinBox davranışıyla ilgili tüm hata raporları geçersiz olarak kapatılacaktır.\n\nKullanabileceğiniz diğer yöneticilerin bir listesi için 86box.net adresine gidin." +msgstr "WinBox yöneticisinin geliştirilmesi 2022 yılında bakımcı eksikliği nedeniyle durduruldu. Çabalarımızı 86Box'ı daha da iyi hale getirmeye yönlendirdiğimiz için bu yöneticiyi artık desteklememe kararı aldık.\n\nArtık WinBox aracılığıyla güncellemeler sağlanmayacaktır ve onu 86Box'ın yeni sürümleriyle kullanmaya devam etmeniz halinde hatalarla karşılaşabilirsiniz. Bunun yanı sıra WinBox ile ilgili tüm hata raporları geçersiz olarak kapatılacaktır.\n\nKullanabileceğiniz diğer yöneticilerin listesi için 86box.net adresini ziyaret edebilirsiniz." msgid "Generate" msgstr "Oluştur" @@ -1243,7 +1243,7 @@ msgid "Qt (OpenGL &ES)" msgstr "Qt (OpenGL &ES)" msgid "About Qt" -msgstr "Qt Hakkında" +msgstr "Qt hakkında" msgid "MCA devices..." msgstr "MCA cihazları..." @@ -1252,7 +1252,7 @@ msgid "Show non-primary monitors" msgstr "Birincil olmayan monitörleri göster" msgid "Open screenshots folder..." -msgstr "Ekran görüntüleri klasörünü açın..." +msgstr "Ekran görüntüsü klasörünü aç..." msgid "Apply fullscreen stretch mode when maximized" msgstr "Büyütüldüğünde tam ekran genişletme modu uygula" @@ -1267,16 +1267,16 @@ msgid "Host CD/DVD Drive (%1:)" msgstr "Ana bilgisayar CD/DVD sürücüsü (%1:)" msgid "&Connected" -msgstr "&Connected" +msgstr "&Bağlı" msgid "Clear image history" -msgstr "Görüntü geçmişini temizleyin" +msgstr "İmaj geçmişini temizleyin" msgid "Create..." -msgstr "Yarat..." +msgstr "Oluştur..." msgid "previous image" -msgstr "önceki resim" +msgstr "önceki imaj" msgid "Host CD/DVD Drive (%1)" msgstr "Ana bilgisayar CD/DVD sürücüsü (%1)" @@ -1291,25 +1291,25 @@ msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" msgid "Error opening \"%1\": %2" -msgstr "Hata açılıyor \"%1\": %2" +msgstr "\"%1\": %2 açılırken hata oluştu" msgid "Error compiling vertex shader in file \"%1\"" -msgstr "Dosyada tepe gölgelendirici derlenirken hata oluştu \"%1\"" +msgstr "\"%1\" dosyasında tepe gölgelendirici derlenirken hata oluştu" msgid "Error compiling fragment shader in file \"%1\"" -msgstr "Dosyada parça gölgelendirici derlenirken hata oluştu \"%1\"" +msgstr "\"%1\" dosyasında parça gölgelendirici derlenirken hata oluştu" msgid "Error linking shader program in file \"%1\"" -msgstr "Dosyadaki gölgelendirici programı bağlanırken hata oluştu \"%1\"" +msgstr "\"%1\" dosyasında gölgelendirici programı bağlanırken hata oluştu" msgid "OpenGL 3.0 renderer options" msgstr "OpenGL 3.0 işleyici seçenekleri" msgid "Render behavior" -msgstr "Render davranışı" +msgstr "İşleyiş davranışı" msgid "Use target framerate:" -msgstr "Hedef kare oranı kullanın:" +msgstr "Şu hedef kare hızı oranını kullan:" msgid " fps" msgstr " fps" @@ -1318,7 +1318,7 @@ 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>Taklit 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>" +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" @@ -1327,13 +1327,13 @@ msgid "Shaders" msgstr "Gölgelendiriciler" msgid "Remove" -msgstr "Kaldırmak" +msgstr "Kaldır" msgid "No shader selected" msgstr "Gölgelendirici seçili değil" msgid "Browse..." -msgstr "Göz atın..." +msgstr "Göz at..." msgid "Shader error" msgstr "Gölgelendirici hatası" @@ -1342,7 +1342,7 @@ msgid "Could not load shaders." msgstr "Gölgelendiriciler yüklenemedi." msgid "More information in details." -msgstr "Daha fazla bilgi için tıklayınız." +msgstr "Daha fazla bilgi detaylardadır." msgid "Couldn't create OpenGL context." msgstr "OpenGL bağlamı oluşturulamadı." @@ -1354,34 +1354,34 @@ 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şlatma başarısız oldu. Hata %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 oluşturmaya geri dönüyoruz.\n" +msgstr "Yazılım işleyicisine geri dönülüyor.\n" msgid "Allocating memory for unpack buffer failed.\n" msgstr "Paket açma arabelleği için bellek ayırma başarısız oldu.\n" msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>Medya görüntülerini (CD-ROM, disket, vb.) seçerken, açma iletişim kutusu 86Box yapılandırma dosyasıyla aynı dizinde başlayacaktır. Bu ayar muhtemelen sadece macOS üzerinde bir fark yaratacaktır.</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>" msgid "This machine might have been moved or copied." msgstr "Bu makine taşınmış veya kopyalanmış olabilir." 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 "Doğru ağ işlevselliğini sağlamak için 86Box'ın bu makinenin taşınıp taşınmadığını veya kopyalanıp kopyalanmadığını bilmesi gerekir.\n\nEmin değilseniz \"Kopyaladım\" öğesini seçin." +msgstr "Ağ bağlantısı özelliğinin doğru şekilde çalışmasını sağlamak amacıyla 86Box'ın bu makinenin taşındığını mı yoksa kopyalandığını mı bilmesi gerekmektedir.\n\nEğer bundan emin değilseniz \"Kopyalandı\" seçeneğini seçiniz." msgid "I Moved It" -msgstr "Taşıdım" +msgstr "Taşındı" msgid "I Copied It" -msgstr "Kopyaladım" +msgstr "Kopyalandı" msgid "86Box Monitor #" -msgstr "86Box Monitör " +msgstr "86Box monitör " msgid "No MCA devices." msgstr "MCA cihazı yok." @@ -1411,13 +1411,13 @@ msgid "Adapter" msgstr "Adaptör" msgid "VDE Socket" -msgstr "VDE Soket" +msgstr "VDE soketi" msgid "86Box Unit Tester" -msgstr "86Box Ünite Test" +msgstr "86Box birim test cihazı" msgid "Novell NetWare 2.x Key Card" -msgstr "Novell NetWare 2.x Anahtar Kartı" +msgstr "Novell NetWare 2.x anahtar kartı" msgid "Serial port passthrough 1" msgstr "Seri port geçişi 1" @@ -1432,16 +1432,16 @@ msgid "Serial port passthrough 4" msgstr "Seri port geçişi 4" msgid "Vision Systems LBA Enhancer" -msgstr "Vision Systems LBA Enhancers" +msgstr "Vision Systems LBA Enhancer" msgid "Renderer options..." msgstr "İşleyici seçenekleri..." msgid "Logitech/Microsoft Bus Mouse" -msgstr "Logitech/Microsoft veri yolu fare" +msgstr "Logitech/Microsoft veri yolu bağlantılı fare" msgid "Microsoft Bus Mouse (InPort)" -msgstr "Microsoft (InPort) veri yolu fare" +msgstr "Microsoft veri yolu bağlantılı fare (InPort)" msgid "Mouse Systems Serial Mouse" msgstr "Mouse Systems seri fare" @@ -1465,7 +1465,7 @@ msgid "Roland MT-32 Emulation" msgstr "Roland MT-32 emülasyonu" msgid "Roland MT-32 (New) Emulation" -msgstr "Roland MT-32 (Yeni) emülasyonu" +msgstr "Roland MT-32 (yeni) emülasyonu" msgid "Roland CM-32L Emulation" msgstr "Roland CM-32L emülasyonu" @@ -1474,10 +1474,10 @@ msgid "Roland CM-32LN Emulation" msgstr "Roland CM-32LN emülasyonu" msgid "OPL4-ML Daughterboard" -msgstr "OPL4-ML Kızak" +msgstr "OPL4-ML yankartı" msgid "System MIDI" -msgstr "Sistem MIDI" +msgstr "Sistem MIDI'si" msgid "MIDI Input Device" msgstr "MIDI giriş cihazı" @@ -1486,7 +1486,7 @@ msgid "BIOS Address" msgstr "BIOS adresi" msgid "Enable BIOS extension ROM Writes" -msgstr "BIOS uzantılı ROM yazmalarını etkinleştir" +msgstr "BIOS uzantı ROM'larına yazmayı etkinleştir" msgid "Address" msgstr "Adres" @@ -1495,10 +1495,10 @@ msgid "IRQ" msgstr "IRQ" msgid "BIOS Revision" -msgstr "BIOS revizyonu" +msgstr "BIOS sürümü" msgid "Translate 26 -> 17" -msgstr "26 -> 17 çevir" +msgstr "26 -> 17 olarak çevir" msgid "Language" msgstr "Dil" @@ -1507,7 +1507,7 @@ msgid "Enable backlight" msgstr "Arka ışığı etkinleştir" msgid "Invert colors" -msgstr "Renkleri ters çevirin" +msgstr "Renkleri ters çevir" msgid "BIOS size" msgstr "BIOS boyutu" @@ -1531,25 +1531,25 @@ msgid "Map E8000-EFFFF as UMB" msgstr "E8000-EFFFF'yi UMB olarak eşleyin" msgid "JS9 Jumper (JIM)" -msgstr "JS9 Jumper (JIM)" +msgstr "JS9 jumper'ı (JIM)" msgid "MIDI Output Device" msgstr "MIDI çıkış cihazı" msgid "MIDI Real time" -msgstr "MIDI gerçek zamanlı" +msgstr "Gerçek zamanlı MIDI" msgid "MIDI Thru" -msgstr "MIDI girişinin geçişi" +msgstr "MIDI geçişi" msgid "MIDI Clockout" -msgstr "MIDI saatinin çıkışı" +msgstr "MIDI saat çıkışı" msgid "SoundFont" msgstr "SoundFont" msgid "Output Gain" -msgstr "Çıkış kazancı" +msgstr "Çıkış ses düzeyi kazancı" msgid "Chorus" msgstr "Koro" @@ -1567,13 +1567,13 @@ msgid "Chorus Depth" msgstr "Koro derinliği" msgid "Chorus Waveform" -msgstr "Koro dalga formu" +msgstr "Koro dalga biçimi" msgid "Reverb" msgstr "Yankı" msgid "Reverb Room Size" -msgstr "Yankı odasının boyutu" +msgstr "Yankı odası boyutu" msgid "Reverb Damping" msgstr "Yankı sönümleme" @@ -1585,10 +1585,10 @@ msgid "Reverb Level" msgstr "Yankı seviyesi" msgid "Interpolation Method" -msgstr "İnterpolasyon Yöntemi" +msgstr "İnterpolasyon yöntemi" msgid "Reverb Output Gain" -msgstr "Yankı çıkışının kazancı" +msgstr "Yankı çıkış ses düzeyi artışı" msgid "Reversed stereo" msgstr "Tersine çevrilmiş stereo" @@ -1609,19 +1609,19 @@ msgid "RTS toggle" msgstr "RTS geçişi" msgid "Revision" -msgstr "Revizyon" +msgstr "Sürüm" msgid "Controller" msgstr "Kontrolcü" msgid "Show Crosshair" -msgstr "Artı işaretini göster" +msgstr "Nişangahı göster" msgid "DMA" msgstr "DMA" msgid "MAC Address" -msgstr "MAC Adresi" +msgstr "MAC adresi" msgid "MAC Address OUI" msgstr "MAC adresinin OUI'si" @@ -1633,10 +1633,10 @@ msgid "Baud Rate" msgstr "Baud hızı" msgid "TCP/IP listening port" -msgstr "TCP/IP dinleme bağlantı noktası" +msgstr "TCP/IP dinleme portu" msgid "Phonebook File" -msgstr "Telefon defteri dosyası" +msgstr "Telefon rehber dosyası" msgid "Telnet emulation" msgstr "Telnet emülasyonu" @@ -1666,13 +1666,13 @@ msgid "MPU-401 IRQ" msgstr "MPU-401 IRQ" msgid "Receive MIDI input" -msgstr "MIDI girişi alma" +msgstr "MIDI girişi al" msgid "Low DMA" msgstr "Düşük DMA" msgid "Enable Game port" -msgstr "Oyun bağlantı noktasını etkinleştir" +msgstr "Gameport girişini etkinleştir" msgid "Surround module" msgstr "Surround modülü" @@ -1696,7 +1696,7 @@ msgid "Enable OPL" msgstr "OPL'yi etkinleştir" msgid "Receive MIDI input (MPU-401)" -msgstr "MIDI girişi alma (MPU-401)" +msgstr "MIDI girişi al (MPU-401)" msgid "SB low DMA" msgstr "SB düşük DMA" @@ -1714,7 +1714,7 @@ msgid "High DMA" msgstr "Yüksek DMA" msgid "Control PC speaker" -msgstr "PC hoparlörünü kontrol etme" +msgstr "PC hoparlörünü kontrol et" msgid "Memory size" msgstr "Bellek boyutu" @@ -1732,7 +1732,7 @@ msgid "GUS type" msgstr "GUS türü" msgid "Enable 0x04 \"Exit 86Box\" command" -msgstr "0x04 komutunu \"86Box'tan çık\" etkinleştir" +msgstr "0x04 \"86Box'tan çık\" komutunu etkinleştir" msgid "Display type" msgstr "Ekran türü" @@ -1777,7 +1777,7 @@ msgid "Dithering" msgstr "Dithering" msgid "Enable NMI for CGA emulation" -msgstr "CGA öykünmesi için NMI'yi etkinleştirin" +msgstr "CGA öykünmesi için NMI'yi etkinleştir" msgid "Voodoo type" msgstr "Voodoo türü" @@ -1795,7 +1795,7 @@ msgid "Screen Filter" msgstr "Ekran filtresi" msgid "Render threads" -msgstr "İş parçacıkları oluşturma" +msgstr "İşleme için iş parçacığı sayısı" msgid "SLI" msgstr "SLI" @@ -1825,7 +1825,7 @@ msgid "USA" msgstr "ABD" msgid "Danish" -msgstr "Danimarka" +msgstr "Danca" msgid "Always at selected speed" msgstr "Her zaman seçilen hızda" @@ -1849,10 +1849,10 @@ msgid "Linear" msgstr "Doğrusal" msgid "4th Order" -msgstr "4. dereceden" +msgstr "4. sıra" msgid "7th Order" -msgstr "7. dereceden" +msgstr "7. sıra" msgid "Non-timed (original)" msgstr "Zamanlayıcı olmadan (orijinal)" @@ -1873,10 +1873,10 @@ msgid "Five + Wheel" msgstr "Beş + tekerlek" msgid "A3 - SMT2 Serial / SMT3(R)V" -msgstr "A3 - SMT2 Seri / SMT3(R)V" +msgstr "A3 - SMT2 seri / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" -msgstr "Q1 - SMT3(R) Seri" +msgstr "Q1 - SMT3(R) seri" msgid "8 kB" msgstr "8 kB" @@ -1891,7 +1891,7 @@ msgid "64 kB" msgstr "64 kB" msgid "Disable BIOS" -msgstr "BIOS'u Devre Dışı Bırak" +msgstr "BIOS'u devre dışı bırak" msgid "512 kB" msgstr "512 kB" @@ -1942,7 +1942,7 @@ msgid "New" msgstr "Yeni" msgid "Color (generic)" -msgstr "Renk (jenerik)" +msgstr "Renk (sıradan)" msgid "Green Monochrome" msgstr "Yeşil monokrom" @@ -1963,10 +1963,10 @@ msgid "Simple doubling" msgstr "Basit ikiye katlama" msgid "sRGB interpolation" -msgstr "sRGB enterpolasyonu" +msgstr "sRGB interpolasyonu" msgid "Linear interpolation" -msgstr "Doğrusal enterpolasyon" +msgstr "Doğrusal interpolasyon" msgid "128 kB" msgstr "128 kB" @@ -2005,7 +2005,7 @@ msgid "Color" msgstr "Renk" msgid "U.S. English" -msgstr "A.B.D. İngilizcesi" +msgstr "ABD İngilizcesi" msgid "Scandinavian" msgstr "İskandinav" @@ -2014,16 +2014,16 @@ msgid "Other languages" msgstr "Diğer diller" msgid "Bochs latest" -msgstr "Bochs son" +msgstr "Bochs en son sürümü" msgid "Mono Non-Interlaced" -msgstr "Mono Araya Girmeyen" +msgstr "Monokrom (geçmeli tarama yok)" msgid "Color Interlaced" -msgstr "Renkli Taramalı" +msgstr "Renkli (geçmeli tarama var)" msgid "Color Non-Interlaced" -msgstr "Renkli Araya Girmeyen" +msgstr "Renkli (geçmeli tarama yok)" msgid "3Dfx Voodoo Graphics" msgstr "3Dfx Voodoo Grafikleri" @@ -2056,16 +2056,16 @@ msgid "Stereo LPT DAC" msgstr "Stereo LPT DAC" msgid "Generic Text Printer" -msgstr "Genel metin yazıcısı" +msgstr "Sıradan metin yazıcı" msgid "Generic ESC/P Dot-Matrix" -msgstr "Jenerik ESC/P nokta vuruşlu" +msgstr "Sıradan ESC/P Dot Matrix yazıcı" msgid "Generic PostScript Printer" -msgstr "Jenerik PostScript yazıcısı" +msgstr "Sıradan PostScript yazıcı" msgid "Generic PCL5e Printer" -msgstr "Jenerik PCL5e yazıcısı" +msgstr "Sıradan PCL5e yazıcı" msgid "Parallel Line Internet Protocol" msgstr "Paralel Hat İnternet Protokolü" @@ -2077,13 +2077,13 @@ msgid "Serial Passthrough Device" msgstr "Seri port geçiş cihazı" msgid "Passthrough Mode" -msgstr "Geçişi modu" +msgstr "Geçişli mod" msgid "Host Serial Device" msgstr "Ana bilgisayar seri cihazı" msgid "Name of pipe" -msgstr "Borunun adı" +msgstr "Boru adı" msgid "Data bits" msgstr "Veri bitleri" @@ -2101,13 +2101,22 @@ msgid "Host Serial Passthrough" msgstr "Ana bilgisayar seri port geçişi" msgid "Eject %s" -msgstr "%s çıkari" +msgstr "%s diskini çıkar" msgid "&Unmute" -msgstr "&Sesi açın" +msgstr "&Sesi aç" msgid "Softfloat FPU" msgstr "Softfloat FPU" msgid "High performance impact" -msgstr "Performans üzerinde yüksek etki" +msgstr "Ciddi performans düşüklüğüne neden olabilir" + +msgid "RAM Disk (max. speed)" +msgstr "RAM Disk (maks. hız)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A klonu (ISA)" + +msgid "Vendor" +msgstr "Üretici" From c38fc46670a19e1d95e8eb7e15acb353901c7a65 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 19 Nov 2024 03:46:03 +0100 Subject: [PATCH 594/624] More language fixes and the remaining four languages (Ukrainian, Vietnamese, Simplified Chinese, and Traditional Chinese). --- src/printer/prt_escp.c | 2 +- src/qt/languages/ca-ES.po | 8 +- src/qt/languages/cs-CZ.po | 8 +- src/qt/languages/de-DE.po | 6 +- src/qt/languages/es-ES.po | 8 +- src/qt/languages/fi-FI.po | 8 +- src/qt/languages/fr-FR.po | 8 +- src/qt/languages/hr-HR.po | 8 +- src/qt/languages/hu-HU.po | 8 +- src/qt/languages/it-IT.po | 8 +- src/qt/languages/ja-JP.po | 6 +- src/qt/languages/ko-KR.po | 6 +- src/qt/languages/pl-PL.po | 6 +- src/qt/languages/pt-BR.po | 6 +- src/qt/languages/pt-PT.po | 8 +- src/qt/languages/ru-RU.po | 18 +- src/qt/languages/sk-SK.po | 6 +- src/qt/languages/sl-SI.po | 8 +- src/qt/languages/tr-TR.po | 6 +- src/qt/languages/uk-UA.po | 983 +++++++++++++++++++++++++++++++++++- src/qt/languages/vi-VN.po | 984 ++++++++++++++++++++++++++++++++++++- src/qt/languages/zh-CN.po | 976 +++++++++++++++++++++++++++++++++++- src/qt/languages/zh-TW.po | 972 +++++++++++++++++++++++++++++++++++- src/qt/qt_deviceconfig.cpp | 2 +- 24 files changed, 3921 insertions(+), 138 deletions(-) diff --git a/src/printer/prt_escp.c b/src/printer/prt_escp.c index d91a52e0c..0b40bec90 100644 --- a/src/printer/prt_escp.c +++ b/src/printer/prt_escp.c @@ -2058,7 +2058,7 @@ escp_close(void *priv) } const lpt_device_t lpt_prt_escp_device = { - .name = "Generic ESC/P Dot-Matrix", + .name = "Generic ESC/P Dot-Matrix Printer", .internal_name = "dot_matrix", .init = escp_init, .close = escp_close, diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index 359912393..aa2b82c03 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -834,8 +834,8 @@ msgstr "Imatges MO" msgid "Welcome to 86Box!" msgstr "Benvingut a 86Box!" -msgid "Internal controller" -msgstr "Controlador intern" +msgid "Internal device" +msgstr "Dispositiu intern" msgid "Exit" msgstr "Sortir" @@ -2058,8 +2058,8 @@ msgstr "DAC LPT estèreo" msgid "Generic Text Printer" msgstr "Impressora de text genèrica" -msgid "Generic ESC/P Dot-Matrix" -msgstr "De matriu de punts ESC/P genèrica" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Impressora de matriu de punts ESC/P genèrica" msgid "Generic PostScript Printer" msgstr "Impressora PostScript genèrica" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 181b49165..4629ac508 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -834,8 +834,8 @@ msgstr "Obrazy MO" msgid "Welcome to 86Box!" msgstr "Vítejte v programu 86Box!" -msgid "Internal controller" -msgstr "Vestavěný řadič" +msgid "Internal device" +msgstr "Vestavěné zařízení" msgid "Exit" msgstr "Ukončit" @@ -2058,8 +2058,8 @@ msgstr "Stereofonní převodník LPT" msgid "Generic Text Printer" msgstr "Obecná textová tiskárna" -msgid "Generic ESC/P Dot-Matrix" -msgstr "Generická jehličková ESC/P" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Obecná jehličková tiskárna ESC/P" msgid "Generic PostScript Printer" msgstr "Obecná tiskárna PostScript" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 99161a109..d5abbed65 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -837,8 +837,8 @@ msgstr "MO-Abbilder" msgid "Welcome to 86Box!" msgstr "Willkommen bei 86Box!" -msgid "Internal controller" -msgstr "Interner Controller" +msgid "Internal device" +msgstr "Interne Gerät" msgid "Exit" msgstr "Beenden" @@ -2061,7 +2061,7 @@ msgstr "Stereo-LPT-DAC" msgid "Generic Text Printer" msgstr "Generischer Textdrucker" -msgid "Generic ESC/P Dot-Matrix" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "Allgemeiner ESC/P-Nadel-Drucker" msgid "Generic PostScript Printer" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index abcdb5daf..5eb8872b5 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -834,8 +834,8 @@ msgstr "Imágenes de MO" msgid "Welcome to 86Box!" msgstr "¡Bienvenido a 86Box!" -msgid "Internal controller" -msgstr "Controladora interna" +msgid "Internal device" +msgstr "Dispositivo interno" msgid "Exit" msgstr "Salir" @@ -2057,8 +2057,8 @@ msgstr "DAC LPT estéreo" msgid "Generic Text Printer" msgstr "Impresora genérica de texto" -msgid "Generic ESC/P Dot-Matrix" -msgstr "Matricial ESC/P genérica" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Impresora matricial ESC/P genérica" msgid "Generic PostScript Printer" msgstr "Impresora genérica PostScript" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 2c03cce11..5abe4c4e8 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -834,8 +834,8 @@ msgstr "MO-levykuvat" msgid "Welcome to 86Box!" msgstr "Tervetuloa 86Boxiin!" -msgid "Internal controller" -msgstr "Sisäinen ohjain" +msgid "Internal device" +msgstr "Sisäinen laite" msgid "Exit" msgstr "Poistu" @@ -2058,8 +2058,8 @@ msgstr "Stereo-LPT-DAC" msgid "Generic Text Printer" msgstr "Yleinen tekstitulostin" -msgid "Generic ESC/P Dot-Matrix" -msgstr "Yleinen ESC/P pistematriisi" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Yleinen ESC/P pistematriisitulostin" msgid "Generic PostScript Printer" msgstr "Yleinen PostScript-tulostin" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 8e69a03d6..aa9afaf46 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -834,8 +834,8 @@ msgstr "Images magnéto-optiques" msgid "Welcome to 86Box!" msgstr "Bienvenue dans 86Box !" -msgid "Internal controller" -msgstr "Côntrolleur interne" +msgid "Internal device" +msgstr "Dispositif interne" msgid "Exit" msgstr "Sortir" @@ -2058,8 +2058,8 @@ msgstr "Convertisseur numérique stéréo LPT" msgid "Generic Text Printer" msgstr "Imprimante de texte générique" -msgid "Generic ESC/P Dot-Matrix" -msgstr "Générique ESC/P à matrice à points" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Imprimant générique ESC/P à matrice à points" msgid "Generic PostScript Printer" msgstr "Imprimante PostScript générique" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index d05dd8f60..01be92737 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -834,8 +834,8 @@ msgstr "MO slike" msgid "Welcome to 86Box!" msgstr "Dobrodošli u 86Box!" -msgid "Internal controller" -msgstr "Uunutarnji kontroler" +msgid "Internal device" +msgstr "Uunutarnji uređaj" msgid "Exit" msgstr "Izlazi" @@ -2058,8 +2058,8 @@ msgstr "Stereo DAC za LPT" msgid "Generic Text Printer" msgstr "Generični tekstovni pisač" -msgid "Generic ESC/P Dot-Matrix" -msgstr "Generični matrični ESC/P" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Generični pisač matrični ESC/P" msgid "Generic PostScript Printer" msgstr "Generični pisač PostScript" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 471f56a03..b9f4df48c 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -834,8 +834,8 @@ msgstr "MO-képfájlok" msgid "Welcome to 86Box!" msgstr "Üdvözli önt az 86Box!" -msgid "Internal controller" -msgstr "Integrált vezérlő" +msgid "Internal device" +msgstr "Integrált eszköz" msgid "Exit" msgstr "Kilépés" @@ -2058,8 +2058,8 @@ msgstr "Sztereó LPT DAC" msgid "Generic Text Printer" msgstr "Általános szövegnyomtató" -msgid "Generic ESC/P Dot-Matrix" -msgstr "Általános ESC/P pontmátrix" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Általános ESC/P pontmátrixnyomtató" msgid "Generic PostScript Printer" msgstr "Általános PostScript nyomtató" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 614cb0f2d..29e395db3 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -831,8 +831,8 @@ msgstr "Immagini MO" msgid "Welcome to 86Box!" msgstr "Benvenuti in 86Box!" -msgid "Internal controller" -msgstr "Controller interno" +msgid "Internal device" +msgstr "Dispositivo integrato" msgid "Exit" msgstr "Esci" @@ -2055,8 +2055,8 @@ msgstr "DAC LPT stereo" msgid "Generic Text Printer" msgstr "Stampante di testo generica" -msgid "Generic ESC/P Dot-Matrix" -msgstr "A matrice di punti ESC/P generica" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Stampante a matrice di punti ESC/P generica" msgid "Generic PostScript Printer" msgstr "Stampante PostScript generica" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index ecc901d07..38e73bb06 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -834,8 +834,8 @@ msgstr "光磁気イメージ" msgid "Welcome to 86Box!" msgstr "86Boxへようこそ!" -msgid "Internal controller" -msgstr "内蔵コントローラー" +msgid "Internal device" +msgstr "内蔵デバイス" msgid "Exit" msgstr "終了" @@ -2058,7 +2058,7 @@ msgstr "ステレオLPT DAC" msgid "Generic Text Printer" msgstr "汎用テキスト・プリンタ" -msgid "Generic ESC/P Dot-Matrix" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "汎用ESC/Pドットマトリクスプリンタ" msgid "Generic PostScript Printer" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 25d0c6034..4a0da3e4f 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -834,8 +834,8 @@ msgstr "광자기 이미지" msgid "Welcome to 86Box!" msgstr "86Box에 어서오세요!" -msgid "Internal controller" -msgstr "내부 컨트롤러" +msgid "Internal device" +msgstr "내부 장치" msgid "Exit" msgstr "끝내기" @@ -2058,7 +2058,7 @@ msgstr "스테레오 LPT DAC" msgid "Generic Text Printer" msgstr "일반 텍스트 프린터" -msgid "Generic ESC/P Dot-Matrix" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "일반 ESC/P 도트 매트릭스 프린터" msgid "Generic PostScript Printer" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index d63cbf5c8..86f09a5cc 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -834,8 +834,8 @@ msgstr "Obrazy MO" msgid "Welcome to 86Box!" msgstr "Witamy w 86Box!" -msgid "Internal controller" -msgstr "Kontroler wewnętrzny" +msgid "Internal device" +msgstr "Urządzenie wewnętrzne" msgid "Exit" msgstr "Zakończ" @@ -2058,7 +2058,7 @@ msgstr "Stereofoniczny przetwornik cyfrowo-analogowy LPT" msgid "Generic Text Printer" msgstr "Ogólna drukarka tekstowa" -msgid "Generic ESC/P Dot-Matrix" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "Generyczna drukarka igłowa ESC/P" msgid "Generic PostScript Printer" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 3084619ab..65d729bc6 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -834,8 +834,8 @@ msgstr "Imagens magneto-ópticas" msgid "Welcome to 86Box!" msgstr "Bem-vindo ao 86Box!" -msgid "Internal controller" -msgstr "Controlador interno" +msgid "Internal device" +msgstr "Dispositivo interno" msgid "Exit" msgstr "Sair" @@ -2058,7 +2058,7 @@ msgstr "DAC estéreo LPT" msgid "Generic Text Printer" msgstr "Impressora de texto genérica" -msgid "Generic ESC/P Dot-Matrix" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "Impressora matricial de pontos ESC/P genérica" msgid "Generic PostScript Printer" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 1163d690e..13a3a2c0a 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -834,8 +834,8 @@ msgstr "Imagens magneto-ópticas" msgid "Welcome to 86Box!" msgstr "Bem-vindos ao 86Box!" -msgid "Internal controller" -msgstr "Controlador interno" +msgid "Internal device" +msgstr "Dispositivo integrado" msgid "Exit" msgstr "Sair" @@ -2058,8 +2058,8 @@ msgstr "DAC LPT estéreo" msgid "Generic Text Printer" msgstr "Impressora de texto genérica" -msgid "Generic ESC/P Dot-Matrix" -msgstr "Matricial de pontos ESC/P genérica" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Impressora matricial de pontos ESC/P genérica" msgid "Generic PostScript Printer" msgstr "Impressora PostScript genérica" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 8fa25c373..72ad9f3a1 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -834,8 +834,8 @@ msgstr "Образы магнитооптических дисков" msgid "Welcome to 86Box!" msgstr "Добро пожаловать в 86Box!" -msgid "Internal controller" -msgstr "Встроенный контроллер" +msgid "Internal device" +msgstr "Встроенное устройство" msgid "Exit" msgstr "Выход" @@ -2058,7 +2058,7 @@ msgstr "Стереофонический ЦАП LPT" msgid "Generic Text Printer" msgstr "Стандартный текстовый принтер" -msgid "Generic ESC/P Dot-Matrix" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "Стандартный матричный принтер ESC/P" msgid "Generic PostScript Printer" @@ -2112,12 +2112,6 @@ msgstr "Softfloat FPU" msgid "High performance impact" msgstr "Сильное влияние на производительность" -msgid "30 Hz (JMP2 = 1)" -msgstr "30 Гц (JMP2 = 1)" - -msgid "60 Hz (JMP2 = 2)" -msgstr "60 Гц (JMP2 = 2)" - msgid "RAM Disk (max. speed)" msgstr "RAM-диск (макс. скорость)" @@ -2126,3 +2120,9 @@ msgstr "Клон IBM 8514/A (ISA)" msgid "Vendor" msgstr "Производитель" + +msgid "30 Hz (JMP2 = 1)" +msgstr "30 Гц (JMP2 = 1)" + +msgid "60 Hz (JMP2 = 2)" +msgstr "60 Гц (JMP2 = 2)" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 34e6248c5..097fb9c47 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -834,8 +834,8 @@ msgstr "Obrazy MO" msgid "Welcome to 86Box!" msgstr "Vitajte v programe 86Box!" -msgid "Internal controller" -msgstr "Vstavaný radič" +msgid "Internal device" +msgstr "Vstavané zariadenie" msgid "Exit" msgstr "Ukončiť" @@ -2058,7 +2058,7 @@ msgstr "Stereofónny prevodník LPT DAC" msgid "Generic Text Printer" msgstr "Generická textová tlačiareň" -msgid "Generic ESC/P Dot-Matrix" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "Generická ihličková tlačiareň ESC/P" msgid "Generic PostScript Printer" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 71efb875f..a48636df8 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -834,8 +834,8 @@ msgstr "Slike MO" msgid "Welcome to 86Box!" msgstr "Dobrodošli v 86Box!" -msgid "Internal controller" -msgstr "Notranji krmilnik" +msgid "Internal device" +msgstr "Vgrajena naprava" msgid "Exit" msgstr "Izhod" @@ -2058,8 +2058,8 @@ msgstr "Stereo DAC LPT" msgid "Generic Text Printer" msgstr "Generični besedilni tiskalnik" -msgid "Generic ESC/P Dot-Matrix" -msgstr "Generični matrični ESC/P" +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Generični matrični tiskalnik ESC/P" msgid "Generic PostScript Printer" msgstr "Generični tiskalnik PostScript" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 9e2fb8840..3d1801f2e 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -834,8 +834,8 @@ msgstr "MO imajları" msgid "Welcome to 86Box!" msgstr "86Box'a hoşgeldiniz!" -msgid "Internal controller" -msgstr "Dahili kontrolcü" +msgid "Internal device" +msgstr "Dahili cihazı" msgid "Exit" msgstr "Çıkış" @@ -2058,7 +2058,7 @@ msgstr "Stereo LPT DAC" msgid "Generic Text Printer" msgstr "Sıradan metin yazıcı" -msgid "Generic ESC/P Dot-Matrix" +msgid "Generic ESC/P Dot-Matrix Printer" msgstr "Sıradan ESC/P Dot Matrix yazıcı" msgid "Generic PostScript Printer" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 9c76d803e..0aad818ad 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -390,8 +390,11 @@ msgstr "Динамічний рекомпілятор" msgid "Video:" msgstr "Відеокарта:" -msgid "Voodoo Graphics" -msgstr "Прискорювач Voodoo" +msgid "Video #2:" +msgstr "Відеокарта 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Прискорювач Voodoo 1 або 2" msgid "IBM 8514/A Graphics" msgstr "Прискорювач IBM 8514/A" @@ -637,7 +640,7 @@ msgid "Fatal error" msgstr "Непереробна помилка" msgid " - PAUSED" -msgstr " - PAUSED" +msgstr " - ПРИЗУПИНЕННЯ" msgid "Press Ctrl+Alt+PgDn to return to windowed mode." msgstr "Натисніть Ctrl+Alt+PgDn для повернення у віконний режим." @@ -684,6 +687,9 @@ msgstr "Системна плата \"%hs\" недоступна через ві msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "Відеокарта \"%hs\" недоступна через відсутність файлу її ПЗУ в каталозі roms/video. Переключення на доступну відеокарту." +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "Відеокарта 2 \"%hs\" недоступна через відсутність файлу її ПЗУ в каталозі roms/video. Переключення на доступну відеокарту." + msgid "Machine" msgstr "Комп'ютер" @@ -741,9 +747,6 @@ msgstr "H" msgid "S" msgstr "S" -msgid "MiB" -msgstr "МіБ" - msgid "KB" msgstr "КБ" @@ -765,17 +768,26 @@ msgstr "Пристрої PCap не знайдені" msgid "Invalid PCap device" msgstr "Невірний пристрій PCap" -msgid "Standard 2-button joystick(s)" -msgstr "Стандартний 2-кнопковий джойстик" +msgid "2-axis, 2-button joystick(s)" +msgstr "2-осьовий, 2-кнопковий джойстик" -msgid "Standard 4-button joystick" -msgstr "Стандартний 4-кнопковий джойстик" +msgid "2-axis, 4-button joystick" +msgstr "2-осьовий, 4-кнопковий джойстик" -msgid "Standard 6-button joystick" -msgstr "Стандартний 6-кнопковий джойстик" +msgid "2-axis, 6-button joystick" +msgstr "2-осьовий, 6-кнопковий джойстик" -msgid "Standard 8-button joystick" -msgstr "Стандартний 8-кнопковий джойстик" +msgid "2-axis, 8-button joystick" +msgstr "2-осьовий, 8-кнопковий джойстик" + +msgid "3-axis, 2-button joystick" +msgstr "3-осьовий, 2-кнопковий джойстик" + +msgid "3-axis, 4-button joystick" +msgstr "3-осьовий, 4-кнопковий джойстик" + +msgid "4-axis, 4-button joystick" +msgstr "4-осьовий, 4-кнопковий джойстик" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -810,6 +822,9 @@ msgstr "Ви впевнені, що хочете вийти з 86Box?" msgid "Unable to initialize Ghostscript" msgstr "Неможливо ініціалізувати Ghostscript" +msgid "Unable to initialize GhostPCL" +msgstr "Неможливо ініціалізувати GhostPCL" + msgid "MO %i (%ls): %ls" msgstr "Магнітооптичний %i (%ls): %ls" @@ -819,8 +834,8 @@ msgstr "Образи магнітооптичних дисків" msgid "Welcome to 86Box!" msgstr "Ласкаво просимо в 86Box!" -msgid "Internal controller" -msgstr "Вбудований контролер" +msgid "Internal device" +msgstr "Вбудований пристрій" msgid "Exit" msgstr "Вихід" @@ -858,6 +873,9 @@ msgstr "Неприпустима конфігурація" 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 потрібно для автоматичного перетворення файлів PostScript в PDF.\n\nВсі документи, відправлені на загальний принтер PostScript, будуть збережені у вигляді файлів PostScript (.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." +msgstr "%1 потрібно для автоматичного перетворення файлів PCL в PDF.\n\nВсі документи, відправлені на загальний принтер PCL, будуть збережені у вигляді файлів Printer Command Language (.ps)." + msgid "Entering fullscreen mode" msgstr "Вхід у повноекранний режим" @@ -1002,6 +1020,27 @@ msgstr "Перезаписати" msgid "Don't overwrite" msgstr "Не перезаписувати" +msgid "Raw image" +msgstr "RAW образ" + +msgid "HDI image" +msgstr "Образ HDI" + +msgid "HDX image" +msgstr "Образ HDX" + +msgid "Fixed-size VHD" +msgstr "VHD фіксованого розміру" + +msgid "Dynamic-size VHD" +msgstr "VHD динамічного розміру" + +msgid "Differencing VHD" +msgstr "Диференційований образ VHD" + +msgid "(N/A)" +msgstr "(Ні)" + msgid "Raw image (.img)" msgstr "RAW образ (.img)" @@ -1175,3 +1214,915 @@ msgstr "WinBox більше не підтримується" 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 "Розробку менеджера WinBox було припинено у 2022 році через брак супровідників. Оскільки ми спрямовуємо наші зусилля на те, щоб зробити 86Box ще кращим, ми прийняли рішення більше не підтримувати WinBox як менеджер.\n\nБільше ніяких оновлень не буде надаватися через WinBox, і ви можете зіткнутися з некоректною поведінкою, якщо продовжите використовувати його з новими версіями 86Box. Будь-які повідомлення про помилки, пов'язані з поведінкою WinBox, будуть закриті як недійсні.\n\nПерейдіть на 86box.net для отримання списку інших менеджерів, які ви можете використовувати." + +msgid "Generate" +msgstr "Згенерувати" + +msgid "Joystick configuration" +msgstr "Конфігурація джойстика" + +msgid "Device" +msgstr "Пристрій" + +msgid "%1 (X axis)" +msgstr "%1 (вісь X)" + +msgid "%1 (Y axis)" +msgstr "%1 (вісь Y)" + +msgid "MCA devices" +msgstr "Пристрої MCA" + +msgid "List of MCA devices:" +msgstr "Список пристроїв MCA:" + +msgid "Tablet tool" +msgstr "Інструмент для планшета" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Про Qt" + +msgid "MCA devices..." +msgstr "Пристрої MCA..." + +msgid "Show non-primary monitors" +msgstr "Показати неосновні монітори" + +msgid "Open screenshots folder..." +msgstr "Відкрийте папку скріншотів..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Застосовувати розстягування у повноекранному режимі у максимізованому стані" + +msgid "Cursor/Puck" +msgstr "Курсор/шайба" + +msgid "Pen" +msgstr "Ручка" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "CD/DVD привід хоста (%1:)" + +msgid "&Connected" +msgstr "&Підключено" + +msgid "Clear image history" +msgstr "Очистити історію образів" + +msgid "Create..." +msgstr "Створити..." + +msgid "previous image" +msgstr "попередній образ" + +msgid "Host CD/DVD Drive (%1)" +msgstr "CD/DVD привід хоста (%1)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "Поведінка рендерингу" + +msgid "Use target framerate:" +msgstr "Використовувати цільову частоту кадрів:" + +msgid " fps" +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 "Синхронізація з відео" + +msgid "Shaders" +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." + +msgid "Couldn't switch to OpenGL context." +msgstr "Не вдалося переключитися на контекст OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Потрібна версія OpenGL 3.0 або новіша. Поточна версія %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "Не вдалося ініціалізувати OpenGL. Помилка %1." + +msgid "Error initializing OpenGL" +msgstr "Помилка ініціалізації OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Повернення до програмного рендерингу.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Не вдалося виділити пам'ять для буфера розпакування.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>При виборі медіа-образів (CD-ROM, дискета і т.д.) діалогове вікно буде відкриватися в тому ж каталозі, що і файл конфігурації 86Box. Цей параметр, швидше за все, матиме значення лише на macOS.</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "Цю машину могли перемістити або скопіювати." + +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 "Щоб забезпечити належну мережеву функціональність, 86Box повинен знати, чи машина була переміщена або скопійована.\n\nЯкщо ви не впевнені, виберіте \"Скопійована\"." + +msgid "I Moved It" +msgstr "Переміщена" + +msgid "I Copied It" +msgstr "Скопійована" + +msgid "86Box Monitor #" +msgstr "Монітор 86Box " + +msgid "No MCA devices." +msgstr "Ніяких пристроїв MCA." + +msgid "MiB" +msgstr "МіБ" + +msgid "Network Card #1" +msgstr "Мережева карта 1" + +msgid "Network Card #2" +msgstr "Мережева карта 2" + +msgid "Network Card #3" +msgstr "Мережева карта 3" + +msgid "Network Card #4" +msgstr "Мережева карта 4" + +msgid "Mode" +msgstr "Режим" + +msgid "Interface" +msgstr "Інтерфейс" + +msgid "Adapter" +msgstr "Адаптер" + +msgid "VDE Socket" +msgstr "VDE сокет" + +msgid "86Box Unit Tester" +msgstr "Тестер блоків 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Ключова картка Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Пропуск послідовного порту 1" + +msgid "Serial port passthrough 2" +msgstr "Пропуск послідовного порту 2" + +msgid "Serial port passthrough 3" +msgstr "Пропуск послідовного порту 3" + +msgid "Serial port passthrough 4" +msgstr "Пропуск послідовного порту 4" + +msgid "Vision Systems LBA Enhancer" +msgstr "Vision Systems LBA Enhancer" + +msgid "Renderer options..." +msgstr "Параметри рендерингу..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Шинна миша Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Шинна миша Microsoft (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Послідовна миша Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Послідовна миша Microsoft" + +msgid "Logitech Serial Mouse" +msgstr "Послідовна миша Logitech" + +msgid "PS/2 Mouse" +msgstr "Миша PS/2" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (послідовна)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] Стандартний модем, сумісний зі стандартом Hayes" + +msgid "Roland MT-32 Emulation" +msgstr "Емуляція Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Емуляція Roland MT-32 (новий)" + +msgid "Roland CM-32L Emulation" +msgstr "Емуляція Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Емуляція Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Дочірня плата OPL4-ML" + +msgid "System MIDI" +msgstr "MIDI системи" + +msgid "MIDI Input Device" +msgstr "Пристрій введення MIDI" + +msgid "BIOS Address" +msgstr "Адреса BIOS" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Увімкнути розширення BIOS Записи в ПЗУ" + +msgid "Address" +msgstr "Адреса" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "Ревізія BIOS" + +msgid "Translate 26 -> 17" +msgstr "Перекладіть 26 -> 17" + +msgid "Language" +msgstr "Мова" + +msgid "Enable backlight" +msgstr "Увімкнути підсвічування" + +msgid "Invert colors" +msgstr "Інвертувати кольори" + +msgid "BIOS size" +msgstr "Розмір BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Зіставлення C0000-C7FFF як UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Зіставлення C8000-CFFFF як UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Зіставлення D0000-D7FFF як UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Зіставлення D8000-DFFFF як UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Зіставлення E0000-E7FFF як UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Зіставлення E8000-EFFFF як UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Джампер JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Вихідний пристрій MIDI" + +msgid "MIDI Real time" +msgstr "MIDI в реальному часі" + +msgid "MIDI Thru" +msgstr "Прохід MIDI-вхіду" + +msgid "MIDI Clockout" +msgstr "Вихід MIDI-годинника" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Вихідний коефіцієнт підсилення" + +msgid "Chorus" +msgstr "Приспів" + +msgid "Chorus Voices" +msgstr "Голоси приспіву" + +msgid "Chorus Level" +msgstr "Рівень приспіву" + +msgid "Chorus Speed" +msgstr "Швидкість приспіву" + +msgid "Chorus Depth" +msgstr "Глибина приспіву" + +msgid "Chorus Waveform" +msgstr "Форма сигналу приспіву" + +msgid "Reverb" +msgstr "Реверберація" + +msgid "Reverb Room Size" +msgstr "Розмір ревербераційної кімнати" + +msgid "Reverb Damping" +msgstr "Демпфування реверберації" + +msgid "Reverb Width" +msgstr "Ширина реверберації" + +msgid "Reverb Level" +msgstr "Рівень реверберації" + +msgid "Interpolation Method" +msgstr "Метод інтерполяції" + +msgid "Reverb Output Gain" +msgstr "Посилення виходу реверберації" + +msgid "Reversed stereo" +msgstr "Реверсивне стерео" + +msgid "Nice ramp" +msgstr "Гарний пандус" + +msgid "Hz" +msgstr "Гц" + +msgid "Buttons" +msgstr "Кнопки" + +msgid "Serial Port" +msgstr "Послідовний порт" + +msgid "RTS toggle" +msgstr "Перемикач RTS" + +msgid "Revision" +msgstr "Ревізія" + +msgid "Controller" +msgstr "Контролер" + +msgid "Show Crosshair" +msgstr "Показати перехрестя" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC-адреса" + +msgid "MAC Address OUI" +msgstr "MAC-адреса OUI" + +msgid "Enable BIOS" +msgstr "Увімкнення BIOS" + +msgid "Baud Rate" +msgstr "Швидкість передачі даних" + +msgid "TCP/IP listening port" +msgstr "Порт прослуховування TCP/IP" + +msgid "Phonebook File" +msgstr "Файл телефонної книги" + +msgid "Telnet emulation" +msgstr "Емуляція Telnet" + +msgid "RAM Address" +msgstr "Адреса оперативної пам'яті" + +msgid "RAM size" +msgstr "Розмір оперативної пам'яті" + +msgid "Initial RAM size" +msgstr "Початковий розмір оперативної пам'яті" + +msgid "Serial Number" +msgstr "Серійний номер" + +msgid "Host ID" +msgstr "Ідентифікатор хоста" + +msgid "FDC Address" +msgstr "Адреса FDC" + +msgid "MPU-401 Address" +msgstr "Адреса MPU-401" + +msgid "MPU-401 IRQ" +msgstr "IRQ MPU-401" + +msgid "Receive MIDI input" +msgstr "Отримання MIDI-входу" + +msgid "Low DMA" +msgstr "Низький рівень DMA" + +msgid "Enable Game port" +msgstr "Увімкнути ігровий порт" + +msgid "Surround module" +msgstr "Модуль об'ємного звучання" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Піднімати переривання CODEC під час встановлення CODEC (потрібно для деяких драйверів)" + +msgid "SB Address" +msgstr "Адреса SB" + +msgid "WSS IRQ" +msgstr "IRQ WSS" + +msgid "WSS DMA" +msgstr "DMA WSS" + +msgid "Enable OPL" +msgstr "Ввімкнути OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Отримання MIDI-входу (MPU-401)" + +msgid "SB low DMA" +msgstr "SB низький DMA" + +msgid "6CH variant (6-channel)" +msgstr "Варіант 6CH (6-канальний)" + +msgid "Enable CMS" +msgstr "Ввімкнути CMS" + +msgid "Mixer" +msgstr "Міксер" + +msgid "High DMA" +msgstr "Високий DMA" + +msgid "Control PC speaker" +msgstr "Керування динаміком ПК" + +msgid "Memory size" +msgstr "Обсяг пам'яті" + +msgid "EMU8000 Address" +msgstr "Адреса EMU8000" + +msgid "IDE Controller" +msgstr "Контролер IDE" + +msgid "Codec" +msgstr "Кодек" + +msgid "GUS type" +msgstr "Тип GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Увімкнути команду 0x04 \"Вихід з 86Box\"." + +msgid "Display type" +msgstr "Тип відображення" + +msgid "Composite type" +msgstr "Композитний тип" + +msgid "RGB type" +msgstr "Тип RGB" + +msgid "Line doubling type" +msgstr "Тип подвоєння лінії" + +msgid "Snow emulation" +msgstr "Емуляція снігу" + +msgid "Monitor type" +msgstr "Тип монітора" + +msgid "Character set" +msgstr "Набір символів" + +msgid "XGA type" +msgstr "Тип XGA" + +msgid "Instance" +msgstr "Примірник" + +msgid "MMIO Address" +msgstr "Адреса MMIO" + +msgid "RAMDAC type" +msgstr "Тип RAMDAC" + +msgid "Blend" +msgstr "Суміш" + +msgid "Bilinear filtering" +msgstr "Білінійна фільтрація" + +msgid "Dithering" +msgstr "Дизеринг" + +msgid "Enable NMI for CGA emulation" +msgstr "Увімкнути NMI для емуляції CGA" + +msgid "Voodoo type" +msgstr "Тип вуду" + +msgid "Framebuffer memory size" +msgstr "Розмір пам'яті фреймбуфера" + +msgid "Texture memory size" +msgstr "Розмір пам'яті текстур" + +msgid "Dither subtraction" +msgstr "Віднімання з похибкою" + +msgid "Screen Filter" +msgstr "Сітчастий фільтр" + +msgid "Render threads" +msgstr "Відрендерити потоки" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Початкова адреса" + +msgid "Contiguous Size" +msgstr "Суміжний розмір" + +msgid "I/O Width" +msgstr "Ширина вводу/виводу" + +msgid "Transfer Speed" +msgstr "Швидкість передачі даних" + +msgid "EMS mode" +msgstr "Режим EMS" + +msgid "Address for > 2 MB" +msgstr "Адреса для > 2 МБ" + +msgid "Frame Address" +msgstr "Адреса кадру" + +msgid "USA" +msgstr "США" + +msgid "Danish" +msgstr "Данська" + +msgid "Always at selected speed" +msgstr "Завжди на обраній швидкості" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Налаштування BIOS + Гарячі клавіші (вимкнено під час POST)" + +msgid "64 kB starting from F0000" +msgstr "64 кБ, починаючи з F0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 кБ, починаючи з E0000 (адреса MSB інвертована, останні 64 кБ першими)" + +msgid "Sine" +msgstr "Синусоїдальна" + +msgid "Triangle" +msgstr "Трикутна" + +msgid "Linear" +msgstr "Лінійний" + +msgid "4th Order" +msgstr "4-го порядку" + +msgid "7th Order" +msgstr "7-го порядку" + +msgid "Non-timed (original)" +msgstr "Без таймера (оригінал)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Гц (без джампера на JMP2)" + +msgid "Two" +msgstr "Два" + +msgid "Three" +msgstr "Три" + +msgid "Wheel" +msgstr "Колесо" + +msgid "Five + Wheel" +msgstr "П'ять + колесо" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 послідовна / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) послідовна" + +msgid "8 kB" +msgstr "8 kБ" + +msgid "32 kB" +msgstr "32 kБ" + +msgid "16 kB" +msgstr "16 kБ" + +msgid "64 kB" +msgstr "64 kБ" + +msgid "Disable BIOS" +msgstr "Вимкнення BIOS" + +msgid "512 kB" +msgstr "512 kБ" + +msgid "2 MB" +msgstr "2 МБ" + +msgid "8 MB" +msgstr "8 МБ" + +msgid "28 MB" +msgstr "28 МБ" + +msgid "1 MB" +msgstr "1 МБ" + +msgid "4 MB" +msgstr "4 МБ" + +msgid "12 MB" +msgstr "12 МБ" + +msgid "16 MB" +msgstr "16 МБ" + +msgid "20 MB" +msgstr "20 МБ" + +msgid "24 MB" +msgstr "24 МБ" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (стерео)" + +msgid "Classic" +msgstr "Класичний" + +msgid "256 kB" +msgstr "256 kБ" + +msgid "Composite" +msgstr "Композитний" + +msgid "Old" +msgstr "Старий" + +msgid "New" +msgstr "Новий" + +msgid "Color (generic)" +msgstr "Кольоровий (загальний)" + +msgid "Green Monochrome" +msgstr "Зелений монохромний" + +msgid "Amber Monochrome" +msgstr "Бурштиновий монохромний" + +msgid "Gray Monochrome" +msgstr "Сірий монохромний" + +msgid "Color (no brown)" +msgstr "Кольоровий (без коричневого)" + +msgid "Color (IBM 5153)" +msgstr "Кольоровий (IBM 5153)" + +msgid "Simple doubling" +msgstr "Просте подвоєння" + +msgid "sRGB interpolation" +msgstr "sRGB інтерполяція" + +msgid "Linear interpolation" +msgstr "Лінійна інтерполяція" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Монохромний (5151/MDA) (білий)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Монохромний (5151/MDA) (зелений)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Монохромний (5151/MDA) (бурштиновий)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Кольоровий 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Кольоровий 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Покращений колір - звичайний режим (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Покращений колір - розширений режим (5154/ECD)" + +msgid "Green" +msgstr "Зелений" + +msgid "Amber" +msgstr "Бурштиновий" + +msgid "Gray" +msgstr "Сірий" + +msgid "Color" +msgstr "Кольоровий" + +msgid "U.S. English" +msgstr "Американський англійський" + +msgid "Scandinavian" +msgstr "Скандинавський" + +msgid "Other languages" +msgstr "Інші мови" + +msgid "Bochs latest" +msgstr "Bochs останній" + +msgid "Mono Non-Interlaced" +msgstr "Монохромний неінтерлейсний" + +msgid "Color Interlaced" +msgstr "Кольоровий інтерлейсний" + +msgid "Color Non-Interlaced" +msgstr "Кольоровий неінтерлейсний" + +msgid "3Dfx Voodoo Graphics" +msgstr "Прискорювач 3Dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU)" + +msgid "8-bit" +msgstr "8-розрядний" + +msgid "16-bit" +msgstr "16-розрядний" + +msgid "Standard (150ns)" +msgstr "Стандартний (150 нс)" + +msgid "High-Speed (120ns)" +msgstr "Високошвидкісний (120нс)" + +msgid "Enabled" +msgstr "Увімкнено" + +msgid "Standard" +msgstr "Стандартний" + +msgid "High-Speed" +msgstr "Високошвидкісний" + +msgid "Stereo LPT DAC" +msgstr "Стерео LPT ЦАП" + +msgid "Generic Text Printer" +msgstr "Загальний текстовий принтер" + +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Загальний матричний принтер ESC/P" + +msgid "Generic PostScript Printer" +msgstr "Загальний принтер PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Загальний принтер PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Parallel Line Internet Protocol" + +msgid "Protection Dongle for Savage Quest" +msgstr "Ключовий захист для Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Пристрій для пропуску послідовного порту" + +msgid "Passthrough Mode" +msgstr "Наскрізний режим" + +msgid "Host Serial Device" +msgstr "Послідовний пристрій хоста" + +msgid "Name of pipe" +msgstr "Назва пайпа" + +msgid "Data bits" +msgstr "Біти даних" + +msgid "Stop bits" +msgstr "Стоп-біти" + +msgid "Baud Rate of Passthrough" +msgstr "Швидкість передачі даних пропуску" + +msgid "Named Pipe (Server)" +msgstr "Іменований пайп (сервер)" + +msgid "Host Serial Passthrough" +msgstr "Пропуск послідовного порту хоста" + +msgid "Eject %s" +msgstr "Вилучити %s" + +msgid "&Unmute" +msgstr "&Увімкнути звук" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Високий вплив на продуктивність" + +msgid "RAM Disk (max. speed)" +msgstr "Диск оперативної пам'яті (макс. швидкість)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "Клон IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Виробник" + +msgid "30 Hz (JMP2 = 1)" +msgstr "30 Гц (JMP2 = 1)" + +msgid "60 Hz (JMP2 = 2)" +msgstr "60 Гц (JMP2 = 2)" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 6d9673e3d..1039e9b1c 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -39,9 +39,6 @@ msgstr "Ẩn tha&nh trạng thái" msgid "Hide &toolbar" msgstr "Ẩn thanh &công cụ" -msgid "Show non-primary monitors" -msgstr "Hiển thị các màn hình phụ" - msgid "&Resizeable window" msgstr "Tùy chỉnh cỡ cử&a sổ" @@ -69,9 +66,6 @@ msgstr "Tự nhập độ &phân giải..." msgid "F&orce 4:3 display ratio" msgstr "Giữ n&guyên khung hình 4:3" -msgid "Apply fullscreen stretch mode when maximized" -msgstr "Co giãn toàn màn hình khi cực đại hóa cửa sổ" - msgid "&Window scale factor" msgstr "Đổi &tỷ lệ cửa sổ" @@ -204,9 +198,6 @@ msgstr "Bật trình trạng thái cho Discord" msgid "Sound &gain..." msgstr "Bộ &tăng âm..." -msgid "Open screenshots folder..." -msgstr "Mở thư mục ảnh chụp màn hình..." - msgid "Begin trace\tCtrl+T" msgstr "Bắt đầu dò\tCtrl+T" @@ -399,8 +390,11 @@ msgstr "Bộ tái biên dịch động (Dynamic Recompiler)" msgid "Video:" msgstr "Video:" -msgid "Voodoo Graphics" -msgstr "Đồ họa Voodoo" +msgid "Video #2:" +msgstr "Video 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Đồ họa Voodoo 1 hoặc 2" msgid "IBM 8514/A Graphics" msgstr "Đồ họa IBM 8514/A" @@ -666,9 +660,6 @@ msgstr "86Box không tìm được bản ROM nào.\n\nVui lòng 17" +msgstr "Dịch 26 -> 17" + +msgid "Language" +msgstr "Ngôn ngữ" + +msgid "Enable backlight" +msgstr "Bật đèn nền" + +msgid "Invert colors" +msgstr "Đảo ngược màu sắc" + +msgid "BIOS size" +msgstr "Kích thước BIOS" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Bản đồ C0000-C7FFF dưới dạng UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Bản đồ C8000-CFFFF dưới dạng UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Bản đồ D0000-D7FFF dưới dạng UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Bản đồ D8000-Dffff dưới dạng UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Bản đồ E0000-E7FFF dưới dạng UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Bản đồ e8000-effff dưới dạng umb" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 Jumper (Jim)" + +msgid "MIDI Output Device" +msgstr "Thiết bị đầu ra MIDI" + +msgid "MIDI Real time" +msgstr "MIDI trong thời gian thực" + +msgid "MIDI Thru" +msgstr "Thông qua đầu vào MIDI" + +msgid "MIDI Clockout" +msgstr "MIDI đồng hồ" + +msgid "SoundFont" +msgstr "Soundfont" + +msgid "Output Gain" +msgstr "Đầu ra tăng" + +msgid "Chorus" +msgstr "Điệp khúc" + +msgid "Chorus Voices" +msgstr "Tiếng nói của điệp khúc" + +msgid "Chorus Level" +msgstr "Cấp độ điệp khúc" + +msgid "Chorus Speed" +msgstr "Tốc độ điệp khúc" + +msgid "Chorus Depth" +msgstr "Độ sâu điệp khúc" + +msgid "Chorus Waveform" +msgstr "Dạng sóng điệp khúc" + +msgid "Reverb" +msgstr "Hồi âm" + +msgid "Reverb Room Size" +msgstr "Kích thước phòng hồi âm" + +msgid "Reverb Damping" +msgstr "Giảm chấn hồi âm" + +msgid "Reverb Width" +msgstr "Chiều rộng hồi âm" + +msgid "Reverb Level" +msgstr "Mức độ hồi âm" + +msgid "Interpolation Method" +msgstr "Phương pháp nội suy" + +msgid "Reverb Output Gain" +msgstr "Gợi ý đầu ra hồi âm" + +msgid "Reversed stereo" +msgstr "Đảo ngược âm thanh nổi" + +msgid "Nice ramp" +msgstr "Đoạn đường dốc đẹp" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Nút" + +msgid "Serial Port" +msgstr "Cổng serial" + +msgid "RTS toggle" +msgstr "RT chuyển đổi" + +msgid "Revision" +msgstr "Ôn tập" + +msgid "Controller" +msgstr "Người điều khiển" + +msgid "Show Crosshair" +msgstr "Hiển thị hình chữ thập" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Địa chỉ MAC" + +msgid "MAC Address OUI" +msgstr " OUI địa chỉ MAC" + +msgid "Enable BIOS" +msgstr "Bật BIOS" + +msgid "Baud Rate" +msgstr "Tốc độ baud" + +msgid "TCP/IP listening port" +msgstr "Cổng nghe TCP/IP" + +msgid "Phonebook File" +msgstr "Tệp danh bạ" + +msgid "Telnet emulation" +msgstr "Mô phỏng telnet" + +msgid "RAM Address" +msgstr "Địa chỉ RAM" + +msgid "RAM size" +msgstr "Kích thước ram" + +msgid "Initial RAM size" +msgstr "Kích thước ram ban đầu" + +msgid "Serial Number" +msgstr "Số seri" + +msgid "Host ID" +msgstr "ID máy chủ" + +msgid "FDC Address" +msgstr "Địa chỉ FDC" + +msgid "MPU-401 Address" +msgstr "Địa chỉ MPU-401" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "Nhận nhập MIDI" + +msgid "Low DMA" +msgstr "DMA thấp" + +msgid "Enable Game port" +msgstr "Bật cổng trò chơi" + +msgid "Surround module" +msgstr "Mô đun vòm" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "Tăng ngắt CODEC trên thiết lập CODEC (cần bởi một số trình điều khiển)" + +msgid "SB Address" +msgstr "Địa chỉ SB" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "Bật OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Nhận nhập MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "SB DMA thấp" + +msgid "6CH variant (6-channel)" +msgstr "Biến thể 6CH (6 kênh)" + +msgid "Enable CMS" +msgstr "Bật CMS" + +msgid "Mixer" +msgstr "Máy trộn" + +msgid "High DMA" +msgstr "DMA cao" + +msgid "Control PC speaker" +msgstr "Kiểm soát loa PC" + +msgid "Memory size" +msgstr "Kích thước bộ nhớ" + +msgid "EMU8000 Address" +msgstr "Địa chỉ EMU8000" + +msgid "IDE Controller" +msgstr "Bộ điều khiển IDE" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "Loại Gus" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Bật lệnh 0x04 \" Thoát 86box \"" + +msgid "Display type" +msgstr "Loại hiển thị" + +msgid "Composite type" +msgstr "Loại tổng hợp" + +msgid "RGB type" +msgstr "Loại RGB" + +msgid "Line doubling type" +msgstr "Dòng nhân đôi" + +msgid "Snow emulation" +msgstr "Đun tuyết" + +msgid "Monitor type" +msgstr "Loại giám sát" + +msgid "Character set" +msgstr "Bộ ký tự" + +msgid "XGA type" +msgstr "Loại XGA" + +msgid "Instance" +msgstr "Ví dụ" + +msgid "MMIO Address" +msgstr "Địa chỉ MMIO" + +msgid "RAMDAC type" +msgstr "Loại Ramdac" + +msgid "Blend" +msgstr "Trộn" + +msgid "Bilinear filtering" +msgstr "Lọc song tuyến" + +msgid "Dithering" +msgstr "Ngân tán" + +msgid "Enable NMI for CGA emulation" +msgstr "Bật NMI cho mô phỏng CGA" + +msgid "Voodoo type" +msgstr "Loại voodoo" + +msgid "Framebuffer memory size" +msgstr "Kích thước bộ nhớ FRAMEBUFFER" + +msgid "Texture memory size" +msgstr "Kích thước bộ nhớ kết cấu" + +msgid "Dither subtraction" +msgstr "Phân biệt trừ" + +msgid "Screen Filter" +msgstr "Bộ lọc màn hình" + +msgid "Render threads" +msgstr "Kết xuất chủ đề" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Địa chỉ bắt đầu" + +msgid "Contiguous Size" +msgstr "Kích thước tiếp giáp" + +msgid "I/O Width" +msgstr "Chiều rộng I/O" + +msgid "Transfer Speed" +msgstr "Tốc độ chuyển" + +msgid "EMS mode" +msgstr "Chế độ EMS" + +msgid "Address for > 2 MB" +msgstr "Địa chỉ cho> 2 MB" + +msgid "Frame Address" +msgstr "Địa chỉ khung" + +msgid "USA" +msgstr "Hoa Kỳ" + +msgid "Danish" +msgstr "Đan Mạch" + +msgid "Always at selected speed" +msgstr "Luôn ở tốc độ đã chọn" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Cài đặt BIOS + phím nóng (TẮT trong bài đăng)" + +msgid "64 kB starting from F0000" +msgstr "64 kb bắt đầu từ f0000" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kb bắt đầu từ E0000 (địa chỉ MSB đảo ngược, 64kb cuối cùng)" + +msgid "Sine" +msgstr "Sin" + +msgid "Triangle" +msgstr "Tam giác" + +msgid "Linear" +msgstr "Tuyến tính" + +msgid "4th Order" +msgstr "Thứ tự thứ 4" + +msgid "7th Order" +msgstr "Thứ tự thứ 7" + +msgid "Non-timed (original)" +msgstr "Không đúng lúc (bản gốc)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 không dân cư)" + +msgid "Two" +msgstr "Hai" + +msgid "Three" +msgstr "Ba" + +msgid "Wheel" +msgstr "Bánh xe" + +msgid "Five + Wheel" +msgstr "Năm + bánh xe" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 Serial / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) Serial" + +msgid "8 kB" +msgstr "8 kb" + +msgid "32 kB" +msgstr "32 kb" + +msgid "16 kB" +msgstr "16 kb" + +msgid "64 kB" +msgstr "64 kb" + +msgid "Disable BIOS" +msgstr "Vô hiệu hóa BIOS" + +msgid "512 kB" +msgstr "512 kb" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "Sigmatel Stac9721T (âm thanh nổi)" + +msgid "Classic" +msgstr "Cổ điển" + +msgid "256 kB" +msgstr "256 kb" + +msgid "Composite" +msgstr "Tổng hợp" + +msgid "Old" +msgstr "Cũ" + +msgid "New" +msgstr "Mới" + +msgid "Color (generic)" +msgstr "Màu (chung)" + +msgid "Green Monochrome" +msgstr "Đơn sắc màu xanh lá cây" + +msgid "Amber Monochrome" +msgstr "Đơn sắc màu hổ phách" + +msgid "Gray Monochrome" +msgstr "Đơn sắc màu xám" + +msgid "Color (no brown)" +msgstr "Màu (không có màu nâu)" + +msgid "Color (IBM 5153)" +msgstr "Màu sắc (IBM 5153)" + +msgid "Simple doubling" +msgstr "Nhân đôi đơn giản" + +msgid "sRGB interpolation" +msgstr "Nội suy SRGB" + +msgid "Linear interpolation" +msgstr "Nội suy tuyến tính" + +msgid "128 kB" +msgstr "128 kb" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Đơn sắc (5151/MDA) (Trắng)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Đơn sắc (5151/MDA) (màu xanh lá cây)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Đơn sắc (5151/MDA) (Amber)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Màu 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Màu 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Màu sắc nâng cao - Chế độ bình thường (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Màu sắc nâng cao - Chế độ nâng cao (5154/ECD)" + +msgid "Green" +msgstr "Màu xanh lá cây" + +msgid "Amber" +msgstr "Màu hổ phách" + +msgid "Gray" +msgstr "Màu xám" + +msgid "Color" +msgstr "Màu sắc" + +msgid "U.S. English" +msgstr "Tiếng Anh Hoa Kỳ" + +msgid "Scandinavian" +msgstr "Scandinavia" + +msgid "Other languages" +msgstr "Các ngôn ngữ khác" + +msgid "Bochs latest" +msgstr "Bochs mới nhất" + +msgid "Mono Non-Interlaced" +msgstr "Đơn sắc không được xen kẽ" + +msgid "Color Interlaced" +msgstr "Màu sắc xen kẽ" + +msgid "Color Non-Interlaced" +msgstr "Màu sắc không được xen kẽ" + +msgid "3Dfx Voodoo Graphics" +msgstr "Đồ họa 3Dfx Voodoo" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU)" + +msgid "8-bit" +msgstr "8 bit" + +msgid "16-bit" +msgstr "16 bit" + +msgid "Standard (150ns)" +msgstr "Tiêu chuẩn (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Tốc độ cao (120ns)" + +msgid "Enabled" +msgstr "Đã bật" + +msgid "Standard" +msgstr "Tiêu chuẩn" + +msgid "High-Speed" +msgstr "Tốc độ cao" + +msgid "Stereo LPT DAC" +msgstr "STEREO LPT DAC" + +msgid "Generic Text Printer" +msgstr "Máy in generic văn bản" + +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Máy in generic ESC/P ma trận chấm" + +msgid "Generic PostScript Printer" +msgstr "Máy in generic PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Máy in generic PCL5E" + +msgid "Parallel Line Internet Protocol" +msgstr "Parallel Line Internet Protocol" + +msgid "Protection Dongle for Savage Quest" +msgstr "Bảo vệ dongle cho Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Thiết bị thông qua cổng serial" + +msgid "Passthrough Mode" +msgstr "Chế độ thông qua" + +msgid "Host Serial Device" +msgstr "Thiết bị serial máy chủ" + +msgid "Name of pipe" +msgstr "Tên của đường ống" + +msgid "Data bits" +msgstr "Bit dữ liệu" + +msgid "Stop bits" +msgstr "Dừng bit" + +msgid "Baud Rate of Passthrough" +msgstr "Tốc độ baud của qua đường" + +msgid "Named Pipe (Server)" +msgstr "Đường ống được đặt 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 "&Unmute" +msgstr "&Không quay được" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Tác động cao đến hiệu suất" + +msgid "RAM Disk (max. speed)" +msgstr "Đĩa RAM (Tối đa. Tốc độ)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A dòng vô tính (ISA)" + +msgid "Vendor" +msgstr "Nhà sản xuất" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index c8bd8f7bd..6bbd22181 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -390,14 +390,17 @@ msgstr "动态重编译器" msgid "Video:" msgstr "显卡:" -msgid "Voodoo Graphics" -msgstr "Voodoo Graphics" +msgid "Video #2:" +msgstr "显卡 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 或 2 图形" msgid "IBM 8514/A Graphics" -msgstr "IBM 8514/A Graphics" +msgstr "IBM 8514/A 图形" msgid "XGA Graphics" -msgstr "XGA Graphics" +msgstr "XGA 图形" msgid "Mouse:" msgstr "鼠标:" @@ -684,6 +687,9 @@ msgstr "由于 roms/machines 文件夹中缺少合适的 ROM,机型 \"%hs\" msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "由于 roms/video 文件夹中缺少合适的 ROM,显卡 \"%hs\" 不可用。将切换到其他可用显卡。" +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "由于 roms/video 文件夹中缺少合适的 ROM,显卡 2 \"%hs\" 不可用。将切换到其他可用显卡。" + msgid "Machine" msgstr "机型" @@ -762,17 +768,26 @@ msgstr "未找到 PCap 设备" msgid "Invalid PCap device" msgstr "无效 PCap 设备" -msgid "Standard 2-button joystick(s)" -msgstr "标准 2 键操纵杆" +msgid "2-axis, 2-button joystick(s)" +msgstr "2 轴, 2 键操纵杆" -msgid "Standard 4-button joystick" -msgstr "标准 4 键操纵杆" +msgid "2-axis, 4-button joystick" +msgstr "2 轴, 4 键操纵杆" -msgid "Standard 6-button joystick" -msgstr "标准 6 键操纵杆" +msgid "2-axis, 6-button joystick" +msgstr "2 轴, 6 键操纵杆" -msgid "Standard 8-button joystick" -msgstr "标准 8 键操纵杆" +msgid "2-axis, 8-button joystick" +msgstr "2 轴, 8 键操纵杆" + +msgid "3-axis, 2-button joystick" +msgstr "3 轴, 2 键操纵杆" + +msgid "3-axis, 4-button joystick" +msgstr "3 轴, 4 键操纵杆" + +msgid "4-axis, 4-button joystick" +msgstr "4 轴, 4 键操纵杆" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "确定要退出 86Box 吗?" msgid "Unable to initialize Ghostscript" msgstr "无法初始化 Ghostscript" +msgid "Unable to initialize GhostPCL" +msgstr "无法初始化 GhostPCL" + msgid "MO %i (%ls): %ls" msgstr "磁光盘 %i (%ls): %ls" @@ -816,8 +834,8 @@ msgstr "磁光盘映像" msgid "Welcome to 86Box!" msgstr "欢迎使用 86Box!" -msgid "Internal controller" -msgstr "内部控制器" +msgid "Internal device" +msgstr "内部设备" msgid "Exit" msgstr "退出" @@ -855,6 +873,9 @@ msgstr "无效配置" 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 是将 PostScript 文件转换为 PDF 所需要的库。\n\n使用通用 PostScript 打印机打印的文档将被保存为 PostScript (.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." +msgstr "%1 是将 PCL 文件转换为 PDF 所需要的库。\n\n使用通用 PCL 打印机打印的文档将被保存为 Printer Command Language (.pcl) 文件。" + msgid "Entering fullscreen mode" msgstr "正在进入全屏模式" @@ -999,6 +1020,27 @@ msgstr "覆盖" msgid "Don't overwrite" msgstr "不覆盖" +msgid "Raw image" +msgstr "原始映像" + +msgid "HDI image" +msgstr "HDI 映像" + +msgid "HDX image" +msgstr "HDX 映像" + +msgid "Fixed-size VHD" +msgstr "固定大小 VHD" + +msgid "Dynamic-size VHD" +msgstr "动态大小 VHD" + +msgid "Differencing VHD" +msgstr "差分 VHD" + +msgid "(N/A)" +msgstr "(不适用)" + msgid "Raw image (.img)" msgstr "原始映像 (.img)" @@ -1172,3 +1214,909 @@ msgstr "WinBox 不再受支持" 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 "由于缺乏维护者,WinBox 管理器的开发工作于 2022 年停止。由于我们正努力将 86Box 做得更好,因此决定不再支持 WinBox 作为管理器。\n\nWinBox将不再提供更新,如果你继续在86Box的新版本中使用WinBox,可能会遇到不正确的行为。任何与 WinBox 行为相关的错误报告都将被视为无效而关闭。\n\n请访问 86box.net,查看你可以使用的其他管理器列表。" + +msgid "Generate" +msgstr "生成" + +msgid "Joystick configuration" +msgstr "操纵杆配置" + +msgid "Device" +msgstr "设备" + +msgid "%1 (X axis)" +msgstr "%1(X 轴)" + +msgid "%1 (Y axis)" +msgstr "%1(Y 轴)" + +msgid "MCA devices" +msgstr "MCA 设备" + +msgid "List of MCA devices:" +msgstr "MCA 设备清单:" + +msgid "Tablet tool" +msgstr "平板工具" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt(OpenGL &ES)" + +msgid "About Qt" +msgstr "关于 Qt" + +msgid "MCA devices..." +msgstr "MCA 设备..." + +msgid "Show non-primary monitors" +msgstr "显示非主要监控器" + +msgid "Open screenshots folder..." +msgstr "打开屏幕截图文件夹..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "最大化时应用全屏拉伸模式" + +msgid "Cursor/Puck" +msgstr "光标/冰球" + +msgid "Pen" +msgstr "笔" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "主机 CD/DVD 驱动器 (%1:)" + +msgid "&Connected" +msgstr "&Connected" + +msgid "Clear image history" +msgstr "清除图像历史" + +msgid "Create..." +msgstr "创建..." + +msgid "previous image" +msgstr "上一张" + +msgid "Host CD/DVD Drive (%1)" +msgstr "主机 CD/DVD 驱动器 (%1)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "渲染行为" + +msgid "Use target framerate:" +msgstr "使用目标帧率:" + +msgid " fps" +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 "与视频同步" + +msgid "Shaders" +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 上下文。" + +msgid "Couldn't switch to OpenGL context." +msgstr "无法切换到 OpenGL 上下文。" + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "需要 OpenGL 3.0 或更高版本。当前版本为 %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "OpenGL 初始化失败。错误 %1." + +msgid "Error initializing OpenGL" +msgstr "初始化 OpenGL 时出错" + +msgid "Falling back to software rendering.\n" +msgstr "回到软件渲染。" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "为解包缓冲区分配内存失败.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>选择媒体图像(光盘、软盘等)时,打开对话框将从与 86Box 配置文件相同的目录开始。这一设置可能只会在 macOS 上产生影响。</p></body></html>;" + +msgid "This machine might have been moved or copied." +msgstr "这台机器可能被移动或复制过。" + +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 "为了确保网络功能正常,86Box需要知道这台机器是否被移动或复制。\n\n如果您不确定,请选择\"我复制了它\"。" + +msgid "I Moved It" +msgstr "我搬走了它" + +msgid "I Copied It" +msgstr "我复制了它" + +msgid "86Box Monitor #" +msgstr "86Box 监测器 " + +msgid "No MCA devices." +msgstr "无 MCA 设备。" + +msgid "MiB" +msgstr "米字节" + +msgid "Network Card #1" +msgstr "网卡 1" + +msgid "Network Card #2" +msgstr "网卡 2" + +msgid "Network Card #3" +msgstr "网卡 3" + +msgid "Network Card #4" +msgstr "网卡 4" + +msgid "Mode" +msgstr "模式" + +msgid "Interface" +msgstr "界面" + +msgid "Adapter" +msgstr "适配器" + +msgid "VDE Socket" +msgstr "VDE 插座" + +msgid "86Box Unit Tester" +msgstr "86Box 装置测试仪" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x 密钥卡" + +msgid "Serial port passthrough 1" +msgstr "串行端口直通 1" + +msgid "Serial port passthrough 2" +msgstr "串行端口直通 2" + +msgid "Serial port passthrough 3" +msgstr "串行端口直通 3" + +msgid "Serial port passthrough 4" +msgstr "串行端口直通 4" + +msgid "Vision Systems LBA Enhancer" +msgstr "视觉系统 LBA 增强器" + +msgid "Renderer options..." +msgstr "渲染器选项..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft 总线鼠标" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft 总线鼠标(InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse Systems 串鼠标" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft 串鼠标" + +msgid "Logitech Serial Mouse" +msgstr "Logitech 串鼠标" + +msgid "PS/2 Mouse" +msgstr "PS/2 鼠标" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (串)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] 标准海斯兼容调制解调器" + +msgid "Roland MT-32 Emulation" +msgstr "Roland MT-32 仿真" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Roland MT-32(新)仿真" + +msgid "Roland CM-32L Emulation" +msgstr "Roland CM-32L 仿真" + +msgid "Roland CM-32LN Emulation" +msgstr "Roland CM-32LN 仿真" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML 子板" + +msgid "System MIDI" +msgstr "系统 MIDI" + +msgid "MIDI Input Device" +msgstr "MIDI 输入设备" + +msgid "BIOS Address" +msgstr "BIOS 地址" + +msgid "Enable BIOS extension ROM Writes" +msgstr "启用 BIOS 扩展 ROM 写入功能" + +msgid "Address" +msgstr "地址" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS 修订版" + +msgid "Translate 26 -> 17" +msgstr "翻译 26 -> 17" + +msgid "Language" +msgstr "语言" + +msgid "Enable backlight" +msgstr "启用背光" + +msgid "Invert colors" +msgstr "反转颜色" + +msgid "BIOS size" +msgstr "BIOS 大小" + +msgid "Map C0000-C7FFF as UMB" +msgstr "将 C0000-C7FFF 映射为 UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "将 C8000-CFFFF 映射为 UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "将 D0000-D7FFF 映射为 UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "将 D8000-DFFFF 映射为 UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "将 E0000-E7FFF 映射为 UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "将 E8000-EFFFF 映射为 UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 跳线 (JIM)" + +msgid "MIDI Output Device" +msgstr "MIDI 输出设备" + +msgid "MIDI Real time" +msgstr "实时 MIDI" + +msgid "MIDI Thru" +msgstr "MIDI 输入直通" + +msgid "MIDI Clockout" +msgstr "MIDI 时钟输出" + +msgid "SoundFont" +msgstr "声音字体" + +msgid "Output Gain" +msgstr "输出增益" + +msgid "Chorus" +msgstr "合唱" + +msgid "Chorus Voices" +msgstr "合唱声部" + +msgid "Chorus Level" +msgstr "合唱音量" + +msgid "Chorus Speed" +msgstr "合唱速度" + +msgid "Chorus Depth" +msgstr "合唱深度" + +msgid "Chorus Waveform" +msgstr "合唱波形" + +msgid "Reverb" +msgstr "混响" + +msgid "Reverb Room Size" +msgstr "混响室的大小" + +msgid "Reverb Damping" +msgstr "混响阻尼" + +msgid "Reverb Width" +msgstr "混响宽度" + +msgid "Reverb Level" +msgstr "混响电平" + +msgid "Interpolation Method" +msgstr "插值法" + +msgid "Reverb Output Gain" +msgstr "混响输出的增益" + +msgid "Reversed stereo" +msgstr "反转立体声" + +msgid "Nice ramp" +msgstr "漂亮的斜坡" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "按钮" + +msgid "Serial Port" +msgstr "串行端口" + +msgid "RTS toggle" +msgstr "RTS 切换" + +msgid "Revision" +msgstr "修订" + +msgid "Controller" +msgstr "控制器" + +msgid "Show Crosshair" +msgstr "显示十字准线" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC 地址" + +msgid "MAC Address OUI" +msgstr "MAC 地址的 OUI" + +msgid "Enable BIOS" +msgstr "启用 BIOS" + +msgid "Baud Rate" +msgstr "波特率" + +msgid "TCP/IP listening port" +msgstr "TCP/IP 监听端口" + +msgid "Phonebook File" +msgstr "电话簿文件" + +msgid "Telnet emulation" +msgstr "Telnet 仿真" + +msgid "RAM Address" +msgstr "内存地址" + +msgid "RAM size" +msgstr "内存大小" + +msgid "Initial RAM size" +msgstr "初始 RAM 大小" + +msgid "Serial Number" +msgstr "序列号" + +msgid "Host ID" +msgstr "主机 ID" + +msgid "FDC Address" +msgstr "FDC 地址" + +msgid "MPU-401 Address" +msgstr "MPU-401 地址" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "接收 MIDI 输入" + +msgid "Low DMA" +msgstr "低 DMA" + +msgid "Enable Game port" +msgstr "启用游戏端口" + +msgid "Surround module" +msgstr "环绕声模块" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "在 CODEC 设置时引发 CODEC 中断(某些驱动程序需要)。" + +msgid "SB Address" +msgstr "SB 地址" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "启用 OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "接收 MIDI 输入(MPU-401)" + +msgid "SB low DMA" +msgstr "SB 低 DMA" + +msgid "6CH variant (6-channel)" +msgstr "6 通道变体(6 通道)" + +msgid "Enable CMS" +msgstr "启用内容管理系统" + +msgid "Mixer" +msgstr "混合器" + +msgid "High DMA" +msgstr "高 DMA" + +msgid "Control PC speaker" +msgstr "控制电脑扬声器" + +msgid "Memory size" +msgstr "内存大小" + +msgid "EMU8000 Address" +msgstr "EMU8000 地址" + +msgid "IDE Controller" +msgstr "IDE 控制器" + +msgid "Codec" +msgstr "编解码器" + +msgid "GUS type" +msgstr "GUS 型" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "启用命令 0x04 \"退出 86Box\"" + +msgid "Display type" +msgstr "显示类型" + +msgid "Composite type" +msgstr "复合型" + +msgid "RGB type" +msgstr "RGB 类型" + +msgid "Line doubling type" +msgstr "线路倍增类型" + +msgid "Snow emulation" +msgstr "雪地模拟" + +msgid "Monitor type" +msgstr "显示器类型" + +msgid "Character set" +msgstr "字符集" + +msgid "XGA type" +msgstr "XGA 类型" + +msgid "Instance" +msgstr "实例" + +msgid "MMIO Address" +msgstr "MMIO 地址" + +msgid "RAMDAC type" +msgstr "RAMDAC 类型" + +msgid "Blend" +msgstr "混合" + +msgid "Bilinear filtering" +msgstr "双线性滤波" + +msgid "Dithering" +msgstr "抖动" + +msgid "Enable NMI for CGA emulation" +msgstr "为 CGA 仿真启用 NMI" + +msgid "Voodoo type" +msgstr "巫毒类型" + +msgid "Framebuffer memory size" +msgstr "帧缓冲区内存大小" + +msgid "Texture memory size" +msgstr "纹理内存大小" + +msgid "Dither subtraction" +msgstr "抖动减法" + +msgid "Screen Filter" +msgstr "滤网" + +msgid "Render threads" +msgstr "渲染线程" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "起始地址" + +msgid "Contiguous Size" +msgstr "连续尺寸" + +msgid "I/O Width" +msgstr "输入/输出宽度" + +msgid "Transfer Speed" +msgstr "传输速度" + +msgid "EMS mode" +msgstr "紧急医疗服务模式" + +msgid "Address for > 2 MB" +msgstr "地址 > 2 MB" + +msgid "Frame Address" +msgstr "帧地址" + +msgid "USA" +msgstr "美国" + +msgid "Danish" +msgstr "丹麦语" + +msgid "Always at selected speed" +msgstr "始终保持选定速度" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS 设置 + 热键 (开机自检期间关闭)" + +msgid "64 kB starting from F0000" +msgstr "64 kB,从 F0000 开始" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB,从 E0000 开始 (地址 MSB 反相,最后 64KB 优先)" + +msgid "Sine" +msgstr "正弦" + +msgid "Triangle" +msgstr "三角" + +msgid "Linear" +msgstr "线性" + +msgid "4th Order" +msgstr "四阶" + +msgid "7th Order" +msgstr "七阶" + +msgid "Non-timed (original)" +msgstr "没有计时器 (原版)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 上无跳线)" + +msgid "Two" +msgstr "两个" + +msgid "Three" +msgstr "三个" + +msgid "Wheel" +msgstr "车轮" + +msgid "Five + Wheel" +msgstr "五+轮" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 串 / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R)串" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "禁用 BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (立体声)" + +msgid "Classic" +msgstr "经典" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "复合材料" + +msgid "Old" +msgstr "旧" + +msgid "New" +msgstr "新" + +msgid "Color (generic)" +msgstr "颜色(通用)" + +msgid "Green Monochrome" +msgstr "单色绿色" + +msgid "Amber Monochrome" +msgstr "琥珀单色" + +msgid "Gray Monochrome" +msgstr "灰色单色" + +msgid "Color (no brown)" +msgstr "颜色(无棕色)" + +msgid "Color (IBM 5153)" +msgstr "彩色(IBM 5153)" + +msgid "Simple doubling" +msgstr "简单加倍" + +msgid "sRGB interpolation" +msgstr "sRGB 插值" + +msgid "Linear interpolation" +msgstr "线性插值" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "单色(5151/MDA)(白色)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "单色(5151/MDA)(绿色)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "单色 (5151/MDA)(琥珀色)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "彩色 40x25(5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "彩色 80x25(5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "增强色彩 - 正常模式 (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "增强色彩 - 增强模式 (5154/ECD)" + +msgid "Green" +msgstr "绿色" + +msgid "Amber" +msgstr "琥珀色" + +msgid "Gray" +msgstr "灰色" + +msgid "Color" +msgstr "颜色" + +msgid "U.S. English" +msgstr "美国英语" + +msgid "Scandinavian" +msgstr "斯堪的纳维亚" + +msgid "Other languages" +msgstr "其他语言" + +msgid "Bochs latest" +msgstr "Bochs 最新版本" + +msgid "Mono Non-Interlaced" +msgstr "单色非隔行扫描" + +msgid "Color Interlaced" +msgstr "彩色隔行扫描" + +msgid "Color Non-Interlaced" +msgstr "彩色非隔行扫描" + +msgid "3Dfx Voodoo Graphics" +msgstr "3Dfx Voodoo 图形" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst(2 个 TMU)" + +msgid "8-bit" +msgstr "8 位" + +msgid "16-bit" +msgstr "16 位" + +msgid "Standard (150ns)" +msgstr "标准 (150ns)" + +msgid "High-Speed (120ns)" +msgstr "高速 (120ns)" + +msgid "Enabled" +msgstr "已启用" + +msgid "Standard" +msgstr "标准" + +msgid "High-Speed" +msgstr "高速" + +msgid "Stereo LPT DAC" +msgstr "立体声 LPT DAC" + +msgid "Generic Text Printer" +msgstr "通用文本打印机" + +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "通用 ESC/P 点阵打印机" + +msgid "Generic PostScript Printer" +msgstr "通用 PostScript 打印机" + +msgid "Generic PCL5e Printer" +msgstr "通用 PCL5e 打印机" + +msgid "Parallel Line Internet Protocol" +msgstr "Parallel Line Internet Protocol" + +msgid "Protection Dongle for Savage Quest" +msgstr "Savage Quest保护加密狗" + +msgid "Serial Passthrough Device" +msgstr "串行端口直通设备" + +msgid "Passthrough Mode" +msgstr "直通模式" + +msgid "Host Serial Device" +msgstr "主机串行设备" + +msgid "Name of pipe" +msgstr "管道名称" + +msgid "Data bits" +msgstr "数据位" + +msgid "Stop bits" +msgstr "停止位" + +msgid "Baud Rate of Passthrough" +msgstr "直通波特率" + +msgid "Named Pipe (Server)" +msgstr "命名管道(服务器)" + +msgid "Host Serial Passthrough" +msgstr "主机串行端口直通" + +msgid "Eject %s" +msgstr "弹出 %s" + +msgid "&Unmute" +msgstr "打开声音(&U)" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "对性能影响大" + +msgid "RAM Disk (max. speed)" +msgstr "RAM磁盘 (最大速度)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A克隆 (ISA)" + +msgid "Vendor" +msgstr "制造商" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 3de6bf4c4..7851aa302 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -390,8 +390,11 @@ msgstr "動態重編譯器" msgid "Video:" msgstr "顯示卡:" -msgid "Voodoo Graphics" -msgstr "Voodoo Graphics" +msgid "Video #2:" +msgstr "顯示卡 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 或 2 圖形" msgid "IBM 8514/A Graphics" msgstr "IBM 8514/A Graphics" @@ -684,6 +687,9 @@ msgstr "由於 roms/machines 資料夾中缺少合適的 ROM,機型 \"%hs\" msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." msgstr "由於 roms/video 資料夾中缺少合適的 ROM,顯示卡 \"%hs\" 不可用。將切換到其他可用顯示卡。" +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "由於 roms/video 資料夾中缺少合適的 ROM,顯示卡 2 \"%hs\" 不可用。將切換到其他可用顯示卡。" + msgid "Machine" msgstr "機型" @@ -762,17 +768,26 @@ msgstr "未找到 PCap 裝置" msgid "Invalid PCap device" msgstr "無效 PCap 裝置" -msgid "Standard 2-button joystick(s)" -msgstr "標準 2 鍵搖桿" +msgid "2-axis, 2-button joystick(s)" +msgstr "2 軸, 2 鍵搖桿" -msgid "Standard 4-button joystick" -msgstr "標準 4 鍵搖桿" +msgid "2-axis, 4-button joystick" +msgstr "2 軸, 4 鍵搖桿" -msgid "Standard 6-button joystick" -msgstr "標準 6 鍵搖桿" +msgid "2-axis, 6-button joystick" +msgstr "2 軸, 6 鍵搖桿" -msgid "Standard 8-button joystick" -msgstr "標準 8 鍵搖桿" +msgid "2-axis, 8-button joystick" +msgstr "2 軸, 8 鍵搖桿" + +msgid "3-axis, 2-button joystick" +msgstr "3 軸, 2 鍵搖桿" + +msgid "3-axis, 4-button joystick" +msgstr "3 軸, 4 鍵搖桿" + +msgid "4-axis, 4-button joystick" +msgstr "4 軸, 4 鍵搖桿" msgid "CH Flightstick Pro" msgstr "CH Flightstick Pro" @@ -807,6 +822,9 @@ msgstr "確定要退出 86Box 嗎?" msgid "Unable to initialize Ghostscript" msgstr "無法初始化 Ghostscript" +msgid "Unable to initialize GhostPCL" +msgstr "無法初始化 GhostPCL" + msgid "MO %i (%ls): %ls" msgstr "磁光碟 %i (%ls): %ls" @@ -816,8 +834,8 @@ msgstr "磁光碟映像" msgid "Welcome to 86Box!" msgstr "歡迎使用 86Box!" -msgid "Internal controller" -msgstr "內部控制器" +msgid "Internal device" +msgstr "內部裝置" msgid "Exit" msgstr "退出" @@ -855,6 +873,9 @@ msgstr "無效設定" 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 是將 PostScript 檔案轉換為 PDF 所需要的庫。\n\n使用通用 PostScript 印表機列印的文件將被儲存為 PostScript (.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." +msgstr "%1 是將 PCL 檔案轉換為 PDF 所需要的庫。\n\n使用通用 PCL 印表機列印的文件將被儲存為 Printer Command Language (.pcl) 檔案。" + msgid "Entering fullscreen mode" msgstr "正在進入全螢幕模式" @@ -999,6 +1020,27 @@ msgstr "覆蓋" msgid "Don't overwrite" msgstr "不覆蓋" +msgid "Raw image" +msgstr "原始映像" + +msgid "HDI image" +msgstr "HDI 映像" + +msgid "HDX image" +msgstr "HDX 映像" + +msgid "Fixed-size VHD" +msgstr "固定大小 VHD" + +msgid "Dynamic-size VHD" +msgstr "動態大小 VHD" + +msgid "Differencing VHD" +msgstr "差分 VHD" + +msgid "(N/A)" +msgstr "(不適用)" + msgid "Raw image (.img)" msgstr "原始映像 (.img)" @@ -1172,3 +1214,909 @@ msgstr "WinBox is no longer supported" 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 behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." + +msgid "Generate" +msgstr "產生" + +msgid "Joystick configuration" +msgstr "搖桿配置" + +msgid "Device" +msgstr "裝置" + +msgid "%1 (X axis)" +msgstr "%1 (X 軸)" + +msgid "%1 (Y axis)" +msgstr "%1 (Y 軸)" + +msgid "MCA devices" +msgstr "MCA 裝置" + +msgid "List of MCA devices:" +msgstr "MCA 裝置清單:" + +msgid "Tablet tool" +msgstr "平板工具" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "關於 Qt" + +msgid "MCA devices..." +msgstr "MCA 裝置..." + +msgid "Show non-primary monitors" +msgstr "顯示非主要顯示器" + +msgid "Open screenshots folder..." +msgstr "開啟螢幕截圖資料夾..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "最大化時套用全螢幕拉伸模式" + +msgid "Cursor/Puck" +msgstr "游標/球棒" + +msgid "Pen" +msgstr "筆" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "主機 CD/DVD 光碟機 (%1:)" + +msgid "&Connected" +msgstr "已連線" + +msgid "Clear image history" +msgstr "清除影像記錄" + +msgid "Create..." +msgstr "建立..." + +msgid "previous image" +msgstr "上一個影像" + +msgid "Host CD/DVD Drive (%1)" +msgstr "主機 CD/DVD 光碟機 (%1)" + +msgid "Unknown Bus" +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 "Render behavior" +msgstr "渲染行為" + +msgid "Use target framerate:" +msgstr "使用目標畫格速率:" + +msgid " fps" +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 "與視訊同步" + +msgid "Shaders" +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 上下文。" + +msgid "Couldn't switch to OpenGL context." +msgstr "無法切換至 OpenGL 上下文。" + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "需要 OpenGL 版本 3.0 或更高。目前版本為 %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "OpenGL 初始化失敗。錯誤 %1." + +msgid "Error initializing OpenGL" +msgstr "初始化 OpenGL 出錯" + +msgid "Falling back to software rendering.\n" +msgstr "回退到軟體渲染。" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "為解除封包緩衝區分配記憶體失敗。\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>當選擇媒體影像 (CD-ROM、軟碟等) 時,開啟對話方塊會在與 86Box 設定檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。</p></body></html>" + +msgid "This machine might have been moved or copied." +msgstr "這台機器可能已被移動或複製。" + +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 "為了確保正常的網路功能,86Box 需要知道這台機器是否被移動或複製。\n\n如果您不確定,請選擇「我複製了它」。" + +msgid "I Moved It" +msgstr "我移動了它" + +msgid "I Copied It" +msgstr "我複製了它" + +msgid "86Box Monitor #" +msgstr "86Box Monitor " + +msgid "No MCA devices." +msgstr "沒有 MCA 裝置。" + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "網路卡 1" + +msgid "Network Card #2" +msgstr "網路卡 2" + +msgid "Network Card #3" +msgstr "網路卡 3" + +msgid "Network Card #4" +msgstr "網路卡 4" + +msgid "Mode" +msgstr "模式" + +msgid "Interface" +msgstr "介面" + +msgid "Adapter" +msgstr "轉接器" + +msgid "VDE Socket" +msgstr "VDE 插座" + +msgid "86Box Unit Tester" +msgstr "86Box 單元測試器" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x 密鑰卡" + +msgid "Serial port passthrough 1" +msgstr "序列埠的直通 1" + +msgid "Serial port passthrough 2" +msgstr "序列埠的直通 2" + +msgid "Serial port passthrough 3" +msgstr "序列埠的直通 3" + +msgid "Serial port passthrough 4" +msgstr "序列埠的直通 4" + +msgid "Vision Systems LBA Enhancer" +msgstr "Vision Systems LBA Enhancer" + +msgid "Renderer options..." +msgstr "渲染器選項..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft 匯流排滑鼠" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft 匯流排滑鼠 (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse Systems 序滑鼠" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft 序滑鼠" + +msgid "Logitech Serial Mouse" +msgstr "Logitech 序滑鼠" + +msgid "PS/2 Mouse" +msgstr "PS/2 滑鼠" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (序)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "[COM] 標準 Hayes 相容的數據機" + +msgid "Roland MT-32 Emulation" +msgstr "羅蘭 MT-32 模擬" + +msgid "Roland MT-32 (New) Emulation" +msgstr "羅蘭 MT-32(新)模擬" + +msgid "Roland CM-32L Emulation" +msgstr "羅蘭 CM-32L 模擬" + +msgid "Roland CM-32LN Emulation" +msgstr "羅蘭 CM-32LN 模擬" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML 子板" + +msgid "System MIDI" +msgstr "系統的 MIDI" + +msgid "MIDI Input Device" +msgstr "MIDI 輸入裝置" + +msgid "BIOS Address" +msgstr "BIOS 位址" + +msgid "Enable BIOS extension ROM Writes" +msgstr "啟用 BIOS 擴充 ROM 寫入" + +msgid "Address" +msgstr "位址" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS 版本" + +msgid "Translate 26 -> 17" +msgstr "轉換 26 -> 17" + +msgid "Language" +msgstr "語言" + +msgid "Enable backlight" +msgstr "啟用背光" + +msgid "Invert colors" +msgstr "反轉顏色" + +msgid "BIOS size" +msgstr "BIOS 大小" + +msgid "Map C0000-C7FFF as UMB" +msgstr "映射 C0000-C7FFF 為 UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "映射 C8000-CFFFF 為 UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "映射 D0000-D7FFF 為 UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "映射 D8000-DFFFF 為 UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "映射 E0000-E7FFF 為 UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "映射 E8000-EFFFF 為 UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 跳線 (JIM)" + +msgid "MIDI Output Device" +msgstr "MIDI 輸出裝置" + +msgid "MIDI Real time" +msgstr "實時 MIDI" + +msgid "MIDI Thru" +msgstr "MIDI 輸入直通" + +msgid "MIDI Clockout" +msgstr "MIDI 時鐘輸出" + +msgid "SoundFont" +msgstr "音色" + +msgid "Output Gain" +msgstr "輸出增益" + +msgid "Chorus" +msgstr "和聲" + +msgid "Chorus Voices" +msgstr "和聲聲音" + +msgid "Chorus Level" +msgstr "和聲等級" + +msgid "Chorus Speed" +msgstr "和聲速度" + +msgid "Chorus Depth" +msgstr "和聲深度" + +msgid "Chorus Waveform" +msgstr "和聲波形" + +msgid "Reverb" +msgstr "迴響" + +msgid "Reverb Room Size" +msgstr "迴響室尺寸" + +msgid "Reverb Damping" +msgstr "迴響阻尼" + +msgid "Reverb Width" +msgstr "迴響寬度" + +msgid "Reverb Level" +msgstr "迴響等級" + +msgid "Interpolation Method" +msgstr "插值方法" + +msgid "Reverb Output Gain" +msgstr "迴響輸出增益" + +msgid "Reversed stereo" +msgstr "反向立體聲" + +msgid "Nice ramp" +msgstr "漂亮的斜坡" + +msgid "Hz" +msgstr "赫茲" + +msgid "Buttons" +msgstr "按鈕" + +msgid "Serial Port" +msgstr "串列埠" + +msgid "RTS toggle" +msgstr "RTS 切換" + +msgid "Revision" +msgstr "修訂" + +msgid "Controller" +msgstr "控制器" + +msgid "Show Crosshair" +msgstr "顯示十字線" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC 位址" + +msgid "MAC Address OUI" +msgstr "MAC 位址的 OUI" + +msgid "Enable BIOS" +msgstr "啟用 BIOS" + +msgid "Baud Rate" +msgstr "波特率" + +msgid "TCP/IP listening port" +msgstr "TCP/IP 監聽埠" + +msgid "Phonebook File" +msgstr "電話簿檔案" + +msgid "Telnet emulation" +msgstr "Telnet 模擬" + +msgid "RAM Address" +msgstr "RAM 位址" + +msgid "RAM size" +msgstr "RAM 大小" + +msgid "Initial RAM size" +msgstr "初始 RAM 大小" + +msgid "Serial Number" +msgstr "序列號" + +msgid "Host ID" +msgstr "主機 ID" + +msgid "FDC Address" +msgstr "FDC 位址" + +msgid "MPU-401 Address" +msgstr "MPU-401 位址" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "接收 MIDI 輸入" + +msgid "Low DMA" +msgstr "低 DMA" + +msgid "Enable Game port" +msgstr "啟用遊戲埠" + +msgid "Surround module" +msgstr "環繞聲模組" + +msgid "CODEC" +msgstr "CODEC" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "在 CODEC 設定時啟動 CODEC 中斷 (某些驅動程式需要)" + +msgid "SB Address" +msgstr "SB 位址" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "啟用 OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "接收 MIDI 輸入 (MPU-401)" + +msgid "SB low DMA" +msgstr "SB 低 DMA" + +msgid "6CH variant (6-channel)" +msgstr "6CH 變數 (6 通道)" + +msgid "Enable CMS" +msgstr "啟用 CMS" + +msgid "Mixer" +msgstr "混音器" + +msgid "High DMA" +msgstr "高 DMA" + +msgid "Control PC speaker" +msgstr "控制電腦喇叭" + +msgid "Memory size" +msgstr "記憶體大小" + +msgid "EMU8000 Address" +msgstr "EMU8000 位址" + +msgid "IDE Controller" +msgstr "IDE 控制器" + +msgid "Codec" +msgstr "編解碼器" + +msgid "GUS type" +msgstr "GUS 類型" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "啟用 0x04 \"退出 86Box\" 指令" + +msgid "Display type" +msgstr "顯示類型" + +msgid "Composite type" +msgstr "複合類型" + +msgid "RGB type" +msgstr "RGB 類型" + +msgid "Line doubling type" +msgstr "行倍增類型" + +msgid "Snow emulation" +msgstr "雪花模擬" + +msgid "Monitor type" +msgstr "監視器類型" + +msgid "Character set" +msgstr "字元集" + +msgid "XGA type" +msgstr "XGA 類型" + +msgid "Instance" +msgstr "實例" + +msgid "MMIO Address" +msgstr "MMIO 位址" + +msgid "RAMDAC type" +msgstr "RAMDAC 類型" + +msgid "Blend" +msgstr "混合" + +msgid "Bilinear filtering" +msgstr "雙線性濾波" + +msgid "Dithering" +msgstr "抖動" + +msgid "Enable NMI for CGA emulation" +msgstr "啟用 CGA 模擬的 NMI" + +msgid "Voodoo type" +msgstr "Voodoo 類型" + +msgid "Framebuffer memory size" +msgstr "幀緩衝記憶體大小" + +msgid "Texture memory size" +msgstr "材質記憶體大小" + +msgid "Dither subtraction" +msgstr "抖動減法" + +msgid "Screen Filter" +msgstr "畫面濾鏡" + +msgid "Render threads" +msgstr "渲染線程" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "起始位址" + +msgid "Contiguous Size" +msgstr "連續大小" + +msgid "I/O Width" +msgstr "I/O 寬度" + +msgid "Transfer Speed" +msgstr "傳輸速度" + +msgid "EMS mode" +msgstr "EMS 模式" + +msgid "Address for > 2 MB" +msgstr "> 2 MB 的位址" + +msgid "Frame Address" +msgstr "幀位址" + +msgid "USA" +msgstr "美國" + +msgid "Danish" +msgstr "丹麥" + +msgid "Always at selected speed" +msgstr "永遠以所選速度運作" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS 設定 + 熱鍵 (POST 期間關閉)" + +msgid "64 kB starting from F0000" +msgstr "64 kB 從 F0000 開始" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "128 kB 從 E0000 開始 (位址 MSB 反轉,後 64KB 為先)" + +msgid "Sine" +msgstr "正弦" + +msgid "Triangle" +msgstr "三角" + +msgid "Linear" +msgstr "線性" + +msgid "4th Order" +msgstr "四階" + +msgid "7th Order" +msgstr "七階" + +msgid "Non-timed (original)" +msgstr "非定時 (原始)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 未填充)" + +msgid "Two" +msgstr "二階" + +msgid "Three" +msgstr "三階" + +msgid "Wheel" +msgstr "滾輪" + +msgid "Five + Wheel" +msgstr "五 + 滾輪" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 序 / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) 序" + +msgid "8 kB" +msgstr "8 kB" + +msgid "32 kB" +msgstr "32 kB" + +msgid "16 kB" +msgstr "16 kB" + +msgid "64 kB" +msgstr "64 kB" + +msgid "Disable BIOS" +msgstr "停用 BIOS" + +msgid "512 kB" +msgstr "512 kB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (立體聲)" + +msgid "Classic" +msgstr "經典" + +msgid "256 kB" +msgstr "256 kB" + +msgid "Composite" +msgstr "複合式" + +msgid "Old" +msgstr "舊版" + +msgid "New" +msgstr "新款" + +msgid "Color (generic)" +msgstr "彩色(通用)" + +msgid "Green Monochrome" +msgstr "綠色單色" + +msgid "Amber Monochrome" +msgstr "琥珀單色" + +msgid "Gray Monochrome" +msgstr "灰色單色" + +msgid "Color (no brown)" +msgstr "彩色(無棕色)" + +msgid "Color (IBM 5153)" +msgstr "彩色(IBM 5153)" + +msgid "Simple doubling" +msgstr "簡單加倍" + +msgid "sRGB interpolation" +msgstr "sRGB 插值" + +msgid "Linear interpolation" +msgstr "線性插補" + +msgid "128 kB" +msgstr "128 kB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "單色 (5151/MDA)(白色)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "單色 (5151/MDA)(綠色)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "單色 (5151/MDA)(琥珀色)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "彩色 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "彩色 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "增強色彩 - 一般模式 (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "增強色彩 - 增強模式 (5154/ECD)" + +msgid "Green" +msgstr "綠色" + +msgid "Amber" +msgstr "琥珀色" + +msgid "Gray" +msgstr "灰色" + +msgid "Color" +msgstr "顏色" + +msgid "U.S. English" +msgstr "美國英語" + +msgid "Scandinavian" +msgstr "斯堪的納維亞語" + +msgid "Other languages" +msgstr "其他語言" + +msgid "Bochs latest" +msgstr "Bochs 最新" + +msgid "Mono Non-Interlaced" +msgstr "單色非隔行掃描" + +msgid "Color Interlaced" +msgstr "彩色隔行扫描" + +msgid "Color Non-Interlaced" +msgstr "彩色非隔行掃描" + +msgid "3Dfx Voodoo Graphics" +msgstr "3Dfx Voodoo 圖形" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU)" + +msgid "8-bit" +msgstr "8 位元" + +msgid "16-bit" +msgstr "16 位元" + +msgid "Standard (150ns)" +msgstr "標準 (150ns)" + +msgid "High-Speed (120ns)" +msgstr "高速 (120ns)" + +msgid "Enabled" +msgstr "啟用" + +msgid "Standard" +msgstr "標準" + +msgid "High-Speed" +msgstr "高速" + +msgid "Stereo LPT DAC" +msgstr "立體聲 LPT DAC" + +msgid "Generic Text Printer" +msgstr "通用文字印表機" + +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "通用 ESC/P 點矩陣" + +msgid "Generic PostScript Printer" +msgstr "通用 PostScript 印表機" + +msgid "Generic PCL5e Printer" +msgstr "通用 PCL5e 印表機" + +msgid "Parallel Line Internet Protocol" +msgstr "Parallel Line Internet Protocol" + +msgid "Protection Dongle for Savage Quest" +msgstr "用於 Savage Quest 的保護加密狗" + +msgid "Serial Passthrough Device" +msgstr "序列埠的直通裝置" + +msgid "Passthrough Mode" +msgstr "直通模式" + +msgid "Host Serial Device" +msgstr "主機串列裝置" + +msgid "Name of pipe" +msgstr "管道名稱" + +msgid "Data bits" +msgstr "資料位元" + +msgid "Stop bits" +msgstr "停止位元" + +msgid "Baud Rate of Passthrough" +msgstr "直通的波特率" + +msgid "Named Pipe (Server)" +msgstr "已命名管道 (伺服器)" + +msgid "Host Serial Passthrough" +msgstr "主機序列埠的直通" + +msgid "Eject %s" +msgstr "退出 %s" + +msgid "&Unmute" +msgstr "開啟聲音 (&U)" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "對效能影響大" + +msgid "RAM Disk (max. speed)" +msgstr "RAM 磁碟 (最大速度)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A 克隆 (ISA)" + +msgid "Vendor" +msgstr "製造商" diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 935b48a82..e2d6759ad 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -457,7 +457,7 @@ DeviceConfig::DeviceName(const _device_ *device, const char *internalName, const if (QStringLiteral("none") == internalName) return tr("None"); else if (QStringLiteral("internal") == internalName) - return tr("Internal controller"); + return tr("Internal device"); else if (device == nullptr) return ""; else { From 463badd61369f1ec280be6b3e0661cda912ca6cc Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 19 Nov 2024 04:08:21 +0100 Subject: [PATCH 595/624] kB -> KB. --- src/network/net_wd8003.c | 12 ++++---- src/qt/languages/ca-ES.po | 52 ++++++++++++++++----------------- src/qt/languages/cs-CZ.po | 52 ++++++++++++++++----------------- src/qt/languages/de-DE.po | 52 ++++++++++++++++----------------- src/qt/languages/es-ES.po | 52 ++++++++++++++++----------------- src/qt/languages/fi-FI.po | 54 +++++++++++++++++------------------ src/qt/languages/fr-FR.po | 40 +++++++++++++------------- src/qt/languages/hr-HR.po | 52 ++++++++++++++++----------------- src/qt/languages/hu-HU.po | 52 ++++++++++++++++----------------- src/qt/languages/it-IT.po | 52 ++++++++++++++++----------------- src/qt/languages/ja-JP.po | 52 ++++++++++++++++----------------- src/qt/languages/ko-KR.po | 52 ++++++++++++++++----------------- src/qt/languages/pl-PL.po | 52 ++++++++++++++++----------------- src/qt/languages/pt-BR.po | 52 ++++++++++++++++----------------- src/qt/languages/pt-PT.po | 52 ++++++++++++++++----------------- src/qt/languages/ru-RU.po | 52 ++++++++++++++++----------------- src/qt/languages/sk-SK.po | 52 ++++++++++++++++----------------- src/qt/languages/sl-SI.po | 52 ++++++++++++++++----------------- src/qt/languages/tr-TR.po | 54 +++++++++++++++++------------------ src/qt/languages/uk-UA.po | 52 ++++++++++++++++----------------- src/qt/languages/vi-VN.po | 52 ++++++++++++++++----------------- src/qt/languages/zh-CN.po | 52 ++++++++++++++++----------------- src/qt/languages/zh-TW.po | 52 ++++++++++++++++----------------- src/qt/qt_newfloppydialog.cpp | 12 ++++---- src/sound/snd_gus.c | 4 +-- src/sound/snd_sb.c | 8 +++--- src/video/vid_8514a.c | 4 +-- src/video/vid_ati18800.c | 4 +-- src/video/vid_ati28800.c | 8 +++--- src/video/vid_ati_mach8.c | 6 ++-- src/video/vid_cl54xx.c | 6 ++-- src/video/vid_ega.c | 8 +++--- src/video/vid_et3000.c | 4 +-- src/video/vid_et4000.c | 12 ++++---- src/video/vid_ht216.c | 4 +-- src/video/vid_nga.c | 4 +-- src/video/vid_oak_oti.c | 16 +++++------ src/video/vid_paradise.c | 8 +++--- src/video/vid_rtg310x.c | 8 +++--- src/video/vid_s3.c | 4 +-- src/video/vid_tvga.c | 4 +-- 41 files changed, 636 insertions(+), 636 deletions(-) diff --git a/src/network/net_wd8003.c b/src/network/net_wd8003.c index 5fd1034eb..72a4b7fd0 100644 --- a/src/network/net_wd8003.c +++ b/src/network/net_wd8003.c @@ -935,8 +935,8 @@ static const device_config_t wd8003eb_config[] = { .file_filter = "", .spinner = { 0 }, .selection = { - { .description = "8 kB", .value = 8192 }, - { .description = "32 kB", .value = 32768 }, + { .description = "8 KB", .value = 8192 }, + { .description = "32 KB", .value = 32768 }, { .description = "" } }, }, @@ -1024,8 +1024,8 @@ static const device_config_t wd8013_config[] = { .file_filter = "", .spinner = { 0 }, .selection = { - { .description = "16 kB", .value = 16384 }, - { .description = "64 kB", .value = 65536 }, + { .description = "16 KB", .value = 16384 }, + { .description = "64 KB", .value = 65536 }, { .description = "" } }, }, @@ -1049,8 +1049,8 @@ static const device_config_t wd8013epa_config[] = { .file_filter = "", .spinner = { 0 }, .selection = { - { .description = "8 kB", .value = 8192 }, - { .description = "16 kB", .value = 16384 }, + { .description = "8 KB", .value = 8192 }, + { .description = "16 KB", .value = 16384 }, { .description = "" } }, }, diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index aa2b82c03..f6b175847 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 sèrie / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) sèrie" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Desactivar la BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (estèreo)" msgid "Classic" msgstr "Clàssic" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Compost" @@ -1968,8 +1968,8 @@ msgstr "Interpolació sRGB" msgid "Linear interpolation" msgstr "Interpolació lineal" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monocrom (5151/MDA) (blanc)" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index 4629ac508..ea2cdbe34 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 sériová / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) sériová" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Zakázat BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (stereo)" msgid "Classic" msgstr "Klasické" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Kompozitný" @@ -1968,8 +1968,8 @@ msgstr "Interpolace sRGB" msgid "Linear interpolation" msgstr "Lineární interpolace" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monochromatický (5151/MDA) (bílý)" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index d5abbed65..1ce3a2ab6 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -1101,23 +1101,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1881,23 +1881,23 @@ msgstr "A3 - SMT2 Seriell / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) Seriell" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "BIOS ausschalten" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1932,8 +1932,8 @@ msgstr "SigmaTel STAC9721T (Stereo)" msgid "Classic" msgstr "Klassisch" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Composite" @@ -1971,8 +1971,8 @@ msgstr "sRGB-Interpolation" msgid "Linear interpolation" msgstr "Lineare Interpolation" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monochrom (5151/MDA) (weiß)" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index 5eb8872b5..d09c9ee8f 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1877,23 +1877,23 @@ msgstr "A3 - SMT2 serie / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) serie" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Deshabilitar BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1928,8 +1928,8 @@ msgstr "SigmaTel STAC9721T (estéreo)" msgid "Classic" msgstr "Clásico" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Compuesto" @@ -1967,8 +1967,8 @@ msgstr "Interpolación sRGB" msgid "Linear interpolation" msgstr "Interpolación lineare" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monocromo (5151/MDA) (blanco)" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 5abe4c4e8..d6643edb9 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -748,7 +748,7 @@ msgid "S" msgstr "S" msgid "KB" -msgstr "kt" +msgstr "Kt" msgid "Could not initialize the video renderer." msgstr "Videorenderöijän alustus epäonnistui" @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kt" +msgid "160 KB" +msgstr "160 Kt" -msgid "180 kB" -msgstr "180 kt" +msgid "180 KB" +msgstr "180 Kt" -msgid "320 kB" -msgstr "320 kt" +msgid "320 KB" +msgstr "320 Kt" -msgid "360 kB" -msgstr "360 kt" +msgid "360 KB" +msgstr "360 Kt" -msgid "640 kB" -msgstr "640 kt" +msgid "640 KB" +msgstr "640 Kt" -msgid "720 kB" -msgstr "720 kt" +msgid "720 KB" +msgstr "720 Kt" msgid "1.2 MB" msgstr "1.2 Mt" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 sarja / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) sarja" -msgid "8 kB" -msgstr "8 kt" +msgid "8 KB" +msgstr "8 Kt" -msgid "32 kB" -msgstr "32 kt" +msgid "32 KB" +msgstr "32 Kt" -msgid "16 kB" -msgstr "16 kt" +msgid "16 KB" +msgstr "16 Kt" -msgid "64 kB" -msgstr "64 kt" +msgid "64 KB" +msgstr "64 Kt" msgid "Disable BIOS" msgstr "BIOS pois käytöstä" -msgid "512 kB" -msgstr "512 kt" +msgid "512 KB" +msgstr "512 Kt" msgid "2 MB" msgstr "2 Mt" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (stereo)" msgid "Classic" msgstr "Klassinen" -msgid "256 kB" -msgstr "256 kt" +msgid "256 KB" +msgstr "256 Kt" msgid "Composite" msgstr "Komposiitti" @@ -1968,8 +1968,8 @@ msgstr "sRGB-interpolointi" msgid "Linear interpolation" msgstr "Lineaarinen interpolointi" -msgid "128 kB" -msgstr "128 kt" +msgid "128 KB" +msgstr "128 Kt" msgid "Monochrome (5151/MDA) (white)" msgstr "Yksivärinen (5151/MDA) (valkoinen)" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index aa9afaf46..3643e562c 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -1098,22 +1098,22 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" +msgid "160 KB" msgstr "160 Ko" -msgid "180 kB" +msgid "180 KB" msgstr "180 Ko" -msgid "320 kB" +msgid "320 KB" msgstr "320 Ko" -msgid "360 kB" +msgid "360 KB" msgstr "360 Ko" -msgid "640 kB" +msgid "640 KB" msgstr "640 Ko" -msgid "720 kB" +msgid "720 KB" msgstr "720 Ko" msgid "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 série / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) série" -msgid "8 kB" -msgstr "8 ko" +msgid "8 KB" +msgstr "8 Ko" -msgid "32 kB" -msgstr "32 ko" +msgid "32 KB" +msgstr "32 Ko" -msgid "16 kB" -msgstr "16 ko" +msgid "16 KB" +msgstr "16 Ko" -msgid "64 kB" -msgstr "64 ko" +msgid "64 KB" +msgstr "64 Ko" msgid "Disable BIOS" msgstr "Désactiver BIOS" -msgid "512 kB" -msgstr "512 ko" +msgid "512 KB" +msgstr "512 Ko" msgid "2 MB" msgstr "2 Mo" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (stéréo)" msgid "Classic" msgstr "Classique" -msgid "256 kB" -msgstr "256 ko" +msgid "256 KB" +msgstr "256 Ko" msgid "Composite" msgstr "Composite" @@ -1968,8 +1968,8 @@ msgstr "Interpolation sRVB" msgid "Linear interpolation" msgstr "Interpolation linéairee" -msgid "128 kB" -msgstr "128 ko" +msgid "128 KB" +msgstr "128 Ko" msgid "Monochrome (5151/MDA) (white)" msgstr "Monochrome (5151/MDA) (blanc)" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 01be92737..17d1f5937 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1,2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 serijski / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) serijski" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Onemogući BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (stereo)" msgid "Classic" msgstr "Klasičan" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Kompozitni" @@ -1968,8 +1968,8 @@ msgstr "Interpolacija sRGB" msgid "Linear interpolation" msgstr "Linearna interpolacija" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Crno-biljeli (5151/MDA) (bijeli)" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index b9f4df48c..4958cd6c6 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 soros / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) soros" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "BIOS letiltása" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (sztereó)" msgid "Classic" msgstr "Klasszikus" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Összetett" @@ -1968,8 +1968,8 @@ msgstr "sRGB interpoláció" msgid "Linear interpolation" msgstr "Lineáris interpoláció" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monokróm (5151/MDA) (fehér)" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 29e395db3..02a87ba67 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -1095,23 +1095,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1875,23 +1875,23 @@ msgstr "A3 - SMT2 seriale / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) seriale" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Disattivare il BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1926,8 +1926,8 @@ msgstr "SigmaTel STAC9721T (stereo)" msgid "Classic" msgstr "Classico" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Composito" @@ -1965,8 +1965,8 @@ msgstr "Interpolazione sRGB" msgid "Linear interpolation" msgstr "Interpolazione lineare" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monocromatico (5151/MDA) (bianco)" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 38e73bb06..ab07474de 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 シリアル / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R)シリアル" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "BIOSを無効にする" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "シグマテル STAC9721T(ステレオ)" msgid "Classic" msgstr "クラシック" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "コンポジット" @@ -1968,8 +1968,8 @@ msgstr "sRGB補間" msgid "Linear interpolation" msgstr "線形補間" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "モノクローム(5151/MDA)(白い)" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 4a0da3e4f..9e28470ad 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 직렬/SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) 직렬" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "BIOS 비활성화" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2MB" @@ -1929,8 +1929,8 @@ msgstr "시그마텔 STAC9721T(스테레오)" msgid "Classic" msgstr "클래식" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "합성" @@ -1968,8 +1968,8 @@ msgstr "sRGB 보간" msgid "Linear interpolation" msgstr "선형 보간" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "흑백(5151/MDA)(흰색)" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 86f09a5cc..c265b0800 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1,2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 szeregowa / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) szeregowa" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Wyłącz BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (stereo)" msgid "Classic" msgstr "Klasyczny" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Kompozyt" @@ -1968,8 +1968,8 @@ msgstr "Interpolacja sRGB" msgid "Linear interpolation" msgstr "Interpolacja liniowa" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monochromatyczny (5151/MDA) (biały)" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index 65d729bc6..fa3fc94c1 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 Serial / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) Serial" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Desativar o BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (estéreo)" msgid "Classic" msgstr "Clássico" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Composto" @@ -1968,8 +1968,8 @@ msgstr "Interpolação sRGB" msgid "Linear interpolation" msgstr "Interpolação linear" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monocromático (5151/MDA) (branco)" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 13a3a2c0a..7f672dc55 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 série / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) série" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Desativar a BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (estéreo)" msgid "Classic" msgstr "Clássico" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Compósito" @@ -1968,8 +1968,8 @@ msgstr "interpolação sRGB" msgid "Linear interpolation" msgstr "Interpolação linear" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monocromático (5151/MDA) (branco)" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 72ad9f3a1..483629c10 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 кБ" +msgid "160 KB" +msgstr "160 КБ" -msgid "180 kB" -msgstr "180 кБ" +msgid "180 KB" +msgstr "180 КБ" -msgid "320 kB" -msgstr "320 кБ" +msgid "320 KB" +msgstr "320 КБ" -msgid "360 kB" -msgstr "360 кБ" +msgid "360 KB" +msgstr "360 КБ" -msgid "640 kB" -msgstr "640 кБ" +msgid "640 KB" +msgstr "640 КБ" -msgid "720 kB" -msgstr "720 кБ" +msgid "720 KB" +msgstr "720 КБ" msgid "1.2 MB" msgstr "1.2 МБ" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 последовательная / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) последовательная" -msgid "8 kB" -msgstr "8 кБ" +msgid "8 KB" +msgstr "8 КБ" -msgid "32 kB" -msgstr "32 кБ" +msgid "32 KB" +msgstr "32 КБ" -msgid "16 kB" -msgstr "16 кБ" +msgid "16 KB" +msgstr "16 КБ" -msgid "64 kB" -msgstr "64 кБ" +msgid "64 KB" +msgstr "64 КБ" msgid "Disable BIOS" msgstr "Отключить BIOS" -msgid "512 kB" -msgstr "512 кБ" +msgid "512 KB" +msgstr "512 КБ" msgid "2 MB" msgstr "2 МБ" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (стерео)" msgid "Classic" msgstr "Классический" -msgid "256 kB" -msgstr "256 кБ" +msgid "256 KB" +msgstr "256 КБ" msgid "Composite" msgstr "Композитное видео" @@ -1968,8 +1968,8 @@ msgstr "Интерполяция sRGB" msgid "Linear interpolation" msgstr "Линейная интерполяция" -msgid "128 kB" -msgstr "128 кБ" +msgid "128 KB" +msgstr "128 КБ" msgid "Monochrome (5151/MDA) (white)" msgstr "Монохромный (5151/MDA) (белый)" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 097fb9c47..bd8a4bc63 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 sériová / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) sériová" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Zakázať BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (stereo)" msgid "Classic" msgstr "Klasické" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Kompozitný" @@ -1968,8 +1968,8 @@ msgstr "Interpolácia sRGB" msgid "Linear interpolation" msgstr "Lineárna interpolácia" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Jednofarebný (5151/MDA) (biely)" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index a48636df8..23ed7bf98 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 serijska / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) serijska" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Onemogoči BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (stereo)" msgid "Classic" msgstr "Klasični" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Kompozitni" @@ -1968,8 +1968,8 @@ msgstr "Interpolacija sRGB" msgid "Linear interpolation" msgstr "Linearna interpolacija" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Enobarvni (5151/MDA) (beli)" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 3d1801f2e..3a0cc2b96 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1834,7 +1834,7 @@ msgid "BIOS setting + Hotkeys (off during POST)" msgstr "BIOS ayarı + Kısayol tuşları (POST sırasında kapalı)" msgid "64 kB starting from F0000" -msgstr "F0000'dan başlayarak 64 kB" +msgstr "F0000'dan başlayarak 64 KB" msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" msgstr "E0000'dan başlayarak 128 kB (adres MSB ters çevrilmiş, önce son 64KB)" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 seri / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) seri" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "BIOS'u devre dışı bırak" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (stereo)" msgid "Classic" msgstr "Klasik" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Kompozit" @@ -1968,8 +1968,8 @@ msgstr "sRGB interpolasyonu" msgid "Linear interpolation" msgstr "Doğrusal interpolasyon" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Monokrom (5151/MDA) (beyaz)" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 0aad818ad..0b91b4104 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 кБ" +msgid "160 KB" +msgstr "160 КБ" -msgid "180 kB" -msgstr "180 кБ" +msgid "180 KB" +msgstr "180 КБ" -msgid "320 kB" -msgstr "320 кБ" +msgid "320 KB" +msgstr "320 КБ" -msgid "360 kB" -msgstr "360 кБ" +msgid "360 KB" +msgstr "360 КБ" -msgid "640 kB" -msgstr "640 кБ" +msgid "640 KB" +msgstr "640 КБ" -msgid "720 kB" -msgstr "720 кБ" +msgid "720 KB" +msgstr "720 КБ" msgid "1.2 MB" msgstr "1.2 МБ" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 послідовна / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) послідовна" -msgid "8 kB" -msgstr "8 kБ" +msgid "8 KB" +msgstr "8 КБ" -msgid "32 kB" -msgstr "32 kБ" +msgid "32 KB" +msgstr "32 КБ" -msgid "16 kB" -msgstr "16 kБ" +msgid "16 KB" +msgstr "16 КБ" -msgid "64 kB" -msgstr "64 kБ" +msgid "64 KB" +msgstr "64 КБ" msgid "Disable BIOS" msgstr "Вимкнення BIOS" -msgid "512 kB" -msgstr "512 kБ" +msgid "512 KB" +msgstr "512 КБ" msgid "2 MB" msgstr "2 МБ" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (стерео)" msgid "Classic" msgstr "Класичний" -msgid "256 kB" -msgstr "256 kБ" +msgid "256 KB" +msgstr "256 КБ" msgid "Composite" msgstr "Композитний" @@ -1968,8 +1968,8 @@ msgstr "sRGB інтерполяція" msgid "Linear interpolation" msgstr "Лінійна інтерполяція" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 КБ" msgid "Monochrome (5151/MDA) (white)" msgstr "Монохромний (5151/MDA) (білий)" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 1039e9b1c..15802fc2d 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "CD-ROM %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 Serial / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) Serial" -msgid "8 kB" -msgstr "8 kb" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kb" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kb" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kb" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "Vô hiệu hóa BIOS" -msgid "512 kB" -msgstr "512 kb" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "Sigmatel Stac9721T (âm thanh nổi)" msgid "Classic" msgstr "Cổ điển" -msgid "256 kB" -msgstr "256 kb" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "Tổng hợp" @@ -1968,8 +1968,8 @@ msgstr "Nội suy SRGB" msgid "Linear interpolation" msgstr "Nội suy tuyến tính" -msgid "128 kB" -msgstr "128 kb" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "Đơn sắc (5151/MDA) (Trắng)" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 6bbd22181..4f8bd54b3 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "光盘 %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 串 / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R)串" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "禁用 BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (立体声)" msgid "Classic" msgstr "经典" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "复合材料" @@ -1968,8 +1968,8 @@ msgstr "sRGB 插值" msgid "Linear interpolation" msgstr "线性插值" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "单色(5151/MDA)(白色)" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 7851aa302..e8920bcb0 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -1098,23 +1098,23 @@ msgstr "ATAPI" msgid "CD-ROM %i (%s): %s" msgstr "光碟 %i (%s): %s" -msgid "160 kB" -msgstr "160 kB" +msgid "160 KB" +msgstr "160 KB" -msgid "180 kB" -msgstr "180 kB" +msgid "180 KB" +msgstr "180 KB" -msgid "320 kB" -msgstr "320 kB" +msgid "320 KB" +msgstr "320 KB" -msgid "360 kB" -msgstr "360 kB" +msgid "360 KB" +msgstr "360 KB" -msgid "640 kB" -msgstr "640 kB" +msgid "640 KB" +msgstr "640 KB" -msgid "720 kB" -msgstr "720 kB" +msgid "720 KB" +msgstr "720 KB" msgid "1.2 MB" msgstr "1.2 MB" @@ -1878,23 +1878,23 @@ msgstr "A3 - SMT2 序 / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" msgstr "Q1 - SMT3(R) 序" -msgid "8 kB" -msgstr "8 kB" +msgid "8 KB" +msgstr "8 KB" -msgid "32 kB" -msgstr "32 kB" +msgid "32 KB" +msgstr "32 KB" -msgid "16 kB" -msgstr "16 kB" +msgid "16 KB" +msgstr "16 KB" -msgid "64 kB" -msgstr "64 kB" +msgid "64 KB" +msgstr "64 KB" msgid "Disable BIOS" msgstr "停用 BIOS" -msgid "512 kB" -msgstr "512 kB" +msgid "512 KB" +msgstr "512 KB" msgid "2 MB" msgstr "2 MB" @@ -1929,8 +1929,8 @@ msgstr "SigmaTel STAC9721T (立體聲)" msgid "Classic" msgstr "經典" -msgid "256 kB" -msgstr "256 kB" +msgid "256 KB" +msgstr "256 KB" msgid "Composite" msgstr "複合式" @@ -1968,8 +1968,8 @@ msgstr "sRGB 插值" msgid "Linear interpolation" msgstr "線性插補" -msgid "128 kB" -msgstr "128 kB" +msgid "128 KB" +msgstr "128 KB" msgid "Monochrome (5151/MDA) (white)" msgstr "單色 (5151/MDA)(白色)" diff --git a/src/qt/qt_newfloppydialog.cpp b/src/qt/qt_newfloppydialog.cpp index e24ad9aa1..48be09777 100644 --- a/src/qt/qt_newfloppydialog.cpp +++ b/src/qt/qt_newfloppydialog.cpp @@ -96,12 +96,12 @@ static const QStringList rpmModes = { }; static const QStringList floppyTypes = { - "160 kB", - "180 kB", - "320 kB", - "360 kB", - "640 kB", - "720 kB", + "160 KB", + "180 KB", + "320 KB", + "360 KB", + "640 KB", + "720 KB", "1.2 MB", "1.25 MB", "1.44 MB", diff --git a/src/sound/snd_gus.c b/src/sound/snd_gus.c index 25da1643e..55707b493 100644 --- a/src/sound/snd_gus.c +++ b/src/sound/snd_gus.c @@ -1499,11 +1499,11 @@ static const device_config_t gus_config[] = { .spinner = { 0 }, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 0 }, { - .description = "512 kB", + .description = "512 KB", .value = 1 }, { diff --git a/src/sound/snd_sb.c b/src/sound/snd_sb.c index 438ce15bc..6536071b0 100644 --- a/src/sound/snd_sb.c +++ b/src/sound/snd_sb.c @@ -4669,7 +4669,7 @@ static const device_config_t sb_32_pnp_config[] = { .value = 0 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -4882,7 +4882,7 @@ static const device_config_t sb_awe32_config[] = { .value = 0 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -4946,7 +4946,7 @@ static const device_config_t sb_awe32_pnp_config[] = { .value = 0 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -4999,7 +4999,7 @@ static const device_config_t sb_awe64_value_config[] = { .spinner = { 0 }, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_8514a.c b/src/video/vid_8514a.c index ceeb835e3..393d2ca04 100644 --- a/src/video/vid_8514a.c +++ b/src/video/vid_8514a.c @@ -3921,7 +3921,7 @@ static const device_config_t isa_ext8514_config[] = { .default_int = 1024, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -3990,7 +3990,7 @@ static const device_config_t mca_ext8514_config[] = { .default_int = 1024, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_ati18800.c b/src/video/vid_ati18800.c index 7f0993ef8..df41e5d3f 100644 --- a/src/video/vid_ati18800.c +++ b/src/video/vid_ati18800.c @@ -335,11 +335,11 @@ static const device_config_t ati18800_wonder_config[] = { .default_int = 512, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 5a73991c0..b3cf8aad1 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -750,11 +750,11 @@ static const device_config_t ati28800_config[] = { .default_int = 512, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -780,11 +780,11 @@ static const device_config_t ati28800_wonderxl_config[] = { .default_int = 512, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_ati_mach8.c b/src/video/vid_ati_mach8.c index f488edace..558f37f5b 100644 --- a/src/video/vid_ati_mach8.c +++ b/src/video/vid_ati_mach8.c @@ -6228,7 +6228,7 @@ static const device_config_t mach8_config[] = { .default_int = 1024, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -6254,7 +6254,7 @@ static const device_config_t mach32_config[] = { .default_int = 2048, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -6307,7 +6307,7 @@ static const device_config_t mach32_pci_config[] = { .default_int = 2048, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 8e6a75014..1adcc14ec 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -4549,7 +4549,7 @@ static const device_config_t gd542x_config[] = { .type = CONFIG_SELECTION, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -4574,7 +4574,7 @@ static const device_config_t gd5426_config[] = { .type = CONFIG_SELECTION, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -4603,7 +4603,7 @@ static const device_config_t gd5428_onboard_config[] = { .type = CONFIG_SELECTION, .selection = { { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_ega.c b/src/video/vid_ega.c index 5a4f100df..fccd4f629 100644 --- a/src/video/vid_ega.c +++ b/src/video/vid_ega.c @@ -1596,19 +1596,19 @@ static const device_config_t ega_config[] = { .default_int = 256, .selection = { { - .description = "32 kB", + .description = "32 KB", .value = 32 }, { - .description = "64 kB", + .description = "64 KB", .value = 64 }, { - .description = "128 kB", + .description = "128 KB", .value = 128 }, { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { diff --git a/src/video/vid_et3000.c b/src/video/vid_et3000.c index 30c075b25..a7d2a749f 100644 --- a/src/video/vid_et3000.c +++ b/src/video/vid_et3000.c @@ -553,9 +553,9 @@ static const device_config_t et3000_config[] = { .type = CONFIG_SELECTION, .default_int = 512, .selection = { - { .description = "256 kB", + { .description = "256 KB", .value = 256 }, - { .description = "512 kB", + { .description = "512 KB", .value = 512 }, { .description = "" } } }, { .type = CONFIG_END } diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index d8668d931..caf8d03c7 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -949,11 +949,11 @@ static const device_config_t et4000_tc6058af_config[] = { .default_int = 512, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -996,11 +996,11 @@ static const device_config_t et4000_bios_config[] = { .default_int = 1024, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -1043,11 +1043,11 @@ static const device_config_t et4000_config[] = { .default_int = 1024, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index 7d868a63b..c1f5cbeaf 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -1707,9 +1707,9 @@ static const device_config_t v7_vga_1024i_config[] = { .type = CONFIG_SELECTION, .default_int = 512, .selection = { - { .description = "256 kB", + { .description = "256 KB", .value = 256 }, - { .description = "512 kB", + { .description = "512 KB", .value = 512 }, { .description = "" } } }, { .type = CONFIG_END } diff --git a/src/video/vid_nga.c b/src/video/vid_nga.c index 59d3475e5..32c103a8b 100644 --- a/src/video/vid_nga.c +++ b/src/video/vid_nga.c @@ -643,11 +643,11 @@ const device_config_t nga_config[] = { .default_int = 64, .selection = { { - .description = "32 kB", + .description = "32 KB", .value = 32 }, { - .description = "64 kB", + .description = "64 KB", .value = 64 }, { diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index f21e9d66c..715ba0df3 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -577,11 +577,11 @@ static const device_config_t oti067_config[] = { .default_int = 512, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -602,11 +602,11 @@ static const device_config_t oti067_ama932j_config[] = { .default_int = 256, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -627,11 +627,11 @@ static const device_config_t oti077_acer100t_config[] = { .default_int = 512, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -656,11 +656,11 @@ static const device_config_t oti077_config[] = { .default_int = 1024, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 053ef2651..bf038eb32 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -751,11 +751,11 @@ static const device_config_t paradise_pvga1a_config[] = { .default_int = 512, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -834,11 +834,11 @@ static const device_config_t paradise_wd90c30_config[] = { .default_int = 1024, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_rtg310x.c b/src/video/vid_rtg310x.c index 10bec8620..e82763d15 100644 --- a/src/video/vid_rtg310x.c +++ b/src/video/vid_rtg310x.c @@ -393,11 +393,11 @@ static const device_config_t rtg3105_config[] = { .default_int = 512, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { @@ -420,11 +420,11 @@ static const device_config_t rtg3106_config[] = { .default_int = 1024, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { diff --git a/src/video/vid_s3.c b/src/video/vid_s3.c index 2d7debe0a..295c65bd4 100644 --- a/src/video/vid_s3.c +++ b/src/video/vid_s3.c @@ -10489,7 +10489,7 @@ static const device_config_t s3_orchid_86c911_config[] = { .type = CONFIG_SELECTION, .default_int = 1, .selection = { - { .description = "512 kB", + { .description = "512 KB", .value = 0 }, { .description = "1 MB", .value = 1 }, @@ -10519,7 +10519,7 @@ static const device_config_t s3_phoenix_trio32_config[] = { .type = CONFIG_SELECTION, .default_int = 2, .selection = { - { .description = "512 kB", + { .description = "512 KB", .value = 0 }, { .description = "1 MB", .value = 1 }, diff --git a/src/video/vid_tvga.c b/src/video/vid_tvga.c index cd5714d04..eb0d1a780 100644 --- a/src/video/vid_tvga.c +++ b/src/video/vid_tvga.c @@ -527,11 +527,11 @@ static const device_config_t tvga_config[] = { .default_int = 1024, .selection = { { - .description = "256 kB", + .description = "256 KB", .value = 256 }, { - .description = "512 kB", + .description = "512 KB", .value = 512 }, { From d52ba5e5d270d83505ba11748a80ae26d65308e2 Mon Sep 17 00:00:00 2001 From: borisvolk117 <141923951+borisvolk117@users.noreply.github.com> Date: Tue, 19 Nov 2024 13:43:48 +0800 Subject: [PATCH 596/624] Update zh-CN.po --- src/qt/languages/zh-CN.po | 68 +++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 4f8bd54b3..41f06b681 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1189,7 +1189,7 @@ msgid "The network configuration will be switched to the null driver" msgstr "网络配置将切换为空驱动程序" msgid "Mouse sensitivity:" -msgstr "鼠标敏感度:" +msgstr "鼠标灵敏度:" msgid "Select media images from program working directory" msgstr "从程序工作目录中选择介质映像" @@ -1249,7 +1249,7 @@ msgid "MCA devices..." msgstr "MCA 设备..." msgid "Show non-primary monitors" -msgstr "显示非主要监控器" +msgstr "显示非主要显示器" msgid "Open screenshots folder..." msgstr "打开屏幕截图文件夹..." @@ -1270,7 +1270,7 @@ msgid "&Connected" msgstr "&Connected" msgid "Clear image history" -msgstr "清除图像历史" +msgstr "清除映像历史记录" msgid "Create..." msgstr "创建..." @@ -1375,7 +1375,7 @@ msgid "In order to ensure proper networking functionality, 86Box needs to know i msgstr "为了确保网络功能正常,86Box需要知道这台机器是否被移动或复制。\n\n如果您不确定,请选择\"我复制了它\"。" msgid "I Moved It" -msgstr "我搬走了它" +msgstr "我移动了它" msgid "I Copied It" msgstr "我复制了它" @@ -1387,7 +1387,7 @@ msgid "No MCA devices." msgstr "无 MCA 设备。" msgid "MiB" -msgstr "米字节" +msgstr "兆字节" msgid "Network Card #1" msgstr "网卡 1" @@ -1411,7 +1411,7 @@ msgid "Adapter" msgstr "适配器" msgid "VDE Socket" -msgstr "VDE 插座" +msgstr "VDE 套接字" msgid "86Box Unit Tester" msgstr "86Box 装置测试仪" @@ -1432,7 +1432,7 @@ msgid "Serial port passthrough 4" msgstr "串行端口直通 4" msgid "Vision Systems LBA Enhancer" -msgstr "视觉系统 LBA 增强器" +msgstr "Vision Systems LBA 增强器" msgid "Renderer options..." msgstr "渲染器选项..." @@ -1444,22 +1444,22 @@ msgid "Microsoft Bus Mouse (InPort)" msgstr "Microsoft 总线鼠标(InPort)" msgid "Mouse Systems Serial Mouse" -msgstr "Mouse Systems 串鼠标" +msgstr "Mouse Systems 串行鼠标" msgid "Microsoft Serial Mouse" -msgstr "Microsoft 串鼠标" +msgstr "Microsoft 串行鼠标" msgid "Logitech Serial Mouse" -msgstr "Logitech 串鼠标" +msgstr "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] 标准海斯兼容调制解调器" +msgstr "[COM] 标准 Hayes 兼容调制解调器" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32 仿真" @@ -1705,7 +1705,7 @@ msgid "6CH variant (6-channel)" msgstr "6 通道变体(6 通道)" msgid "Enable CMS" -msgstr "启用内容管理系统" +msgstr "启用 CMS" msgid "Mixer" msgstr "混合器" @@ -1729,7 +1729,7 @@ msgid "Codec" msgstr "编解码器" msgid "GUS type" -msgstr "GUS 型" +msgstr "GUS 类型" msgid "Enable 0x04 \"Exit 86Box\" command" msgstr "启用命令 0x04 \"退出 86Box\"" @@ -1738,7 +1738,7 @@ msgid "Display type" msgstr "显示类型" msgid "Composite type" -msgstr "复合型" +msgstr "复合视频类型" msgid "RGB type" msgstr "RGB 类型" @@ -1747,7 +1747,7 @@ msgid "Line doubling type" msgstr "线路倍增类型" msgid "Snow emulation" -msgstr "雪地模拟" +msgstr "雪花模拟" msgid "Monitor type" msgstr "显示器类型" @@ -1792,7 +1792,7 @@ msgid "Dither subtraction" msgstr "抖动减法" msgid "Screen Filter" -msgstr "滤网" +msgstr "滤镜" msgid "Render threads" msgstr "渲染线程" @@ -1804,7 +1804,7 @@ msgid "Start Address" msgstr "起始地址" msgid "Contiguous Size" -msgstr "连续尺寸" +msgstr "连续大小" msgid "I/O Width" msgstr "输入/输出宽度" @@ -1813,7 +1813,7 @@ msgid "Transfer Speed" msgstr "传输速度" msgid "EMS mode" -msgstr "紧急医疗服务模式" +msgstr "EMS (扩展内存)模式" msgid "Address for > 2 MB" msgstr "地址 > 2 MB" @@ -1861,22 +1861,22 @@ msgid "45 Hz (JMP2 not populated)" msgstr "45 Hz (JMP2 上无跳线)" msgid "Two" -msgstr "两个" +msgstr "两键" msgid "Three" -msgstr "三个" +msgstr "三键" msgid "Wheel" -msgstr "车轮" +msgstr "滚轮" msgid "Five + Wheel" -msgstr "五+轮" +msgstr "五键+滚轮" msgid "A3 - SMT2 Serial / SMT3(R)V" -msgstr "A3 - SMT2 串 / SMT3(R)V" +msgstr "A3 - SMT2 串行 / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" -msgstr "Q1 - SMT3(R)串" +msgstr "Q1 - SMT3(R)串行" msgid "8 KB" msgstr "8 KB" @@ -1933,7 +1933,7 @@ msgid "256 KB" msgstr "256 KB" msgid "Composite" -msgstr "复合材料" +msgstr "复合视频" msgid "Old" msgstr "旧" @@ -1942,7 +1942,7 @@ msgid "New" msgstr "新" msgid "Color (generic)" -msgstr "颜色(通用)" +msgstr "彩色(通用)" msgid "Green Monochrome" msgstr "单色绿色" @@ -1954,7 +1954,7 @@ msgid "Gray Monochrome" msgstr "灰色单色" msgid "Color (no brown)" -msgstr "颜色(无棕色)" +msgstr "彩色(无棕色)" msgid "Color (IBM 5153)" msgstr "彩色(IBM 5153)" @@ -2002,13 +2002,13 @@ msgid "Gray" msgstr "灰色" msgid "Color" -msgstr "颜色" +msgstr "彩色" msgid "U.S. English" msgstr "美国英语" msgid "Scandinavian" -msgstr "斯堪的纳维亚" +msgstr "斯堪的纳维亚语系" msgid "Other languages" msgstr "其他语言" @@ -2104,19 +2104,19 @@ msgid "Eject %s" msgstr "弹出 %s" msgid "&Unmute" -msgstr "打开声音(&U)" +msgstr "解除静音(&U)" msgid "Softfloat FPU" msgstr "Softfloat FPU" msgid "High performance impact" -msgstr "对性能影响大" +msgstr "重大性能影响" msgid "RAM Disk (max. speed)" -msgstr "RAM磁盘 (最大速度)" +msgstr "RAM 磁盘 (最大速度)" msgid "IBM 8514/A clone (ISA)" -msgstr "IBM 8514/A克隆 (ISA)" +msgstr "IBM 8514/A 克隆 (ISA)" msgid "Vendor" msgstr "制造商" From 7e0541453d6dfbbc529ab0e47d55aaa756e916c0 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 19 Nov 2024 09:56:37 +0100 Subject: [PATCH 597/624] ASUS P/I-486SVG2: Correct name and change the KBC back to PS/2, fixes #4976. --- src/machine/m_at_386dx_486.c | 2 +- src/machine/machine_table.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/m_at_386dx_486.c b/src/machine/m_at_386dx_486.c index 00a4021fe..253f7522a 100644 --- a/src/machine/m_at_386dx_486.c +++ b/src/machine/m_at_386dx_486.c @@ -837,7 +837,7 @@ machine_at_vli486sv2g_init(const machine_t *model) return ret; machine_at_sis_85c471_common_init(model); - device_add(&keyboard_at_ami_device); + device_add(&keyboard_ps2_ami_device); return ret; } diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index c019a16dd..580ca541d 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -6855,7 +6855,7 @@ const machine_t machines[] = { }, /* This has an AMIKey-2, which is an updated version of type 'H'. */ { - .name = "[SiS 471] ASUS VL/I-486SV2G (GX4)", + .name = "[SiS 471] ASUS VL/I-486SV2GX4", .internal_name = "vli486sv2g", .type = MACHINE_TYPE_486_S3, .chipset = MACHINE_CHIPSET_SIS_471, From 38eb89a5dcbae28b7d186ba5043a643a78396df6 Mon Sep 17 00:00:00 2001 From: Sasamiya <117635969+kzmidze@users.noreply.github.com> Date: Tue, 19 Nov 2024 22:15:41 +0800 Subject: [PATCH 598/624] Update zh-TW.po --- src/qt/languages/zh-TW.po | 96 +++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index e8920bcb0..2ad14f49f 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -256,7 +256,7 @@ msgid "&Folder..." msgstr "資料夾(&F)..." msgid "Target &framerate" -msgstr "目標幀率(&F)" +msgstr "目標影格速率(&F)" msgid "&Sync with video" msgstr "與視訊同步(&S)" @@ -1195,7 +1195,7 @@ msgid "Select media images from program working directory" msgstr "從程式工作目錄中選擇介質映像" msgid "PIT mode:" -msgstr "PIT模式:" +msgstr "PIT 模式:" msgid "Auto" msgstr "自動" @@ -1219,7 +1219,7 @@ msgid "Generate" msgstr "產生" msgid "Joystick configuration" -msgstr "搖桿配置" +msgstr "搖桿設定" msgid "Device" msgstr "裝置" @@ -1270,13 +1270,13 @@ msgid "&Connected" msgstr "已連線" msgid "Clear image history" -msgstr "清除影像記錄" +msgstr "清除映像歷史記錄" msgid "Create..." msgstr "建立..." msgid "previous image" -msgstr "上一個影像" +msgstr "上一個映像" msgid "Host CD/DVD Drive (%1)" msgstr "主機 CD/DVD 光碟機 (%1)" @@ -1285,10 +1285,10 @@ msgid "Unknown Bus" msgstr "未知匯流排" msgid "Null Driver" -msgstr "空 驅動程式" +msgstr "空驅動程式" msgid "NIC %02i (%ls) %ls" -msgstr "網卡 %02i (%ls) %ls" +msgstr "網路卡 %02i (%ls) %ls" msgid "Error opening \"%1\": %2" msgstr "錯誤開啟 \"%1\": %2" @@ -1309,7 +1309,7 @@ msgid "Render behavior" msgstr "渲染行為" msgid "Use target framerate:" -msgstr "使用目標畫格速率:" +msgstr "使用目標影格速率:" msgid " fps" msgstr "fps" @@ -1318,7 +1318,7 @@ 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>" +msgstr "<html><head/><body><p>立即渲染每個畫面,與模擬顯示同步。</p><p><span style=" font-style:italic;">如果使用中的著色器不利用影格時間製作動畫效果,建議使用此選項。</span></p></body></html>" msgid "Synchronize with video" msgstr "與視訊同步" @@ -1330,7 +1330,7 @@ msgid "Remove" msgstr "移除" msgid "No shader selected" -msgstr "未選擇陰影" +msgstr "未選擇著色器" msgid "Browse..." msgstr "瀏覽..." @@ -1366,7 +1366,7 @@ msgid "Allocating memory for unpack buffer failed.\n" msgstr "為解除封包緩衝區分配記憶體失敗。\n" msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" -msgstr "<html><head/><body><p>當選擇媒體影像 (CD-ROM、軟碟等) 時,開啟對話方塊會在與 86Box 設定檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。</p></body></html>" +msgstr "<html><head/><body><p>當選擇媒體映像 (CD-ROM、軟碟等) 時,開啟對話方塊會在與 86Box 設定檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。</p></body></html>" msgid "This machine might have been moved or copied." msgstr "這台機器可能已被移動或複製。" @@ -1408,7 +1408,7 @@ msgid "Interface" msgstr "介面" msgid "Adapter" -msgstr "轉接器" +msgstr "配接器" msgid "VDE Socket" msgstr "VDE 插座" @@ -1444,19 +1444,19 @@ msgid "Microsoft Bus Mouse (InPort)" msgstr "Microsoft 匯流排滑鼠 (InPort)" msgid "Mouse Systems Serial Mouse" -msgstr "Mouse Systems 序滑鼠" +msgstr "Mouse Systems 序列滑鼠" msgid "Microsoft Serial Mouse" -msgstr "Microsoft 序滑鼠" +msgstr "Microsoft 序列滑鼠" msgid "Logitech Serial Mouse" -msgstr "Logitech 序滑鼠" +msgstr "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 相容的數據機" @@ -1546,43 +1546,43 @@ msgid "MIDI Clockout" msgstr "MIDI 時鐘輸出" msgid "SoundFont" -msgstr "音色" +msgstr "SoundFont" msgid "Output Gain" msgstr "輸出增益" msgid "Chorus" -msgstr "和聲" +msgstr "合唱" msgid "Chorus Voices" -msgstr "和聲聲音" +msgstr "合唱聲部" msgid "Chorus Level" -msgstr "和聲等級" +msgstr "合唱音量" msgid "Chorus Speed" -msgstr "和聲速度" +msgstr "合唱速度" msgid "Chorus Depth" -msgstr "和聲深度" +msgstr "合唱深度" msgid "Chorus Waveform" -msgstr "和聲波形" +msgstr "合唱波形" msgid "Reverb" -msgstr "迴響" +msgstr "混響" msgid "Reverb Room Size" -msgstr "迴響室尺寸" +msgstr "混響室的大小" msgid "Reverb Damping" -msgstr "迴響阻尼" +msgstr "混響阻尼" msgid "Reverb Width" -msgstr "迴響寬度" +msgstr "混響寬度" msgid "Reverb Level" -msgstr "迴響等級" +msgstr "混響電平" msgid "Interpolation Method" msgstr "插值方法" @@ -1630,7 +1630,7 @@ msgid "Enable BIOS" msgstr "啟用 BIOS" msgid "Baud Rate" -msgstr "波特率" +msgstr "鮑率" msgid "TCP/IP listening port" msgstr "TCP/IP 監聽埠" @@ -1738,7 +1738,7 @@ msgid "Display type" msgstr "顯示類型" msgid "Composite type" -msgstr "複合類型" +msgstr "複合視訊類型" msgid "RGB type" msgstr "RGB 類型" @@ -1750,7 +1750,7 @@ msgid "Snow emulation" msgstr "雪花模擬" msgid "Monitor type" -msgstr "監視器類型" +msgstr "顯示器類型" msgid "Character set" msgstr "字元集" @@ -1783,7 +1783,7 @@ msgid "Voodoo type" msgstr "Voodoo 類型" msgid "Framebuffer memory size" -msgstr "幀緩衝記憶體大小" +msgstr "影格緩衝記憶體大小" msgid "Texture memory size" msgstr "材質記憶體大小" @@ -1792,10 +1792,10 @@ msgid "Dither subtraction" msgstr "抖動減法" msgid "Screen Filter" -msgstr "畫面濾鏡" +msgstr "濾鏡" msgid "Render threads" -msgstr "渲染線程" +msgstr "渲染執行緒" msgid "SLI" msgstr "SLI" @@ -1819,13 +1819,13 @@ msgid "Address for > 2 MB" msgstr "> 2 MB 的位址" msgid "Frame Address" -msgstr "幀位址" +msgstr "影格位址" msgid "USA" msgstr "美國" msgid "Danish" -msgstr "丹麥" +msgstr "丹麥語" msgid "Always at selected speed" msgstr "永遠以所選速度運作" @@ -1861,22 +1861,22 @@ msgid "45 Hz (JMP2 not populated)" msgstr "45 Hz (JMP2 未填充)" msgid "Two" -msgstr "二階" +msgstr "二鍵" msgid "Three" -msgstr "三階" +msgstr "三鍵" msgid "Wheel" msgstr "滾輪" msgid "Five + Wheel" -msgstr "五 + 滾輪" +msgstr "五鍵 + 滾輪" msgid "A3 - SMT2 Serial / SMT3(R)V" -msgstr "A3 - SMT2 序 / SMT3(R)V" +msgstr "A3 - SMT2 序列 / SMT3(R)V" msgid "Q1 - SMT3(R) Serial" -msgstr "Q1 - SMT3(R) 序" +msgstr "Q1 - SMT3(R) 序列" msgid "8 KB" msgstr "8 KB" @@ -1933,13 +1933,13 @@ msgid "256 KB" msgstr "256 KB" msgid "Composite" -msgstr "複合式" +msgstr "複合視訊" msgid "Old" -msgstr "舊版" +msgstr "舊" msgid "New" -msgstr "新款" +msgstr "新" msgid "Color (generic)" msgstr "彩色(通用)" @@ -1987,10 +1987,10 @@ msgid "Color 80x25 (5153/CGA)" msgstr "彩色 80x25 (5153/CGA)" msgid "Enhanced Color - Normal Mode (5154/ECD)" -msgstr "增強色彩 - 一般模式 (5154/ECD)" +msgstr "增強彩色 - 一般模式 (5154/ECD)" msgid "Enhanced Color - Enhanced Mode (5154/ECD)" -msgstr "增強色彩 - 增強模式 (5154/ECD)" +msgstr "增強彩色 - 增強模式 (5154/ECD)" msgid "Green" msgstr "綠色" @@ -2092,7 +2092,7 @@ msgid "Stop bits" msgstr "停止位元" msgid "Baud Rate of Passthrough" -msgstr "直通的波特率" +msgstr "直通的鮑率" msgid "Named Pipe (Server)" msgstr "已命名管道 (伺服器)" @@ -2104,7 +2104,7 @@ msgid "Eject %s" msgstr "退出 %s" msgid "&Unmute" -msgstr "開啟聲音 (&U)" +msgstr "解除靜音 (&U)" msgid "Softfloat FPU" msgstr "Softfloat FPU" From 945a57376fc4494dfa2e78c9b9e65a22c4f0aff9 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 19 Nov 2024 23:43:55 +0100 Subject: [PATCH 599/624] CD-ROM: Fix raw TOC reads. --- src/cdrom/cdrom.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index 4dc03885e..ff83b0a07 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -1188,12 +1188,14 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) b[len++] = ti.attr; /* Track ADR and Control */ b[len++] = 0; /* TNO (always 0) */ b[len++] = ti.number; /* Point (for track points - track number) */ - b[len++] = ti.m; /* M */ - b[len++] = ti.s; /* S */ - b[len++] = ti.f; /* F */ + /* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */ b[len++] = 0; b[len++] = 0; b[len++] = 0; + b[len++] = 0; + b[len++] = ti.m; /* PM */ + b[len++] = ti.s; /* PS */ + b[len++] = ti.f; /* PF */ } return len; From 593d09b9ecdbba62fad6c8f1ccd469054378372a Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 20 Nov 2024 00:29:02 +0100 Subject: [PATCH 600/624] CD-ROM: Fix track starting address calculation. --- src/cdrom/cdrom_image_backend.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index a1223bd17..f1d5ed1f9 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -857,7 +857,7 @@ cdi_cue_get_flags(track_t *cur, char **line) } static int -cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, uint64_t *total_pregap, uint64_t cur_pregap) +cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, uint64_t cur_pregap) { /* Frames between index 0 (prestart) and 1 (current track start) must be skipped. */ track_t *prev = NULL; @@ -865,7 +865,8 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u /* Skip *MUST* be calculated even if prestart is 0. */ if (prestart > cur->start) return 0; - const uint64_t skip = cur->start - prestart; + /* If prestart is 0, there is no skip. */ + uint64_t skip = (prestart == 0) ? 0 : (cur->start - prestart); if ((cdi->tracks != NULL) && (cdi->tracks_num != 0)) prev = &cdi->tracks[cdi->tracks_num - 1]; @@ -883,7 +884,6 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0) && !cur->noskip) cur->skip += 8; cur->start += cur_pregap; - *total_pregap = cur_pregap; cdi_track_push_back(cdi, cur); return 1; } @@ -891,23 +891,21 @@ cdi_add_track(cd_img_t *cdi, track_t *cur, uint64_t *shift, uint64_t prestart, u /* Current track consumes data from the same file as the previous. */ if (prev->file == cur->file) { cur->start += *shift; - prev->length = cur->start + *total_pregap - prev->start - skip; + prev->length = cur->start - prev->start - skip; cur->skip += prev->skip + (prev->length * prev->sector_size) + (skip * cur->sector_size); - *total_pregap += cur_pregap; - cur->start += *total_pregap; + cur->start += cur_pregap; } else { const uint64_t temp = prev->file->get_length(prev->file) - (prev->skip); prev->length = temp / ((uint64_t) prev->sector_size); if ((temp % prev->sector_size) != 0) + /* Padding. */ prev->length++; - /* Padding. */ cur->start += prev->start + prev->length + cur_pregap; cur->skip = skip * cur->sector_size; if ((cur->sector_size != RAW_SECTOR_SIZE) && (cur->form > 0) && !cur->noskip) cur->skip += 8; *shift += prev->start + prev->length; - *total_pregap = cur_pregap; } /* Error checks. */ @@ -931,7 +929,6 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) uint64_t shift = 0ULL; uint64_t prestart = 0ULL; uint64_t cur_pregap = 0ULL; - uint64_t total_pregap = 0ULL; uint64_t frame = 0ULL; uint64_t index; int iso_file_used = 0; @@ -984,7 +981,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) if (!strcmp(command, "TRACK")) { if (can_add_track) - success = cdi_add_track(cdi, &trk, &shift, prestart, &total_pregap, cur_pregap); + success = cdi_add_track(cdi, &trk, &shift, prestart, cur_pregap); else success = 1; if (!success) @@ -1103,7 +1100,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) char ansi[MAX_FILENAME_LENGTH]; if (can_add_track) - success = cdi_add_track(cdi, &trk, &shift, prestart, &total_pregap, cur_pregap); + success = cdi_add_track(cdi, &trk, &shift, prestart, cur_pregap); else success = 1; if (!success) @@ -1186,7 +1183,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) return 0; /* Add last track. */ - if (!cdi_add_track(cdi, &trk, &shift, prestart, &total_pregap, cur_pregap)) + if (!cdi_add_track(cdi, &trk, &shift, prestart, cur_pregap)) return 0; /* Add lead out track. */ @@ -1196,7 +1193,7 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) trk.start = 0; trk.length = 0; trk.file = NULL; - if (!cdi_add_track(cdi, &trk, &shift, 0, &total_pregap, 0)) + if (!cdi_add_track(cdi, &trk, &shift, 0, 0)) return 0; return 1; From 2947e0fd8907b3afcb62658374a819cb86d154ac Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 20 Nov 2024 01:32:05 +0100 Subject: [PATCH 601/624] Fix a build failure on NetBSD. --- src/include/86box/bswap.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/include/86box/bswap.h b/src/include/86box/bswap.h index 78183d137..f7d3a3d0e 100644 --- a/src/include/86box/bswap.h +++ b/src/include/86box/bswap.h @@ -35,6 +35,8 @@ * USA. */ +#ifndef __NetBSD__ + #ifndef BSWAP_H #define BSWAP_H @@ -239,3 +241,5 @@ cpu_to_be32wu(uint32_t *p, uint32_t v) #undef be_bswaps #endif /*BSWAP_H*/ + +#endif From e0ff6a1da721f675d73b8f63c1712a9d51048472 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 20 Nov 2024 01:36:29 +0100 Subject: [PATCH 602/624] More NetBSD fixes, by Randrianasulu. --- src/qt/qt_platform.cpp | 4 ++++ src/unix/unix.c | 6 +++++- src/unix/unix_serial_passthrough.c | 3 +++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index e48cb1f3e..9ea1be821 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -804,12 +804,16 @@ plat_set_thread_name(void *thread, const char *name) if (thread) /* Apple pthread can only set self's name */ return; char truncated[64]; +# elif defined(Q_OS_NETBSD) + char truncated[64]; # else char truncated[16]; # endif strncpy(truncated, name, sizeof(truncated) - 1); # if defined(Q_OS_DARWIN) pthread_setname_np(truncated); +# elif defined(Q_OS_NETBSD) + pthread_setname_np(thread ? *((pthread_t *) thread) : pthread_self(), truncated, "%s"); # elif defined(Q_OS_OPENBSD) pthread_set_name_np(thread ? *((pthread_t *) thread) : pthread_self(), truncated); # else diff --git a/src/unix/unix.c b/src/unix/unix.c index d4d73817f..d9b3af81f 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -782,7 +782,7 @@ plat_init_rom_paths(void) strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); path_slash(xdg_rom_path); - strncat(xdg_rom_path, "86Box/", 1024); + strncat(xdg_rom_path, "86Box/", 1023); if (!plat_dir_check(xdg_rom_path)) plat_dir_create(xdg_rom_path); @@ -1394,12 +1394,16 @@ plat_set_thread_name(void *thread, const char *name) if (thread) /* Apple pthread can only set self's name */ return; char truncated[64]; +#elif defined(Q_OS_NETBSD) + char truncated[64]; #else char truncated[16]; #endif strncpy(truncated, name, sizeof(truncated) - 1); #ifdef __APPLE__ pthread_setname_np(truncated); +#elif defined(Q_OS_NETBSD) + pthread_setname_np(thread ? *((pthread_t *) thread) : pthread_self(), truncated, "%s"); #else pthread_setname_np(thread ? *((pthread_t *) thread) : pthread_self(), truncated); #endif diff --git a/src/unix/unix_serial_passthrough.c b/src/unix/unix_serial_passthrough.c index 0184ebbc0..a12346013 100644 --- a/src/unix/unix_serial_passthrough.c +++ b/src/unix/unix_serial_passthrough.c @@ -24,6 +24,9 @@ #if defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__DragonFly__) # define __BSD_VISIBLE 1 #endif +#ifdef __NetBSD__ +# define _NETBSD_VISIBLE 1 +#endif #include #include #include From fb1a4677c6aeb22598f4f8586f91adbb58d55494 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 20 Nov 2024 01:42:32 +0100 Subject: [PATCH 603/624] More NetBSD fixes. --- src/codegen/codegen_x86-64.c | 2 ++ src/codegen/codegen_x86.c | 2 ++ src/codegen_new/codegen_allocator.c | 2 ++ src/qt/qt_platform.cpp | 2 ++ src/unix/unix.c | 2 ++ 5 files changed, 10 insertions(+) diff --git a/src/codegen/codegen_x86-64.c b/src/codegen/codegen_x86-64.c index 958872162..16d8a16f6 100644 --- a/src/codegen/codegen_x86-64.c +++ b/src/codegen/codegen_x86-64.c @@ -70,6 +70,8 @@ codegen_init(void) { # if _WIN64 codeblock = VirtualAlloc(NULL, BLOCK_SIZE * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); +# elif defined(PROT_MPROTECT) + codeblock = mmap(NULL, BLOCK_SIZE * sizeof(codeblock_t), PROT_MPROTECT(PROT_READ | PROT_WRITE | PROT_EXEC), MAP_ANON | MAP_PRIVATE, -1, 0); # elif defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) codeblock = mmap(NULL, BLOCK_SIZE * sizeof(codeblock_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); # else diff --git a/src/codegen/codegen_x86.c b/src/codegen/codegen_x86.c index 74c209001..09ae8697c 100644 --- a/src/codegen/codegen_x86.c +++ b/src/codegen/codegen_x86.c @@ -1196,6 +1196,8 @@ codegen_init(void) { # ifdef _WIN32 codeblock = VirtualAlloc(NULL, (BLOCK_SIZE + 1) * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); +# elif defined(PROT_MPROTECT) + codeblock = mmap(NULL, (BLOCK_SIZE + 1) * sizeof(codeblock_t), PROT_MPROTECT(PROT_READ | PROT_WRITE | PROT_EXEC), MAP_ANON | MAP_PRIVATE, 0, 0); # elif defined __unix__ codeblock = mmap(NULL, (BLOCK_SIZE + 1) * sizeof(codeblock_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, 0, 0); # else diff --git a/src/codegen_new/codegen_allocator.c b/src/codegen_new/codegen_allocator.c index 90e619d70..3aba72f59 100644 --- a/src/codegen_new/codegen_allocator.c +++ b/src/codegen_new/codegen_allocator.c @@ -37,6 +37,8 @@ codegen_allocator_init(void) mem_block_alloc = VirtualAlloc(NULL, MEM_BLOCK_NR * MEM_BLOCK_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); /* TODO: check deployment target: older Intel-based versions of macOS don't play nice with MAP_JIT. */ +#elif defined(PROT_MPROTECT) + mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_MPROTECT(PROT_READ | PROT_WRITE | PROT_EXEC), MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0); #elif defined(__APPLE__) && defined(MAP_JIT) mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0); #else diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 9ea1be821..bbc9489b8 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -365,6 +365,8 @@ plat_mmap(size_t size, uint8_t executable) #elif defined Q_OS_UNIX # if defined Q_OS_DARWIN && defined MAP_JIT void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE | (executable ? MAP_JIT : 0), -1, 0); +# elif defined(PROT_MPROTECT) + void *ret = mmap(0, size, PROT_MPROTECT(PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0)), MAP_ANON | MAP_PRIVATE, -1, 0); # else void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE, -1, 0); # endif diff --git a/src/unix/unix.c b/src/unix/unix.c index d9b3af81f..911905ef2 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -409,6 +409,8 @@ plat_mmap(size_t size, uint8_t executable) { #if defined __APPLE__ && defined MAP_JIT void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE | (executable ? MAP_JIT : 0), -1, 0); +#elif defined(PROT_MPROTECT) + void *ret = mmap(0, size, PROT_MPROTECT(PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0)), MAP_ANON | MAP_PRIVATE, -1, 0); #else void *ret = mmap(0, size, PROT_READ | PROT_WRITE | (executable ? PROT_EXEC : 0), MAP_ANON | MAP_PRIVATE, -1, 0); #endif From 752e687e31ef5a0a8b7d085664f20cc2425ef1a4 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 20 Nov 2024 04:23:57 +0100 Subject: [PATCH 604/624] Translated a line in the About box accidentally not translated into most languages. --- src/qt/languages/ca-ES.po | 2 +- src/qt/languages/cs-CZ.po | 2 +- src/qt/languages/de-DE.po | 2 +- src/qt/languages/es-ES.po | 2 +- src/qt/languages/fi-FI.po | 2 +- src/qt/languages/fr-FR.po | 2 +- src/qt/languages/hr-HR.po | 2 +- src/qt/languages/hu-HU.po | 2 +- src/qt/languages/it-IT.po | 2 +- src/qt/languages/ja-JP.po | 2 +- src/qt/languages/ko-KR.po | 2 +- src/qt/languages/pl-PL.po | 2 +- src/qt/languages/pt-PT.po | 2 +- src/qt/languages/ru-RU.po | 2 +- src/qt/languages/sk-SK.po | 2 +- src/qt/languages/sl-SI.po | 2 +- src/qt/languages/uk-UA.po | 2 +- src/qt/languages/zh-CN.po | 2 +- src/qt/languages/zh-TW.po | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index f6b175847..cf0556c36 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -859,7 +859,7 @@ 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." -msgstr "Un emulador d'ordinadors antics\n\nAutors: 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 i altres.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho i altres.\n\nAlliberat sota la GNU General Public License versió 2 o posterior. Veure LLICENSE per a més informació." +msgstr "Un emulador d'ordinadors antics\n\nAutors: 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 i altres.\n\nAmb contribucions bàsiques anteriors de Sarah Walker, Leilei, JohnElliott, greatpsycho i altres.\n\nAlliberat sota la GNU General Public License versió 2 o posterior. Veure LLICENSE per a més informació." msgid "Hardware not available" msgstr "Maquinari no disponible" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index ea2cdbe34..070c8a0df 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -859,7 +859,7 @@ 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." -msgstr "Emulátor starých počítačů\n\nAutoři: 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\nZveřejněno pod licencí GNU General Public License verze 2 nebo novější. Viz soubor LICENSE pro více informací." +msgstr "Emulátor starých počítačů\n\nAutoři: 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\nS předchozími příspěvky od Sarah Walker, leilei, JohnElliott, greatpsycho a dalších.\n\nZveřejněno pod licencí GNU General Public License verze 2 nebo novější. Viz soubor LICENSE pro více informací." msgid "Hardware not available" msgstr "Hardware není dostupný" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index 1ce3a2ab6..e94b8ebf4 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -862,7 +862,7 @@ msgid "86Box v" msgstr "86Box Version " 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 "Ein Emulator für alte Computer\n\nAutoren: 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 sowie andere.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho sowie andere.\n\nÜbersetzt von: dob205\n\nVeröffentlicht unter der GNU General Public License in der Version 2 oder neuer. Siehe LICENSE für mehr Informationen." +msgstr "Ein Emulator für alte Computer\n\nAutoren: 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 sowie andere.\n\nMit früheren Kernbeiträgen von Sarah Walker, leilei, JohnElliott, greatpsycho sowie andere.\n\nÜbersetzt von: dob205\n\nVeröffentlicht unter der GNU General Public License in der Version 2 oder neuer. Siehe LICENSE für mehr Informationen." msgid "Hardware not available" msgstr "Diese Hardware ist nicht verfügbar" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index d09c9ee8f..7a457b225 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -859,7 +859,7 @@ 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." -msgstr "Un emulador de ordenadores antigüos\n\nAutores: 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, y otros.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, y otros.\n\nLiberado bajo la GNU General Public License versión 2 o posterior. Ver LICENSE para más información." +msgstr "Un emulador de ordenadores antigüos\n\nAutores: 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, y otros.\n\nCon contribuciones anteriores de Sarah Walker, leilei, JohnElliott, greatpsycho y otros.\n\nLiberado bajo la GNU General Public License versión 2 o posterior. Ver LICENSE para más información." msgid "Hardware not available" msgstr "Equipo no disponible" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index d6643edb9..6aa71a867 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -859,7 +859,7 @@ 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." -msgstr "Vanhojen tietokoneiden emulaattori\n\nTekijät: 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 ja muut.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho ja muut.\n\nJulkaistu GNU General Public License 2. version tai myöhemmän alaisena. Tarkempia tietoja LICENSE-tiedostossa." +msgstr "Vanhojen tietokoneiden emulaattori\n\nTekijät: 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 ja muut.\n\nSarah Walkerin, leilein, JohnElliottin, greatpsychon ja muiden aiemmat keskeiset panokset.\n\nJulkaistu GNU General Public License 2. version tai myöhemmän alaisena. Tarkempia tietoja LICENSE-tiedostossa." msgid "Hardware not available" msgstr "Laitteisto ei ole saatavilla" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 3643e562c..c8e4aa6cd 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -859,7 +859,7 @@ 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." -msgstr "Un émulateur de vieux ordinateurs\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\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nLibéré sous la licence GNU General Public License version 2 ou ultérieure. Pour plus d'informations, voir le fichier LICENSE." +msgstr "Un émulateur de vieux ordinateurs\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\nAvec les contributions de Sarah Walker, leilei, JohnElliott, greatpsycho et d'autres.\n\nLibéré sous la licence GNU General Public License version 2 ou ultérieure. Pour plus d'informations, voir le fichier LICENSE." msgid "Hardware not available" msgstr "Matériel non disponible" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 17d1f5937..c1c76f468 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -859,7 +859,7 @@ msgid "86Box v" msgstr "86Box verzija " 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 "Emulator starih računala\n\nAutori: 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, i drugi.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, i drugi.\n\nPreveo: dob205\n\nObjavljeno pod licencom GNU General Public License, verzija 2 ili novije. Za više informacija pogledajte datoteku LICENCE." +msgstr "Emulator starih računala\n\nAutori: 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, i drugi.\n\nS prethodnim osnovnim doprinosima Sarah Walker, Leilei, JohnElliott, greatpsycho i drugih.\n\nPreveo: dob205\n\nObjavljeno pod licencom GNU General Public License, verzija 2 ili novije. Za više informacija pogledajte datoteku LICENCE." msgid "Hardware not available" msgstr "Hardver nije dostupan" diff --git a/src/qt/languages/hu-HU.po b/src/qt/languages/hu-HU.po index 4958cd6c6..732a75df7 100644 --- a/src/qt/languages/hu-HU.po +++ b/src/qt/languages/hu-HU.po @@ -859,7 +859,7 @@ 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." -msgstr "Régi számítógépek emulátora\n\nFejlesztők: 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\nFordította: Laci bá'\n\nMegjelent a GNU General Public License v2 vagy újabb alatt. További információért lásd a LICENSE fájlt." +msgstr "Régi számítógépek emulátora\n\nFejlesztők: 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\nSarah Walker, leilei, JohnElliott, greatpsycho és mások korábbi alapvető hozzájárulásával.\n\nFordította: Laci bá'\n\nMegjelent a GNU General Public License v2 vagy újabb alatt. További információért lásd a LICENSE fájlt." msgid "Hardware not available" msgstr "Hardver nem elérhető" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 02a87ba67..088b625af 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -856,7 +856,7 @@ 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." -msgstr "Un emulatore di computer vecchi\n\nAutori: 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\nTradotto da: explorerdotexe\n\nRilasciato sotto la Licenza Pubblica GNU versione 2 o dopo. Vedi LICENSE per maggior informazioni." +msgstr "Un emulatore di computer vecchi\n\nAutori: 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\nCon i precedenti contributi al nucleo di Sarah Walker, leilei, JohnElliott, greatpsycho e altri.\n\nTradotto da: explorerdotexe\n\nRilasciato sotto la Licenza Pubblica GNU versione 2 o dopo. Vedi LICENSE per maggior informazioni." msgid "Hardware not available" msgstr "Hardware non disponibile" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index ab07474de..8ad510745 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -859,7 +859,7 @@ 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." -msgstr "古いパソコンのエミュレーター\n\n著者: 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\nGNU General Public License version 2以降でリリースされています。詳しくは LICENSE をご覧ください。" +msgstr "古いパソコンのエミュレーター\n\n著者: 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\nSarah Walker, leilei, JohnElliott, greatpsycho, その他の方々による以前からの多大な貢献。\n\nGNU General Public License version 2以降でリリースされています。詳しくは LICENSE をご覧ください。" msgid "Hardware not available" msgstr "ハードウェアが利用できません" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 9e28470ad..707ed33b3 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -859,7 +859,7 @@ 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." -msgstr "고전 컴퓨터 에뮬레이터\n\n저자: 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\nGNU General Public 라이선스 (버전 2 이상)에 의해 배포되었습니다. 자세한 내용은 LICENSE 파일을 읽어 주세요." +msgstr "고전 컴퓨터 에뮬레이터\n\n저자: 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\이전 핵심 기여자로는 Sarah Walker, leilei, JohnElliott, greatpsycho 등이 있습니다.\n\nGNU General Public 라이선스 (버전 2 이상)에 의해 배포되었습니다. 자세한 내용은 LICENSE 파일을 읽어 주세요." msgid "Hardware not available" msgstr "하드웨어를 이용할 수 없습니다" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index c265b0800..9fa67bf9e 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -859,7 +859,7 @@ 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." -msgstr "Emulator starych komputerów\n\nAutorzy: 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, i inni.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, i inni.\n\nPrzetłumaczony przez: Fanta-Shokata\n\nWydany na licencji GNU General Public License w wersji 2 lub nowszej. Zobacz LICENSE aby uzyskać więcej informacji." +msgstr "Emulator starych komputerów\n\nAutorzy: 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, i inni.\n\nZ wcześniejszym wkładem od Sarah Walker, leilei, JohnElliott, greatpsycho i innych.\n\nPrzetłumaczony przez: Fanta-Shokata\n\nWydany na licencji GNU General Public License w wersji 2 lub nowszej. Zobacz LICENSE aby uzyskać więcej informacji." msgid "Hardware not available" msgstr "Sprzęt niedostępny" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index 7f672dc55..1494ce1dc 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -859,7 +859,7 @@ 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." -msgstr "Um emulador de computadores antigos\n\nAutores: 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\nUsado sob a licença GNU General Public License versão 2 ou posterior. Veja o ficheiro LICENSE para mais informações." +msgstr "Um emulador de computadores antigos\n\nAutores: 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\nCom contribuições anteriores de Sarah Walker, leilei, JohnElliott, greatpsycho e outros.\n\nUsado sob a licença GNU General Public License versão 2 ou posterior. Veja o ficheiro LICENSE para mais informações." msgid "Hardware not available" msgstr "Hardware não disponível" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 483629c10..2d3f6046e 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -859,7 +859,7 @@ 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." -msgstr "Эмулятор старых компьютеров\n\nАвторы: 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\nВыпускается под лицензией GNU General Public License версии 2 или более поздней. Дополнительную информацию см. в файле LICENSE." +msgstr "Эмулятор старых компьютеров\n\nАвторы: 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\nС предыдущими основными материалами от Sarah Walker, leilei, JohnElliott, greatpsycho и других.\n\nВыпускается под лицензией GNU General Public License версии 2 или более поздней. Дополнительную информацию см. в файле LICENSE." msgid "Hardware not available" msgstr "Оборудование недоступно" diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index bd8a4bc63..708c24dd8 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -859,7 +859,7 @@ 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." -msgstr "Emulátor starých počítačov\n\nAutori: 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\nZverejnené pod licenciou GNU General Public License verzie 2 alebo novšej. Pozri súbor LICENSE pre viac informácií." +msgstr "Emulátor starých počítačov\n\nAutori: 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\nS predchádzajúcimi hlavnými príspevkami od Sarah Walker, leilei, JohnElliott, greatpsycho a ďalších.\n\nZverejnené pod licenciou GNU General Public License verzie 2 alebo novšej. Pozri súbor LICENSE pre viac informácií." msgid "Hardware not available" msgstr "Hardvér nie je dostupný" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index 23ed7bf98..c9c99d6b2 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -859,7 +859,7 @@ 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." -msgstr "Emulator starih računalnikov\n\nAvtorji: 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 in drugi.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho in drugi.\n\nIzdano pod licenco GNU General Public License različica 2 ali novejša. Glej datoteko LICENSE za več informacij." +msgstr "Emulator starih računalnikov\n\nAvtorji: 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 in drugi.\n\nS prejšnjimi prispevki Sarah Walker, leilei, JohnElliott, greatpsycho in drugih.\n\nIzdano pod licenco GNU General Public License različica 2 ali novejša. Glej datoteko LICENSE za več informacij." msgid "Hardware not available" msgstr "Strojna oprema ni na voljo" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 0b91b4104..6cef7c294 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -859,7 +859,7 @@ 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." -msgstr "Емулятор старих комп'ютерів\n\nАвтори: 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\nВипускаєтся під ліцензією GNU General Public License версії 2 або більше пізніше. Додадкову інформацію см. у файлі LICENSE." +msgstr "Емулятор старих комп'ютерів\n\nАвтори: 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\nЗ попередніми основними внесками Sarah Walker, leilei, JohnElliott, greatpsycho та інших.\n\nВипускаєтся під ліцензією GNU General Public License версії 2 або більше пізніше. Додадкову інформацію см. у файлі LICENSE." msgid "Hardware not available" msgstr "Обладнання недоступне" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 41f06b681..95e770357 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -859,7 +859,7 @@ 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." -msgstr "一个旧式计算机模拟器\n\n作者: 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 等人。\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\n本软件依据 GNU 通用公共许可证第二版或更新版本发布。详情见 LICENSE 文件。" +msgstr "一个旧式计算机模拟器\n\n作者: 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 等人。\n\n感谢 Sarah Walker、leilei、JohnElliott、greatpsycho 和其他人的核心贡献。\n\n本软件依据 GNU 通用公共许可证第二版或更新版本发布。详情见 LICENSE 文件。" msgid "Hardware not available" msgstr "硬件不可用" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 2ad14f49f..2d5576573 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -859,7 +859,7 @@ 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." -msgstr "一個舊式電腦模擬器\n\n作者: 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 等人。\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\n本軟體依據 GNU 通用公共授權第二版或更新版本發布。詳情見 LICENSE 檔案。" +msgstr "一個舊式電腦模擬器\n\n作者: 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 等人。\n\n之前的核心貢獻來自 Sarah Walker、leilei、JohnElliott、greatpsycho 等人。\n\n本軟體依據 GNU 通用公共授權第二版或更新版本發布。詳情見 LICENSE 檔案。" msgid "Hardware not available" msgstr "硬體不可用" From d7a2db5025856fb04223fcad92c86794255fcbc3 Mon Sep 17 00:00:00 2001 From: OBattler Date: Wed, 20 Nov 2024 04:24:57 +0100 Subject: [PATCH 605/624] Fixed a compile-breaking typo in the Korean translation. --- src/qt/languages/ko-KR.po | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 707ed33b3..485789f56 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -859,7 +859,7 @@ 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." -msgstr "고전 컴퓨터 에뮬레이터\n\n저자: 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\이전 핵심 기여자로는 Sarah Walker, leilei, JohnElliott, greatpsycho 등이 있습니다.\n\nGNU General Public 라이선스 (버전 2 이상)에 의해 배포되었습니다. 자세한 내용은 LICENSE 파일을 읽어 주세요." +msgstr "고전 컴퓨터 에뮬레이터\n\n저자: 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\n이전 핵심 기여자로는 Sarah Walker, leilei, JohnElliott, greatpsycho 등이 있습니다.\n\nGNU General Public 라이선스 (버전 2 이상)에 의해 배포되었습니다. 자세한 내용은 LICENSE 파일을 읽어 주세요." msgid "Hardware not available" msgstr "하드웨어를 이용할 수 없습니다" From 1e052e5dc0ca0d521def9260e94262686ddea6b3 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 20 Nov 2024 11:23:24 -0300 Subject: [PATCH 606/624] Use plat_mmap on the dynarecs as well --- src/codegen/codegen_x86-64.c | 19 ++----------------- src/codegen/codegen_x86.c | 19 ++----------------- src/codegen_new/codegen_allocator.c | 13 ++----------- 3 files changed, 6 insertions(+), 45 deletions(-) diff --git a/src/codegen/codegen_x86-64.c b/src/codegen/codegen_x86-64.c index 16d8a16f6..59f411612 100644 --- a/src/codegen/codegen_x86-64.c +++ b/src/codegen/codegen_x86-64.c @@ -7,6 +7,7 @@ # include # define HAVE_STDARG_H # include <86box/86box.h> +# include <86box/plat.h> # include "cpu.h" # include "x86.h" # include "x86_flags.h" @@ -25,14 +26,6 @@ # include "codegen_ops.h" # include "codegen_ops_x86-64.h" -# if defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) -# include -# include -# endif -# if _WIN64 -# include -# endif - int codegen_flat_ds; int codegen_flat_ss; int codegen_flags_changed = 0; @@ -68,15 +61,7 @@ static int last_ssegs; void codegen_init(void) { -# if _WIN64 - codeblock = VirtualAlloc(NULL, BLOCK_SIZE * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); -# elif defined(PROT_MPROTECT) - codeblock = mmap(NULL, BLOCK_SIZE * sizeof(codeblock_t), PROT_MPROTECT(PROT_READ | PROT_WRITE | PROT_EXEC), MAP_ANON | MAP_PRIVATE, -1, 0); -# elif defined(__unix__) || defined(__APPLE__) || defined(__HAIKU__) - codeblock = mmap(NULL, BLOCK_SIZE * sizeof(codeblock_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); -# else - codeblock = malloc(BLOCK_SIZE * sizeof(codeblock_t)); -# endif + codeblock = plat_mmap(BLOCK_SIZE * sizeof(codeblock_t), 1); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *)); memset(codeblock, 0, BLOCK_SIZE * sizeof(codeblock_t)); diff --git a/src/codegen/codegen_x86.c b/src/codegen/codegen_x86.c index 09ae8697c..df0ed3bfd 100644 --- a/src/codegen/codegen_x86.c +++ b/src/codegen/codegen_x86.c @@ -44,6 +44,7 @@ # include # include # include <86box/86box.h> +# include <86box/plat.h> # include "cpu.h" # include <86box/mem.h> # include "x86.h" @@ -64,14 +65,6 @@ # include "codegen_ops.h" # include "codegen_ops_x86.h" -# ifdef __unix__ -# include -# include -# endif -# if defined _WIN32 -# include -# endif - int codegen_flat_ds; int codegen_flat_ss; int mmx_ebx_ecx_loaded; @@ -1194,15 +1187,7 @@ gen_MEM_CHECK_WRITE_L(void) void codegen_init(void) { -# ifdef _WIN32 - codeblock = VirtualAlloc(NULL, (BLOCK_SIZE + 1) * sizeof(codeblock_t), MEM_COMMIT, PAGE_EXECUTE_READWRITE); -# elif defined(PROT_MPROTECT) - codeblock = mmap(NULL, (BLOCK_SIZE + 1) * sizeof(codeblock_t), PROT_MPROTECT(PROT_READ | PROT_WRITE | PROT_EXEC), MAP_ANON | MAP_PRIVATE, 0, 0); -# elif defined __unix__ - codeblock = mmap(NULL, (BLOCK_SIZE + 1) * sizeof(codeblock_t), PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, 0, 0); -# else - codeblock = malloc((BLOCK_SIZE + 1) * sizeof(codeblock_t)); -# endif + codeblock = plat_mmap((BLOCK_SIZE + 1) * sizeof(codeblock_t), 1); codeblock_hash = malloc(HASH_SIZE * sizeof(codeblock_t *)); memset(codeblock, 0, (BLOCK_SIZE + 1) * sizeof(codeblock_t)); diff --git a/src/codegen_new/codegen_allocator.c b/src/codegen_new/codegen_allocator.c index 3aba72f59..3cdb731b9 100644 --- a/src/codegen_new/codegen_allocator.c +++ b/src/codegen_new/codegen_allocator.c @@ -13,6 +13,7 @@ #include <86box/86box.h> #include "cpu.h" #include <86box/mem.h> +#include <86box/plat.h> #include <86box/plat_unused.h> #include "codegen.h" @@ -33,17 +34,7 @@ int codegen_allocator_usage = 0; void codegen_allocator_init(void) { -#if defined WIN32 || defined _WIN32 || defined _WIN32 - mem_block_alloc = VirtualAlloc(NULL, MEM_BLOCK_NR * MEM_BLOCK_SIZE, MEM_COMMIT, PAGE_EXECUTE_READWRITE); - /* TODO: check deployment target: older Intel-based versions of macOS don't play - nice with MAP_JIT. */ -#elif defined(PROT_MPROTECT) - mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_MPROTECT(PROT_READ | PROT_WRITE | PROT_EXEC), MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0); -#elif defined(__APPLE__) && defined(MAP_JIT) - mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE | MAP_JIT, -1, 0); -#else - mem_block_alloc = mmap(0, MEM_BLOCK_NR * MEM_BLOCK_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANON | MAP_PRIVATE, -1, 0); -#endif + mem_block_alloc = plat_mmap(MEM_BLOCK_NR * MEM_BLOCK_SIZE, 1); for (uint32_t c = 0; c < MEM_BLOCK_NR; c++) { mem_blocks[c].offset = c * MEM_BLOCK_SIZE; From 393b1ba04a404de1b7b7a179eb4a2d2b92ff6db5 Mon Sep 17 00:00:00 2001 From: RichardG867 Date: Wed, 20 Nov 2024 16:15:39 -0300 Subject: [PATCH 607/624] Jenkins: Lock MacPorts to an older openal-soft while 10.x support is uncertain, fixes #4980 --- .ci/build.sh | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.ci/build.sh b/.ci/build.sh index 2a48d564b..bf23f5d38 100755 --- a/.ci/build.sh +++ b/.ci/build.sh @@ -539,6 +539,12 @@ then sudo sed -i -e 's/configure.env-append MAKE=/configure.env-append VULKAN_SDK=${prefix} MAKE=/g' "$qt5_portfile" fi + # Patch openal-soft to use 1.23.1 on all targets instead of 1.24.0 on >=11.0 only, + # to prevent a symlink mismatch from having different versions on x86_64 and arm64. + # See: https://github.com/macports/macports-ports/commit/9b4903fc9c76769d476079e404c9a3b8a225f8aa + openal_portfile="$macports/var/macports/sources/rsync.macports.org/macports/release/tarballs/ports/audio/openal-soft/Portfile" + sudo sed -i -e 's/if {${os.platform} ne "darwin" || ${os.major} >= 21}/if {0}/g' "$openal_portfile" + # Patch wget to remove libproxy support, as it depends on shared-mime-info which # fails to build for a 10.13 target, which we have to do despite wget only being # a host dependency. MacPorts issue 69406 strongly implies this will not be fixed. From 5078063a39fe46e1535edb88b5ff8ccad7168e26 Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 21 Nov 2024 14:58:09 +0100 Subject: [PATCH 608/624] Rename the Microsoft RAMCard to just that - the other variant is for the Apple II which is obviously outside of our scope so there's no point in clarifying which this is. --- src/device/isamem.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/device/isamem.c b/src/device/isamem.c index 4ff819d67..a3baf466d 100644 --- a/src/device/isamem.c +++ b/src/device/isamem.c @@ -1080,7 +1080,7 @@ static const device_config_t msramcard_config[] = { }; static const device_t msramcard_device = { - .name = "Microsoft RAMCard for IBM PC", + .name = "Microsoft RAMCard", .internal_name = "msramcard", .flags = DEVICE_ISA, .local = ISAMEM_RAMCARD_CARD, From 35b115a4077923145c91d0c93955d8243a4aeece Mon Sep 17 00:00:00 2001 From: OBattler Date: Thu, 21 Nov 2024 14:59:19 +0100 Subject: [PATCH 609/624] And the device config section migration for it. --- src/device.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/device.c b/src/device.c index 46125f58e..2f5a3cdad 100644 --- a/src/device.c +++ b/src/device.c @@ -111,6 +111,14 @@ device_set_context(device_context_t *c, const device_t *dev, int inst) void * old_sec = config_find_section("Standard PS/2 Mouse"); if ((sec == NULL) && (old_sec != NULL)) config_rename_section(old_sec, c->name); + } else if (!strcmp(dev->name, "Microsoft RAMCard")) { + sprintf(c->name, "%s", dev->name); + + /* Migrate the old "Standard PS/2 Mouse" section */ + const void *sec = config_find_section(c->name); + void * old_sec = config_find_section("Microsoft RAMCard for IBM PC"); + if ((sec == NULL) && (old_sec != NULL)) + config_rename_section(old_sec, c->name); } else sprintf(c->name, "%s", dev->name); } From db6d3aba38e6e73f0cc349f6fd242aac9a62f6a3 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 21 Nov 2024 22:29:04 +0500 Subject: [PATCH 610/624] Make Qt base translation embedding disableable --- src/qt/CMakeLists.txt | 70 +++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt index a99209273..d7ea91f70 100644 --- a/src/qt/CMakeLists.txt +++ b/src/qt/CMakeLists.txt @@ -455,46 +455,52 @@ if (UNIX AND NOT APPLE AND NOT HAIKU) endif() endif() -# Get the Qt translations directory -get_target_property(QT_QMAKE_EXECUTABLE Qt${QT_MAJOR}::qmake IMPORTED_LOCATION) -execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS OUTPUT_VARIABLE QT_TRANSLATIONS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) +option(EMBED_QTBASE_TRANSLATIONS "Embed the base Qt translations into the executable" ON) + +if (EMBED_QTBASE_TRANSLATIONS) + # Get the Qt translations directory + get_target_property(QT_QMAKE_EXECUTABLE Qt${QT_MAJOR}::qmake IMPORTED_LOCATION) + execute_process(COMMAND ${QT_QMAKE_EXECUTABLE} -query QT_INSTALL_TRANSLATIONS OUTPUT_VARIABLE QT_TRANSLATIONS_DIR OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() set(QM_FILES) file(GLOB po_files "${CMAKE_CURRENT_SOURCE_DIR}/languages/*.po") foreach(po_file ${po_files}) get_filename_component(PO_FILE_NAME ${po_file} NAME_WE) - # Get the language and country - string(REGEX MATCH "^[a-z]+" PO_LANGUAGE ${PO_FILE_NAME}) - string(REGEX MATCH "[A-Z]+$" PO_COUNTRY ${PO_FILE_NAME}) + if (EMBED_QTBASE_TRANSLATIONS) + # Get the language and country + string(REGEX MATCH "^[a-z]+" PO_LANGUAGE ${PO_FILE_NAME}) + string(REGEX MATCH "[A-Z]+$" PO_COUNTRY ${PO_FILE_NAME}) - # Find the base Qt translation for the language and country - set(qt_translation_file_dest "qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") - if (EXISTS "${QT_TRANSLATIONS_DIR}/qtbase_${PO_LANGUAGE}_${PO_COUNTRY}.qm") - set(qt_translation_file "qtbase_${PO_LANGUAGE}_${PO_COUNTRY}.qm") - # Fall back to just the language if country isn't found - elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qtbase_${PO_LANGUAGE}.qm") - set(qt_translation_file "qtbase_${PO_LANGUAGE}.qm") - # If the translation is still not found, try the legacy Qt one - elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") - set(qt_translation_file "qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") - # Fall back to just the language again - elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qt_${PO_LANGUAGE}.qm") - set(qt_translation_file "qt_${PO_LANGUAGE}.qm") - else() - unset(qt_translation_file) - endif() - - # Copy the translation file to the build directory - if (qt_translation_file) - file(COPY "${QT_TRANSLATIONS_DIR}/${qt_translation_file}" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) - if (NOT (qt_translation_file STREQUAL qt_translation_file_dest)) - # Rename the file for consistency - file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file}" "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file_dest}") + # Find the base Qt translation for the language and country + set(qt_translation_file_dest "qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + if (EXISTS "${QT_TRANSLATIONS_DIR}/qtbase_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + set(qt_translation_file "qtbase_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + # Fall back to just the language if country isn't found + elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qtbase_${PO_LANGUAGE}.qm") + set(qt_translation_file "qtbase_${PO_LANGUAGE}.qm") + # If the translation is still not found, try the legacy Qt one + elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + set(qt_translation_file "qt_${PO_LANGUAGE}_${PO_COUNTRY}.qm") + # Fall back to just the language again + elseif (EXISTS "${QT_TRANSLATIONS_DIR}/qt_${PO_LANGUAGE}.qm") + set(qt_translation_file "qt_${PO_LANGUAGE}.qm") + else() + unset(qt_translation_file) + endif() + + # Copy the translation file to the build directory + if (qt_translation_file) + file(COPY "${QT_TRANSLATIONS_DIR}/${qt_translation_file}" DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) + if (NOT (qt_translation_file STREQUAL qt_translation_file_dest)) + # Rename the file for consistency + file(RENAME "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file}" "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file_dest}") + endif() + # Add the file to the translations list + string(APPEND QT_TRANSLATIONS_LIST " ${qt_translation_file_dest}\n") + list(APPEND QM_FILES "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file_dest}") endif() - # Add the file to the translations list - string(APPEND QT_TRANSLATIONS_LIST " ${qt_translation_file_dest}\n") - list(APPEND QM_FILES "${CMAKE_CURRENT_BINARY_DIR}/${qt_translation_file_dest}") endif() add_custom_command(OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/86box_${PO_FILE_NAME}.qm" From c79fe9ffb1372db325a8ebfe875a28a6310bc4a7 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 21 Nov 2024 22:29:37 +0500 Subject: [PATCH 611/624] Fix HDD preset names not being translated in the HDD table --- src/qt/qt_settingsharddisks.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/qt_settingsharddisks.cpp b/src/qt/qt_settingsharddisks.cpp index 3f02ffe54..4f6811ff1 100644 --- a/src/qt/qt_settingsharddisks.cpp +++ b/src/qt/qt_settingsharddisks.cpp @@ -99,7 +99,7 @@ addRow(QAbstractItemModel *model, hard_disk_t *hd) model->setData(model->index(row, ColumnHeads), hd->hpc); model->setData(model->index(row, ColumnSectors), hd->spt); model->setData(model->index(row, ColumnSize), (hd->tracks * hd->hpc * hd->spt) >> 11); - model->setData(model->index(row, ColumnSpeed), hdd_preset_getname(hd->speed_preset)); + model->setData(model->index(row, ColumnSpeed), QObject::tr(hdd_preset_getname(hd->speed_preset))); model->setData(model->index(row, ColumnSpeed), hd->speed_preset, Qt::UserRole); } @@ -267,7 +267,7 @@ SettingsHarddisks::on_comboBoxSpeed_currentIndexChanged(int index) auto *model = ui->tableView->model(); auto col = idx.siblingAtColumn(ColumnSpeed); model->setData(col, ui->comboBoxSpeed->currentData(Qt::UserRole), Qt::UserRole); - model->setData(col, hdd_preset_getname(ui->comboBoxSpeed->currentData(Qt::UserRole).toUInt())); + model->setData(col, QObject::tr(hdd_preset_getname(ui->comboBoxSpeed->currentData(Qt::UserRole).toUInt()))); } } From 3636bb9e2f405aa208f208854df6612d360bea99 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 21 Nov 2024 22:30:13 +0500 Subject: [PATCH 612/624] Fix mistakes in the Russian translation --- src/qt/languages/ru-RU.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 2d3f6046e..839393c0c 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1282,10 +1282,10 @@ msgid "Host CD/DVD Drive (%1)" msgstr "Главный CD/DVD-привод (%1)" msgid "Unknown Bus" -msgstr "Неизвестный автобус" +msgstr "Неизвестная шина" msgid "Null Driver" -msgstr "Нулевой водитель" +msgstr "Нулевой драйвер" msgid "NIC %02i (%ls) %ls" msgstr "NIC %02i (%ls) %ls" From 0044cf3a5b4b951af3dd9d28b49139f0508510db Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 21 Nov 2024 23:39:46 +0500 Subject: [PATCH 613/624] Russian translation of generic ISA memory expansion card names --- src/qt/languages/ru-RU.po | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index 839393c0c..8476090d1 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -2126,3 +2126,9 @@ msgstr "30 Гц (JMP2 = 1)" msgid "60 Hz (JMP2 = 2)" msgstr "60 Гц (JMP2 = 2)" + +msgid "Generic PC/XT Memory Expansion" +msgstr "Стандартное расширение памяти PC/XT" + +msgid "Generic PC/AT Memory Expansion" +msgstr "Стандартное расширение памяти PC/AT" From a87a03c4d3978013fbd6082f85c5ab62b0ee7343 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 21 Nov 2024 22:30:27 +0500 Subject: [PATCH 614/624] Add a template file for new translations --- src/qt/languages/86box.pot | 2134 ++++++++++++++++++++++++++++++++++++ 1 file changed, 2134 insertions(+) create mode 100644 src/qt/languages/86box.pot diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot new file mode 100644 index 000000000..c427d1300 --- /dev/null +++ b/src/qt/languages/86box.pot @@ -0,0 +1,2134 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Language: \n" +"X-Source-Language: en_US\n" + +msgid "&Action" +msgstr "" + +msgid "&Keyboard requires capture" +msgstr "" + +msgid "&Right CTRL is left ALT" +msgstr "" + +msgid "&Hard Reset..." +msgstr "" + +msgid "&Ctrl+Alt+Del\tCtrl+F12" +msgstr "" + +msgid "Ctrl+Alt+&Esc" +msgstr "" + +msgid "&Pause" +msgstr "" + +msgid "E&xit..." +msgstr "" + +msgid "&View" +msgstr "" + +msgid "&Hide status bar" +msgstr "" + +msgid "Hide &toolbar" +msgstr "" + +msgid "&Resizeable window" +msgstr "" + +msgid "R&emember size && position" +msgstr "" + +msgid "Re&nderer" +msgstr "" + +msgid "&Qt (Software)" +msgstr "" + +msgid "Qt (&OpenGL)" +msgstr "" + +msgid "Open&GL (3.0 Core)" +msgstr "" + +msgid "&VNC" +msgstr "" + +msgid "Specify dimensions..." +msgstr "" + +msgid "F&orce 4:3 display ratio" +msgstr "" + +msgid "&Window scale factor" +msgstr "" + +msgid "&0.5x" +msgstr "" + +msgid "&1x" +msgstr "" + +msgid "1.&5x" +msgstr "" + +msgid "&2x" +msgstr "" + +msgid "&3x" +msgstr "" + +msgid "&4x" +msgstr "" + +msgid "&5x" +msgstr "" + +msgid "&6x" +msgstr "" + +msgid "&7x" +msgstr "" + +msgid "&8x" +msgstr "" + +msgid "Filter method" +msgstr "" + +msgid "&Nearest" +msgstr "" + +msgid "&Linear" +msgstr "" + +msgid "Hi&DPI scaling" +msgstr "" + +msgid "&Fullscreen\tCtrl+Alt+PgUp" +msgstr "" + +msgid "Fullscreen &stretch mode" +msgstr "" + +msgid "&Full screen stretch" +msgstr "" + +msgid "&4:3" +msgstr "" + +msgid "&Square pixels (Keep ratio)" +msgstr "" + +msgid "&Integer scale" +msgstr "" + +msgid "4:&3 Integer scale" +msgstr "" + +msgid "E&GA/(S)VGA settings" +msgstr "" + +msgid "&Inverted VGA monitor" +msgstr "" + +msgid "VGA screen &type" +msgstr "" + +msgid "RGB &Color" +msgstr "" + +msgid "&RGB Grayscale" +msgstr "" + +msgid "&Amber monitor" +msgstr "" + +msgid "&Green monitor" +msgstr "" + +msgid "&White monitor" +msgstr "" + +msgid "Grayscale &conversion type" +msgstr "" + +msgid "BT&601 (NTSC/PAL)" +msgstr "" + +msgid "BT&709 (HDTV)" +msgstr "" + +msgid "&Average" +msgstr "" + +msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" +msgstr "" + +msgid "Change contrast for &monochrome display" +msgstr "" + +msgid "&Media" +msgstr "" + +msgid "&Tools" +msgstr "" + +msgid "&Settings..." +msgstr "" + +msgid "&Update status bar icons" +msgstr "" + +msgid "Take s&creenshot\tCtrl+F11" +msgstr "" + +msgid "&Preferences..." +msgstr "" + +msgid "Enable &Discord integration" +msgstr "" + +msgid "Sound &gain..." +msgstr "" + +msgid "Begin trace\tCtrl+T" +msgstr "" + +msgid "End trace\tCtrl+T" +msgstr "" + +msgid "&Help" +msgstr "" + +msgid "&Documentation..." +msgstr "" + +msgid "&About 86Box..." +msgstr "" + +msgid "&New image..." +msgstr "" + +msgid "&Existing image..." +msgstr "" + +msgid "Existing image (&Write-protected)..." +msgstr "" + +msgid "&Record" +msgstr "" + +msgid "&Play" +msgstr "" + +msgid "&Rewind to the beginning" +msgstr "" + +msgid "&Fast forward to the end" +msgstr "" + +msgid "E&ject" +msgstr "" + +msgid "&Image..." +msgstr "" + +msgid "E&xport to 86F..." +msgstr "" + +msgid "&Mute" +msgstr "" + +msgid "E&mpty" +msgstr "" + +msgid "&Reload previous image" +msgstr "" + +msgid "&Folder..." +msgstr "" + +msgid "Target &framerate" +msgstr "" + +msgid "&Sync with video" +msgstr "" + +msgid "&25 fps" +msgstr "" + +msgid "&30 fps" +msgstr "" + +msgid "&50 fps" +msgstr "" + +msgid "&60 fps" +msgstr "" + +msgid "&75 fps" +msgstr "" + +msgid "&VSync" +msgstr "" + +msgid "&Select shader..." +msgstr "" + +msgid "&Remove shader" +msgstr "" + +msgid "Preferences" +msgstr "" + +msgid "Sound Gain" +msgstr "" + +msgid "New Image" +msgstr "" + +msgid "Settings" +msgstr "" + +msgid "Specify Main Window Dimensions" +msgstr "" + +msgid "OK" +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 "" + +msgid "File name:" +msgstr "" + +msgid "Disk size:" +msgstr "" + +msgid "RPM mode:" +msgstr "" + +msgid "Progress:" +msgstr "" + +msgid "Width:" +msgstr "" + +msgid "Height:" +msgstr "" + +msgid "Lock to this size" +msgstr "" + +msgid "Machine type:" +msgstr "" + +msgid "Machine:" +msgstr "" + +msgid "Configure" +msgstr "" + +msgid "CPU type:" +msgstr "" + +msgid "Speed:" +msgstr "" + +msgid "Frequency:" +msgstr "" + +msgid "FPU:" +msgstr "" + +msgid "Wait states:" +msgstr "" + +msgid "MB" +msgstr "" + +msgid "Memory:" +msgstr "" + +msgid "Time synchronization" +msgstr "" + +msgid "Disabled" +msgstr "" + +msgid "Enabled (local time)" +msgstr "" + +msgid "Enabled (UTC)" +msgstr "" + +msgid "Dynamic Recompiler" +msgstr "" + +msgid "Video:" +msgstr "" + +msgid "Video #2:" +msgstr "" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "" + +msgid "IBM 8514/A Graphics" +msgstr "" + +msgid "XGA Graphics" +msgstr "" + +msgid "Mouse:" +msgstr "" + +msgid "Joystick:" +msgstr "" + +msgid "Joystick 1..." +msgstr "" + +msgid "Joystick 2..." +msgstr "" + +msgid "Joystick 3..." +msgstr "" + +msgid "Joystick 4..." +msgstr "" + +msgid "Sound card #1:" +msgstr "" + +msgid "Sound card #2:" +msgstr "" + +msgid "Sound card #3:" +msgstr "" + +msgid "Sound card #4:" +msgstr "" + +msgid "MIDI Out Device:" +msgstr "" + +msgid "MIDI In Device:" +msgstr "" + +msgid "Standalone MPU-401" +msgstr "" + +msgid "Use FLOAT32 sound" +msgstr "" + +msgid "FM synth driver" +msgstr "" + +msgid "Nuked (more accurate)" +msgstr "" + +msgid "YMFM (faster)" +msgstr "" + +msgid "Network type:" +msgstr "" + +msgid "PCap device:" +msgstr "" + +msgid "Network adapter:" +msgstr "" + +msgid "COM1 Device:" +msgstr "" + +msgid "COM2 Device:" +msgstr "" + +msgid "COM3 Device:" +msgstr "" + +msgid "COM4 Device:" +msgstr "" + +msgid "LPT1 Device:" +msgstr "" + +msgid "LPT2 Device:" +msgstr "" + +msgid "LPT3 Device:" +msgstr "" + +msgid "LPT4 Device:" +msgstr "" + +msgid "Serial port 1" +msgstr "" + +msgid "Serial port 2" +msgstr "" + +msgid "Serial port 3" +msgstr "" + +msgid "Serial port 4" +msgstr "" + +msgid "Parallel port 1" +msgstr "" + +msgid "Parallel port 2" +msgstr "" + +msgid "Parallel port 3" +msgstr "" + +msgid "Parallel port 4" +msgstr "" + +msgid "HD Controller:" +msgstr "" + +msgid "FD Controller:" +msgstr "" + +msgid "Tertiary IDE Controller" +msgstr "" + +msgid "Quaternary IDE Controller" +msgstr "" + +msgid "SCSI" +msgstr "" + +msgid "Controller 1:" +msgstr "" + +msgid "Controller 2:" +msgstr "" + +msgid "Controller 3:" +msgstr "" + +msgid "Controller 4:" +msgstr "" + +msgid "Cassette" +msgstr "" + +msgid "Hard disks:" +msgstr "" + +msgid "&New..." +msgstr "" + +msgid "&Existing..." +msgstr "" + +msgid "&Remove" +msgstr "" + +msgid "Bus:" +msgstr "" + +msgid "Channel:" +msgstr "" + +msgid "ID:" +msgstr "" + +msgid "&Specify..." +msgstr "" + +msgid "Sectors:" +msgstr "" + +msgid "Heads:" +msgstr "" + +msgid "Cylinders:" +msgstr "" + +msgid "Size (MB):" +msgstr "" + +msgid "Type:" +msgstr "" + +msgid "Image Format:" +msgstr "" + +msgid "Block Size:" +msgstr "" + +msgid "Floppy drives:" +msgstr "" + +msgid "Turbo timings" +msgstr "" + +msgid "Check BPB" +msgstr "" + +msgid "CD-ROM drives:" +msgstr "" + +msgid "MO drives:" +msgstr "" + +msgid "ZIP drives:" +msgstr "" + +msgid "ZIP 250" +msgstr "" + +msgid "ISA RTC:" +msgstr "" + +msgid "ISA Memory Expansion" +msgstr "" + +msgid "Card 1:" +msgstr "" + +msgid "Card 2:" +msgstr "" + +msgid "Card 3:" +msgstr "" + +msgid "Card 4:" +msgstr "" + +msgid "ISABugger device" +msgstr "" + +msgid "POST card" +msgstr "" + +msgid "86Box" +msgstr "" + +msgid "Error" +msgstr "" + +msgid "Fatal error" +msgstr "" + +msgid " - PAUSED" +msgstr "" + +msgid "Press Ctrl+Alt+PgDn to return to windowed mode." +msgstr "" + +msgid "Speed" +msgstr "" + +msgid "ZIP %03i %i (%s): %ls" +msgstr "" + +msgid "ZIP images" +msgstr "" + +msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." +msgstr "" + +msgid "(empty)" +msgstr "" + +msgid "All files" +msgstr "" + +msgid "Turbo" +msgstr "" + +msgid "On" +msgstr "" + +msgid "Off" +msgstr "" + +msgid "All images" +msgstr "" + +msgid "Basic sector images" +msgstr "" + +msgid "Surface images" +msgstr "" + +msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." +msgstr "" + +msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "" + +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "" + +msgid "Machine" +msgstr "" + +msgid "Display" +msgstr "" + +msgid "Input devices" +msgstr "" + +msgid "Sound" +msgstr "" + +msgid "Network" +msgstr "" + +msgid "Ports (COM & LPT)" +msgstr "" + +msgid "Storage controllers" +msgstr "" + +msgid "Hard disks" +msgstr "" + +msgid "Floppy & CD-ROM drives" +msgstr "" + +msgid "Other removable devices" +msgstr "" + +msgid "Other peripherals" +msgstr "" + +msgid "Click to capture mouse" +msgstr "" + +msgid "Press %1 to release mouse" +msgstr "" + +msgid "Press %1 or middle button to release mouse" +msgstr "" + +msgid "Bus" +msgstr "" + +msgid "File" +msgstr "" + +msgid "C" +msgstr "" + +msgid "H" +msgstr "" + +msgid "S" +msgstr "" + +msgid "KB" +msgstr "" + +msgid "Could not initialize the video renderer." +msgstr "" + +msgid "Default" +msgstr "" + +msgid "%i estat(s) d'espera" +msgstr "" + +msgid "Type" +msgstr "" + +msgid "No PCap devices found" +msgstr "" + +msgid "Invalid PCap device" +msgstr "" + +msgid "2-axis, 2-button joystick(s)" +msgstr "" + +msgid "2-axis, 4-button joystick" +msgstr "" + +msgid "2-axis, 6-button joystick" +msgstr "" + +msgid "2-axis, 8-button joystick" +msgstr "" + +msgid "3-axis, 2-button joystick" +msgstr "" + +msgid "3-axis, 4-button joystick" +msgstr "" + +msgid "4-axis, 4-button joystick" +msgstr "" + +msgid "CH Flightstick Pro" +msgstr "" + +msgid "Microsoft SideWinder Pad" +msgstr "" + +msgid "Thrustmaster Flight Control System" +msgstr "" + +msgid "None" +msgstr "" + +msgid "%u MB (CHS: %i, %i, %i)" +msgstr "" + +msgid "Floppy %i (%s): %ls" +msgstr "" + +msgid "Advanced sector images" +msgstr "" + +msgid "Flux images" +msgstr "" + +msgid "Are you sure you want to hard reset the emulated machine?" +msgstr "" + +msgid "Are you sure you want to exit 86Box?" +msgstr "" + +msgid "Unable to initialize Ghostscript" +msgstr "" + +msgid "Unable to initialize GhostPCL" +msgstr "" + +msgid "MO %i (%ls): %ls" +msgstr "" + +msgid "MO images" +msgstr "" + +msgid "Welcome to 86Box!" +msgstr "" + +msgid "Internal device" +msgstr "" + +msgid "Exit" +msgstr "" + +msgid "No ROMs found" +msgstr "" + +msgid "Do you want to save the settings?" +msgstr "" + +msgid "This will hard reset the emulated machine." +msgstr "" + +msgid "Save" +msgstr "" + +msgid "About 86Box" +msgstr "" + +msgid "86Box v" +msgstr "" + +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 "" + +msgid "Hardware not available" +msgstr "" + +msgid "Make sure %1 is installed and that you are on a %1-compatible network connection." +msgstr "" + +msgid "Invalid configuration" +msgstr "" + +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 "" + +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 "" + +msgid "Entering fullscreen mode" +msgstr "" + +msgid "Don't show this message again" +msgstr "" + +msgid "Don't exit" +msgstr "" + +msgid "Reset" +msgstr "" + +msgid "Don't reset" +msgstr "" + +msgid "CD-ROM images" +msgstr "" + +msgid "%1 Device Configuration" +msgstr "" + +msgid "Monitor in sleep mode" +msgstr "" + +msgid "OpenGL Shaders" +msgstr "" + +msgid "OpenGL options" +msgstr "" + +msgid "You are loading an unsupported configuration" +msgstr "" + +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 "" + +msgid "Continue" +msgstr "" + +msgid "Cassette: %s" +msgstr "" + +msgid "Cassette images" +msgstr "" + +msgid "Cartridge %i: %ls" +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 "" + +msgid "Pause execution" +msgstr "" + +msgid "Press Ctrl+Alt+Del" +msgstr "" + +msgid "Press Ctrl+Alt+Esc" +msgstr "" + +msgid "Hard reset" +msgstr "" + +msgid "ACPI shutdown" +msgstr "" + +msgid "Hard disk (%1)" +msgstr "" + +msgid "MFM/RLL or ESDI CD-ROM drives never existed" +msgstr "" + +msgid "Custom..." +msgstr "" + +msgid "Custom (large)..." +msgstr "" + +msgid "Add New Hard Disk" +msgstr "" + +msgid "Add Existing Hard Disk" +msgstr "" + +msgid "HDI disk images cannot be larger than 4 GB." +msgstr "" + +msgid "Disk images cannot be larger than 127 GB." +msgstr "" + +msgid "Hard disk images" +msgstr "" + +msgid "Unable to read file" +msgstr "" + +msgid "Unable to write file" +msgstr "" + +msgid "HDI or HDX images with a sector size other than 512 are not supported." +msgstr "" + +msgid "Disk image file already exists" +msgstr "" + +msgid "Please specify a valid file name." +msgstr "" + +msgid "Disk image created" +msgstr "" + +msgid "Make sure the file exists and is readable." +msgstr "" + +msgid "Make sure the file is being saved to a writable directory." +msgstr "" + +msgid "Disk image too large" +msgstr "" + +msgid "Remember to partition and format the newly-created drive." +msgstr "" + +msgid "The selected file will be overwritten. Are you sure you want to use it?" +msgstr "" + +msgid "Unsupported disk image" +msgstr "" + +msgid "Overwrite" +msgstr "" + +msgid "Don't overwrite" +msgstr "" + +msgid "Raw image" +msgstr "" + +msgid "HDI image" +msgstr "" + +msgid "HDX image" +msgstr "" + +msgid "Fixed-size VHD" +msgstr "" + +msgid "Dynamic-size VHD" +msgstr "" + +msgid "Differencing VHD" +msgstr "" + +msgid "(N/A)" +msgstr "" + +msgid "Raw image (.img)" +msgstr "" + +msgid "HDI image (.hdi)" +msgstr "" + +msgid "HDX image (.hdx)" +msgstr "" + +msgid "Fixed-size VHD (.vhd)" +msgstr "" + +msgid "Dynamic-size VHD (.vhd)" +msgstr "" + +msgid "Differencing VHD (.vhd)" +msgstr "" + +msgid "Large blocks (2 MB)" +msgstr "" + +msgid "Small blocks (512 KB)" +msgstr "" + +msgid "VHD files" +msgstr "" + +msgid "Select the parent VHD" +msgstr "" + +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 "" + +msgid "Parent and child disk timestamps do not match" +msgstr "" + +msgid "Could not fix VHD timestamp." +msgstr "" + +msgid "MFM/RLL" +msgstr "" + +msgid "XTA" +msgstr "" + +msgid "ESDI" +msgstr "" + +msgid "IDE" +msgstr "" + +msgid "ATAPI" +msgstr "" + +msgid "CD-ROM %i (%s): %s" +msgstr "" + +msgid "160 KB" +msgstr "" + +msgid "180 KB" +msgstr "" + +msgid "320 KB" +msgstr "" + +msgid "360 KB" +msgstr "" + +msgid "640 KB" +msgstr "" + +msgid "720 KB" +msgstr "" + +msgid "1.2 MB" +msgstr "" + +msgid "1.25 MB" +msgstr "" + +msgid "1.44 MB" +msgstr "" + +msgid "DMF (cluster 1024)" +msgstr "" + +msgid "DMF (cluster 2048)" +msgstr "" + +msgid "2.88 MB" +msgstr "" + +msgid "ZIP 100" +msgstr "" + +msgid "3.5\" 128 MB (ISO 10090)" +msgstr "" + +msgid "3.5\" 230 MB (ISO 13963)" +msgstr "" + +msgid "3.5\" 540 MB (ISO 15498)" +msgstr "" + +msgid "3.5\" 640 MB (ISO 15498)" +msgstr "" + +msgid "3.5\" 1.3 GB (GigaMO)" +msgstr "" + +msgid "3.5\" 2.3 GB (GigaMO 2)" +msgstr "" + +msgid "5.25\" 600 MB" +msgstr "" + +msgid "5.25\" 650 MB" +msgstr "" + +msgid "5.25\" 1 GB" +msgstr "" + +msgid "5.25\" 1.3 GB" +msgstr "" + +msgid "Perfect RPM" +msgstr "" + +msgid "1% below perfect RPM" +msgstr "" + +msgid "1.5% below perfect RPM" +msgstr "" + +msgid "2% below perfect RPM" +msgstr "" + +msgid "(System Default)" +msgstr "" + +msgid "Failed to initialize network driver" +msgstr "" + +msgid "The network configuration will be switched to the null driver" +msgstr "" + +msgid "Mouse sensitivity:" +msgstr "" + +msgid "Select media images from program working directory" +msgstr "" + +msgid "PIT mode:" +msgstr "" + +msgid "Auto" +msgstr "" + +msgid "Slow" +msgstr "" + +msgid "Fast" +msgstr "" + +msgid "&Auto-pause on focus loss" +msgstr "" + +msgid "WinBox is no longer supported" +msgstr "" + +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 "" + +msgid "Generate" +msgstr "" + +msgid "Joystick configuration" +msgstr "" + +msgid "Device" +msgstr "" + +msgid "%1 (X axis)" +msgstr "" + +msgid "%1 (Y axis)" +msgstr "" + +msgid "MCA devices" +msgstr "" + +msgid "List of MCA devices:" +msgstr "" + +msgid "Tablet tool" +msgstr "" + +msgid "Qt (OpenGL &ES)" +msgstr "" + +msgid "About Qt" +msgstr "" + +msgid "MCA devices..." +msgstr "" + +msgid "Show non-primary monitors" +msgstr "" + +msgid "Open screenshots folder..." +msgstr "" + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "" + +msgid "Cursor/Puck" +msgstr "" + +msgid "Pen" +msgstr "" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "" + +msgid "&Connected" +msgstr "" + +msgid "Clear image history" +msgstr "" + +msgid "Create..." +msgstr "" + +msgid "previous image" +msgstr "" + +msgid "Host CD/DVD Drive (%1)" +msgstr "" + +msgid "Unknown Bus" +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" +msgstr "" + +msgid "Render behavior" +msgstr "" + +msgid "Use target framerate:" +msgstr "" + +msgid " fps" +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 "" + +msgid "Shaders" +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 "" + +msgid "Couldn't switch to OpenGL context." +msgstr "" + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "" + +msgid "OpenGL initialization failed. Error %1." +msgstr "" + +msgid "Error initializing OpenGL" +msgstr "" + +msgid "Falling back to software rendering.\n" +msgstr "" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "" + +msgid "This machine might have been moved or copied." +msgstr "" + +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 "" + +msgid "I Moved It" +msgstr "" + +msgid "I Copied It" +msgstr "" + +msgid "86Box Monitor #" +msgstr "" + +msgid "No MCA devices." +msgstr "" + +msgid "MiB" +msgstr "" + +msgid "Network Card #1" +msgstr "" + +msgid "Network Card #2" +msgstr "" + +msgid "Network Card #3" +msgstr "" + +msgid "Network Card #4" +msgstr "" + +msgid "Mode" +msgstr "" + +msgid "Interface" +msgstr "" + +msgid "Adapter" +msgstr "" + +msgid "VDE Socket" +msgstr "" + +msgid "86Box Unit Tester" +msgstr "" + +msgid "Novell NetWare 2.x Key Card" +msgstr "" + +msgid "Serial port passthrough 1" +msgstr "" + +msgid "Serial port passthrough 2" +msgstr "" + +msgid "Serial port passthrough 3" +msgstr "" + +msgid "Serial port passthrough 4" +msgstr "" + +msgid "Vision Systems LBA Enhancer" +msgstr "" + +msgid "Renderer options..." +msgstr "" + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "" + +msgid "Mouse Systems Serial Mouse" +msgstr "" + +msgid "Microsoft Serial Mouse" +msgstr "" + +msgid "Logitech Serial Mouse" +msgstr "" + +msgid "PS/2 Mouse" +msgstr "" + +msgid "3M MicroTouch (Serial)" +msgstr "" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "" + +msgid "Roland MT-32 Emulation" +msgstr "" + +msgid "Roland MT-32 (New) Emulation" +msgstr "" + +msgid "Roland CM-32L Emulation" +msgstr "" + +msgid "Roland CM-32LN Emulation" +msgstr "" + +msgid "OPL4-ML Daughterboard" +msgstr "" + +msgid "System MIDI" +msgstr "" + +msgid "MIDI Input Device" +msgstr "" + +msgid "BIOS Address" +msgstr "" + +msgid "Enable BIOS extension ROM Writes" +msgstr "" + +msgid "Address" +msgstr "" + +msgid "IRQ" +msgstr "" + +msgid "BIOS Revision" +msgstr "" + +msgid "Translate 26 -> 17" +msgstr "" + +msgid "Language" +msgstr "" + +msgid "Enable backlight" +msgstr "" + +msgid "Invert colors" +msgstr "" + +msgid "BIOS size" +msgstr "" + +msgid "Map C0000-C7FFF as UMB" +msgstr "" + +msgid "Map C8000-CFFFF as UMB" +msgstr "" + +msgid "Map D0000-D7FFF as UMB" +msgstr "" + +msgid "Map D8000-DFFFF as UMB" +msgstr "" + +msgid "Map E0000-E7FFF as UMB" +msgstr "" + +msgid "Map E8000-EFFFF as UMB" +msgstr "" + +msgid "JS9 Jumper (JIM)" +msgstr "" + +msgid "MIDI Output Device" +msgstr "" + +msgid "MIDI Real time" +msgstr "" + +msgid "MIDI Thru" +msgstr "" + +msgid "MIDI Clockout" +msgstr "" + +msgid "SoundFont" +msgstr "" + +msgid "Output Gain" +msgstr "" + +msgid "Chorus" +msgstr "" + +msgid "Chorus Voices" +msgstr "" + +msgid "Chorus Level" +msgstr "" + +msgid "Chorus Speed" +msgstr "" + +msgid "Chorus Depth" +msgstr "" + +msgid "Chorus Waveform" +msgstr "" + +msgid "Reverb" +msgstr "" + +msgid "Reverb Room Size" +msgstr "" + +msgid "Reverb Damping" +msgstr "" + +msgid "Reverb Width" +msgstr "" + +msgid "Reverb Level" +msgstr "" + +msgid "Interpolation Method" +msgstr "" + +msgid "Reverb Output Gain" +msgstr "" + +msgid "Reversed stereo" +msgstr "" + +msgid "Nice ramp" +msgstr "" + +msgid "Hz" +msgstr "" + +msgid "Buttons" +msgstr "" + +msgid "Serial Port" +msgstr "" + +msgid "RTS toggle" +msgstr "" + +msgid "Revision" +msgstr "" + +msgid "Controller" +msgstr "" + +msgid "Show Crosshair" +msgstr "" + +msgid "DMA" +msgstr "" + +msgid "MAC Address" +msgstr "" + +msgid "MAC Address OUI" +msgstr "" + +msgid "Enable BIOS" +msgstr "" + +msgid "Baud Rate" +msgstr "" + +msgid "TCP/IP listening port" +msgstr "" + +msgid "Phonebook File" +msgstr "" + +msgid "Telnet emulation" +msgstr "" + +msgid "RAM Address" +msgstr "" + +msgid "RAM size" +msgstr "" + +msgid "Initial RAM size" +msgstr "" + +msgid "Serial Number" +msgstr "" + +msgid "Host ID" +msgstr "" + +msgid "FDC Address" +msgstr "" + +msgid "MPU-401 Address" +msgstr "" + +msgid "MPU-401 IRQ" +msgstr "" + +msgid "Receive MIDI input" +msgstr "" + +msgid "Low DMA" +msgstr "" + +msgid "Enable Game port" +msgstr "" + +msgid "Surround module" +msgstr "" + +msgid "CODEC" +msgstr "" + +msgid "Raise CODEC interrupt on CODEC setup (needed by some drivers)" +msgstr "" + +msgid "SB Address" +msgstr "" + +msgid "WSS IRQ" +msgstr "" + +msgid "WSS DMA" +msgstr "" + +msgid "Enable OPL" +msgstr "" + +msgid "Receive MIDI input (MPU-401)" +msgstr "" + +msgid "SB low DMA" +msgstr "" + +msgid "6CH variant (6-channel)" +msgstr "" + +msgid "Enable CMS" +msgstr "" + +msgid "Mixer" +msgstr "" + +msgid "High DMA" +msgstr "" + +msgid "Control PC speaker" +msgstr "" + +msgid "Memory size" +msgstr "" + +msgid "EMU8000 Address" +msgstr "" + +msgid "IDE Controller" +msgstr "" + +msgid "Codec" +msgstr "" + +msgid "GUS type" +msgstr "" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "" + +msgid "Display type" +msgstr "" + +msgid "Composite type" +msgstr "" + +msgid "RGB type" +msgstr "" + +msgid "Line doubling type" +msgstr "" + +msgid "Snow emulation" +msgstr "" + +msgid "Monitor type" +msgstr "" + +msgid "Character set" +msgstr "" + +msgid "XGA type" +msgstr "" + +msgid "Instance" +msgstr "" + +msgid "MMIO Address" +msgstr "" + +msgid "RAMDAC type" +msgstr "" + +msgid "Blend" +msgstr "" + +msgid "Bilinear filtering" +msgstr "" + +msgid "Dithering" +msgstr "" + +msgid "Enable NMI for CGA emulation" +msgstr "" + +msgid "Voodoo type" +msgstr "" + +msgid "Framebuffer memory size" +msgstr "" + +msgid "Texture memory size" +msgstr "" + +msgid "Dither subtraction" +msgstr "" + +msgid "Screen Filter" +msgstr "" + +msgid "Render threads" +msgstr "" + +msgid "SLI" +msgstr "" + +msgid "Start Address" +msgstr "" + +msgid "Contiguous Size" +msgstr "" + +msgid "I/O Width" +msgstr "" + +msgid "Transfer Speed" +msgstr "" + +msgid "EMS mode" +msgstr "" + +msgid "Address for > 2 MB" +msgstr "" + +msgid "Frame Address" +msgstr "" + +msgid "USA" +msgstr "" + +msgid "Danish" +msgstr "" + +msgid "Always at selected speed" +msgstr "" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "" + +msgid "64 kB starting from F0000" +msgstr "" + +msgid "128 kB starting from E0000 (address MSB inverted, last 64KB first)" +msgstr "" + +msgid "Sine" +msgstr "" + +msgid "Triangle" +msgstr "" + +msgid "Linear" +msgstr "" + +msgid "4th Order" +msgstr "" + +msgid "7th Order" +msgstr "" + +msgid "Non-timed (original)" +msgstr "" + +msgid "45 Hz (JMP2 not populated)" +msgstr "" + +msgid "Two" +msgstr "" + +msgid "Three" +msgstr "" + +msgid "Wheel" +msgstr "" + +msgid "Five + Wheel" +msgstr "" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "" + +msgid "Q1 - SMT3(R) Serial" +msgstr "" + +msgid "8 KB" +msgstr "" + +msgid "32 KB" +msgstr "" + +msgid "16 KB" +msgstr "" + +msgid "64 KB" +msgstr "" + +msgid "Disable BIOS" +msgstr "" + +msgid "512 KB" +msgstr "" + +msgid "2 MB" +msgstr "" + +msgid "8 MB" +msgstr "" + +msgid "28 MB" +msgstr "" + +msgid "1 MB" +msgstr "" + +msgid "4 MB" +msgstr "" + +msgid "12 MB" +msgstr "" + +msgid "16 MB" +msgstr "" + +msgid "20 MB" +msgstr "" + +msgid "24 MB" +msgstr "" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "" + +msgid "Classic" +msgstr "" + +msgid "256 KB" +msgstr "" + +msgid "Composite" +msgstr "" + +msgid "Old" +msgstr "" + +msgid "New" +msgstr "" + +msgid "Color (generic)" +msgstr "" + +msgid "Green Monochrome" +msgstr "" + +msgid "Amber Monochrome" +msgstr "" + +msgid "Gray Monochrome" +msgstr "" + +msgid "Color (no brown)" +msgstr "" + +msgid "Color (IBM 5153)" +msgstr "" + +msgid "Simple doubling" +msgstr "" + +msgid "sRGB interpolation" +msgstr "" + +msgid "Linear interpolation" +msgstr "" + +msgid "128 KB" +msgstr "" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "" + +msgid "Color 40x25 (5153/CGA)" +msgstr "" + +msgid "Color 80x25 (5153/CGA)" +msgstr "" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "" + +msgid "Green" +msgstr "" + +msgid "Amber" +msgstr "" + +msgid "Gray" +msgstr "" + +msgid "Color" +msgstr "" + +msgid "U.S. English" +msgstr "" + +msgid "Scandinavian" +msgstr "" + +msgid "Other languages" +msgstr "" + +msgid "Bochs latest" +msgstr "" + +msgid "Mono Non-Interlaced" +msgstr "" + +msgid "Color Interlaced" +msgstr "" + +msgid "Color Non-Interlaced" +msgstr "" + +msgid "3Dfx Voodoo Graphics" +msgstr "" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "" + +msgid "8-bit" +msgstr "" + +msgid "16-bit" +msgstr "" + +msgid "Standard (150ns)" +msgstr "" + +msgid "High-Speed (120ns)" +msgstr "" + +msgid "Enabled" +msgstr "" + +msgid "Standard" +msgstr "" + +msgid "High-Speed" +msgstr "" + +msgid "Stereo LPT DAC" +msgstr "" + +msgid "Generic Text Printer" +msgstr "" + +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "" + +msgid "Generic PostScript Printer" +msgstr "" + +msgid "Generic PCL5e Printer" +msgstr "" + +msgid "Parallel Line Internet Protocol" +msgstr "" + +msgid "Protection Dongle for Savage Quest" +msgstr "" + +msgid "Serial Passthrough Device" +msgstr "" + +msgid "Passthrough Mode" +msgstr "" + +msgid "Host Serial Device" +msgstr "" + +msgid "Name of pipe" +msgstr "" + +msgid "Data bits" +msgstr "" + +msgid "Stop bits" +msgstr "" + +msgid "Baud Rate of Passthrough" +msgstr "" + +msgid "Named Pipe (Server)" +msgstr "" + +msgid "Host Serial Passthrough" +msgstr "" + +msgid "Eject %s" +msgstr "" + +msgid "&Unmute" +msgstr "" + +msgid "Softfloat FPU" +msgstr "" + +msgid "High performance impact" +msgstr "" + +msgid "RAM Disk (max. speed)" +msgstr "" + +msgid "IBM 8514/A clone (ISA)" +msgstr "" + +msgid "Vendor" +msgstr "" + +msgid "30 Hz (JMP2 = 1)" +msgstr "" + +msgid "60 Hz (JMP2 = 2)" +msgstr "" + +msgid "Generic PC/XT Memory Expansion" +msgstr "" + +msgid "Generic PC/AT Memory Expansion" +msgstr "" From e1f20063c510ccb84614fbe36d1a93c4fd0e65bf Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 21 Nov 2024 22:31:51 +0500 Subject: [PATCH 615/624] workflows: fully drop 32-bit Windows MSYS2 builds With CLANG32 on its way out and qt5-static for MINGW32 being dropped, there's no point in keeping them --- .github/workflows/cmake_windows_msys2.yml | 6 ------ .github/workflows/codeql_windows_msys2.yml | 6 ------ 2 files changed, 12 deletions(-) diff --git a/.github/workflows/cmake_windows_msys2.yml b/.github/workflows/cmake_windows_msys2.yml index 91442eafd..7620351b3 100644 --- a/.github/workflows/cmake_windows_msys2.yml +++ b/.github/workflows/cmake_windows_msys2.yml @@ -67,15 +67,9 @@ jobs: environment: # - msystem: MSYS # toolchain: ./cmake/flags-gcc-x86_64.cmake -# - msystem: MINGW32 -# prefix: mingw-w64-i686 -# toolchain: ./cmake/flags-gcc-i686.cmake - msystem: MINGW64 prefix: mingw-w64-x86_64 toolchain: ./cmake/flags-gcc-x86_64.cmake -# - msystem: CLANG32 -# prefix: mingw-w64-clang-i686 -# toolchain: ./cmake/llvm-win32-i686.cmake # - msystem: CLANG64 # prefix: mingw-w64-clang-x86_64 # toolchain: ./cmake/llvm-win32-x86_64.cmake diff --git a/.github/workflows/codeql_windows_msys2.yml b/.github/workflows/codeql_windows_msys2.yml index 652a1986a..67de8ec8b 100644 --- a/.github/workflows/codeql_windows_msys2.yml +++ b/.github/workflows/codeql_windows_msys2.yml @@ -72,15 +72,9 @@ jobs: environment: # - msystem: MSYS # toolchain: ./cmake/flags-gcc-x86_64.cmake - - msystem: MINGW32 - prefix: mingw-w64-i686 - toolchain: ./cmake/flags-gcc-i686.cmake - msystem: MINGW64 prefix: mingw-w64-x86_64 toolchain: ./cmake/flags-gcc-x86_64.cmake -# - msystem: CLANG32 -# prefix: mingw-w64-clang-i686 -# toolchain: ./cmake/llvm-win32-i686.cmake # - msystem: CLANG64 # prefix: mingw-w64-clang-x86_64 # toolchain: ./cmake/llvm-win32-x86_64.cmake From e2beb3eed1c96d629006b27e7565085eb15fffa5 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Thu, 21 Nov 2024 22:40:47 +0500 Subject: [PATCH 616/624] workflows: build with VDE support on macOS and Linux --- .github/workflows/cmake_linux.yml | 1 + .github/workflows/cmake_macos.yml | 1 + .github/workflows/codeql_linux.yml | 1 + .github/workflows/codeql_macos.yml | 1 + 4 files changed, 4 insertions(+) diff --git a/.github/workflows/cmake_linux.yml b/.github/workflows/cmake_linux.yml index 859a38899..a8945172b 100644 --- a/.github/workflows/cmake_linux.yml +++ b/.github/workflows/cmake_linux.yml @@ -81,6 +81,7 @@ jobs: libopenal-dev libslirp-dev libfluidsynth-dev + libvdeplug-dev ${{ matrix.ui.packages }} - name: Checkout repository diff --git a/.github/workflows/cmake_macos.yml b/.github/workflows/cmake_macos.yml index f482c7b69..d02ec595b 100644 --- a/.github/workflows/cmake_macos.yml +++ b/.github/workflows/cmake_macos.yml @@ -81,6 +81,7 @@ jobs: openal-soft fluidsynth libslirp + vde ${{ matrix.ui.packages }} - name: Checkout repository diff --git a/.github/workflows/codeql_linux.yml b/.github/workflows/codeql_linux.yml index 396ccd4fe..412a2045c 100644 --- a/.github/workflows/codeql_linux.yml +++ b/.github/workflows/codeql_linux.yml @@ -84,6 +84,7 @@ jobs: libopenal-dev libslirp-dev libfluidsynth-dev + libvdeplug-dev ${{ matrix.ui.packages }} - name: Checkout repository diff --git a/.github/workflows/codeql_macos.yml b/.github/workflows/codeql_macos.yml index 6947ab6ef..5ce12548b 100644 --- a/.github/workflows/codeql_macos.yml +++ b/.github/workflows/codeql_macos.yml @@ -75,6 +75,7 @@ jobs: openal-soft fluidsynth libslirp + vde ${{ matrix.ui.packages }} - name: Checkout repository From eabbc2f46dcd8e430b4aff9326bc316d47bd6675 Mon Sep 17 00:00:00 2001 From: sharkbyte16 <87238812+sharkbyte16@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:05:31 +0100 Subject: [PATCH 617/624] Added Dutch translations --- src/qt/languages/nl-NL.po | 2134 +++++++++++++++++++++++++++++++++ src/qt/qt_platform.cpp | 1 + src/qt/qt_translations.qrc.in | 1 + 3 files changed, 2136 insertions(+) create mode 100644 src/qt/languages/nl-NL.po diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po new file mode 100644 index 000000000..b54bc1cb0 --- /dev/null +++ b/src/qt/languages/nl-NL.po @@ -0,0 +1,2134 @@ +msgid "" +msgstr "" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Language: nl_NL\n" +"X-Source-Language: en_US\n" + +msgid "&Action" +msgstr "&Actie" + +msgid "&Keyboard requires capture" +msgstr "&Keyboard vereist vastleggen" + +msgid "&Right CTRL is left ALT" +msgstr "&Rechtse CTRL is linkse ALT" + +msgid "&Hard Reset..." +msgstr "&Harde Reset..." + +msgid "&Ctrl+Alt+Del\tCtrl+F12" +msgstr "&Ctrl+Alt+Del\tCtrl+F12" + +msgid "Ctrl+Alt+&Esc" +msgstr "Ctrl+Alt+&Esc" + +msgid "&Pause" +msgstr "&Pauze" + +msgid "E&xit..." +msgstr "&Afsluiten..." + +msgid "&View" +msgstr "&Beeld" + +msgid "&Hide status bar" +msgstr "&Statusbalk verbergen" + +msgid "Hide &toolbar" +msgstr "Verberg &toolbar" + +msgid "&Resizeable window" +msgstr "&Venster met aanpasbare grootte" + +msgid "R&emember size && position" +msgstr "&Onthoud grootte && positie" + +msgid "Re&nderer" +msgstr "Re&nderer" + +msgid "&Qt (Software)" +msgstr "&Qt (software)" + +msgid "Qt (&OpenGL)" +msgstr "Qt (&OpenGL)" + +msgid "Open&GL (3.0 Core)" +msgstr "Open&GL (3.0 Core)" + +msgid "&VNC" +msgstr "&VNC" + +msgid "Specify dimensions..." +msgstr "Afmetingen opgeven..." + +msgid "F&orce 4:3 display ratio" +msgstr "F&orceer 4:3 beeldverhouding" + +msgid "&Window scale factor" +msgstr "&Venster schaalfactor" + +msgid "&0.5x" +msgstr "&0,5x" + +msgid "&1x" +msgstr "&1x" + +msgid "1.&5x" +msgstr "1,&5x" + +msgid "&2x" +msgstr "&2x" + +msgid "&3x" +msgstr "&3x" + +msgid "&4x" +msgstr "&4x" + +msgid "&5x" +msgstr "&5x" + +msgid "&6x" +msgstr "&6x" + +msgid "&7x" +msgstr "&7x" + +msgid "&8x" +msgstr "&8x" + +msgid "Filter method" +msgstr "Filtermethode" + +msgid "&Nearest" +msgstr "&Dichtsbijzijnde" + +msgid "&Linear" +msgstr "&Lineair" + +msgid "Hi&DPI scaling" +msgstr "Hi&DPI-schaling" + +msgid "&Fullscreen\tCtrl+Alt+PgUp" +msgstr "&Fullscreen\tCtrl+Alt+PgUp" + +msgid "Fullscreen &stretch mode" +msgstr "Volledig scherm &uitrekmodus" + +msgid "&Full screen stretch" +msgstr "&Volledig scherm uitrekken" + +msgid "&4:3" +msgstr "&4:3" + +msgid "&Square pixels (Keep ratio)" +msgstr "&Vierkante pixels (behoud verhouding)" + +msgid "&Integer scale" +msgstr "&Integerschaal" + +msgid "4:&3 Integer scale" +msgstr "4:&3 integerschaal" + +msgid "E&GA/(S)VGA settings" +msgstr "E&GA/(S)VGA-instellingen" + +msgid "&Inverted VGA monitor" +msgstr "Ge&ïnverteerde VGA-monitor" + +msgid "VGA screen &type" +msgstr "VGA-scherm &type" + +msgid "RGB &Color" +msgstr "RGB &Kleur" + +msgid "&RGB Grayscale" +msgstr "&RGB grijstinten" + +msgid "&Amber monitor" +msgstr "&Amber monitor" + +msgid "&Green monitor" +msgstr "&Groene monitor" + +msgid "&White monitor" +msgstr "&Witte monitor" + +msgid "Grayscale &conversion type" +msgstr "Grijstinten &conversietype" + +msgid "BT&601 (NTSC/PAL)" +msgstr "BT&601 (NTSC/PAL)" + +msgid "BT&709 (HDTV)" +msgstr "BT&709 (HDTV)" + +msgid "&Average" +msgstr "&Gemiddelde" + +msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" +msgstr "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" + +msgid "Change contrast for &monochrome display" +msgstr "Contrast wijzigen voor &monochroom beeldscherm" + +msgid "&Media" +msgstr "&Media" + +msgid "&Tools" +msgstr "&Tools" + +msgid "&Settings..." +msgstr "&Instellingen..." + +msgid "&Update status bar icons" +msgstr "&Statusbalkpictogrammen bijwerken" + +msgid "Take s&creenshot\tCtrl+F11" +msgstr "Maak een schermafbeelding\tCtrl+F11" + +msgid "&Preferences..." +msgstr "&Voorkeuren..." + +msgid "Enable &Discord integration" +msgstr "&Discord integratie inschakelen" + +msgid "Sound &gain..." +msgstr "&Geluidsversterking..." + +msgid "Begin trace\tCtrl+T" +msgstr "Begin traceren\tCtrl+T" + +msgid "End trace\tCtrl+T" +msgstr "Traceren beëindigen\tCtrl+T" + +msgid "&Help" +msgstr "&Help" + +msgid "&Documentation..." +msgstr "&Documentatie..." + +msgid "&About 86Box..." +msgstr "&Over 86Box..." + +msgid "&New image..." +msgstr "&Nieuw image..." + +msgid "&Existing image..." +msgstr "&Bestaande image..." + +msgid "Existing image (&Write-protected)..." +msgstr "Bestaande image (&Schrijfbeveiligd)..." + +msgid "&Record" +msgstr "&Opnemen" + +msgid "&Play" +msgstr "&Play" + +msgid "&Rewind to the beginning" +msgstr "&Terugspoelen naar het begin" + +msgid "&Fast forward to the end" +msgstr "&Snel vooruit naar het einde" + +msgid "E&ject" +msgstr "E&ject" + +msgid "&Image..." +msgstr "&Image..." + +msgid "E&xport to 86F..." +msgstr "E&xporteer naar 86F..." + +msgid "&Mute" +msgstr "&Mute" + +msgid "E&mpty" +msgstr "E&mpty" + +msgid "&Reload previous image" +msgstr "&Herlaad vorige image" + +msgid "&Folder..." +msgstr "&Map..." + +msgid "Target &framerate" +msgstr "Doel &framerate" + +msgid "&Sync with video" +msgstr "&Synchroniseer met video" + +msgid "&25 fps" +msgstr "&25 fps" + +msgid "&30 fps" +msgstr "&30 fps" + +msgid "&50 fps" +msgstr "&50 fps" + +msgid "&60 fps" +msgstr "&60 fps" + +msgid "&75 fps" +msgstr "&75 fps" + +msgid "&VSync" +msgstr "&VSync" + +msgid "&Select shader..." +msgstr "&Selecteer shader..." + +msgid "&Remove shader" +msgstr "&Remove shader" + +msgid "Preferences" +msgstr "Voorkeuren" + +msgid "Sound Gain" +msgstr "Geluidsversterking" + +msgid "New Image" +msgstr "Nieuw image" + +msgid "Settings" +msgstr "Instellingen" + +msgid "Specify Main Window Dimensions" +msgstr "Afmetingen hoofdvenster opgeven" + +msgid "OK" +msgstr "OK" + +msgid "Cancel" +msgstr "Annuleren" + +msgid "Save these settings as &global defaults" +msgstr "Sla deze instellingen op als &globale standaardinstellingen" + +msgid "&Default" +msgstr "&Standaard" + +msgid "Language:" +msgstr "Taal:" + +msgid "Icon set:" +msgstr "Pictogrammenset:" + +msgid "Gain" +msgstr "Versterking" + +msgid "File name:" +msgstr "Bestandsnaam:" + +msgid "Disk size:" +msgstr "Schijfgrootte:" + +msgid "RPM mode:" +msgstr "RPM-modus:" + +msgid "Progress:" +msgstr "Vooruitgang:" + +msgid "Width:" +msgstr "Breedte:" + +msgid "Height:" +msgstr "Hoogte:" + +msgid "Lock to this size" +msgstr "Leg vast op deze grootte" + +msgid "Machine type:" +msgstr "Machinetype:" + +msgid "Machine:" +msgstr "Machine:" + +msgid "Configure" +msgstr "Configureren" + +msgid "CPU type:" +msgstr "CPU type:" + +msgid "Speed:" +msgstr "Snelheid:" + +msgid "Frequency:" +msgstr "Frequentie:" + +msgid "FPU:" +msgstr "FPU:" + +msgid "Wait states:" +msgstr "Wachttoestanden:" + +msgid "MB" +msgstr "MB" + +msgid "Memory:" +msgstr "Geheugen:" + +msgid "Time synchronization" +msgstr "Tijdsynchronisatie" + +msgid "Disabled" +msgstr "Uitgeschakeld" + +msgid "Enabled (local time)" +msgstr "Ingeschakeld (lokale tijd)" + +msgid "Enabled (UTC)" +msgstr "Ingeschakeld (UTC)" + +msgid "Dynamic Recompiler" +msgstr "Dynamische Recompiler" + +msgid "Video:" +msgstr "Video:" + +msgid "Video #2:" +msgstr "Video #2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Voodoo 1 of 2 graphics" + +msgid "IBM 8514/A Graphics" +msgstr "IBM 8514/A-graphics" + +msgid "XGA Graphics" +msgstr "XGA Graphics" + +msgid "Mouse:" +msgstr "Muis:" + +msgid "Joystick:" +msgstr "Joystick:" + +msgid "Joystick 1..." +msgstr "Joystick 1..." + +msgid "Joystick 2..." +msgstr "Joystick 2..." + +msgid "Joystick 3..." +msgstr "Joystick 3..." + +msgid "Joystick 4..." +msgstr "Joystick 4..." + +msgid "Sound card #1:" +msgstr "Geluidskaart #1:" + +msgid "Sound card #2:" +msgstr "Geluidskaart #2:" + +msgid "Sound card #3:" +msgstr "Geluidskaart #3:" + +msgid "Sound card #4:" +msgstr "Geluidskaart #4:" + +msgid "MIDI Out Device:" +msgstr "MIDI Out-apparaat:" + +msgid "MIDI In Device:" +msgstr "MIDI In-apparaat:" + +msgid "Standalone MPU-401" +msgstr "Standalone MPU-401" + +msgid "Use FLOAT32 sound" +msgstr "Gebruik FLOAT32-geluid" + +msgid "FM synth driver" +msgstr "FM-synthesizer" + +msgid "Nuked (more accurate)" +msgstr "Nuked (nauwkeuriger)" + +msgid "YMFM (faster)" +msgstr "YMFM (sneller)" + +msgid "Network type:" +msgstr "Type netwerk:" + +msgid "PCap device:" +msgstr "PCap-apparaat:" + +msgid "Network adapter:" +msgstr "Netwerkadapter:" + +msgid "COM1 Device:" +msgstr "COM1-apparaat:" + +msgid "COM2 Device:" +msgstr "COM2-apparaat:" + +msgid "COM3 Device:" +msgstr "COM3-apparaat:" + +msgid "COM4 Device:" +msgstr "COM4-apparaat:" + +msgid "LPT1 Device:" +msgstr "LPT1-apparaat:" + +msgid "LPT2 Device:" +msgstr "LPT2-apparaat:" + +msgid "LPT3 Device:" +msgstr "LPT3-apparaat:" + +msgid "LPT4 Device:" +msgstr "LPT4-apparaat:" + +msgid "Serial port 1" +msgstr "Seriële poort 1" + +msgid "Serial port 2" +msgstr "Seriële poort 2" + +msgid "Serial port 3" +msgstr "Seriële poort 3" + +msgid "Serial port 4" +msgstr "Seriële poort 4" + +msgid "Parallel port 1" +msgstr "Parallelle poort 1" + +msgid "Parallel port 2" +msgstr "Parallelle poort 2" + +msgid "Parallel port 3" +msgstr "Parallelle poort 3" + +msgid "Parallel port 4" +msgstr "Parallelle poort 4" + +msgid "HD Controller:" +msgstr "HD-controller:" + +msgid "FD Controller:" +msgstr "FD-Controller:" + +msgid "Tertiary IDE Controller" +msgstr "Tertiaire IDE-controller" + +msgid "Quaternary IDE Controller" +msgstr "Quaternaire IDE-controller" + +msgid "SCSI" +msgstr "SCSI" + +msgid "Controller 1:" +msgstr "Controller 1:" + +msgid "Controller 2:" +msgstr "Controller 2:" + +msgid "Controller 3:" +msgstr "Controller 3:" + +msgid "Controller 4:" +msgstr "Controller 4:" + +msgid "Cassette" +msgstr "Cassette" + +msgid "Hard disks:" +msgstr "Harde schijven:" + +msgid "&New..." +msgstr "&Nieuw..." + +msgid "&Existing..." +msgstr "&Bestaande..." + +msgid "&Remove" +msgstr "&Verwijderen" + +msgid "Bus:" +msgstr "Bus:" + +msgid "Channel:" +msgstr "Kanaal:" + +msgid "ID:" +msgstr "ID:" + +msgid "&Specify..." +msgstr "&Specificeer..." + +msgid "Sectors:" +msgstr "Sectoren:" + +msgid "Heads:" +msgstr "Heads:" + +msgid "Cylinders:" +msgstr "Cilinders:" + +msgid "Size (MB):" +msgstr "Grootte (MB):" + +msgid "Type:" +msgstr "Type:" + +msgid "Image Format:" +msgstr "Imageformaat:" + +msgid "Block Size:" +msgstr "Blokgrootte:" + +msgid "Floppy drives:" +msgstr "Floppy-schijfstations:" + +msgid "Turbo timings" +msgstr "Turbo timings" + +msgid "Check BPB" +msgstr "Controleer BPB" + +msgid "CD-ROM drives:" +msgstr "CD-ROM-stations:" + +msgid "MO drives:" +msgstr "MO-schijven:" + +msgid "ZIP drives:" +msgstr "ZIP-schijven:" + +msgid "ZIP 250" +msgstr "ZIP 250" + +msgid "ISA RTC:" +msgstr "ISA RTC:" + +msgid "ISA Memory Expansion" +msgstr "ISA-geheugenuitbreiding" + +msgid "Card 1:" +msgstr "Kaart 1:" + +msgid "Card 2:" +msgstr "Kaart 2:" + +msgid "Card 3:" +msgstr "Kaart 3:" + +msgid "Card 4:" +msgstr "Kaart 4:" + +msgid "ISABugger device" +msgstr "ISABugger-apparaat" + +msgid "POST card" +msgstr "POST-kaart" + +msgid "86Box" +msgstr "86Box" + +msgid "Error" +msgstr "Fout" + +msgid "Fatal error" +msgstr "Fatale fout" + +msgid " - PAUSED" +msgstr " - GEPAUZEERD" + +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" +msgstr "Snelheid" + +msgid "ZIP %03i %i (%s): %ls" +msgstr "ZIP %03i %i (%s): %ls" + +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." +msgstr "86Box kon geen bruikbare ROM images vinden.\n\nDownload een ROM set en pak deze uit in de map \"roms\"." + +msgid "(empty)" +msgstr "(leeg)" + +msgid "All files" +msgstr "Alle bestanden" + +msgid "Turbo" +msgstr "Turbo" + +msgid "On" +msgstr "Aan" + +msgid "Off" +msgstr "Uit" + +msgid "All images" +msgstr "Alle schijfimages" + +msgid "Basic sector images" +msgstr "Basissectorimages" + +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." +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." +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. Switching to an available video card." +msgstr "Videokaart #2 \"%hs\" is niet beschikbaar door ontbrekende ROMs in de map roms/video. Overschakel over naar een beschikbare videokaart." + +msgid "Machine" +msgstr "Machine" + +msgid "Display" +msgstr "Scherm" + +msgid "Input devices" +msgstr "Invoerapparaten" + +msgid "Sound" +msgstr "Geluid" + +msgid "Network" +msgstr "Netwerk" + +msgid "Ports (COM & LPT)" +msgstr "Poorten (COM & LPT)" + +msgid "Storage controllers" +msgstr "Opslagcontrollers" + +msgid "Hard disks" +msgstr "Harde schijven" + +msgid "Floppy & CD-ROM drives" +msgstr "Floppy- en CD-ROM-stations" + +msgid "Other removable devices" +msgstr "Andere verwijderbare apparaten" + +msgid "Other peripherals" +msgstr "Andere randapparatuur" + +msgid "Click to capture mouse" +msgstr "Klik om muis vast te leggen" + +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" +msgstr "Druk op %1 of middelste knop om de muis los te laten" + +msgid "Bus" +msgstr "Bus" + +msgid "File" +msgstr "Bestand" + +msgid "C" +msgstr "C" + +msgid "H" +msgstr "H" + +msgid "S" +msgstr "S" + +msgid "KB" +msgstr "KB" + +msgid "Could not initialize the video renderer." +msgstr "Kan de videorenderer niet initialiseren." + +msgid "Default" +msgstr "Standaard" + +msgid "%i estat(s) d'espera" +msgstr "%i estat(s) d'espera" + +msgid "Type" +msgstr "Type" + +msgid "No PCap devices found" +msgstr "Geen PCap-apparaten gevonden" + +msgid "Invalid PCap device" +msgstr "Ongeldig PCap-apparaat" + +msgid "2-axis, 2-button joystick(s)" +msgstr "Joystick(s) met 2 assen en 2 knoppen" + +msgid "2-axis, 4-button joystick" +msgstr "Joystick met 2 assen en 4 knoppen" + +msgid "2-axis, 6-button joystick" +msgstr "Joystick met 2 assen en 6 knoppen" + +msgid "2-axis, 8-button joystick" +msgstr "Joystick met 2 assen en 8 knoppen" + +msgid "3-axis, 2-button joystick" +msgstr "Joystick met 3 assen en 2 knoppen" + +msgid "3-axis, 4-button joystick" +msgstr "Joystick met 3 assen en 4 knoppen" + +msgid "4-axis, 4-button joystick" +msgstr "Joystick met 4 assen en 4 knoppen" + +msgid "CH Flightstick Pro" +msgstr "CH Flightstick Pro" + +msgid "Microsoft SideWinder Pad" +msgstr "Microsoft SideWinder Pad" + +msgid "Thrustmaster Flight Control System" +msgstr "Thrustmaster Flight Control systeem" + +msgid "None" +msgstr "Geen" + +msgid "%u MB (CHS: %i, %i, %i)" +msgstr "%u MB (CHS: %i, %i, %i)" + +msgid "Floppy %i (%s): %ls" +msgstr "Floppy %i (%s): %ls" + +msgid "Advanced sector images" +msgstr "Geavanceerde sector-images" + +msgid "Flux images" +msgstr "Flux images" + +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?" +msgstr "Weet je zeker dat je 86Box wilt verlaten?" + +msgid "Unable to initialize Ghostscript" +msgstr "Kan Ghostscript niet initialiseren" + +msgid "Unable to initialize GhostPCL" +msgstr "Kan GhostPCL niet initialiseren" + +msgid "MO %i (%ls): %ls" +msgstr "MO %i (%ls): %ls" + +msgid "MO images" +msgstr "MO-images" + +msgid "Welcome to 86Box!" +msgstr "Welkom bij 86Box!" + +msgid "Internal device" +msgstr "Intern apparaat" + +msgid "Exit" +msgstr "&Afsluiten" + +msgid "No ROMs found" +msgstr "Geen ROMs gevonden" + +msgid "Do you want to save the settings?" +msgstr "Wil je de instellingen opslaan?" + +msgid "This will hard reset the emulated machine." +msgstr "Dit zal de geëmuleerde machine een hard reset geven." + +msgid "Save" +msgstr "Opslaan" + +msgid "About 86Box" +msgstr "Over 86Box" + +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." +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" +msgstr "Hardware niet beschikbaar" + +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" +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." +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." +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" +msgstr "Volledig scherm modus openen" + +msgid "Don't show this message again" +msgstr "Dit bericht niet meer tonen" + +msgid "Don't exit" +msgstr "Niet afsluiten" + +msgid "Reset" +msgstr "Reset" + +msgid "Don't reset" +msgstr "Niet resetten" + +msgid "CD-ROM images" +msgstr "CD-ROM-images" + +msgid "%1 Device Configuration" +msgstr "%1 Apparaatconfiguratie" + +msgid "Monitor in sleep mode" +msgstr "Monitor in slaapstand" + +msgid "OpenGL Shaders" +msgstr "OpenGL Shaders" + +msgid "OpenGL options" +msgstr "OpenGL-opties" + +msgid "You are loading an unsupported configuration" +msgstr "U laadt een configuratie die niet wordt ondersteund" + +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" +msgstr "Doorgaan" + +msgid "Cassette: %s" +msgstr "Cassette: %s" + +msgid "Cassette images" +msgstr "Cassette-images" + +msgid "Cartridge %i: %ls" +msgstr "Cartridge %i: %ls" + +msgid "Cartridge images" +msgstr "Cartridge-images" + +msgid "Error initializing renderer" +msgstr "Fout bij het initialiseren van renderer" + +msgid "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." +msgstr "OpenGL (3.0 Core) renderer kon niet worden geïnitialiseerd. Gebruik een andere renderer." + +msgid "Resume execution" +msgstr "Hervat executie" + +msgid "Pause execution" +msgstr "Pauze executie" + +msgid "Press Ctrl+Alt+Del" +msgstr "Druk op Ctrl+Alt+Del" + +msgid "Press Ctrl+Alt+Esc" +msgstr "Druk op Ctrl+Alt+Esc" + +msgid "Hard reset" +msgstr "Harde reset" + +msgid "ACPI shutdown" +msgstr "ACPI uitschakeling" + +msgid "Hard disk (%1)" +msgstr "Harde schijf (%1)" + +msgid "MFM/RLL or ESDI CD-ROM drives never existed" +msgstr "MFM/RLL of ESDI CD-ROM-stations hebben nooit bestaan" + +msgid "Custom..." +msgstr "Aangepast..." + +msgid "Custom (large)..." +msgstr "Aangepast (groot)..." + +msgid "Add New Hard Disk" +msgstr "Nieuwe harde schijf toevoegen" + +msgid "Add Existing Hard Disk" +msgstr "Bestaande harde schijf toevoegen" + +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." +msgstr "Schijfimages kunnen niet groter zijn dan 127 GB." + +msgid "Hard disk images" +msgstr "Harde schijf-image" + +msgid "Unable to read file" +msgstr "Kan bestand niet lezen" + +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." +msgstr "HDI- of HDX-image met een andere sectorgrootte dan 512 worden niet ondersteund." + +msgid "Disk image file already exists" +msgstr "Schijfimagebestand bestaat al" + +msgid "Please specify a valid file name." +msgstr "Geef een geldige bestandsnaam op." + +msgid "Disk image created" +msgstr "Schijfimage gemaakt" + +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." +msgstr "Zorg ervoor dat het bestand wordt opgeslagen in een schrijfbare map." + +msgid "Disk image too large" +msgstr "Schijfimage te groot" + +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?" +msgstr "Het geselecteerde bestand wordt overschreven. Weet u zeker dat u het wilt gebruiken?" + +msgid "Unsupported disk image" +msgstr "Niet-ondersteunde schijfimage" + +msgid "Overwrite" +msgstr "Overschrijven" + +msgid "Don't overwrite" +msgstr "Niet overschrijven" + +msgid "Raw image" +msgstr "Ruw image" + +msgid "HDI image" +msgstr "HDI-image" + +msgid "HDX image" +msgstr "HDX-image" + +msgid "Fixed-size VHD" +msgstr "VHD met vaste grootte" + +msgid "Dynamic-size VHD" +msgstr "VHD met dynamisch grootte" + +msgid "Differencing VHD" +msgstr "Verschil-VHD" + +msgid "(N/A)" +msgstr "(N/A)" + +msgid "Raw image (.img)" +msgstr "Ruw image (.img)" + +msgid "HDI image (.hdi)" +msgstr "HDI-image (.hdi)" + +msgid "HDX image (.hdx)" +msgstr "HDX-image (.hdx)" + +msgid "Fixed-size VHD (.vhd)" +msgstr "VHD met vaste grootte (.vhd)" + +msgid "Dynamic-size VHD (.vhd)" +msgstr "VHD met dynamisch grootte (.vhd)" + +msgid "Differencing VHD (.vhd)" +msgstr "Verschil-VHD (.vhd)" + +msgid "Large blocks (2 MB)" +msgstr "Grote blokken (2 MB)" + +msgid "Small blocks (512 KB)" +msgstr "Kleine blokken (512 KB)" + +msgid "VHD files" +msgstr "VHD-bestanden" + +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?" +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" +msgstr "Bovenliggende en onderliggende schijf tijdstempels komen niet overeen" + +msgid "Could not fix VHD timestamp." +msgstr "Kan VHD tijdstempel niet herstellen." + +msgid "MFM/RLL" +msgstr "MFM/RLL" + +msgid "XTA" +msgstr "XTA" + +msgid "ESDI" +msgstr "ESDI" + +msgid "IDE" +msgstr "IDE" + +msgid "ATAPI" +msgstr "ATAPI" + +msgid "CD-ROM %i (%s): %s" +msgstr "CD-ROM %i (%s): %s" + +msgid "160 KB" +msgstr "160 KB" + +msgid "180 KB" +msgstr "180 KB" + +msgid "320 KB" +msgstr "320 KB" + +msgid "360 KB" +msgstr "360 KB" + +msgid "640 KB" +msgstr "640 KB" + +msgid "720 KB" +msgstr "720 KB" + +msgid "1.2 MB" +msgstr "1,2 MB" + +msgid "1.25 MB" +msgstr "1,25 MB" + +msgid "1.44 MB" +msgstr "1,44 MB" + +msgid "DMF (cluster 1024)" +msgstr "DMF (cluster 1024)" + +msgid "DMF (cluster 2048)" +msgstr "DMF (cluster 2048)" + +msgid "2.88 MB" +msgstr "2,88 MB" + +msgid "ZIP 100" +msgstr "ZIP 100" + +msgid "3.5\" 128 MB (ISO 10090)" +msgstr "3,5\" 128 MB (ISO 10090)" + +msgid "3.5\" 230 MB (ISO 13963)" +msgstr "3,5\" 230 MB (ISO 13963)" + +msgid "3.5\" 540 MB (ISO 15498)" +msgstr "3,5\" 540 MB (ISO 15498)" + +msgid "3.5\" 640 MB (ISO 15498)" +msgstr "3,5\" 640 MB (ISO 15498)" + +msgid "3.5\" 1.3 GB (GigaMO)" +msgstr "3,5\" 1,3 GB (GigaMO)" + +msgid "3.5\" 2.3 GB (GigaMO 2)" +msgstr "3,5\" 2,3 GB (GigaMO 2)" + +msgid "5.25\" 600 MB" +msgstr "5,25\" 600 MB" + +msgid "5.25\" 650 MB" +msgstr "5,25\" 650 MB" + +msgid "5.25\" 1 GB" +msgstr "5,25\" 1 GB" + +msgid "5.25\" 1.3 GB" +msgstr "5,25\" 1,3 GB" + +msgid "Perfect RPM" +msgstr "Perfecte RPM" + +msgid "1% below perfect RPM" +msgstr "1% onder perfecte RPM" + +msgid "1.5% below perfect RPM" +msgstr "1,5% onder perfecte RPM" + +msgid "2% below perfect RPM" +msgstr "2% onder perfecte RPM" + +msgid "(System Default)" +msgstr "(Systeemstandaard)" + +msgid "Failed to initialize network driver" +msgstr "Netwerkstuurprogramma niet geïnitialiseerd" + +msgid "The network configuration will be switched to the null driver" +msgstr "De netwerkconfiguratie wordt overgeschakeld naar de nul-driver" + +msgid "Mouse sensitivity:" +msgstr "Muisgevoeligheid:" + +msgid "Select media images from program working directory" +msgstr "Selecteer media-images uit de werkmap van het programma" + +msgid "PIT mode:" +msgstr "PIT-modus:" + +msgid "Auto" +msgstr "Auto" + +msgid "Slow" +msgstr "Langzaam" + +msgid "Fast" +msgstr "Snel" + +msgid "&Auto-pause on focus loss" +msgstr "&Autopauze bij focusverlies" + +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." +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" +msgstr "Genereren" + +msgid "Joystick configuration" +msgstr "Joystick configuratie " + +msgid "Device" +msgstr "Apparaat" + +msgid "%1 (X axis)" +msgstr "%1 (X-as)" + +msgid "%1 (Y axis)" +msgstr "%1 (Y-as)" + +msgid "MCA devices" +msgstr "MCA-apparaten" + +msgid "List of MCA devices:" +msgstr "Lijst van MCA-apparaten:" + +msgid "Tablet tool" +msgstr "Tablet-hulpmiddel" + +msgid "Qt (OpenGL &ES)" +msgstr "Qt (OpenGL &ES)" + +msgid "About Qt" +msgstr "Over Qt" + +msgid "MCA devices..." +msgstr "MCA-apparaten..." + +msgid "Show non-primary monitors" +msgstr "Toon niet-primaire monitors" + +msgid "Open screenshots folder..." +msgstr "Map met schermafbeeldingen openen..." + +msgid "Apply fullscreen stretch mode when maximized" +msgstr "Pas fullscreen stretchmodus toe wanneer gemaximaliseerd" + +msgid "Cursor/Puck" +msgstr "Cursor/Puck" + +msgid "Pen" +msgstr "Pen" + +msgid "Host CD/DVD Drive (%1:)" +msgstr "Host cd/dvd-station (%1:)" + +msgid "&Connected" +msgstr "&Verbonden" + +msgid "Clear image history" +msgstr "Imagegeschiedenis verwijderen" + +msgid "Create..." +msgstr "Creëer..." + +msgid "previous image" +msgstr "vorige image" + +msgid "Host CD/DVD Drive (%1)" +msgstr "Host CD/DVD-station (%1)" + +msgid "Unknown Bus" +msgstr "Onbekende bus" + +msgid "Null Driver" +msgstr "Null Driver" + +msgid "NIC %02i (%ls) %ls" +msgstr "NIC %02i (%ls) %ls" + +msgid "Error opening \"%1\": %2" +msgstr "Fout bij het openen van \"%1\": %2" + +msgid "Error compiling vertex shader in file \"%1\"" +msgstr "Fout bij het compileren van vertex shader in bestand \"%1\"" + +msgid "Error compiling fragment shader in file \"%1\"" +msgstr "Fout bij het compileren van fragment shader in bestand \"%1\"" + +msgid "Error linking shader program in file \"%1\"" +msgstr "Fout bij koppelen shaderprogramma in bestand \"%1\"" + +msgid "OpenGL 3.0 renderer options" +msgstr "OpenGL 3.0 renderer opties" + +msgid "Render behavior" +msgstr "Rendergedrag" + +msgid "Use target framerate:" +msgstr "Gebruik doelframerate:" + +msgid " fps" +msgstr " fps" + +msgid "VSync" +msgstr "VSync" + +msgid "<html><head/><body><p>Render each frame immediately, in sync with the emulated display.</p><p><span style=" font-style:italic;">This is the recommended option if the shaders in use don't utilize frametime for animated effects.</span></p></body></html>" +msgstr "<html><head/><body><p>Onmiddellijk elk frame synchroon met het geëmuleerde beeldscherm renderen.</p><p><span style=" font-style:italic;">Dit is de aanbevolen optie als de gebruikte shaders geen frametime gebruiken voor geanimeerde effecten.</span></p></body></html>" + +msgid "Synchronize with video" +msgstr "Synchroniseren met video" + +msgid "Shaders" +msgstr "Shaders" + +msgid "Remove" +msgstr "Verwijderen" + +msgid "No shader selected" +msgstr "Geen shader geselecteerd" + +msgid "Browse..." +msgstr "Bladeren..." + +msgid "Shader error" +msgstr "Shader-fout" + +msgid "Could not load shaders." +msgstr "Kan shaders niet laden." + +msgid "More information in details." +msgstr "Meer informatie in details." + +msgid "Couldn't create OpenGL context." +msgstr "Kan OpenGL context niet maken." + +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" +msgstr "OpenGL versie 3.0 of hoger is vereist. De huidige versie is %1.%2" + +msgid "OpenGL initialization failed. Error %1." +msgstr "OpenGL initialisatie mislukt. Fout %1." + +msgid "Error initializing OpenGL" +msgstr "Fout bij het initialiseren van OpenGL" + +msgid "Falling back to software rendering.\n" +msgstr "Terugvallen op software rendering.\n" + +msgid "Allocating memory for unpack buffer failed.\n" +msgstr "Toewijzen van geheugen voor uitpakbuffer mislukt.\n" + +msgid "<html><head/><body><p>When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.</p></body></html>" +msgstr "<html><head/><body><p>Bij het selecteren van media-images (CD-ROM, floppy, etc.) zal de \"open dialoog\" starten in dezelfde map als het 86Box configuratiebestand. Deze instelling is doet er waarschijnlijk alleen toe op macOS.</p></body></html>" + +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." +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" +msgstr "Ik heb het verplaatst" + +msgid "I Copied It" +msgstr "Ik heb het gekopieerd" + +msgid "86Box Monitor #" +msgstr "86Box Monitor #" + +msgid "No MCA devices." +msgstr "Geen MCA-apparaten." + +msgid "MiB" +msgstr "MiB" + +msgid "Network Card #1" +msgstr "Netwerkkaart #1" + +msgid "Network Card #2" +msgstr "Netwerkkaart #2" + +msgid "Network Card #3" +msgstr "Netwerkkaart #3" + +msgid "Network Card #4" +msgstr "Netwerkkaart #4" + +msgid "Mode" +msgstr "Modus" + +msgid "Interface" +msgstr "Interface" + +msgid "Adapter" +msgstr "Adapter" + +msgid "VDE Socket" +msgstr "VDE-socket" + +msgid "86Box Unit Tester" +msgstr "86Box apparaattester" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Novell NetWare 2.x Key Card" + +msgid "Serial port passthrough 1" +msgstr "Seriële poort doorvoer 1" + +msgid "Serial port passthrough 2" +msgstr "Seriële poort doorvoer 2" + +msgid "Serial port passthrough 3" +msgstr "Seriële poort doorvoer 3" + +msgid "Serial port passthrough 4" +msgstr "Seriële poort doorvoer 4" + +msgid "Vision Systems LBA Enhancer" +msgstr "Vision Systems LBA Enhancer" + +msgid "Renderer options..." +msgstr "Renderer-opties..." + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Logitech/Microsoft busmuis" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Microsoft busmuis (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Mouse Systems seriële muis" + +msgid "Microsoft Serial Mouse" +msgstr "Microsoft seriële muis" + +msgid "Logitech Serial Mouse" +msgstr "Logitech seriële muis" + +msgid "PS/2 Mouse" +msgstr "PS/2-muis" + +msgid "3M MicroTouch (Serial)" +msgstr "3M MicroTouch (serieel)" + +msgid "[COM] Standard Hayes-compliant Modem" +msgstr "COM] Standaard Hayes-compatibele modem " + +msgid "Roland MT-32 Emulation" +msgstr "Roland MT-32-emulatie" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Roland MT-32 (nieuwe) emulatie" + +msgid "Roland CM-32L Emulation" +msgstr "Roland CM-32L-emulatie" + +msgid "Roland CM-32LN Emulation" +msgstr "Roland CM-32LN-emulatie" + +msgid "OPL4-ML Daughterboard" +msgstr "OPL4-ML-dochterbord" + +msgid "System MIDI" +msgstr "Systeem MIDI" + +msgid "MIDI Input Device" +msgstr "MIDI-ingangsapparaat" + +msgid "BIOS Address" +msgstr "BIOS-adres" + +msgid "Enable BIOS extension ROM Writes" +msgstr "BIOS-extensie ROM Writes inschakelen" + +msgid "Address" +msgstr "Adres" + +msgid "IRQ" +msgstr "IRQ" + +msgid "BIOS Revision" +msgstr "BIOS Revisie" + +msgid "Translate 26 -> 17" +msgstr "Vertaal 26 -> 17" + +msgid "Language" +msgstr "Taal" + +msgid "Enable backlight" +msgstr "Backlight inschakelen" + +msgid "Invert colors" +msgstr "Kleuren omkeren" + +msgid "BIOS size" +msgstr "BIOS-grootte" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Geheugenadres C0000-C7FFF toewijzen aan UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Geheugenadres C8000-CFFFF toewijzen aan UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Geheugenadres D0000-D7FFF toewijzen aan UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Geheugenadres D8000-DFFFF toewijzen aan UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Geheugenadres E0000-E7FFF toewijzen aan UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Geheugenadres E8000-EFFFF toewijzen aan UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "JS9 Jumper (JIM)" + +msgid "MIDI Output Device" +msgstr "MIDI-uitgangsapparaat" + +msgid "MIDI Real time" +msgstr "MIDI real-time" + +msgid "MIDI Thru" +msgstr "MIDI doorvoer" + +msgid "MIDI Clockout" +msgstr "MIDI Clockout" + +msgid "SoundFont" +msgstr "SoundFont" + +msgid "Output Gain" +msgstr "Output Gain" + +msgid "Chorus" +msgstr "Chorus" + +msgid "Chorus Voices" +msgstr "Chorus-stemmen" + +msgid "Chorus Level" +msgstr "Chorus-niveau" + +msgid "Chorus Speed" +msgstr "Chorus-snelheid" + +msgid "Chorus Depth" +msgstr "Chorus-diepte" + +msgid "Chorus Waveform" +msgstr "Chorus-golfvorm" + +msgid "Reverb" +msgstr "Reverb" + +msgid "Reverb Room Size" +msgstr "Reverbkamer afmetingen" + +msgid "Reverb Damping" +msgstr "Reverbdemping" + +msgid "Reverb Width" +msgstr "Reverbbreedte" + +msgid "Reverb Level" +msgstr "Reverbniveau" + +msgid "Interpolation Method" +msgstr "Interpolatiemethode" + +msgid "Reverb Output Gain" +msgstr "Reverbuitgang Versterking" + +msgid "Reversed stereo" +msgstr "Omgekeerde stereo" + +msgid "Nice ramp" +msgstr "Mooie helling" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Knoppen" + +msgid "Serial Port" +msgstr "Seriële poort" + +msgid "RTS toggle" +msgstr "RTS toggle" + +msgid "Revision" +msgstr "Revisie" + +msgid "Controller" +msgstr "Controller" + +msgid "Show Crosshair" +msgstr "Toon dradenkruis" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "MAC-adres" + +msgid "MAC Address OUI" +msgstr "MAC-adres OUI" + +msgid "Enable BIOS" +msgstr "BIOS inschakelen" + +msgid "Baud Rate" +msgstr "Baud-snelheid" + +msgid "TCP/IP listening port" +msgstr "TCP/IP-luisterpoort" + +msgid "Phonebook File" +msgstr "Telefoonboekbestand" + +msgid "Telnet emulation" +msgstr "Telnet-emulatie" + +msgid "RAM Address" +msgstr "RAM-adres" + +msgid "RAM size" +msgstr "RAM-grootte" + +msgid "Initial RAM size" +msgstr "Oorspronkelijke RAM-grootte" + +msgid "Serial Number" +msgstr "Serienummer" + +msgid "Host ID" +msgstr "Host-ID" + +msgid "FDC Address" +msgstr "FDC Adres" + +msgid "MPU-401 Address" +msgstr "MPU-401 Adres" + +msgid "MPU-401 IRQ" +msgstr "MPU-401 IRQ" + +msgid "Receive MIDI input" +msgstr "MIDI-ingang ontvangen" + +msgid "Low DMA" +msgstr "Lage DMA" + +msgid "Enable Game port" +msgstr "Game-poort inschakelen" + +msgid "Surround module" +msgstr "Surroundmodule" + +msgid "CODEC" +msgstr "Codec" + +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" +msgstr "SB-adres" + +msgid "WSS IRQ" +msgstr "WSS IRQ" + +msgid "WSS DMA" +msgstr "WSS DMA" + +msgid "Enable OPL" +msgstr "OPL inschakelen" + +msgid "Receive MIDI input (MPU-401)" +msgstr "MIDI-ingang ontvangen (MPU-401)" + +msgid "SB low DMA" +msgstr "SB lage DMA" + +msgid "6CH variant (6-channel)" +msgstr "6CH-variant (6-kanaals)" + +msgid "Enable CMS" +msgstr "CMS inschakelen" + +msgid "Mixer" +msgstr "Mixer" + +msgid "High DMA" +msgstr "Hoge DMA" + +msgid "Control PC speaker" +msgstr "Bestuur pc-luidspreker" + +msgid "Memory size" +msgstr "Geheugengrootte" + +msgid "EMU8000 Address" +msgstr "EMU8000 Adres" + +msgid "IDE Controller" +msgstr "IDE-controller" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "GUS-type" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Schakel het commando 0x04 \"Exit 86Box\" in" + +msgid "Display type" +msgstr "Scherm type" + +msgid "Composite type" +msgstr "Composite type" + +msgid "RGB type" +msgstr "RGB-type" + +msgid "Line doubling type" +msgstr "Type lijnverdubbeling" + +msgid "Snow emulation" +msgstr "Sneeuwemulatie" + +msgid "Monitor type" +msgstr "Type monitor" + +msgid "Character set" +msgstr "Tekenset" + +msgid "XGA type" +msgstr "XGA-type" + +msgid "Instance" +msgstr "Instantie" + +msgid "MMIO Address" +msgstr "MMIO-adres" + +msgid "RAMDAC type" +msgstr "RAMDAC type" + +msgid "Blend" +msgstr "Mengen" + +msgid "Bilinear filtering" +msgstr "Bilineaire filtering" + +msgid "Dithering" +msgstr "Dithering" + +msgid "Enable NMI for CGA emulation" +msgstr "NMI inschakelen voor CGA-emulatie" + +msgid "Voodoo type" +msgstr "Voodoo-type" + +msgid "Framebuffer memory size" +msgstr "Framebuffer geheugengrootte" + +msgid "Texture memory size" +msgstr "Grootte textuurgeheugen" + +msgid "Dither subtraction" +msgstr "Dither aftrekken" + +msgid "Screen Filter" +msgstr "Schermfilter" + +msgid "Render threads" +msgstr "Render threads" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Startadres" + +msgid "Contiguous Size" +msgstr "Aaneengesloten grootte" + +msgid "I/O Width" +msgstr "I/O-breedte" + +msgid "Transfer Speed" +msgstr "Overdrachtssnelheid" + +msgid "EMS mode" +msgstr "EMS-modus" + +msgid "Address for > 2 MB" +msgstr "Adres voor > 2 MB" + +msgid "Frame Address" +msgstr "Frameadres" + +msgid "USA" +msgstr "USA" + +msgid "Danish" +msgstr "Deens" + +msgid "Always at selected speed" +msgstr "Altijd op geselecteerde snelheid" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "BIOS-instelling + Sneltoetsen (niet actief tijdens POST)" + +msgid "64 kB starting from F0000" +msgstr "64 kB vanaf F0000" + +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" +msgstr "Sinus" + +msgid "Triangle" +msgstr "Driehoek" + +msgid "Linear" +msgstr "Lineair" + +msgid "4th Order" +msgstr "4e Orde" + +msgid "7th Order" +msgstr "7e Orde" + +msgid "Non-timed (original)" +msgstr "Niet-getimed (origineel)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 niet gezet)" + +msgid "Two" +msgstr "Twee" + +msgid "Three" +msgstr "Drie" + +msgid "Wheel" +msgstr "Wiel" + +msgid "Five + Wheel" +msgstr "Vijf + Wiel" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 Serieel / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) Serieel" + +msgid "8 KB" +msgstr "8 KB" + +msgid "32 KB" +msgstr "32 KB" + +msgid "16 KB" +msgstr "16 KB" + +msgid "64 KB" +msgstr "64 KB" + +msgid "Disable BIOS" +msgstr "BIOS uitschakelen" + +msgid "512 KB" +msgstr "512 KB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (stereo)" + +msgid "Classic" +msgstr "Klassiek" + +msgid "256 KB" +msgstr "256 KB" + +msgid "Composite" +msgstr "Composite" + +msgid "Old" +msgstr "Oud" + +msgid "New" +msgstr "Nieuw" + +msgid "Color (generic)" +msgstr "Kleur (algemeen)" + +msgid "Green Monochrome" +msgstr "Groen monochroom" + +msgid "Amber Monochrome" +msgstr "Amber Monochroom" + +msgid "Gray Monochrome" +msgstr "Grijs monochroom" + +msgid "Color (no brown)" +msgstr "Kleur (geen bruin)" + +msgid "Color (IBM 5153)" +msgstr "Kleur (IBM 5153)" + +msgid "Simple doubling" +msgstr "Eenvoudige verdubbeling" + +msgid "sRGB interpolation" +msgstr "sRGB-interpolatie" + +msgid "Linear interpolation" +msgstr "Lineaire interpolatie" + +msgid "128 KB" +msgstr "128 KB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monochroom (5151/MDA) (wit)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monochroom (5151/MDA) (groen)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monochroom (5151/MDA) (amber)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Kleur 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Kleur 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Verbeterde kleur - normale modus (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Verbeterde kleur - Verbeterde modus (5154/ECD)" + +msgid "Green" +msgstr "Groen" + +msgid "Amber" +msgstr "Amber" + +msgid "Gray" +msgstr "Grijs" + +msgid "Color" +msgstr "Kleur" + +msgid "U.S. English" +msgstr "Amerikaans Engels" + +msgid "Scandinavian" +msgstr "Scandinavisch" + +msgid "Other languages" +msgstr "Andere talen" + +msgid "Bochs latest" +msgstr "Bochs nieuwste" + +msgid "Mono Non-Interlaced" +msgstr "Mono Non-Interlaced" + +msgid "Color Interlaced" +msgstr "Kleur interlaced" + +msgid "Color Non-Interlaced" +msgstr "Kleur non-interlaced" + +msgid "3Dfx Voodoo Graphics" +msgstr "3Dfx Voodoo Graphics" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 TMU's)" + +msgid "8-bit" +msgstr "8-bit" + +msgid "16-bit" +msgstr "16-bit" + +msgid "Standard (150ns)" +msgstr "Standaard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Hoge snelheid (120ns)" + +msgid "Enabled" +msgstr "Ingeschakeld" + +msgid "Standard" +msgstr "Standaard" + +msgid "High-Speed" +msgstr "Hoge snelheid" + +msgid "Stereo LPT DAC" +msgstr "Stereo LPT DAC" + +msgid "Generic Text Printer" +msgstr "Generieke tekstprinter" + +msgid "Generic ESC/P Dot-Matrix Printer" +msgstr "Generieke ESC/P dot-matrix-printer" + +msgid "Generic PostScript Printer" +msgstr "Generieke PostScript-printer" + +msgid "Generic PCL5e Printer" +msgstr "Generieke PCL5e-printer" + +msgid "Parallel Line Internet Protocol" +msgstr "Internetprotocol voor parallelle lijnen" + +msgid "Protection Dongle for Savage Quest" +msgstr "Beschermingsdongle voor Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Serieel doorvoerapparaat" + +msgid "Passthrough Mode" +msgstr "Doorgeefmodus" + +msgid "Host Serial Device" +msgstr "Host Serieel Apparaat" + +msgid "Name of pipe" +msgstr "Naam van de pipe" + +msgid "Data bits" +msgstr "Databits" + +msgid "Stop bits" +msgstr "Stopbits" + +msgid "Baud Rate of Passthrough" +msgstr "Baud-snelheid van doorvoer" + +msgid "Named Pipe (Server)" +msgstr "Named Pipe (Server)" + +msgid "Host Serial Passthrough" +msgstr "Host seriële doorgave" + +msgid "Eject %s" +msgstr "Uitwerpen %s" + +msgid "&Unmute" +msgstr "&Geluid aanzetten" + +msgid "Softfloat FPU" +msgstr "Softfloat FPU" + +msgid "High performance impact" +msgstr "Hoge prestatie-impact" + +msgid "RAM Disk (max. speed)" +msgstr "RAM-schijf (max. snelheid)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "IBM 8514/A-kloon (ISA)" + +msgid "Vendor" +msgstr "Verkoper" + +msgid "30 Hz (JMP2 = 1)" +msgstr "30 Hz (JMP2 = 1)" + +msgid "60 Hz (JMP2 = 2)" +msgstr "60 Hz (JMP2 = 2)" + +msgid "Generic PC/XT Memory Expansion" +msgstr "Generieke PC/XT geheugenuitbreiding" + +msgid "Generic PC/AT Memory Expansion" +msgstr "Generieke PC/AT geheugenuitbreiding" diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index bbc9489b8..f8b512f78 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -460,6 +460,7 @@ QMap> ProgSettings::lcid_langcode = { { 0x0410, { "it-IT", "Italian (Italy)" } }, { 0x0411, { "ja-JP", "Japanese (Japan)" } }, { 0x0412, { "ko-KR", "Korean (Korea)" } }, + { 0x0413, { "nl-NL", "Dutch (Netherlands)" } }, { 0x0415, { "pl-PL", "Polish (Poland)" } }, { 0x0416, { "pt-BR", "Portuguese (Brazil)" } }, { 0x0816, { "pt-PT", "Portuguese (Portugal)" } }, diff --git a/src/qt/qt_translations.qrc.in b/src/qt/qt_translations.qrc.in index 96f7291fc..655323563 100644 --- a/src/qt/qt_translations.qrc.in +++ b/src/qt/qt_translations.qrc.in @@ -13,6 +13,7 @@ 86box_it-IT.qm 86box_ja-JP.qm 86box_ko-KR.qm + 86box_nl-NL.qm 86box_pl-PL.qm 86box_pt-BR.qm 86box_pt-PT.qm From 8f68703255047b7fa2bacff9e5f9299c047f6795 Mon Sep 17 00:00:00 2001 From: Alexander Babikov Date: Sat, 23 Nov 2024 23:14:22 +0500 Subject: [PATCH 618/624] Link to avrt.dll on Windows for openal-soft >=1.24.0 --- src/sound/CMakeLists.txt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/sound/CMakeLists.txt b/src/sound/CMakeLists.txt index 9fbdd6ac1..832cdee3f 100644 --- a/src/sound/CMakeLists.txt +++ b/src/sound/CMakeLists.txt @@ -64,8 +64,14 @@ if(OPENAL) if(TARGET OpenAL::OpenAL) target_link_libraries(86Box OpenAL::OpenAL) + if(WIN32 AND STATIC_BUILD) + target_link_libraries(OpenAL::OpenAL INTERFACE avrt) + endif() else() target_link_libraries(86Box ${OPENAL_LIBRARY}) + if(WIN32 AND STATIC_BUILD) + target_link_libraries(${OPENAL_LIBRARY} INTERFACE avrt) + endif() endif() include_directories(${OPENAL_INCLUDE_DIR}) From 5c27083af6567030abd8dc38aeaa7103cfea372c Mon Sep 17 00:00:00 2001 From: OBattler Date: Mon, 25 Nov 2024 21:23:28 +0100 Subject: [PATCH 619/624] CD-ROM interface API to get raw track data, IOCTL now actually provides it, and IOCTL is now actually instantiable, as well as cleaned up a bit. --- src/cdrom/cdrom.c | 133 ++++++- src/cdrom/cdrom_image.c | 31 +- src/cdrom/cdrom_image_backend.c | 1 - src/cdrom/cdrom_ioctl.c | 57 +-- src/include/86box/cdrom.h | 17 +- src/include/86box/cdrom_image_backend.h | 27 +- src/include/86box/plat_cdrom.h | 30 +- src/qt/dummy_cdrom_ioctl.c | 121 ++++--- src/qt/qt_settingsfloppycdrom.cpp | 2 +- src/qt/win_cdrom_ioctl.c | 442 +++++++++++++++--------- src/unix/dummy_cdrom_ioctl.c | 117 ++++--- 11 files changed, 671 insertions(+), 307 deletions(-) diff --git a/src/cdrom/cdrom.c b/src/cdrom/cdrom.c index ff83b0a07..0bdcb5fb8 100644 --- a/src/cdrom/cdrom.c +++ b/src/cdrom/cdrom.c @@ -1167,27 +1167,81 @@ read_toc_session(cdrom_t *dev, unsigned char *b, int msf) static int read_toc_raw(cdrom_t *dev, unsigned char *b) { - track_info_t ti; - int len = 4; - int first_track; - int last_track; - - cdrom_log("read_toc_raw(%08X, %08X)\n", dev, b); - - dev->ops->get_tracks(dev, &first_track, &last_track); + track_info_t ti; + raw_track_info_t rti[256] = { 0 }; + int num = 0; + int len = 4; + int first_track; + int last_track; /* Bytes 2 and 3 = Number of first and last sessions */ b[2] = b[3] = 1; - for (int i = 0; i <= last_track; i++) { - dev->ops->get_track_info(dev, i + 1, 0, &ti); + if (dev->ops->get_raw_track_info != NULL) { + cdrom_log("read_toc_raw(%08X, %08X): Raw tracks\n", dev, b); + pclog("read_toc_raw(%016" PRIXPTR ", %016" PRIXPTR "): Raw tracks\n", + (uintptr_t) dev, (uintptr_t) b); + + dev->ops->get_raw_track_info(dev, &num, (raw_track_info_t *) rti); + + if (num != 0) for (int i = 0; i < num; i++) { + b[len++] = rti[i].session; + b[len++] = rti[i].adr_ctl; + b[len++] = rti[i].tno; + b[len++] = rti[i].point; + b[len++] = rti[i].m; + b[len++] = rti[i].s; + b[len++] = rti[i].f; + b[len++] = rti[i].zero; + b[len++] = rti[i].pm; + b[len++] = rti[i].ps; + b[len++] = rti[i].pf; + } + } else { + cdrom_log("read_toc_raw(%08X, %08X): Cooked tracks\n", dev, b); + pclog("read_toc_raw(%016" PRIXPTR ", %016" PRIXPTR "): Cooked tracks\n", + (uintptr_t) dev, (uintptr_t) b); + + dev->ops->get_tracks(dev, &first_track, &last_track); + + dev->ops->get_track_info(dev, 1, 0, &ti); + + b[len++] = 1; /* Session number */ + b[len++] = ti.attr; /* Track ADR and Control */ + b[len++] = 0; /* TNO (always 0) */ + b[len++] = 0xA0; /* Point (for track points - track number) */ + /* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */ + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = ti.number; /* First track number */ + b[len++] = 0; + b[len++] = 0; + + dev->ops->get_track_info(dev, last_track, 0, &ti); + + b[len++] = 1; /* Session number */ + b[len++] = ti.attr; /* Track ADR and Control */ + b[len++] = 0; /* TNO (always 0) */ + b[len++] = 0xA1; /* Point (for track points - track number) */ + /* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */ + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = ti.number; /* First track number */ + b[len++] = 0; + b[len++] = 0; + + dev->ops->get_track_info(dev, last_track + 1, 0, &ti); cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); b[len++] = 1; /* Session number */ b[len++] = ti.attr; /* Track ADR and Control */ b[len++] = 0; /* TNO (always 0) */ - b[len++] = ti.number; /* Point (for track points - track number) */ + b[len++] = 0xA2; /* Point (for track points - track number) */ /* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */ b[len++] = 0; b[len++] = 0; @@ -1196,6 +1250,25 @@ read_toc_raw(cdrom_t *dev, unsigned char *b) b[len++] = ti.m; /* PM */ b[len++] = ti.s; /* PS */ b[len++] = ti.f; /* PF */ + + for (int i = 0; i < last_track; i++) { + dev->ops->get_track_info(dev, i + 1, 0, &ti); + + cdrom_log(" tracks(%i) = %02X, %02X, %i:%02i.%02i\n", i, ti.attr, ti.number, ti.m, ti.s, ti.f); + + b[len++] = 1; /* Session number */ + b[len++] = ti.attr; /* Track ADR and Control */ + b[len++] = 0; /* TNO (always 0) */ + b[len++] = ti.number; /* Point (for track points - track number) */ + /* Yes, this is correct - MSF followed by PMSF, the actual position is in PMSF. */ + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = 0; + b[len++] = ti.m; /* PM */ + b[len++] = ti.s; /* PS */ + b[len++] = ti.f; /* PF */ + } } return len; @@ -1954,6 +2027,22 @@ cdrom_drive_reset(cdrom_t *dev) dev->get_channel = NULL; } +/* Will be removed later. */ +#ifdef ENABLE_CDROM_LOG +static void +cdrom_toc_dump(cdrom_t *dev) +{ + uint8_t b[65536] = { 0 }; + int len = cdrom_read_toc(dev, b, CD_TOC_RAW, 0, 0, 65536); + const char *fn2 = "d:\\86boxnew\\toc_cue.dmp"; + FILE * f = fopen(fn2, "wb"); + fwrite(b, 1, len, f); + fflush(f); + fclose(f); + pclog("Written TOC of %i bytes to %s\n", len, fn2); +} +#endif + void cdrom_hard_reset(void) { @@ -1994,6 +2083,10 @@ cdrom_hard_reset(void) cdrom_ioctl_open(dev, dev->image_path); else cdrom_image_open(dev, dev->image_path); + +#ifdef ENABLE_CDROM_LOG + cdrom_toc_dump(dev); +#endif } } } @@ -2095,15 +2188,13 @@ cdrom_reload(uint8_t id) strcpy(dev->image_path, dev->prev_image_path); #ifdef _WIN32 - if (strlen(dev->prev_image_path) > 0) { - if ((strlen(dev->image_path) >= 1) && (dev->image_path[strlen(dev->image_path) - 1] == '/')) - dev->image_path[strlen(dev->image_path) - 1] = '\\'; - } + if ((strlen(dev->prev_image_path) > 0) && (strlen(dev->image_path) >= 1) && + (dev->image_path[strlen(dev->image_path) - 1] == '/')) + dev->image_path[strlen(dev->image_path) - 1] = '\\'; #else - if (strlen(dev->prev_image_path) > 0) { - if ((strlen(dev->image_path) >= 1) && (dev->image_path[strlen(dev->image_path) - 1] == '\\')) - dev->image_path[strlen(dev->image_path) - 1] = '/'; - } + if ((strlen(dev->prev_image_path) > 0) && (strlen(dev->image_path) >= 1) && + (dev->image_path[strlen(dev->image_path) - 1] == '\\')) + dev->image_path[strlen(dev->image_path) - 1] = '/'; #endif if ((strlen(dev->image_path) != 0) && (strstr(dev->image_path, "ioctl://") == dev->image_path)) @@ -2111,6 +2202,10 @@ cdrom_reload(uint8_t id) else cdrom_image_open(dev, dev->image_path); +#ifdef ENABLE_CDROM_LOG + cdrom_toc_dump(dev); +#endif + cdrom_insert(id); } diff --git a/src/cdrom/cdrom_image.c b/src/cdrom/cdrom_image.c index 113d426c6..0ff914795 100644 --- a/src/cdrom/cdrom_image.c +++ b/src/cdrom/cdrom_image.c @@ -61,7 +61,7 @@ cdrom_image_log(const char *fmt, ...) static void image_get_tracks(cdrom_t *dev, int *first, int *last) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; TMSF tmsf; cdi_get_audio_tracks(img, first, last, &tmsf); @@ -70,7 +70,7 @@ image_get_tracks(cdrom_t *dev, int *first, int *last) static void image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; TMSF tmsf; cdi_get_audio_track_info(img, end, track, &ti->number, &tmsf, &ti->attr); @@ -83,7 +83,7 @@ image_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti) static void image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; TMSF rel_pos; TMSF abs_pos; @@ -105,7 +105,7 @@ image_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc) static int image_get_capacity(cdrom_t *dev) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; int first_track; int last_track; int number; @@ -130,7 +130,7 @@ image_get_capacity(cdrom_t *dev) static int image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; uint8_t attr; TMSF tmsf; int m; @@ -162,7 +162,7 @@ image_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf) static int image_is_track_pre(cdrom_t *dev, uint32_t lba) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; int track; /* GetTrack requires LBA. */ @@ -177,7 +177,7 @@ image_is_track_pre(cdrom_t *dev, uint32_t lba) static int image_sector_size(struct cdrom *dev, uint32_t lba) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; return cdi_get_sector_size(img, lba); } @@ -185,7 +185,7 @@ image_sector_size(struct cdrom *dev, uint32_t lba) static int image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; switch (type) { case CD_READ_DATA: @@ -206,7 +206,7 @@ image_read_sector(struct cdrom *dev, int type, uint8_t *b, uint32_t lba) static int image_track_type(cdrom_t *dev, uint32_t lba) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; if (img) { if (image_is_track_audio(dev, lba, 0)) @@ -229,14 +229,14 @@ image_ext_medium_changed(cdrom_t *dev) static void image_exit(cdrom_t *dev) { - cd_img_t *img = (cd_img_t *) dev->image; + cd_img_t *img = (cd_img_t *) dev->local; cdrom_image_log("CDROM: image_exit(%s)\n", dev->image_path); dev->cd_status = CD_STATUS_EMPTY; if (img) { cdi_close(img); - dev->image = NULL; + dev->local = NULL; } dev->ops = NULL; @@ -245,6 +245,7 @@ image_exit(cdrom_t *dev) static const cdrom_ops_t cdrom_image_ops = { image_get_tracks, image_get_track_info, + NULL, image_get_subchannel, image_is_track_pre, image_sector_size, @@ -282,7 +283,7 @@ cdrom_image_open(cdrom_t *dev, const char *fn) return image_open_abort(dev); memset(img, 0, sizeof(cd_img_t)); - dev->image = img; + dev->local = img; /* Open the image. */ int i = cdi_set_device(img, fn); @@ -298,6 +299,12 @@ cdrom_image_open(cdrom_t *dev, const char *fn) dev->cd_buflen = 0; dev->cdrom_capacity = image_get_capacity(dev); cdrom_image_log("CD-ROM capacity: %i sectors (%" PRIi64 " bytes)\n", dev->cdrom_capacity, ((uint64_t) dev->cdrom_capacity) << 11ULL); + int cm, cs, cf; + cf = dev->cdrom_capacity % 75; + cs = (dev->cdrom_capacity / 75) % 60; + cm = (dev->cdrom_capacity / 75) / 60; + pclog("CD-ROM capacity: %i sectors (%" PRIi64 " bytes) (time: %02i:%02i:%02i)\n", + dev->cdrom_capacity, ((uint64_t) dev->cdrom_capacity - 150ULL) * 2352ULL, cm, cs, cf); /* Attach this handler to the drive. */ dev->ops = &cdrom_image_ops; diff --git a/src/cdrom/cdrom_image_backend.c b/src/cdrom/cdrom_image_backend.c index f1d5ed1f9..2578e9e33 100644 --- a/src/cdrom/cdrom_image_backend.c +++ b/src/cdrom/cdrom_image_backend.c @@ -1189,7 +1189,6 @@ cdi_load_cue(cd_img_t *cdi, const char *cuefile) /* Add lead out track. */ trk.number++; trk.track_number = 0xAA; - trk.attr = 0x16; /* Was 0x00 but I believe 0x16 is appropriate. */ trk.start = 0; trk.length = 0; trk.file = NULL; diff --git a/src/cdrom/cdrom_ioctl.c b/src/cdrom/cdrom_ioctl.c index 13df2d965..f25988bb9 100644 --- a/src/cdrom/cdrom_ioctl.c +++ b/src/cdrom/cdrom_ioctl.c @@ -28,9 +28,9 @@ #include <86box/config.h> #include <86box/path.h> #include <86box/plat.h> -#include <86box/plat_cdrom.h> #include <86box/scsi_device.h> #include <86box/cdrom.h> +#include <86box/plat_cdrom.h> #ifdef ENABLE_CDROM_IOCTL_LOG int cdrom_ioctl_do_log = ENABLE_CDROM_IOCTL_LOG; @@ -56,19 +56,19 @@ cdrom_ioctl_log(const char *fmt, ...) #define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f) static void -ioctl_get_tracks(UNUSED(cdrom_t *dev), int *first, int *last) +ioctl_get_tracks(cdrom_t *dev, int *first, int *last) { TMSF tmsf; - plat_cdrom_get_audio_tracks(first, last, &tmsf); + plat_cdrom_get_audio_tracks(dev->local, first, last, &tmsf); } static void -ioctl_get_track_info(UNUSED(cdrom_t *dev), uint32_t track, int end, track_info_t *ti) +ioctl_get_track_info(cdrom_t *dev, uint32_t track, int end, track_info_t *ti) { TMSF tmsf; - plat_cdrom_get_audio_track_info(end, track, &ti->number, &tmsf, &ti->attr); + plat_cdrom_get_audio_track_info(dev->local, end, track, &ti->number, &tmsf, &ti->attr); ti->m = tmsf.min; ti->s = tmsf.sec; @@ -76,13 +76,19 @@ ioctl_get_track_info(UNUSED(cdrom_t *dev), uint32_t track, int end, track_info_t } static void -ioctl_get_subchannel(UNUSED(cdrom_t *dev), uint32_t lba, subchannel_t *subc) +ioctl_get_raw_track_info(cdrom_t *dev, int *num, raw_track_info_t *rti) +{ + plat_cdrom_get_raw_track_info(dev->local, num, rti); +} + +static void +ioctl_get_subchannel(cdrom_t *dev, uint32_t lba, subchannel_t *subc) { TMSF rel_pos; TMSF abs_pos; if ((dev->cd_status == CD_STATUS_PLAYING) || (dev->cd_status == CD_STATUS_PAUSED)) { - const uint32_t trk = plat_cdrom_get_track_start(lba, &subc->attr, &subc->track); + const uint32_t trk = plat_cdrom_get_track_start(dev->local, lba, &subc->attr, &subc->track); FRAMES_TO_MSF(lba + 150, &abs_pos.min, &abs_pos.sec, &abs_pos.fr); @@ -91,7 +97,7 @@ ioctl_get_subchannel(UNUSED(cdrom_t *dev), uint32_t lba, subchannel_t *subc) subc->index = 1; } else - plat_cdrom_get_audio_sub(lba, &subc->attr, &subc->track, &subc->index, + plat_cdrom_get_audio_sub(dev->local, lba, &subc->attr, &subc->track, &subc->index, &rel_pos, &abs_pos); subc->abs_m = abs_pos.min; @@ -107,11 +113,11 @@ ioctl_get_subchannel(UNUSED(cdrom_t *dev), uint32_t lba, subchannel_t *subc) } static int -ioctl_get_capacity(UNUSED(cdrom_t *dev)) +ioctl_get_capacity(cdrom_t *dev) { int ret; - ret = plat_cdrom_get_last_block(); + ret = plat_cdrom_get_last_block(dev->local); cdrom_ioctl_log("GetCapacity=%x.\n", ret); return ret; } @@ -134,35 +140,35 @@ ioctl_is_track_audio(cdrom_t *dev, uint32_t pos, int ismsf) } /* GetTrack requires LBA. */ - return plat_cdrom_is_track_audio(pos); + return plat_cdrom_is_track_audio(dev->local, pos); } static int -ioctl_is_track_pre(UNUSED(cdrom_t *dev), uint32_t lba) +ioctl_is_track_pre(cdrom_t *dev, uint32_t lba) { - return plat_cdrom_is_track_pre(lba); + return plat_cdrom_is_track_pre(dev->local, lba); } static int -ioctl_sector_size(UNUSED(cdrom_t *dev), uint32_t lba) +ioctl_sector_size(cdrom_t *dev, uint32_t lba) { cdrom_ioctl_log("LBA=%x.\n", lba); - return plat_cdrom_get_sector_size(lba); + return plat_cdrom_get_sector_size(dev->local, lba); } static int -ioctl_read_sector(UNUSED(cdrom_t *dev), int type, uint8_t *b, uint32_t lba) +ioctl_read_sector(cdrom_t *dev, int type, uint8_t *b, uint32_t lba) { switch (type) { case CD_READ_DATA: cdrom_ioctl_log("cdrom_ioctl_read_sector(): Data.\n"); - return plat_cdrom_read_sector(b, 0, lba); + return plat_cdrom_read_sector(dev->local, b, 0, lba); case CD_READ_AUDIO: cdrom_ioctl_log("cdrom_ioctl_read_sector(): Audio.\n"); - return plat_cdrom_read_sector(b, 1, lba); + return plat_cdrom_read_sector(dev->local, b, 1, lba); case CD_READ_RAW: cdrom_ioctl_log("cdrom_ioctl_read_sector(): Raw.\n"); - return plat_cdrom_read_sector(b, 1, lba); + return plat_cdrom_read_sector(dev->local, b, 1, lba); default: cdrom_ioctl_log("cdrom_ioctl_read_sector(): Unknown CD read type.\n"); break; @@ -191,7 +197,7 @@ ioctl_ext_medium_changed(cdrom_t *dev) if ((dev->cd_status == CD_STATUS_PLAYING) || (dev->cd_status == CD_STATUS_PAUSED)) ret = 0; else - ret = plat_cdrom_ext_medium_changed(); + ret = plat_cdrom_ext_medium_changed(dev->local); if (ret == 1) { dev->cd_status = CD_STATUS_STOPPED; @@ -208,7 +214,8 @@ ioctl_exit(cdrom_t *dev) cdrom_ioctl_log("CDROM: ioctl_exit(%s)\n", dev->image_path); dev->cd_status = CD_STATUS_EMPTY; - plat_cdrom_close(); + plat_cdrom_close(dev->local); + dev->local = NULL; dev->ops = NULL; } @@ -216,6 +223,7 @@ ioctl_exit(cdrom_t *dev) static const cdrom_ops_t cdrom_ioctl_ops = { ioctl_get_tracks, ioctl_get_track_info, + ioctl_get_raw_track_info, ioctl_get_subchannel, ioctl_is_track_pre, ioctl_sector_size, @@ -238,9 +246,10 @@ int cdrom_ioctl_open(cdrom_t *dev, const char *drv) { const char *actual_drv = &(drv[8]); + int local_size = plat_cdrom_get_local_size(); /* Make sure to not STRCPY if the two are pointing - at the same place. */ + at the same place. */ if (drv != dev->image_path) strcpy(dev->image_path, drv); @@ -248,7 +257,9 @@ cdrom_ioctl_open(cdrom_t *dev, const char *drv) if (strstr(drv, "ioctl://") != drv) return cdrom_ioctl_open_abort(dev); cdrom_ioctl_log("actual_drv = %s\n", actual_drv); - int i = plat_cdrom_set_drive(actual_drv); + if (dev->local == NULL) + dev->local = calloc(1, local_size); + int i = plat_cdrom_set_drive(dev->local, actual_drv); if (!i) return cdrom_ioctl_open_abort(dev); diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 636c151ce..0a28e630d 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -195,10 +195,25 @@ typedef struct track_info_t { uint8_t f; } track_info_t; +typedef struct raw_track_info_t { + uint8_t session; + uint8_t adr_ctl; + uint8_t tno; + uint8_t point; + uint8_t m; + uint8_t s; + uint8_t f; + uint8_t zero; + uint8_t pm; + uint8_t ps; + uint8_t pf; +} raw_track_info_t; + /* Define the various CD-ROM drive operations (ops). */ typedef struct cdrom_ops_t { void (*get_tracks)(struct cdrom *dev, int *first, int *last); void (*get_track_info)(struct cdrom *dev, uint32_t track, int end, track_info_t *ti); + void (*get_raw_track_info)(struct cdrom *dev, int *num, raw_track_info_t *rti); void (*get_subchannel)(struct cdrom *dev, uint32_t lba, subchannel_t *subc); int (*is_track_pre)(struct cdrom *dev, uint32_t lba); int (*sector_size)(struct cdrom *dev, uint32_t lba); @@ -248,7 +263,7 @@ typedef struct cdrom { const cdrom_ops_t *ops; - void *image; + void *local; void (*insert)(void *priv); void (*close)(void *priv); diff --git a/src/include/86box/cdrom_image_backend.h b/src/include/86box/cdrom_image_backend.h index cf4fe95c3..c6b2d9fc7 100644 --- a/src/include/86box/cdrom_image_backend.h +++ b/src/include/86box/cdrom_image_backend.h @@ -57,7 +57,31 @@ typedef struct track_file_t { int motorola; } track_file_t; +#define BLOCK_EMPTY 0 /* Empty block. */ +#define BLOCK_ZERO 1 /* Block not in the file, return all 0x00's. */ +#define BLOCK_NORMAL 2 /* Block in the file. */ + +#define BLOCK_NONE ((uint64_t) -1LL) + +typedef struct track_block_t { + /* Is the current block in the file? If not, return all 0x00's. */ + int type; + /* The amount of bytes to skip at the beginning of each sector. */ + int skip; + /* Starting and ending sector LBA - negative in order to accomodate LBA -150 to -1 + to read the pregap of track 1. */ + int64_t start_sector; + int64_t end_sector; + /* Starting and ending offset in the file. */ + uint64_t start_offs; + uint64_t end_offs; +} track_block_t; + typedef struct track_t { + int pregap_len; /* Pre-gap - not in file. */ + int index0_len; /* Pre-gap - in file. */ + int postgap_len; /* Post-gap - not in file. */ + int blocks_num; /* Number of blocks. */ int number; int track_number; int attr; @@ -65,10 +89,11 @@ typedef struct track_t { int mode2; int form; int pre; - int noskip; /* Do not skip by 8 bytes.*/ + int noskip; /* Do not skip by 8 bytes.*/ uint64_t start; uint64_t length; uint64_t skip; + track_block_t blocks[256]; track_file_t *file; } track_t; diff --git a/src/include/86box/plat_cdrom.h b/src/include/86box/plat_cdrom.h index 8e81f9459..06439a652 100644 --- a/src/include/86box/plat_cdrom.h +++ b/src/include/86box/plat_cdrom.h @@ -49,19 +49,23 @@ typedef struct SMSF { uint8_t fr; } TMSF; -extern int plat_cdrom_is_track_audio(uint32_t sector); -extern int plat_cdrom_is_track_pre(uint32_t sector); -extern uint32_t plat_cdrom_get_last_block(void); -extern void plat_cdrom_get_audio_tracks(int *st_track, int *end, TMSF *lead_out); -extern int plat_cdrom_get_audio_track_info(int end, int track, int *track_num, TMSF *start, uint8_t *attr); -extern int plat_cdrom_get_audio_sub(uint32_t sector, uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos); -extern int plat_cdrom_get_sector_size(uint32_t sector); -extern int plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector); -extern void plat_cdrom_eject(void); -extern void plat_cdrom_close(void); -extern int plat_cdrom_set_drive(const char *drv); -extern int plat_cdrom_ext_medium_changed(void); -extern uint32_t plat_cdrom_get_track_start(uint32_t sector, uint8_t *attr, uint8_t *track); +extern void plat_cdrom_get_raw_track_info(void *local, int *num, raw_track_info_t *rti); +extern int plat_cdrom_is_track_audio(void *local, uint32_t sector); +extern int plat_cdrom_is_track_pre(void *local, uint32_t sector); +extern uint32_t plat_cdrom_get_last_block(void *local); +extern void plat_cdrom_get_audio_tracks(void *local, int *st_track, int *end, TMSF *lead_out); +extern int plat_cdrom_get_audio_track_info(void *local, int end, int track, int *track_num, TMSF *start, + uint8_t *attr); +extern int plat_cdrom_get_audio_sub(void *local, uint32_t sector, uint8_t *attr, uint8_t *track, + uint8_t *index, TMSF *rel_pos, TMSF *abs_pos); +extern int plat_cdrom_get_sector_size(void *local, uint32_t sector); +extern int plat_cdrom_read_sector(void *local, uint8_t *buffer, int raw, uint32_t sector); +extern void plat_cdrom_eject(void *local); +extern void plat_cdrom_close(void *local); +extern int plat_cdrom_set_drive(void *local, const char *drv); +extern int plat_cdrom_ext_medium_changed(void *local); +extern uint32_t plat_cdrom_get_track_start(void *local, uint32_t sector, uint8_t *attr, uint8_t *track); +extern int plat_cdrom_get_local_size(void); #ifdef __cplusplus } diff --git a/src/qt/dummy_cdrom_ioctl.c b/src/qt/dummy_cdrom_ioctl.c index fed1444d1..bf656177b 100644 --- a/src/qt/dummy_cdrom_ioctl.c +++ b/src/qt/dummy_cdrom_ioctl.c @@ -35,7 +35,9 @@ of the audio while audio still plays. With an absolute conversion, the counter is fine. */ #define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f) -static int toc_valid = 0; +typedef struct dummy_cdrom_ioctl_t { + int toc_valid; +} dummy_cdrom_ioctl_t; #ifdef ENABLE_DUMMY_CDROM_IOCTL_LOG int dummy_cdrom_ioctl_do_log = ENABLE_DUMMY_CDROM_IOCTL_LOG; @@ -56,30 +58,41 @@ dummy_cdrom_ioctl_log(const char *fmt, ...) #endif static int -plat_cdrom_open(void) +plat_cdrom_open(void *local) { return 0; } static int -plat_cdrom_load(void) +plat_cdrom_load(void *local) { return 0; } static void -plat_cdrom_read_toc(void) +plat_cdrom_read_toc(void *local) { - if (!toc_valid) - toc_valid = 1; + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + if (!ioctl->toc_valid) + ioctl->toc_valid = 1; +} + +void +plat_cdrom_get_raw_track_info(UNUSED(void *local), int *num, raw_track_info_t *rti) +{ + *num = 1; + memset(rti, 0x00, 11); } int -plat_cdrom_is_track_audio(uint32_t sector) +plat_cdrom_is_track_audio(void *local, uint32_t sector) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; - const int ret = 0; + plat_cdrom_read_toc(ioctl); + + const int ret = 0; dummy_cdrom_ioctl_log("plat_cdrom_is_track_audio(%08X): %i\n", sector, ret); @@ -87,9 +100,11 @@ plat_cdrom_is_track_audio(uint32_t sector) } int -plat_cdrom_is_track_pre(uint32_t sector) +plat_cdrom_is_track_pre(void *local, uint32_t sector) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); const int ret = 0; @@ -99,25 +114,30 @@ plat_cdrom_is_track_pre(uint32_t sector) } uint32_t -plat_cdrom_get_track_start(uint32_t sector, uint8_t *attr, uint8_t *track) +plat_cdrom_get_track_start(void *local, uint32_t sector, uint8_t *attr, uint8_t *track) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); return 0x00000000; } uint32_t -plat_cdrom_get_last_block(void) +plat_cdrom_get_last_block(void *local) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); return 0x00000000; } int -plat_cdrom_ext_medium_changed(void) +plat_cdrom_ext_medium_changed(void *local) { - int ret = 0; + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + int ret = 0; dummy_cdrom_ioctl_log("plat_cdrom_ext_medium_changed(): %i\n", ret); @@ -125,9 +145,11 @@ plat_cdrom_ext_medium_changed(void) } void -plat_cdrom_get_audio_tracks(int *st_track, int *end, TMSF *lead_out) +plat_cdrom_get_audio_tracks(void *local, int *st_track, int *end, TMSF *lead_out) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); *st_track = 1; *end = 1; @@ -141,9 +163,11 @@ plat_cdrom_get_audio_tracks(int *st_track, int *end, TMSF *lead_out) /* This replaces both Info and EndInfo, they are specified by a variable. */ int -plat_cdrom_get_audio_track_info(UNUSED(int end), int track, int *track_num, TMSF *start, uint8_t *attr) +plat_cdrom_get_audio_track_info(void *local, UNUSED(int end), int track, int *track_num, TMSF *start, uint8_t *attr) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); if ((track < 1) || (track == 0xaa)) { dummy_cdrom_ioctl_log("plat_cdrom_get_audio_track_info(%02i)\n", track); @@ -165,7 +189,8 @@ plat_cdrom_get_audio_track_info(UNUSED(int end), int track, int *track_num, TMSF /* TODO: See if track start is adjusted by 150 or not. */ int -plat_cdrom_get_audio_sub(UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos) +plat_cdrom_get_audio_sub(UNUSED(void *local), UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, uint8_t *index, + TMSF *rel_pos, TMSF *abs_pos) { *track = 1; *attr = 0x14; @@ -185,7 +210,7 @@ plat_cdrom_get_audio_sub(UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, } int -plat_cdrom_get_sector_size(UNUSED(uint32_t sector)) +plat_cdrom_get_sector_size(UNUSED(void *local), UNUSED(uint32_t sector)) { dummy_cdrom_ioctl_log("BytesPerSector=2048\n"); @@ -193,42 +218,56 @@ plat_cdrom_get_sector_size(UNUSED(uint32_t sector)) } int -plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) +plat_cdrom_read_sector(void *local, uint8_t *buffer, int raw, uint32_t sector) { - plat_cdrom_open(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; - if (raw) { - dummy_cdrom_ioctl_log("Raw\n"); + plat_cdrom_open(ioctl); + + if (raw) /* Raw */ - } else { - dummy_cdrom_ioctl_log("Cooked\n"); + dummy_cdrom_ioctl_log("Raw\n"); + else /* Cooked */ - } - plat_cdrom_close(); - dummy_cdrom_ioctl_log("ReadSector status=%d, sector=%d, size=%" PRId64 ".\n", status, sector, (long long) size); + dummy_cdrom_ioctl_log("Cooked\n"); - return -1; + plat_cdrom_close(ioctl); + + dummy_cdrom_ioctl_log("ReadSector sector=%d.\n", sector); + + return 0; } void -plat_cdrom_eject(void) +plat_cdrom_eject(void *local) { - plat_cdrom_open(); - plat_cdrom_close(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_open(ioctl); + plat_cdrom_close(ioctl); } void -plat_cdrom_close(void) +plat_cdrom_close(UNUSED(void *local)) { } int -plat_cdrom_set_drive(const char *drv) +plat_cdrom_set_drive(void *local, const char *drv) { - plat_cdrom_close(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; - toc_valid = 0; + plat_cdrom_close(ioctl); + + ioctl->toc_valid = 0; + + plat_cdrom_load(ioctl); - plat_cdrom_load(); return 1; } + +int +plat_cdrom_get_local_size(void) +{ + return sizeof(dummy_cdrom_ioctl_t); +} diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 190dbc2e1..db54315e4 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -220,7 +220,7 @@ SettingsFloppyCDROM::save() for (int i = 0; i < CDROM_NUM; i++) { cdrom[i].priv = NULL; cdrom[i].ops = NULL; - cdrom[i].image = NULL; + cdrom[i].local = NULL; cdrom[i].insert = NULL; cdrom[i].close = NULL; cdrom[i].get_volume = NULL; diff --git a/src/qt/win_cdrom_ioctl.c b/src/qt/win_cdrom_ioctl.c index 995876c1d..ff65046a7 100644 --- a/src/qt/win_cdrom_ioctl.c +++ b/src/qt/win_cdrom_ioctl.c @@ -43,11 +43,16 @@ of the audio while audio still plays. With an absolute conversion, the counter is fine. */ #define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f) -static int toc_valid = 0; -static CDROM_TOC cur_toc = { 0 }; -static HANDLE handle = NULL; -static WCHAR ioctl_path[256] = { 0 }; -static WCHAR old_ioctl_path[256] = { 0 }; +typedef struct win_cdrom_ioctl_t { + int toc_valid; + uint8_t cur_toc[65536]; + CDROM_READ_TOC_EX cur_read_toc_ex; + int blocks_num; + uint8_t cur_rti[65536]; + HANDLE handle; + WCHAR path[256]; + WCHAR old_path[256]; +} win_cdrom_ioctl_t; #ifdef ENABLE_WIN_CDROM_IOCTL_LOG int win_cdrom_ioctl_do_log = ENABLE_WIN_CDROM_IOCTL_LOG; @@ -68,63 +73,144 @@ win_cdrom_ioctl_log(const char *fmt, ...) #endif static int -plat_cdrom_open(void) +plat_cdrom_open(void *local) { - plat_cdrom_close(); + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; - handle = CreateFileW((LPCWSTR)ioctl_path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); - win_cdrom_ioctl_log("handle=%p, error=%x\n", handle, (unsigned int) GetLastError()); + plat_cdrom_close(local); - return (handle != INVALID_HANDLE_VALUE); + ioctl->handle = CreateFileW((LPCWSTR) ioctl->path, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + win_cdrom_ioctl_log("handle=%p, error=%x\n", ioctl->handle, (unsigned int) GetLastError()); + + return (ioctl->handle != INVALID_HANDLE_VALUE); } static int -plat_cdrom_load(void) +plat_cdrom_load(void *local) { - plat_cdrom_close(); + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; - handle = CreateFileW((LPCWSTR)ioctl_path, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); - win_cdrom_ioctl_log("handle=%p, error=%x\n", handle, (unsigned int) GetLastError()); - if (handle != INVALID_HANDLE_VALUE) { + plat_cdrom_close(local); + + ioctl->handle = CreateFileW((LPCWSTR) ioctl->path, GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); + win_cdrom_ioctl_log("handle=%p, error=%x\n", ioctl->handle, (unsigned int) GetLastError()); + if (ioctl->handle != INVALID_HANDLE_VALUE) { long size; - DeviceIoControl(handle, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, (LPDWORD)&size, NULL); + DeviceIoControl(ioctl->handle, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, (LPDWORD) &size, NULL); return 1; } return 0; } -static void -plat_cdrom_read_toc(void) +static int +plat_cdrom_read_normal_toc(win_cdrom_ioctl_t *ioctl, uint8_t *toc_buf) { - long size = 0; + long size = 0; - if (!toc_valid) { - toc_valid = 1; - plat_cdrom_open(); - DeviceIoControl(handle, IOCTL_CDROM_READ_TOC, NULL, 0, &cur_toc, sizeof(cur_toc), (LPDWORD)&size, NULL); - plat_cdrom_close(); + memset(toc_buf, 0x00, 65536); + plat_cdrom_open(ioctl); + int temp = DeviceIoControl(ioctl->handle, IOCTL_CDROM_READ_TOC, NULL, 0, toc_buf, 65535, (LPDWORD) &size, NULL); + plat_cdrom_close(ioctl); +#ifdef ENABLE_WIN_CDROM_IOCTL_LOG + win_cdrom_ioctl_log("temp = %i\n", temp); + + PCDROM_TOC toc = (PCDROM_TOC) toc_buf; + const int tracks_num = (((toc->Length[0] << 8) | toc->Length[1]) - 2) / 8; + win_cdrom_ioctl_log("%i tracks\n", tracks_num); + for (int i = 0; i < tracks_num; i++) + win_cdrom_ioctl_log("Track %03i: Point %02X\n", i, (int) toc->TrackData[i].TrackNumber); +#endif + + return temp; +} + +static void +plat_cdrom_read_raw_toc(win_cdrom_ioctl_t *ioctl) +{ + long size = 0; + int status; + PCDROM_TOC_FULL_TOC_DATA cur_full_toc = NULL; + + memset(ioctl->cur_rti, 0x00, 65536); + cur_full_toc = (PCDROM_TOC_FULL_TOC_DATA) calloc(1, 65536); + if (ioctl->blocks_num != 0) { + memset(ioctl->cur_rti, 0x00, ioctl->blocks_num * 11); + ioctl->blocks_num = 0; + } + + ioctl->cur_read_toc_ex.Format = CDROM_READ_TOC_EX_FORMAT_FULL_TOC; + win_cdrom_ioctl_log("cur_read_toc_ex.Format = %i\n", ioctl->cur_read_toc_ex.Format); + ioctl->cur_read_toc_ex.Msf = 1; + ioctl->cur_read_toc_ex.SessionTrack = 1; + + plat_cdrom_open(ioctl); + status = DeviceIoControl(ioctl->handle, IOCTL_CDROM_READ_TOC_EX, &ioctl->cur_read_toc_ex, 65535, + cur_full_toc, 65535, (LPDWORD) &size, NULL); + plat_cdrom_close(ioctl); + win_cdrom_ioctl_log("status = %i\n", status); + + if (status != 0) { + ioctl->blocks_num = (((cur_full_toc->Length[0] << 8) | cur_full_toc->Length[1]) - 2) / 11; + memcpy(ioctl->cur_rti, cur_full_toc->Descriptors, ioctl->blocks_num * 11); + } + + free(cur_full_toc); + +#ifdef ENABLE_WIN_CDROM_IOCTL_LOG + win_cdrom_ioctl_log("%i blocks\n", ioctl->blocks_num); + + raw_track_info_t *rti = (raw_track_info_t *) ioctl->cur_rti; + for (int i = 0; i < ioctl->blocks_num; i++) + win_cdrom_ioctl_log("Block %03i: Session %03i, Point %02X\n", i, (int) rti[i].session, (int) rti[i].point); +#endif +} + +void +plat_cdrom_get_raw_track_info(void *local, int *num, raw_track_info_t *rti) +{ + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + + *num = ioctl->blocks_num; + memcpy(rti, ioctl->cur_rti, ioctl->blocks_num * 11); +} + +static void +plat_cdrom_read_toc(win_cdrom_ioctl_t *ioctl) +{ + if (!ioctl->toc_valid) { + ioctl->toc_valid = 1; + (void) plat_cdrom_read_normal_toc(ioctl, ioctl->cur_toc); + plat_cdrom_read_raw_toc(ioctl); } } int -plat_cdrom_is_track_audio(uint32_t sector) +plat_cdrom_is_track_audio(void *local, uint32_t sector) { - int control = 0; - uint32_t track_addr = 0; - uint32_t next_track_addr = 0; + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + PCDROM_TOC toc = (PCDROM_TOC) ioctl->cur_toc; + int control = 0; + uint32_t cur_addr = 0; + uint32_t next_addr = 0; - plat_cdrom_read_toc(); + plat_cdrom_read_toc(ioctl); + + for (int c = 0; toc->TrackData[c].TrackNumber != 0xaa; c++) { + PTRACK_DATA cur_td = &toc->TrackData[c]; + PTRACK_DATA next_td = &toc->TrackData[c + 1]; + + cur_addr = MSFtoLBA(cur_td->Address[1], cur_td->Address[2], cur_td->Address[3]) - 150; + next_addr = MSFtoLBA(next_td->Address[1], next_td->Address[2], next_td->Address[3]) - 150; - for (int c = 0; cur_toc.TrackData[c].TrackNumber != 0xaa; c++) { - track_addr = MSFtoLBA(cur_toc.TrackData[c].Address[1], cur_toc.TrackData[c].Address[2], cur_toc.TrackData[c].Address[3]) - 150; - next_track_addr = MSFtoLBA(cur_toc.TrackData[c + 1].Address[1], cur_toc.TrackData[c + 1].Address[2], cur_toc.TrackData[c + 1].Address[3]) - 150; win_cdrom_ioctl_log("F: %i, L: %i, C: %i (%i), c: %02X, A: %08X, S: %08X\n", - cur_toc.FirstTrack, cur_toc.LastTrack, - cur_toc.TrackData[c].TrackNumber, c, - cur_toc.TrackData[c].Control, track_addr, sector); - if ((cur_toc.TrackData[c].TrackNumber >= cur_toc.FirstTrack) && (cur_toc.TrackData[c].TrackNumber <= cur_toc.LastTrack) && - (sector >= track_addr) && (sector < next_track_addr)) { - control = cur_toc.TrackData[c].Control; + toc->FirstTrack, toc->LastTrack, cur_td->TrackNumber, c, + cur_td->Control, track_addr, sector); + + if ((cur_td->TrackNumber >= toc->FirstTrack) && (cur_td->TrackNumber <= toc->LastTrack) && + (sector >= cur_addr) && (sector < next_addr)) { + control = cur_td->Control; break; } } @@ -137,26 +223,32 @@ plat_cdrom_is_track_audio(uint32_t sector) } int -plat_cdrom_is_track_pre(uint32_t sector) +plat_cdrom_is_track_pre(void *local, uint32_t sector) { - int control = 0; - uint32_t track_addr = 0; - uint32_t next_track_addr = 0; + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + PCDROM_TOC toc = (PCDROM_TOC) ioctl->cur_toc; + int control = 0; + uint32_t cur_addr = 0; + uint32_t next_addr = 0; - plat_cdrom_read_toc(); + plat_cdrom_read_toc(ioctl); + + for (int c = 0; toc->TrackData[c].TrackNumber != 0xaa; c++) { + PTRACK_DATA cur_td = &toc->TrackData[c]; + PTRACK_DATA next_td = &toc->TrackData[c + 1]; + + cur_addr = MSFtoLBA(cur_td->Address[1], cur_td->Address[2], cur_td->Address[3]) - 150; + next_addr = MSFtoLBA(next_td->Address[1], next_td->Address[2], next_td->Address[3]) - 150; - for (int c = 0; cur_toc.TrackData[c].TrackNumber != 0xaa; c++) { - track_addr = MSFtoLBA(cur_toc.TrackData[c].Address[1], cur_toc.TrackData[c].Address[2], cur_toc.TrackData[c].Address[3]) - 150; - next_track_addr = MSFtoLBA(cur_toc.TrackData[c + 1].Address[1], cur_toc.TrackData[c + 1].Address[2], cur_toc.TrackData[c + 1].Address[3]) - 150; win_cdrom_ioctl_log("F: %i, L: %i, C: %i (%i), c: %02X, A: %08X, S: %08X\n", - cur_toc.FirstTrack, cur_toc.LastTrack, - cur_toc.TrackData[c].TrackNumber, c, - cur_toc.TrackData[c].Control, track_addr, sector); - if ((cur_toc.TrackData[c].TrackNumber >= cur_toc.FirstTrack) && (cur_toc.TrackData[c].TrackNumber <= cur_toc.LastTrack) && - (sector >= track_addr) && (sector < next_track_addr)) { - control = cur_toc.TrackData[c].Control; + toc->FirstTrack, toc->LastTrack, cur_td->TrackNumber, c, + cur_td->Control, cur_addr, sector); + + if ((cur_td->TrackNumber >= toc->FirstTrack) && (cur_td->TrackNumber <= toc->LastTrack) && + (sector >= cur_addr) && (sector < next_addr)) { + control = cur_td->Control; break; - } + } } const int ret = (control & 0x01); @@ -167,81 +259,91 @@ plat_cdrom_is_track_pre(uint32_t sector) } uint32_t -plat_cdrom_get_track_start(uint32_t sector, uint8_t *attr, uint8_t *track) +plat_cdrom_get_track_start(void *local, uint32_t sector, uint8_t *attr, uint8_t *track) { - uint32_t track_addr = 0; - uint32_t next_track_addr = 0; + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + PCDROM_TOC toc = (PCDROM_TOC) ioctl->cur_toc; + uint32_t cur_addr = 0; + uint32_t next_addr = 0; - plat_cdrom_read_toc(); + plat_cdrom_read_toc(ioctl); + + for (int c = 0; toc->TrackData[c].TrackNumber != 0xaa; c++) { + PTRACK_DATA cur_td = &toc->TrackData[c]; + PTRACK_DATA next_td = &toc->TrackData[c + 1]; + + cur_addr = MSFtoLBA(cur_td->Address[1], cur_td->Address[2], cur_td->Address[3]) - 150; + next_addr = MSFtoLBA(next_td->Address[1], next_td->Address[2], next_td->Address[3]) - 150; - for (int c = 0; cur_toc.TrackData[c].TrackNumber != 0xaa; c++) { - track_addr = MSFtoLBA(cur_toc.TrackData[c].Address[1], cur_toc.TrackData[c].Address[2], cur_toc.TrackData[c].Address[3]) - 150; - next_track_addr = MSFtoLBA(cur_toc.TrackData[c + 1].Address[1], cur_toc.TrackData[c + 1].Address[2], cur_toc.TrackData[c + 1].Address[3]) - 150; win_cdrom_ioctl_log("F: %i, L: %i, C: %i (%i), c: %02X, a: %02X, A: %08X, S: %08X\n", - cur_toc.FirstTrack, cur_toc.LastTrack, - cur_toc.TrackData[c].TrackNumber, c, - cur_toc.TrackData[c].Control, cur_toc.TrackData[c].Adr, - track_addr, sector); - if ((cur_toc.TrackData[c].TrackNumber >= cur_toc.FirstTrack) && (cur_toc.TrackData[c].TrackNumber <= cur_toc.LastTrack) && - (sector >= track_addr) && (sector < next_track_addr)) { - *track = cur_toc.TrackData[c].TrackNumber; - *attr = cur_toc.TrackData[c].Control; - *attr |= ((cur_toc.TrackData[c].Adr << 4) & 0xf0); + toc->FirstTrack, toc->LastTrack, cur_td->TrackNumber, c, + cur_td->Control, cur_td->Adr, cur_addr, sector); + + if ((cur_td->TrackNumber >= toc->FirstTrack) && (cur_td->TrackNumber <= toc->LastTrack) && + (sector >= cur_addr) && (sector < next_addr)) { + *track = cur_td->TrackNumber; + *attr = cur_td->Control; + *attr |= ((cur_td->Adr << 4) & 0xf0); break; } } - win_cdrom_ioctl_log("plat_cdrom_get_track_start(%08X): %i\n", sector, track_addr); + win_cdrom_ioctl_log("plat_cdrom_get_track_start(%08X): %i\n", sector, cur_addr); - return track_addr; + return cur_addr; } uint32_t -plat_cdrom_get_last_block(void) +plat_cdrom_get_last_block(void *local) { - uint32_t lb = 0; - uint32_t address = 0; + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + PCDROM_TOC toc = (PCDROM_TOC) ioctl->cur_toc; + uint32_t lb = 0; + uint32_t address = 0; - plat_cdrom_read_toc(); + plat_cdrom_read_toc(ioctl); + + for (int c = 0; c <= toc->LastTrack; c++) { + PTRACK_DATA td = &toc->TrackData[c]; + + address = MSFtoLBA(td->Address[1], td->Address[2], td->Address[3]) - 150; - for (int c = 0; c <= cur_toc.LastTrack; c++) { - address = MSFtoLBA(cur_toc.TrackData[c].Address[1], cur_toc.TrackData[c].Address[2], cur_toc.TrackData[c].Address[3]) - 150; if (address > lb) lb = address; } + win_cdrom_ioctl_log("LBCapacity=%d\n", lb); + return lb; } int -plat_cdrom_ext_medium_changed(void) +plat_cdrom_ext_medium_changed(void *local) { - long size; - CDROM_TOC toc; - int ret = 0; + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + PCDROM_TOC toc = (PCDROM_TOC) ioctl->cur_toc; + uint8_t new_toc_buf[65536] = { 0 }; + PCDROM_TOC new_toc = (PCDROM_TOC) new_toc_buf; + int ret = 0; + int temp = plat_cdrom_read_normal_toc(ioctl, new_toc_buf); + PTRACK_DATA cur_ltd = &toc->TrackData[toc->LastTrack]; - plat_cdrom_open(); - int temp = DeviceIoControl(handle, IOCTL_CDROM_READ_TOC, - NULL, 0, &toc, sizeof(toc), - (LPDWORD)&size, NULL); - plat_cdrom_close(); + if (temp != 0) + plat_cdrom_read_raw_toc(ioctl); - if (!temp) + PTRACK_DATA new_ltd = &new_toc->TrackData[new_toc->LastTrack]; + + if (temp == 0) /* There has been some kind of error - not a medium change, but a not ready condition. */ ret = -1; - else if (!toc_valid || (memcmp(ioctl_path, old_ioctl_path, sizeof(ioctl_path)) != 0)) { + else if (!ioctl->toc_valid || (memcmp(ioctl->path, ioctl->old_path, sizeof(ioctl->path)) != 0)) { /* Changed to a different host drive - we already detect such medium changes. */ - toc_valid = 1; - cur_toc = toc; - if (memcmp(ioctl_path, old_ioctl_path, sizeof(ioctl_path)) != 0) - memcpy(old_ioctl_path, ioctl_path, sizeof(ioctl_path)); - } else if ((toc.TrackData[toc.LastTrack].Address[1] != - cur_toc.TrackData[cur_toc.LastTrack].Address[1]) || - (toc.TrackData[toc.LastTrack].Address[2] != - cur_toc.TrackData[cur_toc.LastTrack].Address[2]) || - (toc.TrackData[toc.LastTrack].Address[3] != - cur_toc.TrackData[cur_toc.LastTrack].Address[3])) + ioctl->toc_valid = 1; + memcpy(toc, new_toc, 65535); + if (memcmp(ioctl->path, ioctl->old_path, sizeof(ioctl->path)) != 0) + memcpy(ioctl->old_path, ioctl->path, sizeof(ioctl->path)); + } else if (memcmp(&(new_ltd->Address[1]), &(cur_ltd->Address[1]), 3)) /* The TOC has changed. */ ret = 1; @@ -251,15 +353,20 @@ plat_cdrom_ext_medium_changed(void) } void -plat_cdrom_get_audio_tracks(int *st_track, int *end, TMSF *lead_out) +plat_cdrom_get_audio_tracks(void *local, int *st_track, int *end, TMSF *lead_out) { - plat_cdrom_read_toc(); + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + PCDROM_TOC toc = (PCDROM_TOC) ioctl->cur_toc; + + plat_cdrom_read_toc(ioctl); + + PTRACK_DATA ltd = &toc->TrackData[toc->LastTrack]; *st_track = 1; - *end = cur_toc.LastTrack; - lead_out->min = cur_toc.TrackData[cur_toc.LastTrack].Address[1]; - lead_out->sec = cur_toc.TrackData[cur_toc.LastTrack].Address[2]; - lead_out->fr = cur_toc.TrackData[cur_toc.LastTrack].Address[3]; + *end = toc->LastTrack; + lead_out->min = ltd->Address[1]; + lead_out->sec = ltd->Address[2]; + lead_out->fr = ltd->Address[3]; win_cdrom_ioctl_log("plat_cdrom_get_audio_tracks(): %02i, %02i, %02i:%02i:%02i\n", *st_track, *end, lead_out->min, lead_out->sec, lead_out->fr); @@ -267,22 +374,27 @@ plat_cdrom_get_audio_tracks(int *st_track, int *end, TMSF *lead_out) /* This replaces both Info and EndInfo, they are specified by a variable. */ int -plat_cdrom_get_audio_track_info(UNUSED(int end), int track, int *track_num, TMSF *start, uint8_t *attr) +plat_cdrom_get_audio_track_info(void *local, UNUSED(int end), int track, int *track_num, TMSF *start, uint8_t *attr) { - plat_cdrom_read_toc(); + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + PCDROM_TOC toc = (PCDROM_TOC) ioctl->cur_toc; - if ((track < 1) || (track == 0xaa) || (track > (cur_toc.LastTrack + 1))) { + plat_cdrom_read_toc(ioctl); + + if ((track < 1) || (track == 0xaa) || (track > (toc->LastTrack + 1))) { win_cdrom_ioctl_log("plat_cdrom_get_audio_track_info(%02i)\n", track); return 0; } - start->min = cur_toc.TrackData[track - 1].Address[1]; - start->sec = cur_toc.TrackData[track - 1].Address[2]; - start->fr = cur_toc.TrackData[track - 1].Address[3]; + PTRACK_DATA td = &toc->TrackData[track - 1]; - *track_num = cur_toc.TrackData[track - 1].TrackNumber; - *attr = cur_toc.TrackData[track - 1].Control; - *attr |= ((cur_toc.TrackData[track - 1].Adr << 4) & 0xf0); + start->min = td->Address[1]; + start->sec = td->Address[2]; + start->fr = td->Address[3]; + + *track_num = td->TrackNumber; + *attr = td->Control; + *attr |= ((td->Adr << 4) & 0xf0); win_cdrom_ioctl_log("plat_cdrom_get_audio_track_info(%02i): %02i:%02i:%02i, %02i, %02X\n", track, start->min, start->sec, start->fr, *track_num, *attr); @@ -292,17 +404,20 @@ plat_cdrom_get_audio_track_info(UNUSED(int end), int track, int *track_num, TMSF /* TODO: See if track start is adjusted by 150 or not. */ int -plat_cdrom_get_audio_sub(UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos) +plat_cdrom_get_audio_sub(void *local, UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, uint8_t *index, + TMSF *rel_pos, TMSF *abs_pos) { + win_cdrom_ioctl_t * ioctl = (win_cdrom_ioctl_t *) local; CDROM_SUB_Q_DATA_FORMAT insub; - SUB_Q_CHANNEL_DATA sub; - long size = 0; + SUB_Q_CHANNEL_DATA sub; + long size = 0; insub.Format = IOCTL_CDROM_CURRENT_POSITION; - plat_cdrom_open(); - DeviceIoControl(handle, IOCTL_CDROM_READ_Q_CHANNEL, &insub, sizeof(insub), &sub, sizeof(sub), (LPDWORD)&size, NULL); - plat_cdrom_close(); + plat_cdrom_open(ioctl); + DeviceIoControl(ioctl->handle, IOCTL_CDROM_READ_Q_CHANNEL, &insub, sizeof(insub), &sub, sizeof(sub), + (LPDWORD) &size, NULL); + plat_cdrom_close(ioctl); if (sub.CurrentPosition.TrackNumber < 1) return 0; @@ -320,92 +435,107 @@ plat_cdrom_get_audio_sub(UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, abs_pos->fr = sub.CurrentPosition.AbsoluteAddress[3]; win_cdrom_ioctl_log("plat_cdrom_get_audio_sub(): %02i, %02X, %02i, %02i:%02i:%02i, %02i:%02i:%02i\n", - *track, *attr, *index, rel_pos->min, rel_pos->sec, rel_pos->fr, abs_pos->min, abs_pos->sec, abs_pos->fr); + *track, *attr, *index, rel_pos->min, rel_pos->sec, rel_pos->fr, abs_pos->min, abs_pos->sec, + abs_pos->fr); return 1; } int -plat_cdrom_get_sector_size(UNUSED(uint32_t sector)) +plat_cdrom_get_sector_size(void *local, UNUSED(uint32_t sector)) { - long size; - DISK_GEOMETRY dgCDROM; + win_cdrom_ioctl_t * ioctl = (win_cdrom_ioctl_t *) local; + long size; + DISK_GEOMETRY dgCDROM; - plat_cdrom_open(); - DeviceIoControl(handle, IOCTL_CDROM_GET_DRIVE_GEOMETRY, NULL, 0, &dgCDROM, sizeof(dgCDROM), (LPDWORD)&size, NULL); - plat_cdrom_close(); + plat_cdrom_open(ioctl); + DeviceIoControl(ioctl->handle, IOCTL_CDROM_GET_DRIVE_GEOMETRY, NULL, 0, &dgCDROM, sizeof(dgCDROM), + (LPDWORD) &size, NULL); + plat_cdrom_close(ioctl); win_cdrom_ioctl_log("BytesPerSector=%d\n", dgCDROM.BytesPerSector); return dgCDROM.BytesPerSector; } int -plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) +plat_cdrom_read_sector(void *local, uint8_t *buffer, int raw, uint32_t sector) { - int status; - long size = 0; - int buflen = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE; + win_cdrom_ioctl_t * ioctl = (win_cdrom_ioctl_t *) local; + int status; + long size = 0; + int buflen = raw ? RAW_SECTOR_SIZE : COOKED_SECTOR_SIZE; - plat_cdrom_open(); + plat_cdrom_open(ioctl); if (raw) { - win_cdrom_ioctl_log("Raw\n"); /* Raw */ + win_cdrom_ioctl_log("Raw\n"); RAW_READ_INFO in; in.DiskOffset.LowPart = sector * COOKED_SECTOR_SIZE; in.DiskOffset.HighPart = 0; in.SectorCount = 1; in.TrackMode = CDDA; - status = DeviceIoControl(handle, IOCTL_CDROM_RAW_READ, &in, sizeof(in), - buffer, buflen, (LPDWORD)&size, NULL); + status = DeviceIoControl(ioctl->handle, IOCTL_CDROM_RAW_READ, &in, sizeof(in), + buffer, buflen, (LPDWORD) &size, NULL); } else { - win_cdrom_ioctl_log("Cooked\n"); /* Cooked */ + win_cdrom_ioctl_log("Cooked\n"); int success = 0; - DWORD newPos = SetFilePointer(handle, sector * COOKED_SECTOR_SIZE, 0, FILE_BEGIN); + DWORD newPos = SetFilePointer(ioctl->handle, sector * COOKED_SECTOR_SIZE, 0, FILE_BEGIN); if (newPos != 0xFFFFFFFF) - success = ReadFile(handle, buffer, buflen, (LPDWORD)&size, NULL); + success = ReadFile(ioctl->handle, buffer, buflen, (LPDWORD) &size, NULL); status = (success != 0); } - plat_cdrom_close(); + plat_cdrom_close(ioctl); win_cdrom_ioctl_log("ReadSector status=%d, sector=%d, size=%" PRId64 ".\n", status, sector, (long long) size); return (status > 0) ? (size == buflen) : -1; } void -plat_cdrom_eject(void) +plat_cdrom_eject(void *local) { - long size; + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + long size; - plat_cdrom_open(); - DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, (LPDWORD)&size, NULL); - - plat_cdrom_close(); + plat_cdrom_open(ioctl); + DeviceIoControl(ioctl->handle, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, (LPDWORD) &size, NULL); + plat_cdrom_close(ioctl); } void -plat_cdrom_close(void) +plat_cdrom_close(void *local) { - if (handle != NULL) { - CloseHandle(handle); - handle = NULL; + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; + + if (ioctl->handle != NULL) { + CloseHandle(ioctl->handle); + ioctl->handle = NULL; } } int -plat_cdrom_set_drive(const char *drv) +plat_cdrom_set_drive(void *local, const char *drv) { - plat_cdrom_close(); + win_cdrom_ioctl_t *ioctl = (win_cdrom_ioctl_t *) local; - memcpy(old_ioctl_path, ioctl_path, sizeof(ioctl_path)); - memset(ioctl_path, 0x00, sizeof(ioctl_path)); + plat_cdrom_close(ioctl); - wsprintf(ioctl_path, L"%S", drv); - win_cdrom_ioctl_log("Path is %S\n", ioctl_path); + memcpy(ioctl->old_path, ioctl->path, sizeof(ioctl->path)); + memset(ioctl->path, 0x00, sizeof(ioctl->path)); - toc_valid = 0; + wsprintf(ioctl->path, L"%S", drv); + win_cdrom_ioctl_log("Path is %S\n", ioctl->path); + + ioctl->toc_valid = 0; + + plat_cdrom_load(ioctl); - plat_cdrom_load(); return 1; } + +int +plat_cdrom_get_local_size(void) +{ + return sizeof(win_cdrom_ioctl_t); +} diff --git a/src/unix/dummy_cdrom_ioctl.c b/src/unix/dummy_cdrom_ioctl.c index ed19dfb1f..bf656177b 100644 --- a/src/unix/dummy_cdrom_ioctl.c +++ b/src/unix/dummy_cdrom_ioctl.c @@ -35,7 +35,9 @@ of the audio while audio still plays. With an absolute conversion, the counter is fine. */ #define MSFtoLBA(m, s, f) ((((m * 60) + s) * 75) + f) -static int toc_valid = 0; +typedef struct dummy_cdrom_ioctl_t { + int toc_valid; +} dummy_cdrom_ioctl_t; #ifdef ENABLE_DUMMY_CDROM_IOCTL_LOG int dummy_cdrom_ioctl_do_log = ENABLE_DUMMY_CDROM_IOCTL_LOG; @@ -56,30 +58,41 @@ dummy_cdrom_ioctl_log(const char *fmt, ...) #endif static int -plat_cdrom_open(void) +plat_cdrom_open(void *local) { return 0; } static int -plat_cdrom_load(void) +plat_cdrom_load(void *local) { return 0; } static void -plat_cdrom_read_toc(void) +plat_cdrom_read_toc(void *local) { - if (!toc_valid) - toc_valid = 1; + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + if (!ioctl->toc_valid) + ioctl->toc_valid = 1; +} + +void +plat_cdrom_get_raw_track_info(UNUSED(void *local), int *num, raw_track_info_t *rti) +{ + *num = 1; + memset(rti, 0x00, 11); } int -plat_cdrom_is_track_audio(uint32_t sector) +plat_cdrom_is_track_audio(void *local, uint32_t sector) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; - const int ret = 0; + plat_cdrom_read_toc(ioctl); + + const int ret = 0; dummy_cdrom_ioctl_log("plat_cdrom_is_track_audio(%08X): %i\n", sector, ret); @@ -87,9 +100,11 @@ plat_cdrom_is_track_audio(uint32_t sector) } int -plat_cdrom_is_track_pre(uint32_t sector) +plat_cdrom_is_track_pre(void *local, uint32_t sector) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); const int ret = 0; @@ -99,25 +114,30 @@ plat_cdrom_is_track_pre(uint32_t sector) } uint32_t -plat_cdrom_get_track_start(uint32_t sector, uint8_t *attr, uint8_t *track) +plat_cdrom_get_track_start(void *local, uint32_t sector, uint8_t *attr, uint8_t *track) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); return 0x00000000; } uint32_t -plat_cdrom_get_last_block(void) +plat_cdrom_get_last_block(void *local) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); return 0x00000000; } int -plat_cdrom_ext_medium_changed(void) +plat_cdrom_ext_medium_changed(void *local) { - int ret = 0; + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + int ret = 0; dummy_cdrom_ioctl_log("plat_cdrom_ext_medium_changed(): %i\n", ret); @@ -125,9 +145,11 @@ plat_cdrom_ext_medium_changed(void) } void -plat_cdrom_get_audio_tracks(int *st_track, int *end, TMSF *lead_out) +plat_cdrom_get_audio_tracks(void *local, int *st_track, int *end, TMSF *lead_out) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); *st_track = 1; *end = 1; @@ -141,9 +163,11 @@ plat_cdrom_get_audio_tracks(int *st_track, int *end, TMSF *lead_out) /* This replaces both Info and EndInfo, they are specified by a variable. */ int -plat_cdrom_get_audio_track_info(UNUSED(int end), int track, int *track_num, TMSF *start, uint8_t *attr) +plat_cdrom_get_audio_track_info(void *local, UNUSED(int end), int track, int *track_num, TMSF *start, uint8_t *attr) { - plat_cdrom_read_toc(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_read_toc(ioctl); if ((track < 1) || (track == 0xaa)) { dummy_cdrom_ioctl_log("plat_cdrom_get_audio_track_info(%02i)\n", track); @@ -165,7 +189,8 @@ plat_cdrom_get_audio_track_info(UNUSED(int end), int track, int *track_num, TMSF /* TODO: See if track start is adjusted by 150 or not. */ int -plat_cdrom_get_audio_sub(UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, uint8_t *index, TMSF *rel_pos, TMSF *abs_pos) +plat_cdrom_get_audio_sub(UNUSED(void *local), UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, uint8_t *index, + TMSF *rel_pos, TMSF *abs_pos) { *track = 1; *attr = 0x14; @@ -185,7 +210,7 @@ plat_cdrom_get_audio_sub(UNUSED(uint32_t sector), uint8_t *attr, uint8_t *track, } int -plat_cdrom_get_sector_size(UNUSED(uint32_t sector)) +plat_cdrom_get_sector_size(UNUSED(void *local), UNUSED(uint32_t sector)) { dummy_cdrom_ioctl_log("BytesPerSector=2048\n"); @@ -193,42 +218,56 @@ plat_cdrom_get_sector_size(UNUSED(uint32_t sector)) } int -plat_cdrom_read_sector(uint8_t *buffer, int raw, uint32_t sector) +plat_cdrom_read_sector(void *local, uint8_t *buffer, int raw, uint32_t sector) { - plat_cdrom_open(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; - if (raw) { - dummy_cdrom_ioctl_log("Raw\n"); + plat_cdrom_open(ioctl); + + if (raw) /* Raw */ - } else { - dummy_cdrom_ioctl_log("Cooked\n"); + dummy_cdrom_ioctl_log("Raw\n"); + else /* Cooked */ - } - plat_cdrom_close(); + dummy_cdrom_ioctl_log("Cooked\n"); + + plat_cdrom_close(ioctl); + dummy_cdrom_ioctl_log("ReadSector sector=%d.\n", sector); return 0; } void -plat_cdrom_eject(void) +plat_cdrom_eject(void *local) { - plat_cdrom_open(); - plat_cdrom_close(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; + + plat_cdrom_open(ioctl); + plat_cdrom_close(ioctl); } void -plat_cdrom_close(void) +plat_cdrom_close(UNUSED(void *local)) { } int -plat_cdrom_set_drive(const char *drv) +plat_cdrom_set_drive(void *local, const char *drv) { - plat_cdrom_close(); + dummy_cdrom_ioctl_t *ioctl = (dummy_cdrom_ioctl_t *) local; - toc_valid = 0; + plat_cdrom_close(ioctl); + + ioctl->toc_valid = 0; + + plat_cdrom_load(ioctl); - plat_cdrom_load(); return 1; } + +int +plat_cdrom_get_local_size(void) +{ + return sizeof(dummy_cdrom_ioctl_t); +} From bf509671ef7ba841777cdd2e2a1b29a882a68eb1 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 26 Nov 2024 03:12:59 +0100 Subject: [PATCH 620/624] AAEON SBC-350A: Remove IDE flag, fixes #4985. --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 580ca541d..5b1d37e8c 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -4113,7 +4113,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_IDE, + .flags = MACHINE_FLGAS_NONE, .ram = { .min = 1024, .max = 16384, From 738daa9a4eaa5bb7515a490e78bedbc1d058ac27 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 26 Nov 2024 11:38:03 +0100 Subject: [PATCH 621/624] Fixed a compile-breaking typo in machine/machine_table.c, fixes #5000. --- src/machine/machine_table.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 5b1d37e8c..74c04c7d3 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -4113,7 +4113,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLGAS_NONE, + .flags = MACHINE_FLAGS_NONE, .ram = { .min = 1024, .max = 16384, From 781320817f7ada8e532573c677bb885545966398 Mon Sep 17 00:00:00 2001 From: OBattler Date: Tue, 26 Nov 2024 12:01:27 +0100 Subject: [PATCH 622/624] Aaeon SBC-350: Restore the IDE flag and actually fix IDE and Super I/O chip initialization. --- src/machine/m_at_286_386sx.c | 3 ++- src/machine/machine_table.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/machine/m_at_286_386sx.c b/src/machine/m_at_286_386sx.c index 995301e4f..36629658f 100644 --- a/src/machine/m_at_286_386sx.c +++ b/src/machine/m_at_286_386sx.c @@ -770,7 +770,8 @@ machine_at_sbc350a_init(const machine_t *model) machine_at_common_init(model); device_add(&ali1217_device); - device_add(&fdc37c665_ide_device); + device_add(&ide_isa_device); + device_add(&fdc37c665_ide_pri_device); device_add(&keyboard_ps2_ami_device); return ret; diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 74c04c7d3..580ca541d 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -4113,7 +4113,7 @@ const machine_t machines[] = { .max_multi = 0 }, .bus_flags = MACHINE_AT, - .flags = MACHINE_FLAGS_NONE, + .flags = MACHINE_IDE, .ram = { .min = 1024, .max = 16384, From 2893a7dda1ae073bc6ac469391b514e338dd5451 Mon Sep 17 00:00:00 2001 From: Sasamiya <117635969+kzmidze@users.noreply.github.com> Date: Sun, 1 Dec 2024 15:08:38 +0800 Subject: [PATCH 623/624] Fixed SChinese and TChinese translations --- src/qt/languages/zh-CN.po | 6 +++--- src/qt/languages/zh-TW.po | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index 95e770357..6b659b504 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1372,13 +1372,13 @@ msgid "This machine might have been moved or copied." msgstr "这台机器可能被移动或复制过。" 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 "为了确保网络功能正常,86Box需要知道这台机器是否被移动或复制。\n\n如果您不确定,请选择\"我复制了它\"。" +msgstr "为了确保网络功能正常,86Box需要知道这台机器是否被移动或复制。\n\n如果您不确定,请选择\"我已复制这台机器\"。" msgid "I Moved It" -msgstr "我移动了它" +msgstr "我已移动这台机器" msgid "I Copied It" -msgstr "我复制了它" +msgstr "我已复制这台机器" msgid "86Box Monitor #" msgstr "86Box 监测器 " diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 2d5576573..f9e917d98 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -1372,13 +1372,13 @@ msgid "This machine might have been moved or copied." msgstr "這台機器可能已被移動或複製。" 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 "為了確保正常的網路功能,86Box 需要知道這台機器是否被移動或複製。\n\n如果您不確定,請選擇「我複製了它」。" +msgstr "為了確保正常的網路功能,86Box 需要知道這台機器是否被移動或複製。\n\n如果您不確定,請選擇「我已複製這台機器」。" msgid "I Moved It" -msgstr "我移動了它" +msgstr "我已移動這台機器" msgid "I Copied It" -msgstr "我複製了它" +msgstr "我已複製這台機器" msgid "86Box Monitor #" msgstr "86Box Monitor " From f49cf628a2c8a037b4b6ad90c5003fdba968df86 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 1 Dec 2024 20:59:53 +0100 Subject: [PATCH 624/624] Merged the PS/2 floppy drives into the normal ones, DENSEL polarity is now decided based on machine instead. --- src/floppy/fdd.c | 52 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index 81edcc8b8..f1b1eab69 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -26,6 +26,7 @@ #define HAVE_STDARG_H #include <86box/86box.h> #include <86box/timer.h> +#include <86box/machine.h> #include <86box/path.h> #include <86box/plat.h> #include <86box/ui.h> @@ -153,20 +154,16 @@ static const struct { { 43, FLAG_RPM_300 | FLAG_525 | FLAG_DS | FLAG_HOLE0, "5.25\" 360k", "525_2dd" }, /* 5.25" QD */ { 86, FLAG_RPM_300 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "5.25\" 720k", "525_2qd" }, - /* 5.25" HD PS/2 */ - { 86, FLAG_RPM_360 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_INVERT_DENSEL | FLAG_PS2, "5.25\" 1.2M PS/2", "525_2hd_ps2" }, /* 5.25" HD */ - { 86, FLAG_RPM_360 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "5.25\" 1.2M", "525_2hd" }, + { 86, FLAG_RPM_360 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_PS2, "5.25\" 1.2M", "525_2hd" }, /* 5.25" HD Dual RPM */ { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_525 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "5.25\" 1.2M 300/360 RPM", "525_2hd_dualrpm" }, /* 3.5" 1DD */ { 86, FLAG_RPM_300 | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 360k", "35_1dd" }, /* 3.5" DD, Equivalent to TEAC FD-235F */ { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_DOUBLE_STEP, "3.5\" 720k", "35_2dd" }, - /* 3.5" HD PS/2 */ - { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_INVERT_DENSEL | FLAG_PS2, "3.5\" 1.44M PS/2", "35_2hd_ps2" }, /* 3.5" HD, Equivalent to TEAC FD-235HF */ - { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.44M", "35_2hd" }, + { 86, FLAG_RPM_300 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP | FLAG_PS2, "3.5\" 1.44M", "35_2hd" }, /* TODO: 3.5" DD, Equivalent to TEAC FD-235GF */ // { 86, FLAG_RPM_300 | FLAG_RPM_360 | FLAG_DS | FLAG_HOLE0 | FLAG_HOLE1 | FLAG_DOUBLE_STEP, "3.5\" 1.25M", "35_2hd_2mode" }, /* 3.5" HD PC-98 */ @@ -214,10 +211,19 @@ fdd_get_internal_name(int type) int fdd_get_from_internal_name(char *s) { - int c = 0; + int c = 0; + char *n; + + /* TODO: Remove this once the migration period is over. */ + if (!strcmp(s, "525_2hd_ps2")) + n = "525_2hd"; + else if (!strcmp(s, "35_2hd_ps2")) + n = "35_2hd"; + else + n = s; while (strlen(drive_types[c].internal_name)) { - if (!strcmp((char *) drive_types[c].internal_name, s)) + if (!strcmp((char *) drive_types[c].internal_name, n)) return c; c++; } @@ -282,11 +288,32 @@ fdd_current_track(int drive) return fdd[drive].track; } +static int +fdd_type_invert_densel(int type) +{ + int ret; + + if (drive_types[type].flags & FLAG_PS2) + ret = !strstr(machine_getname(), "PS/2"); + else + ret = drive_types[type].flags & FLAG_INVERT_DENSEL; + + return ret; +} + +static int +fdd_invert_densel(int drive) +{ + int ret = fdd_type_invert_densel(fdd[drive].type); + + return ret; +} + void fdd_set_densel(int densel) { for (uint8_t i = 0; i < FDD_NUM; i++) { - if (drive_types[fdd[i].type].flags & FLAG_INVERT_DENSEL) + if (fdd_invert_densel(i)) fdd[i].densel = densel ^ 1; else fdd[i].densel = densel; @@ -302,7 +329,7 @@ fdd_getrpm(int drive) hole = fdd_hole(drive); densel = fdd[drive].densel; - if (drive_types[fdd[drive].type].flags & FLAG_INVERT_DENSEL) + if (fdd_invert_densel(drive)) densel ^= 1; if (!(drive_types[fdd[drive].type].flags & FLAG_RPM_360)) @@ -340,10 +367,9 @@ fdd_doublestep_40(int drive) void fdd_set_type(int drive, int type) { - int old_type = fdd[drive].type; - fdd[drive].type = type; - if ((drive_types[old_type].flags ^ drive_types[type].flags) & FLAG_INVERT_DENSEL) + if (fdd_type_invert_densel(fdd[drive].type) != fdd_type_invert_densel(type)) fdd[drive].densel ^= 1; + fdd[drive].type = type; } int